跳转至

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
import requests
from 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 启动失败 终端直接 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 + 进一步