发布日期:2026-06-26 | 话题:AI 编程工具 | 适用人群:Claude Code 用户、开发者、AI 工具探索者

Claude Code 的四大扩展机制经常被混为一谈,但它们解决的是完全不同的问题:MCP(Model Context Protocol)是让 Claude 连接外部系统的标准化协议,解决的是"Claude 能调用哪些工具"的问题;Skills 是 Markdown 格式的工作流指令文件,解决的是"Claude 在特定场景下遵循什么流程"的问题;Plugins 是把 Skills、Commands、Hooks、MCP 配置打包在一起的分发容器,解决的是"如何把一套配置分享给他人或跨项目复用"的问题;Hooks 是 Agent 执行生命周期中的拦截点,解决的是"特定操作发生时自动触发什么逻辑"的问题。四者层次不同、触发方式不同、适用场景不同——本文逐一解析每种机制的定义、配置方式、典型用法,以及它们之间的协作关系。

 

四者关系一览

在深入每个概念之前,先建立整体认知:

机制

本质

触发方式

解决的问题

MCP

外部系统连接协议

Claude 主动调用工具

连接 GitHub、数据库、Slack 等外部服务

Skills

Markdown 工作流指令

用户 /skill名 或 Claude 读取

持久化特定场景的执行流程和规范

Plugins

配置打包分发容器

安装时一次性加载

跨项目/跨用户分享一套完整配置

Hooks

生命周期钩子脚本

Agent 操作前后自动触发

拦截危险命令、自动格式化、日志记录

一句话总结它们的关系:MCP 给 Claude 装上手脚(工具),Skills 教 Claude 做事的方法论,Hooks 在每个动作前后加规则,Plugins 把这三样东西打包交付。

 

MCP:给 Claude 连接外部世界的标准协议

是什么

MCP(Model Context Protocol,模型上下文协议)是 Anthropic 制定的开放标准,让 Claude Code 以统一方式与任意外部服务通信,调用外部工具、读取资源、执行操作。类比 HTTP 之于浏览器:HTTP 是浏览器访问网站的标准,MCP 是 Claude 调用外部工具的标准。

没有 MCP 之前:每个 AI 工具要集成 GitHub 就写一套 GitHub 适配,要集成 Slack 再写一套,N 个工具 × M 个服务 = N×M 套集成代码。

有了 MCP:服务商写一个 MCP Server,所有支持 MCP 的 AI 工具(Claude Code、Cursor、Copilot、Windsurf)都能直接连接。2026 年 MCP 已成为主流 AI 编程工具的通用标准。

MCP Server 的三类能力

能力类型

描述

示例

Tools(工具)

Claude 可以主动调用的函数

创建 GitHub Issue、查询数据库、发送 Slack 消息

Resources(资源)

Claude 可以读取的上下文数据

项目文档、API 规范、设计稿

Prompts(提示模板)

预定义的提示词模板

代码审查模板、文档生成模板

配置方式

在 ~/.claude/settings.json 的 mcpServers 字段中添加:

 

{
  "mcpServers": {
    "github": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-github"],
      "env": {
        "GITHUB_PERSONAL_ACCESS_TOKEN": "your-token"
      }
    },
    "filesystem": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-filesystem", "/path/to/allowed/dir"]
    },
    "fetch": {
      "command": "uvx",
      "args": ["mcp-server-fetch"]
    }
  }
}

配置后重启 Claude Code,在对话中可以直接说:

 

"查看 GitHub 仓库 owner/repo 最近 10 个 PR"
"读取 /docs/api-spec.md 文件内容"

Claude 会自动识别并调用对应 MCP Server 的工具。

常用 MCP Server

MCP Server

安装命令

能力

@modelcontextprotocol/server-github

npx -y 运行

GitHub 仓库操作、Issue、PR 管理

@modelcontextprotocol/server-filesystem

npx -y 运行

指定目录文件读写(沙盒外访问)

mcp-server-fetch

uvx 运行

抓取任意 URL 内容

@modelcontextprotocol/server-postgres

npx -y 运行

PostgreSQL 数据库查询

@modelcontextprotocol/server-slack

npx -y 运行

发送 Slack 消息、读取频道历史

 

Skills:持久化工作流程的 Markdown 指令

是什么

Skill 是一个 Markdown 格式的工作流程文件,告诉 Claude 在特定场景下应该遵循什么步骤、参考什么规范、输出什么格式。

与 Prompt 的区别:Prompt 是每次对话手写的一次性指令;Skill 是持久化的、可复用的工作流——装上之后 Claude 自动读取并执行,不需要每次重复说明流程。

与 CLAUDE.md 的区别:CLAUDE.md 是项目级的背景知识(“这个项目是什么、不要改哪些文件”);Skill 是动作级的执行流程(“做代码审查时走这 5 步”)。

Skill 文件结构

 

---
description: 对 PR 进行安全性和规范性代码审查
---
 
# 代码审查 Skill
 
## 执行步骤
 
1. 读取改动的所有文件,列出修改了什么
2. 检查以下安全风险:
   - SQL 注入(用户输入是否直接拼接进查询)
   - XSS(输出到 HTML 的内容是否转义)
   - 路径遍历(文件路径是否经过验证)
3. 检查代码规范:
   - 函数命名是否符合驼峰命名
   - 是否有未处理的 error
   - 注释是否充分
4. 输出格式:
   - 🔴 高风险:必须修复才能合并
   - 🟡 中风险:建议修复
   - 🟢 通过:无需修改
 
当前改动内容:$ARGUMENTS

Skill 的存放位置

 

全局 Skills(所有项目可用):
~/.claude/skills/skill名/skill.md
或
~/.claude/commands/skill名.md
 
项目级 Skills(只当前项目可用):
.claude/skills/skill名/skill.md
或
.claude/commands/skill名.md

触发方式

 

# 斜杠命令触发(文件名即命令名)
/code-review src/auth/login.ts
 
# 在对话中自然描述(Claude 自动匹配相关 Skill)
"帮我审查这个文件的安全性"

高价值 Skill 场景

 代码审查(安全 + 规范 + 性能三维度)

 提交前检查(lint + test + 提交信息格式)

 技术文档生成(读代码 → 输出 API 文档)

 数据库迁移安全审核

 单测生成(按项目约定生成测试文件)

 

Hooks:Agent 生命周期的自动化切面

是什么

Hooks 是在 Claude Code 执行特定操作前后自动运行的脚本。类比 Git Hooks(pre-commit、post-merge)或 Spring AOP(切面编程):在 Agent 动作的特定节点插入你的逻辑,无需每次手动触发。

核心事件

来源:Claude Code 官方文档(code.claude.com/docs/en/hooks)。官网共定义 29 个事件,按使用频率列出高频事件:

事件

触发时机

可阻止?

典型用途

PreToolUse

任何工具执行

拦截危险命令、过滤参数、记录日志

PostToolUse

任何工具执行

自动格式化、触发测试(工具已运行)

UserPromptSubmit

用户提交提示词后、Claude 处理前

过滤敏感词、注入上下文

Stop

Claude 完成响应后

✅(阻止停止)

生成摘要、发送通知、触发 CI

SessionStart

会话开始或恢复时

加载环境、初始化上下文

SessionEnd

会话终止时

清理临时文件、记录审计日志

FileChanged

监视的文件发生变更时

响应 .env 变化、热重载配置

PreCompact

上下文压缩前

阻止压缩、保存重要上下文

SubagentStart / SubagentStop

子代理生成/完成时

❌/✅

子任务监控、结果校验

注意:不存在 PreBash/PostBash/PreWrite/PostWrite 等具体工具事件——官网只有 PreToolUse/PostToolUse,通过 matcher 字段过滤具体工具(Bash、Write、Edit 等)。

配置方式

在 ~/.claude/settings.json 中配置:

 

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Write|Edit",
        "hooks": [
          {
            "type": "command",
            "command": "~/.claude/hooks/format-on-save.sh"
          }
        ]
      }
    ],
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "~/.claude/hooks/safety-check.sh"
          }
        ]
      }
    ]
  }
}

脚本必须有执行权限:

 

chmod +x ~/.claude/hooks/format-on-save.sh

实用 Hook 脚本示例

格式化保存(PostToolUse,matcher: Write|Edit):

 

#!/bin/bash
# ~/.claude/hooks/format-on-save.sh
# 文件写入后自动运行 prettier
# Hook 输入通过 stdin 以 JSON 传入,用 jq 解析文件路径
 
INPUT=$(cat)
FILE=$(echo "$INPUT" | jq -r '.tool_input.file_path // empty')
 
if [[ "$FILE" =~ \.(ts|tsx|js|jsx)$ ]]; then
  npx prettier --write "$FILE" 2>/dev/null
fi

危险命令拦截(PreToolUse,matcher: Bash):

 

#!/bin/bash
# ~/.claude/hooks/safety-check.sh
# 拦截高风险 Bash 命令
# Hook 输入通过 stdin 以 JSON 传入
 
INPUT=$(cat)
CMD=$(echo "$INPUT" | jq -r '.tool_input.command // empty')
 
DANGEROUS_PATTERNS=("rm -rf /" "git push --force" "DROP TABLE")
 
for pattern in "${DANGEROUS_PATTERNS[@]}"; do
  if echo "$CMD" | grep -qi "$pattern"; then
    echo "危险命令已被拦截: $pattern" >&2
    exit 2   # exit 2 = 阻止该工具调用,stderr 内容反馈给 Claude
  fi
done

退出码说明(来源:官方文档):exit 0 = 允许继续;exit 2 = 阻止当前工具调用,stderr 内容反馈给 Claude;exit 1(其他非零)= 非阻塞报错,执行继续——只有 exit 2 才能真正拦截操作。Hook 输入通过 stdin 以 JSON 传入,不是环境变量。

 

Plugins:把配置打包分发的容器

是什么

Plugin 不是一种新功能,而是把 Skills、Commands、Hooks、MCP 配置打包在一起的分发单元。类比:Skills/Hooks/MCP 是商品,Plugin 是快递包裹——包裹本身不是商品,但它让商品能被送达。

一个 Plugin 可以同时包含:

 

my-plugin/
├── skill.md                  # Skill 文件(工作流指令)
├── commands/
│   └── review.md             # 自定义命令
├── hooks/
│   └── format.sh             # Hooks 脚本
└── plugin.json               # Plugin 元数据

plugin.json 示例:

 

{
  "name": "code-quality",
  "version": "1.2.0",
  "description": "代码质量全流程套件:审查 + 自动格式化 + 提交检查",
  "skills": ["skill.md"],
  "commands": ["commands/review.md"],
  "hooks": {
    "PostWrite": "hooks/format.sh"
  }
}

安装 Plugin

 

# 从本地目录安装
claude plugin install ./my-plugin/
 
# 从 GitHub 安装
claude plugin install github:用户名/仓库名
 
# 列出已安装的 Plugins
claude plugin list

Plugin vs 直接放文件

 

直接放文件

Plugin

适合场景

个人项目、临时配置

团队共享、跨项目复用

版本管理

有版本号,可升级

分发方式

手动复制

claude plugin install

更新

手动覆盖

claude plugin update

 

四者协作:一个完整场景的组合用法

以"提交代码前的质量检查流程"为例,四种机制如何协同:

 

用户运行 /pre-commit 命令(触发 Skill)
    │
    ├── Skill 执行步骤:
    │   1. 读取 git diff(调用 Bash 工具)
    │   2. 调用 GitHub MCP Server 查看 PR 模板(MCP)
    │   3. 分析改动,按模板生成提交信息
    │   4. 运行测试命令
    │
    ├── Hooks 并行触发:
    │   PreBash:检查即将运行的测试命令是否安全
    │   PostWrite:每次 Claude 修改文件后自动格式化
    │   PostBash:测试跑完后记录结果到日志
    │
    └── Plugin 保证:
        上述 Skill + Hooks + MCP 配置统一打包,
        新成员一条命令安装,无需手动配置

选哪个:按需求快速决策

你的需求

用哪个

让 Claude 能查 GitHub、读数据库、发 Slack

MCP(接外部服务)

代码审查/文档生成/单测生成有固定流程

Skill(持久化工作流)

每次保存文件后自动格式化

Hook(PostWrite 事件)

阻止 Claude 执行危险命令

Hook(PreBash 事件)

把配置分享给团队成员

Plugin(打包分发)

跨多个项目复用同一套配置

Plugin(统一安装)

常见问题 FAQ

Q1:MCP 和 Claude Code 的内置工具(Bash、Read、Write)有什么区别?

内置工具(Bash、Read、Write、Edit 等)是 Claude Code 自带的基础能力,覆盖本地文件系统和命令执行,不需要任何配置。MCP 扩展的是这套内置能力之外的外部系统访问——GitHub、数据库、第三方 API 等。内置工具解决本地操作,MCP 解决外部集成,两者互补。

Q2:Skill 和 CLAUDE.md 里写的规则,哪个优先级更高?

两者不冲突,作用层次不同。CLAUDE.md 是项目背景和持久规则(“不要修改 migrations/ 目录”),在整个会话中始终生效;Skill 是特定任务的执行流程(“做代码审查时走这 5 步”),在触发时叠加到 CLAUDE.md 上。如果两者有矛盾指令,CLAUDE.md 的规则通常更基础,Skill 里的步骤在此约束下执行。

Q3:Hooks 脚本里能访问哪些上下文信息?

Hook 输入通过 stdin 以 JSON 格式传入脚本,不是环境变量。JSON 包含公共字段(session_id、cwd、hook_event_name、permission_mode)和事件特定字段(PreToolUse/PostToolUse 包含 tool_name、tool_input;PostToolUse 额外包含 tool_response)。脚本里用 INPUT=$(cat) 读取后用 jq 解析。此外有几个环境变量可直接用:CLAUDE_PROJECT_DIR(项目根目录)、CLAUDE_EFFORT(当前推理强度)、CLAUDE_PLUGIN_ROOT(插件目录)。来源:code.claude.com/docs/en/hooks。

Q4:Plugin 和 npm 包有什么关系?

部分 Plugin 发布为 npm 包,通过 npx 运行;也有直接是 Git 仓库或本地目录的 Plugin。Plugin 格式本身不绑定任何包管理器,核心是 plugin.json 元数据和目录结构约定。MCP Server 通常是 npm 包(通过 npx -y 按需下载运行),这是 MCP 生态的惯例,但 Plugin 不一定是 npm 包。

Q5:四种机制对性能(token 消耗)有影响吗?

Skill 文件会在触发时被加载进上下文,文件越长消耗越多 token——建议控制在 500 字以内。CLAUDE.md 每次会话全量加载,影响类似。MCP 工具调用本身不消耗大量 token,但工具返回的数据(如 GitHub API 返回的完整 PR 内容)会进入上下文,间接影响消耗。Hooks 脚本在 Claude Code 进程外运行,几乎不占用 token,是最"轻"的扩展方式。

小结

四大扩展机制各司其职:MCP 连接外部世界(GitHub/数据库/Slack),Skills 固化执行流程(代码审查/文档生成),Hooks 自动化生命周期(格式化/拦截危险命令),Plugins 打包分发配置(跨项目/团队共享)。实践上,个人用户先配置 1-2 个常用 Skill(减少重复提示词),再加关键 Hooks(格式化 + 危险命令拦截),再按需接 MCP Server;团队场景用 Plugin 把这套配置打包,新成员一键安装。

 

参考来源:

 Claude Code 官方文档:Hooks 完整参考(29 个事件、退出码、配置字段)

 Claude Code 官方文档:MCP 集成指南

 Fenno 官网:AI 编程