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 的事件

事件触发时机
PreToolUseClaude 调用工具之前
PostToolUseClaude 调用工具之后
NotificationClaude 发通知时
StopClaude 停止响应时

配置方式

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 的行为(在它做事的前后自动插一脚)
MCPHook
谁执行Claude 调用Claude Code 自动执行
目的扩展能力监控/自动化
用户感知Claude 主动用用户通常无感

一句话:MCP 是给 Claude 加技能,Hook 是给 Claude 加规矩。