跳轉到

Cookbook — 把概念變成可執行 recipe

繁體中文 | 简体中文 | English

Stage 5(Claude Code 生態)跟 mcp-skills-catalog.md 講「概念」跟「有哪些工具」。這份 cookbook 補中間缺的:「怎麼動手做出來」。每個 recipe 是一份 step-by-step + sample code + 常見 pitfall,~30-50 分鐘做完一個。

不是 reference 也不是 tutorial——是 recipe,挑你需要的那道煮就好。


📋 目錄

  1. 寫你的第一個 Skill(SKILL.md anatomy)
  2. 寫你的第一個 MCP server(Python SDK)
  3. Word / Excel / PowerPoint workflow
  4. NotebookLM workflow
  5. Zotero workflow
  6. 本機 LLM + CLI Agent 快速 walkthrough

1. 寫你的第一個 Skill

Skill = 一個資料夾含 SKILL.md,Claude Code 啟動時自動 discover、按情境自動載入。最小 viable 版本 50 行就能跑。

📚 這份是「30 分鐘跑出第一個」實作版。想看「Skill 怎麼寫得好」深度討論Hello-Agents Extra08:如何寫出好的 Skill(中文最完整的 Skill 最佳實踐,討論 description 寫法、references / scripts 設計等)。兩份互補:先用本 recipe 跑出第一個,再讀那份 polish 寫法。

為什麼

寫 Skill 跟「在 prompt 裡加幾段 instruction」差別在於: - Skill 是 per-domain 的,不會污染所有 conversation - 可以打包跨 project / team 共用 - Claude 自己決定何時載入(看 description match 不 match)

步驟

Step 1:建立 skill 資料夾

兩個位置可以放(看你要 user 級還是 project 級):

# user 級(所有 project 共用)
mkdir -p ~/.claude/skills/my-first-skill
cd ~/.claude/skills/my-first-skill

# 或 project 級(只在這個 repo 觸發)
mkdir -p .claude/skills/my-first-skill
cd .claude/skills/my-first-skill

Step 2:寫 SKILL.md

最小可 work 的範本:

---
name: my-first-skill
description: When the user asks for [SPECIFIC SITUATION], use this skill to [WHAT IT DOES]. Examples include [2-3 trigger phrases]. Do NOT use for [WHAT IT'S NOT FOR].
---

# My First Skill

You are now in the [domain] context.

## When the user asks X, do these steps:

1. First, [action A]
2. Then, [action B]
3. Verify with [check]

## Don't do:

- [anti-pattern 1]
- [anti-pattern 2]

## Reference

- (optional) link to a doc / paper / API spec

具體例子:「整理 Python 程式碼的 import 順序」

---
name: python-import-organizer
description: When the user pastes Python code or asks to clean up imports / format code / sort imports, organize the imports following PEP 8 + isort order: stdlib first, then third-party, then local. Do NOT use for non-Python code.
---

# Python Import Organizer

When the user wants Python imports cleaned up:

1. Group imports into 3 sections: stdlib / third-party / local
2. Within each group, sort alphabetically
3. Add a blank line between groups
4. Remove unused imports (only if user explicitly asks; otherwise just sort)

## Don't:
- Don't change function code, only the import block
- Don't auto-remove imports without asking

Step 3:測試

# 重啟 Claude Code(讓它重新 discover skills)
# 在 conversation 裡丟一個觸發句
# e.g.「幫我整理一下這段 Python 的 imports」
# 觀察 Claude 有沒有按照 SKILL.md 的步驟做

Step 4(進階):加 evals

在 skill folder 內加 evals/evals.json

{
  "evals": [
    {
      "input": "整理一下這段 Python 的 imports: import os\nimport requests\nfrom mypackage import foo",
      "expected_behavior": ["按 stdlib / third-party / local 分組", "alphabetical 排序"]
    }
  ]
}

之後可以用 promptfoo 之類工具 batch 跑。

常見 pitfall

症狀 原因 解法
Claude 從不觸發我的 skill description 寫得太籠統,匹配不到 user query description 加 2-3 個具體 trigger phrase("when the user asks X / Y / Z")
觸發了但行為不對 SKILL.md 步驟太抽象 改成 numbered list、每步明確動作
觸發了不該觸發 description 太寬,匹配到不相關 query 加 "Do NOT use for X" 收斂

進一步


2. 寫你的第一個 MCP server

MCP server = 一個獨立 process,跑起來提供 tool / resource / prompt 給 LLM host(Claude Desktop / Claude Code)。最小可 run 版 < 50 行 Python。

為什麼

  • Skill 是給 Claude 的「角色 + 規則」;MCP 是給 Claude 的「外部 function
  • Skill 不能讀檔、不能呼叫 API;MCP 可以(任何 tool 你寫得出來)
  • Skill 只在 Claude Code 跑;MCP 任何 LLM host(包括 Cursor、自寫 agent)都能接

步驟

Step 1:安裝官方 SDK

pip install mcp

Step 2:寫 server.py

最小範本——一個會回 echo 的 tool:

# server.py
from mcp.server import Server
from mcp.server.stdio import stdio_server
from mcp.types import Tool, TextContent

app = Server("hello-mcp")

@app.list_tools()
async def list_tools() -> list[Tool]:
    return [
        Tool(
            name="echo",
            description="Echo the input text back to the user.",
            inputSchema={
                "type": "object",
                "properties": {
                    "text": {
                        "type": "string",
                        "description": "Text to echo back",
                    }
                },
                "required": ["text"],
            },
        )
    ]

@app.call_tool()
async def call_tool(name: str, arguments: dict) -> list[TextContent]:
    if name == "echo":
        return [TextContent(type="text", text=f"Echo: {arguments['text']}")]
    raise ValueError(f"Unknown tool: {name}")

async def main():
    async with stdio_server() as (read, write):
        await app.run(read, write, app.create_initialization_options())

if __name__ == "__main__":
    import asyncio
    asyncio.run(main())

Step 3:在 Claude Desktop / Code 設定

Claude Desktop:編輯 ~/Library/Application Support/Claude/claude_desktop_config.json(macOS)或 %APPDATA%\Claude\claude_desktop_config.json(Windows):

{
  "mcpServers": {
    "hello-mcp": {
      "command": "python",
      "args": ["/絕對路徑/到/server.py"]
    }
  }
}

Claude Code:用 claude mcp add 指令:

claude mcp add hello-mcp python /絕對路徑/到/server.py

Step 4:重啟 Claude Desktop / Code、測試

你問:echo "hello world" 給我
Claude 回(會顯示 tool call icon):Echo: hello world

常見 pitfall

症狀 原因 解法
Claude Desktop 沒看到 tool server.py 啟動失敗 terminal 直接 python server.py 跑、看 stderr 哪裡爆
tool 列出但 call 失敗 inputSchema 格式錯(required 漏寫、type 寫錯) schema-design-cheatsheet.md
Claude 不主動叫 tool description 太籠統 description 改成「When the user asks X, use this tool」式的具體 trigger
stdio 跟 SSE 哪個用? local desktop integration 用 stdio;remote / web 用 SSE 第一個 server 一律用 stdio

進一步


3. Office Docs Workflow

用 Claude 讀寫 Word / Excel / PowerPoint / PDF 不用裝額外 tool——anthropics/skills 官方 repo 已經內建好。

為什麼

最常見場景: - 把 Markdown / 大綱 → 自動生成 Word / PPT - 讀一堆 PDF / Excel → 整理摘要 / 提取數字 - 改別人傳來的 docx → 加 track changes、或重排格式 - 把表格 cross-reference 寫成報告

不需要自己 parse XML、不需要找 python-docx / openpyxl 教學——anthropics/skills 已經包好。

步驟

Step 1:安裝 skills

最簡單:clone Anthropic 官方 skills repo 到 user-level skill 目錄:

# user 級(所有 project 用)
git clone https://github.com/anthropics/skills.git ~/.claude/skills/anthropic-skills

或者用 claude plugin install(如果有打包成 plugin)。

Step 2:重啟 Claude Code

  • skills/docx/ → docx 讀寫
  • skills/xlsx/ → Excel 讀寫
  • skills/pptx/ → PowerPoint 讀寫
  • skills/pdf/ → PDF 讀

Claude 會根據 user query 自動載入合適的 skill。

Step 3:實用 prompt 範本

從大綱生 PPT

讀我寫的 outline.md,照這個結構生一份 PPT:
- 封面 1 頁
- 每個 H2 一頁,bullet points 從 H3 內容濃縮
- 結語 1 頁

存成 ./output/presentation.pptx

讀 Excel 整理數字

讀 ./data/sales-2023.xlsx 第一張 sheet,把每個 region 的 Q4 總額算出來,
寫進 ./output/q4-summary.md(用 markdown table 格式)。

改 docx

讀 ./doc/draft.docx,把繁中詞彙轉成簡中(譬如「軟體」→「软件」),
存成 ./doc/draft.zh-Hans.docx,保留原本的 track changes。

讀 PDF 提取資訊

讀 ./papers/research.pdf,把 abstract、main contributions、limitations
分別寫進三個 markdown section,存到 ./notes/research-summary.md。

常見 pitfall

症狀 原因 解法
skill 沒被觸發 repo 路徑放錯 確認 SKILL.md 在 ~/.claude/skills/anthropic-skills/skills/docx/SKILL.md 這種層級
pptx 生出來樣式醜 沒給設計參考 prompt 加「參考 ./template.pptx 的樣式」
大 PDF 讀不完 context 爆 改用 SylphxAI/pdf-reader-mcp(5-10× 快)
Excel 公式被吃掉 docx skill 不處理 formulas 開檔前 prompt 明說「保留 formula 不要 hard-code」

進一步


4. NotebookLM Workflow

NotebookLM 是 Google 的 RAG-on-your-docs 工具。Claude Code 沒有官方 NotebookLM 整合,但社群有 2 個成熟方案。

為什麼

NotebookLM 強的地方: - 上傳 50 份 PDF 自動建索引 - Q&A 帶 citation(每個答案都標出來自哪份文件第幾頁) - 生成 summary / mind map / podcast-style audio overview

弱點:要在 NotebookLM 網頁裡用,跟你的其他 workflow(Claude Code、Obsidian、Zotero)斷開。

兩個方案橋接: 1. PleasePrompto/notebooklm-skill(Skill,browser automation) 2. teng-lin/notebooklm-py(Python API + CLI)

兩個方案怎麼選

場景 選哪個 為什麼
偶爾從 Claude Code 查一下 NotebookLM PleasePrompto/notebooklm-skill Claude Code 內 prompt 一句話就跑、setup 簡單
批次操作(建 100 個 notebook、批次匯入文件) teng-lin/notebooklm-py Python API,可程式化跑
不想 Google 政策變動就壞 (等 Google 出官方 API) 兩個都是 unofficial、會有風險

方案 A:PleasePrompto/notebooklm-skill

Step 1:clone 到 skills 目錄

git clone https://github.com/PleasePrompto/notebooklm-skill ~/.claude/skills/notebooklm

Step 2:第一次跑會要 Google login(瀏覽器自動化)

照 repo README 設定 OAuth / 登入 cookie。

Step 3:實用 prompt

查我 NotebookLM 內「LLM Agents 2024」這個 notebook,
找出所有提到 "tool use" 的段落,整理成一份比較表,
帶上每個來源文件名跟頁數。

方案 B:teng-lin/notebooklm-py

pip install notebooklm-py

範例:

from notebooklm import NotebookLM
nlm = NotebookLM() # OAuth 流程

# 建一個 notebook
nb = nlm.create_notebook("My Research")

# 批次匯入 PDF
for pdf in glob.glob("papers/*.pdf"):
    nb.add_source(pdf)

# Q&A
answer = nb.query("What are the main contributions?")
print(answer.text)
print(answer.citations)

常見 pitfall

症狀 原因 解法
突然不能用 Google 改了內部 API 檢查 issue tracker、等社群更新
Q&A 答案模糊 上傳文件太多、retrieve 失準 拆成幾個 notebook(每個 < 50 source)
中文支援不好 預設 UI 設成英文 NotebookLM 設定改 zh-Hant

進一步


5. Zotero Workflow

Zotero 管文獻,加上 WenyuChiou/zotero-skills 後 Claude Code 能直接搜 / 加 / 分類 / 標 references。

為什麼

研究流程經典痛點: - 「我那篇 paper 在哪?」——Zotero 有,但要切換視窗 - 「給我所有講 transformer 的 paper 摘要」——要自己 select、export、丟給 LLM - 「這篇 paper 該打什麼 tag?」——人工

zotero-skills 把這些變成 Claude Code 內一句 prompt 就跑。

跟 zotero-gpt 差別

工具 角色 適合
MuiseDestiny/zotero-gpt Zotero plugin(在 Zotero 內部 chat) 邊讀 paper 邊問 LLM、不切換視窗
WenyuChiou/zotero-skills Claude Code skill(從 外部 操作 Zotero) 寫 paper / 整理文獻時,Claude Code 為主

互補不衝突,可以兩個都裝。

步驟

Step 1:開啟 Zotero local API

Zotero 桌面版預設不開 API。打開: - Edit → Preferences → Advanced → Config Editor - 找 extensions.zotero.httpServer.enabled,設 true - 找 extensions.zotero.httpServer.port,預設 23119

Step 2:clone zotero-skills

git clone https://github.com/WenyuChiou/zotero-skills ~/.claude/skills/zotero-skills

照 repo README 設定(包含 API key 給 Web API 寫操作用)。

Step 3:實用 prompt

搜文獻

搜我 Zotero library 內所有 2023 年之後、跟 multi-agent 相關的 paper,
按 cited count 排序、輸出成 markdown table。

自動分類

看我 collection "Inbox" 裡的 50 篇 paper,按主題自動建 sub-collection
(譬如 "RAG"、"Tool Use"、"Multi-Agent"),把 paper 移進去。

標 tag

讀我 Zotero 內這篇 paper(attached PDF 看完),
從 abstract 提取 5 個 keyword 當 tag 加上去。

寫 paper 引用整理

我的 paper draft 在 ./paper/v3.tex,
找出所有 \cite{} 對應的 BibTeX entry,跟 Zotero library 對比,
把缺的 export 出 .bib 給我。

常見 pitfall

症狀 原因 解法
skill 觸發但 query 失敗 Zotero 沒在跑 / API 沒開 開 Zotero 桌面版 + 確認 port 23119 listening
寫操作(add / move)失敗 local API 是 read-only,要用 Web API 設定 Web API key(zotero.org/settings/keys
collection 結構亂 自動分類 prompt 沒給目錄結構 prompt 給 Claude 看現有 collection tree、再決定怎麼分

進一步


6. 本機 LLM + CLI Agent 快速 walkthrough

30 分鐘把 Stage 1 的本機模型接到 Stage 5 的 CLI agent:離線、隱私資料、不想用 API 額度時,可以先用這條路線做 end-to-end 驗證。

為什麼

Stage 1 教你用 Ollama / llama.cpp / vLLM 跑本機 LLM;Stage 5 教 Claude Code、MCP、Skills、Plugins 的 agent 生態。中間常見的誤會是:Claude Code 不是本機 LLM runner。Claude Code 需要 Anthropic OAuth / API key,不能直接把 model endpoint 改成 Ollama 或其他本機 endpoint。

如果目標是「本機 LLM + CLI agent」,選擇支援 BYO LLM 的 CLI 會更直接:OpenCode / goose / Aider / Hermes Agent 都能接 OpenAI-compatible endpoint 或 Ollama provider。這個 recipe 用一個短流程讓你先跑通 model、agent、任務三件事。

步驟

Step 1:Ollama + model(10 分鐘)

# 安裝 Ollama:https://ollama.com
ollama pull qwen2.5:3b
# RAM 16GB+ 可以改試:ollama pull qwen2.5:7b
ollama serve

確認 OpenAI-compatible API 有回應:

curl http://localhost:11434/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{"model":"qwen2.5:3b","messages":[{"role":"user","content":"用 3 句話解釋 ReAct agent。"}]}'

Step 2:選一個 CLI agent 接 Ollama(10 分鐘)

OpenCode:適合想切換多 provider、又要接本機模型的人。

npm install -g opencode-ai
opencode auth login # provider 選 Ollama,endpoint 設 http://localhost:11434/v1
opencode

goose:內建 Ollama provider,適合先做本機 agent 試跑。

# 安裝方式看 https://block.github.io/goose
goose configure # provider 選 Ollama,model 設 qwen2.5:3b
goose session start

Aider:git-native,適合在 repo 內做小型程式碼修改。

pip install aider-chat
aider --model ollama/qwen2.5:3b --no-show-model-warnings

Hermes Agent:適合跑在 VPS,讓 Telegram / Slack / Discord 變成 agent 入口。

curl -fsSL https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash
hermes model set ollama:qwen2.5:3b
hermes

Step 3:跑一個真實小任務(10 分鐘)

不要只問「hello world」。挑一個會碰到檔案、摘要、表格或搜尋的小任務:

  • ~/Downloads 找 5 個 PDF,抽出每篇 paper 的 1 句 summary 與 method。
  • data.csv 前 3 欄,輸出 Markdown table 並指出欄位問題。
  • ~/notes/ 裡 7 天內提到 agent safety 的段落,整理成 checklist。

觀察三件事:

  • Speed:本機小模型常比 API 慢 2-5 倍。
  • Quality:3B / 7B 模型的 reasoning、長 context、複雜程式碼能力通常不如 Claude。
  • Cost:token 成本是 $0,但會吃本機 RAM / VRAM 與電力。

Step 4:跟 Claude Code 的差異(5 分鐘)

面向 Claude Code OpenCode + Ollama
LLM Anthropic hosted 本機模型
成本 訂閱或 per-token $0 token cost
速度 通常較穩 看硬體,常慢 2-5 倍
隱私 內容送 Anthropic 內容留在本機
Reasoning 上限 Claude 4.5+ 較強 取決於本機模型
適合 use case 複雜 codebase、長 context、可靠推理 隱私資料、離線 demo、低成本反覆試

重要限制:Claude Code 不能直接用本機 LLM

Claude Code 目前需要 Anthropic OAuth / API key,沒有官方設定可以把模型切成 Ollama 或本機 endpoint。網路上可能有 proxy 或 API shim 做實驗,但這不是官方支援路徑,穩定性與相容性要自己承擔。

要用本機 LLM,建議把「Claude Code」跟「支援 BYO LLM 的 CLI agent」分開看:Claude Code 用在需要 Claude 品質的工作;OpenCode / goose / Aider / Hermes 用在本機、離線、隱私或低成本實驗。

常見 pitfall

問題 原因 解法
connection refused Ollama server 沒在背景跑 開另一個 terminal 跑 ollama serve
model output 斷句怪、邏輯弱 3B 模型能力有限 改用 qwen2.5:7bdeepseek-r1:7b
CLI agent 沒改到檔案 本機模型太弱,或 prompt 太模糊 縮小任務、指定檔案與成功條件
memory / OOM 模型吃掉 RAM / VRAM 先用 qwen2.5:3b,再升到 7B;必要時開 swap

進一步

  • Stage 1 Local LLM 練習:Ollama / llama.cpp / vLLM 的差異
  • cli-agents-guide.md:7 個 CLI agent 怎麼選
  • Hermes Agent README:多平台 gateway(Telegram / Discord / Slack)與 provider 設定

找不到你要的 recipe?

要新 recipe → 開 issue 或直接 PR 一份。recipe 格式:為什麼 + 步驟 + 範本 prompt + 常見 pitfall + 進一步