Claude Code 扩展机制:MCP、Tools、Skills、Hooks
7 min
Claude Code 有四种扩展机制,层级和用途不同:
| 机制 | 本质 | 类比 |
|---|---|---|
| MCP | 协议/插件系统 | 浏览器的扩展插件 |
| Tools | 原子操作 | 键盘上的按键 |
| Skills | 工作流模板 | 操作手册/SOP |
| Hooks | 事件触发的自动化脚本 | CI/CD 的 webhook |
一、Tools — 内置的原子操作
Claude Code 自带的工具,是 Claude 与环境交互的基本手段:
Read/Write/Edit— 文件读写Bash— 执行 shell 命令Grep/Glob— 搜索文件内容和路径WebFetch/WebSearch— 网络访问
特点: 自带的,用户改不了,每次操作都是调用一个 tool。
二、MCP — 给 Claude 装插件
是什么
MCP(Model Context Protocol)是 Anthropic 提出的开放协议,用于连接 LLM 与外部数据源和工具。
一句话:MCP = 标准化的”给 Claude 装第三方工具”的协议。
没有 MCP vs 有 MCP
没有 MCP:
用户: "帮我查今天天气"
Claude: ❌ 我没有天气相关的工具
有 MCP:
用户: "帮我查今天天气"
Claude: ✅ 调用 weather_server.get_weather("北京") → "晴,25°C"三个核心概念
| 类型 | 装饰器 | 作用 | 类比 |
|---|---|---|---|
| Tool | @mcp.tool() | Claude 调用的函数 | API 接口 |
| Resource | @mcp.resource(uri) | Claude 读取的数据 | GET 请求 |
| Prompt | @mcp.prompt() | 预定义提示词模板 | 快捷指令 |
最小示例
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("my-server")
@mcp.tool()
def hello(name: str) -> str:
"""当用户想跟某人打招呼、问候时调用"""
return f"你好, {name}!"
if __name__ == "__main__":
mcp.run(transport="stdio")6 行有效代码,就是一个完整的 MCP Server。
完整示例:计算器 + 知识库
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("demo-calculator")
# ── Tool: Claude 可以调用的函数 ──────────────────
@mcp.tool()
def add(a: float, b: float) -> float:
"""两数相加"""
return a + b
@mcp.tool()
def multiply(a: float, b: float) -> float:
"""两数相乘"""
return a * b
@mcp.tool()
def calculate(expression: str) -> str:
"""当用户要求计算数学表达式时调用,如 '2 + 3 * 4'"""
allowed = set("0123456789+-*/.() ")
if not all(c in allowed for c in expression):
return "错误: 表达式包含不允许的字符"
try:
return f"{expression} = {eval(expression)}"
except Exception as e:
return f"计算错误: {e}"
# ── Resource: Claude 可以读取的数据 ──────────────
KNOWLEDGE_BASE = {
"python": "Python 是一种高级编程语言,以简洁易读著称。",
"mcp": "Model Context Protocol,Anthropic 提出的开放协议。",
"claude": "Claude 是 Anthropic 开发的 AI 助手。",
}
@mcp.resource("kb://topics/{topic}")
def get_knowledge(topic: str) -> str:
"""查询知识库"""
return KNOWLEDGE_BASE.get(topic, f"未找到主题: {topic}")
@mcp.resource("kb://topics")
def list_topics() -> str:
"""列出所有主题"""
return "\n".join(f"- {k}" for k in KNOWLEDGE_BASE)
# ── Prompt: 预定义提示词模板 ────────────────────
@mcp.prompt()
def explain_like_im_five(topic: str) -> str:
"""生成"给5岁小孩解释"的提示词"""
return f"请用最简单的语言解释 '{topic}',像给5岁小朋友讲故事一样。"
if __name__ == "__main__":
mcp.run(transport="stdio")如何注册
在 Claude Code 的 settings.json 中添加:
{
"mcpServers": {
"demo-calculator": {
"command": "python",
"args": ["path/to/server.py"]
}
}
}重启 Claude Code 后生效。
Tool 描述的重要性
描述不是关键字匹配,而是给 Claude 看的说明书。Claude 根据描述自主判断什么时候调用:
# ❌ 描述差 → Claude 不知道什么时候用
@mcp.tool()
def hello(name: str) -> str:
"""hello"""
# ✅ 描述好 → Claude 知道什么时候用
@mcp.tool()
def hello(name: str) -> str:
"""当用户想跟某人打招呼、问候、说你好时调用"""MCP 和内置 Tools 的区别
内置 Tools → Claude Code 自带的,你改不了
MCP Tools → 你自己写的,想加什么加什么类比手机:
- 系统自带 App → 相机、电话、短信(内置 Tools)
- 你装的 App → 微信、支付宝、抖音(MCP Tools)
MCP 的层级关系
MCP → 协议(规定"怎么接工具")
MCP Server → 遵循协议的程序(你写的 Python 脚本)
Tool → Server 里暴露的具体函数类比 USB:
- MCP = USB 协议
- MCP Server = USB 设备(鼠标、U盘)
- Tool = 设备功能(点击、存储)
三、Skills — 工作流模板
预定义的提示词模板,通过 /skill-name 触发,指导 Claude 按特定流程完成任务:
/commit— 提交代码的标准化流程/learning— 创建学习计划/gsd-plan-phase— 规划阶段的复杂工作流
本质: Claude 的”技能书”,封装了领域知识和最佳实践,决定 HOW 做事。
与 MCP 的区别:
- MCP → 加能力(让 Claude 能做新事情)
- Skills → 加流程(让 Claude 按特定方式做事)
四、Hooks — 监控 Claude 的行为
是什么
在特定事件发生时,自动执行的 shell 命令。
不是 Claude 执行的,是 Claude Code 这个程序执行的。
类比
Git Hook → git commit 时自动跑 lint 检查
Claude Hook → Claude 调用工具时自动跑你指定的命令可以 hook 的事件
| 事件 | 触发时机 |
|---|---|
PreToolUse | Claude 调用工具之前 |
PostToolUse | Claude 调用工具之后 |
Notification | Claude 发通知时 |
Stop | Claude 停止响应时 |
配置方式
在 settings.json 中配置:
{
"hooks": {
"事件名": [
{
"matcher": "工具名",
"command": "要执行的 shell 命令"
}
]
}
}matcher 匹配工具名,command 是要执行的 shell 命令。
实际例子
例1:每次 Claude 写文件前,自动备份
{
"hooks": {
"PreToolUse": [
{
"matcher": "Write",
"command": "cp ${file_path} ${file_path}.bak"
}
]
}
}例2:Claude 执行 Bash 命令后,自动记录日志
{
"hooks": {
"PostToolUse": [
{
"matcher": "Bash",
"command": "echo \"$(date): bash command ran\" >> ~/claude.log"
}
]
}
}例3:Claude 停止时,桌面通知你
{
"hooks": {
"Stop": [
{
"command": "notify-send 'Claude 完成了'"
}
]
}
}Hooks 和 MCP 的区别
MCP → 给 Claude 加能力(让它能做新事情)
Hook → 监控 Claude 的行为(在它做事的前后自动插一脚)| MCP | Hook | |
|---|---|---|
| 谁执行 | Claude 调用 | Claude Code 自动执行 |
| 目的 | 扩展能力 | 监控/自动化 |
| 用户感知 | Claude 主动用 | 用户通常无感 |
一句话:MCP 是给 Claude 加技能,Hook 是给 Claude 加规矩。