# Cookbook — 把概念變成可執行 recipe > **繁體中文** | [简体中文](./cookbook.zh-Hans.md) | [English](./cookbook.en.md) > Stage 5(Claude Code 生態)跟 [`mcp-skills-catalog.md`](mcp-skills-catalog.md) 講「概念」跟「有哪些工具」。這份 cookbook 補中間缺的:「**怎麼動手做出來**」。每個 recipe 是一份 step-by-step + sample code + 常見 pitfall,~30-50 分鐘做完一個。 > > 不是 reference 也不是 tutorial——是 recipe,挑你需要的那道煮就好。 --- ## 📋 目錄 1. [寫你的第一個 Skill(SKILL.md anatomy)](#1-寫你的第一個-skill) 2. [寫你的第一個 MCP server(Python SDK)](#2-寫你的第一個-mcp-server) 3. [Word / Excel / PowerPoint workflow](#3-office-docs-workflow) 4. [NotebookLM workflow](#4-notebooklm-workflow) 5. [Zotero workflow](#5-zotero-workflow) 6. [本機 LLM + CLI Agent 快速 walkthrough](#6-本機-llm--cli-agent-快速-walkthrough) --- ## 1. 寫你的第一個 Skill > Skill = 一個資料夾含 `SKILL.md`,Claude Code 啟動時自動 discover、按情境自動載入。最小 viable 版本 50 行就能跑。 > > 📚 **這份是「30 分鐘跑出第一個」實作版。想看「Skill 怎麼寫得好」深度討論** → [Hello-Agents Extra08:如何寫出好的 Skill](https://github.com/datawhalechina/hello-agents/blob/main/Extra-Chapter/Extra08-如何写出好的Skill.md)(中文最完整的 Skill 最佳實踐,討論 description 寫法、references / scripts 設計等)。兩份互補:先用本 recipe 跑出第一個,再讀那份 polish 寫法。 ### 為什麼 寫 Skill 跟「在 prompt 裡加幾段 instruction」差別在於: - Skill 是 **per-domain** 的,不會污染所有 conversation - 可以打包跨 project / team 共用 - Claude 自己決定何時載入(看 description match 不 match) ### 步驟 #### Step 1:建立 skill 資料夾 兩個位置可以放(看你要 user 級還是 project 級): ```bash # 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 的範本: ```markdown --- 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 順序」 ```markdown --- 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:測試 ```bash # 重啟 Claude Code(讓它重新 discover skills) # 在 conversation 裡丟一個觸發句 # e.g.「幫我整理一下這段 Python 的 imports」 # 觀察 Claude 有沒有按照 SKILL.md 的步驟做 ``` #### Step 4(進階):加 evals 在 skill folder 內加 `evals/evals.json`: ```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" 收斂 | ### 進一步 - 看 [Stage 5.3](../stages/05-claude-code-ecosystem.md#53--skillsclaude-code-的行為層-claude-code-生態最關鍵的一層) 的 Skill anatomy 詳解 - 看 [`anthropics/skills`](https://github.com/anthropics/skills) 官方 skill 範本(docx / xlsx / pptx 等)的寫法 - 多個 skill 打包成 plugin → [Stage 5.4](../stages/05-claude-code-ecosystem.md#54--plugins-與-marketplaces) --- ## 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 ```bash pip install mcp ``` #### Step 2:寫 `server.py` 最小範本——一個會回 echo 的 tool: ```python # 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): ```json { "mcpServers": { "hello-mcp": { "command": "python", "args": ["/絕對路徑/到/server.py"] } } } ``` **Claude Code**:用 `claude mcp add` 指令: ```bash 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`](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 | ### 進一步 - 看 [Stage 5.2](../stages/05-claude-code-ecosystem.md#52--mcpmodel-context-protocol-基礎) 的 MCP 完整介紹 - 看 [`modelcontextprotocol/servers`](https://github.com/modelcontextprotocol/servers) 官方範例(filesystem、github、sqlite、time 等) - 寫 production server 看 [Stage 5.2「練習:MCP in production」](../stages/05-claude-code-ecosystem.md#52--mcpmodel-context-protocol-基礎) 跟 [`anthropics/claude-code`](https://github.com/anthropics/claude-code) 的 `~/.claude/skills/` --- ## 3. Office Docs Workflow > 用 Claude 讀寫 Word / Excel / PowerPoint / PDF 不用裝額外 tool——[`anthropics/skills`](https://github.com/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 目錄: ```bash # 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`](https://github.com/SylphxAI/pdf-reader-mcp)(5-10× 快) | | Excel 公式被吃掉 | docx skill 不處理 formulas | 開檔前 prompt 明說「保留 formula 不要 hard-code」 | ### 進一步 - catalog 2 [`mcp-skills-catalog.md` 2 辦公文件](mcp-skills-catalog.md#2-辦公文件word--excel--powerpoint--pdf):補強版 office skill / Excel / PPT 專用 MCP - 中文圈 office workflow:[`leemysw/feishu-docx`](https://github.com/leemysw/feishu-docx) 飛書 / Lark docs ↔ Markdown --- ## 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 目錄 ```bash 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 ```bash pip install notebooklm-py ``` 範例: ```python 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 | ### 進一步 - catalog 1 [`mcp-skills-catalog.md` 1 筆記 / 知識庫](mcp-skills-catalog.md#1-筆記--知識庫) - 完整 research workspace:用 [`WenyuChiou/research-hub`](https://github.com/WenyuChiou/research-hub) 整合 NotebookLM + Zotero + Obsidian --- ## 5. Zotero Workflow > Zotero 管文獻,加上 [`WenyuChiou/zotero-skills`](https://github.com/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`](https://github.com/MuiseDestiny/zotero-gpt) | Zotero plugin(在 Zotero **內部** chat) | 邊讀 paper 邊問 LLM、不切換視窗 | | [`WenyuChiou/zotero-skills`](https://github.com/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 ```bash 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](https://www.zotero.org/settings/keys)) | | collection 結構亂 | 自動分類 prompt 沒給目錄結構 | prompt 給 Claude 看現有 collection tree、再決定怎麼分 | ### 進一步 - 完整 research workspace:[`WenyuChiou/research-hub`](https://github.com/WenyuChiou/research-hub) 整合 Zotero + Obsidian + NotebookLM - 學術論文寫作:[`WenyuChiou/academic-writing-skills`](https://github.com/WenyuChiou/academic-writing-skills) - 14 個研究流程 skill 集:[`WenyuChiou/ai-research-skills`](https://github.com/WenyuChiou/ai-research-skills) --- ## 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 分鐘) ```bash # 安裝 Ollama:https://ollama.com ollama pull qwen2.5:3b # RAM 16GB+ 可以改試:ollama pull qwen2.5:7b ollama serve ``` 確認 OpenAI-compatible API 有回應: ```bash 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、又要接本機模型的人。 ```bash npm install -g opencode-ai opencode auth login # provider 選 Ollama,endpoint 設 http://localhost:11434/v1 opencode ``` **goose**:內建 Ollama provider,適合先做本機 agent 試跑。 ```bash # 安裝方式看 https://block.github.io/goose goose configure # provider 選 Ollama,model 設 qwen2.5:3b goose session start ``` **Aider**:git-native,適合在 repo 內做小型程式碼修改。 ```bash pip install aider-chat aider --model ollama/qwen2.5:3b --no-show-model-warnings ``` **Hermes Agent**:適合跑在 VPS,讓 Telegram / Slack / Discord 變成 agent 入口。 ```bash 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:7b` 或 `deepseek-r1:7b` | | CLI agent 沒改到檔案 | 本機模型太弱,或 prompt 太模糊 | 縮小任務、指定檔案與成功條件 | | memory / OOM | 模型吃掉 RAM / VRAM | 先用 `qwen2.5:3b`,再升到 7B;必要時開 swap | ### 進一步 - Stage 1 [Local LLM 練習](../stages/01-llm-basics.md#練習-6local-llm):Ollama / llama.cpp / vLLM 的差異 - [`cli-agents-guide.md`](cli-agents-guide.md):7 個 CLI agent 怎麼選 - Hermes Agent README:多平台 gateway(Telegram / Discord / Slack)與 provider 設定 --- ## 找不到你要的 recipe? - 看 [Stage 5](../stages/05-claude-code-ecosystem.md) 完整概念 - 看 [`mcp-skills-catalog.md`](mcp-skills-catalog.md) 完整工具清單 - 看 [`schema-design-cheatsheet.md`](schema-design-cheatsheet.md) 寫 tool schema 的細節 - 看 [`cli-agents-guide.md`](cli-agents-guide.md) 7 個主流 CLI agent 比較 要新 recipe → 開 issue 或直接 PR 一份。recipe 格式:**為什麼 + 步驟 + 範本 prompt + 常見 pitfall + 進一步**。