Claude Code 扩展功能对比:CLAUDE.md、Skills、子代理、MCP 配置时机与选择
Claude Code 的扩展功能各有侧重:CLAUDE.md 存放始终有效的项目规则,Skills 存放按需加载的知识和工作流,子代理隔离执行复杂任务,MCP 连接外部服务,Hooks 实现确定性自动化。从 CLAUDE.md 开始逐步搭建,当上下文窗口快满时用子代理或设置技能 disable-model-invocation: true 优化开销。
Claude Code 结合了能理解代码的模型与内置工具(文件操作、搜索、执行、网页访问),覆盖大多数编程任务。本文介绍扩展层:可添加的自定义功能,用来告诉 Claude 更多内容、连接更多服务、自动化更多流程。
刚开始用 Claude Code? 先从 CLAUDE.md 写项目约定开始,等遇到具体触发时机再按需添加其他扩展。
扩展层概览
各扩展功能插入代理循环的不同节点:
| 功能 | 作用 | 适用场景 | 示例 |
|---|---|---|---|
| CLAUDE.md | 每次会话自动加载的持久上下文 | 项目约定、"始终做 X"的规则 | “使用 pnpm,不用 npm。提交前运行测试。” |
| Skills | 可复用的知识和工作流 | 参考资料、可调用工作流 | /deploy 运行部署清单;API 文档技能 |
| 子代理 | 独立上下文的隔离执行器 | 上下文隔离、并行任务、专业工作者 | 读很多文件的研究任务,只返回关键发现 |
| Agent Teams | 协调多个独立的 Claude Code 会话 | 并行研究、新功能开发、相互竞争的假设 | 同时启动安全、性能、测试审查员 |
| MCP | 连接外部服务 | 外部数据或操作 | 查询数据库、发 Slack 消息、控制浏览器 |
| Hooks | 在特定事件上运行的确定性脚本 | 不涉及 LLM 的可预测自动化 | 每次文件编辑后自动运行 ESLint |
| Plugins | 打包层,把 Skills、Hooks、子代理和 MCP 服务器打包成可安装单元 | 跨仓库复用配置,分发给他人 | 通过 marketplaces 分发 |
逐步搭建你的配置
不需要一开始就配置好一切。每个功能都有明显的触发时机,大多数团队大致按以下顺序添加:
| 触发时机 | 添加什么 |
|---|---|
| Claude 把某个约定或命令搞错了两次 | 加到 CLAUDE.md |
| 每次开始任务都要输入同一段提示 | 保存为可调用的 Skill |
| 第三次把同一个流程或清单粘贴到对话里 | 封装成 Skill |
| 每次要从浏览器标签页复制 Claude 看不到的数据 | 把那个系统接入 MCP 服务器 |
| 某个任务让对话充满了不会再用到的输出 | 通过子代理处理 |
| 希望某件事每次都自动发生,不用提 | 写一个 Hook |
| 另一个仓库需要相同的配置 | 打包成 Plugin |
同样的触发时机告诉你什么时候更新已有的配置。反复出现的错误或代码审查意见是 CLAUDE.md 的编辑信号;反复手动调整的工作流是 Skill 需要修订的信号。
功能对比
Skills vs 子代理
Skills 和子代理解决不同问题:
| 维度 | Skill | 子代理 |
|---|---|---|
| 本质 | 可复用的指令、知识或工作流 | 有独立上下文的隔离工作者 |
| 核心价值 | 跨上下文共享内容 | 上下文隔离。工作在子代理中完成,只有摘要返回 |
| 上下文影响 | 加到主窗口 | 使用独立窗口,有自己的输入输出 Token |
| 最适合 | 参考资料、可调用工作流 | 读大量文件的任务、并行工作、专业工作者 |
Skills 也可以通过 context: fork 在子代理上下文中运行。子代理可以预加载 Skills(skills: 字段)。
CLAUDE.md vs Skill
| 维度 | CLAUDE.md | Skill |
|---|---|---|
| 加载时机 | 每次会话,自动 | 按需(Claude 自动或你手动触发) |
| 可包含文件 | 是,用 @path 导入 |
是,用 @path 导入 |
| 可触发工作流 | 否 | 是,用 /<name> 触发 |
| 最适合 | "始终做 X"的规则 | 参考资料、可调用工作流 |
放 CLAUDE.md:Claude 每次都要知道的内容——编码约定、构建命令、项目结构、"禁止做 X"的规则。
放 Skill:Claude 有时需要的参考资料(API 文档、风格指南),或用 /<name> 触发的工作流(部署、发布、审查)。
CLAUDE.md 保持在 200 行以内。超出部分移到 Skills 或拆分到 .claude/rules/ 文件。
CLAUDE.md vs .claude/rules/ vs Skill
三者都存储指令,但加载方式不同:
| 维度 | CLAUDE.md | .claude/rules/ |
Skill |
|---|---|---|---|
| 加载时机 | 每次会话 | 每次会话,或打开匹配文件时 | 按需,调用或 Claude 判断相关时 |
| 作用域 | 整个项目 | 可按文件路径限定 | 任务特定 |
| 最适合 | 核心约定和构建命令 | 语言或目录特定的指导 | 参考资料、可重复工作流 |
用 CLAUDE.md 存储每个会话都需要的内容:构建命令、测试约定、项目架构。
用 rules 保持 CLAUDE.md 精简。规则可以通过 paths frontmatter 仅当 Claude 处理匹配文件时才加载,节省上下文。
用 Skills 存储 Claude 偶尔才需要的内容,如 API 文档或部署清单。
子代理 vs Agent Teams
| 维度 | 子代理 | Agent Teams |
|---|---|---|
| 上下文 | 独立上下文窗口,结果返回调用方 | 独立上下文窗口,完全独立 |
| 通信 | 只向主代理报告结果 | 成员之间互相发消息 |
| 协调 | 主代理管理所有工作 | 共享任务列表,自我协调 |
| Token 成本 | 低:结果摘要返回 | 高:每个成员是独立的 Claude 实例 |
| 最适合 | 只关心结果的专注任务 | 需要讨论和协作的复杂工作 |
使用子代理 当需要快速专注的工作者:研究问题、验证主张、审查文件。子代理完成工作返回摘要,主对话保持干净。
使用 Agent Teams 当成员需要共享发现、互相挑战并独立协调。适合带有竞争假设的研究、并行代码审查、新功能开发等,每个成员负责一部分。
过渡点:如果你在运行并行子代理但遇到上下文限制,或子代理之间需要通信,Agent Teams 是自然的下一步。
Agent Teams 是实验性功能,默认禁用。详见 agent teams。
MCP vs Skill
| 维度 | MCP | Skill |
|---|---|---|
| 本质 | 连接外部服务的协议 | 知识、工作流和参考资料 |
| 提供 | 工具和数据访问 | 知识、工作流、参考资料 |
| 示例 | Slack 集成、数据库查询、浏览器控制 | 代码审查清单、部署工作流、API 风格指南 |
MCP 让 Claude 能与外部系统交互。没有 MCP,Claude 无法查询数据库或发 Slack。
Skills 教 Claude 如何高效使用这些工具,以及可用 /<name> 触发的工作流。一个 Skill 可以包含团队的数据库 Schema 和查询模式,或一个 /post-to-slack 工作流。
配合示例:MCP 服务器连接数据库,Skill 教会 Claude 数据模型、常见查询模式、不同任务应使用的表。
Hook vs Skill
| 维度 | Hook | Skill |
|---|---|---|
| 运行方式 | 执行 shell 命令、HTTP 请求、LLM 提示或子代理 | Claudioe 读取并遵循的指令 |
| 触发方式 | 生命周期事件,如 PostToolUse、SessionStart |
你输入 /<name>,或 Claude 根据描述判断相关而自动加载 |
| 确定性 | 每次事件必然触发 | Claude 解读指令,结果有变化 |
| 上下文成本 | 零,除非 Hook 返回输出 | 描述每次请求都加载;内容在使用时加载 |
| 最适合 | 文件编辑后 lint、阻止危险命令、日志记录、通知 | 需要推理的工作流、参考资料、多步任务 |
用 Hook:动作必须每次同样执行且不需要 Claude 思考。例如:保存时格式化、拒绝 rm -rf /、会话结束时发 Slack 消息。
用 Skill:Claude 应决定如何应用步骤,或内容是知识而非脚本。例如:/release 检查清单、API 风格指南、调试 playbook。
把护栏放在 Hook 里:CLAUDE.md 或 Skill 中的"不要编辑 .env"是指令而非保证。PreToolUse Hook 阻止编辑才是强制执行。如果规则必须每次生效,做成 Hook 而非提示指令。
Hook 输出会进入上下文:PostToolUse Hook 运行 linter 后返回文本给 Claude 阅读;/fix-lint Skill 告诉 Claude 如何修复。
功能的分层机制
同一功能可以在多个级别定义:用户级、项目级、插件级或托管策略级。当同一功能存在多个级别时,遵循以下规则:
- CLAUDE.md 文件 累加:所有级别的内容同时进入上下文。工作目录及以上的文件在启动时加载;子目录的文件在访问时加载。指令冲突时,Claude 根据判断协调,更具体的指令通常优先。详见 CLAUDE.md 加载方式。
- Skills 和子代理 按名称覆盖:同名时,优先级高的定义覆盖低的(Skills:托管 > 用户 > 项目;子代理:托管 > CLI 标记 > 项目 > 用户 > 插件)。插件 Skills 已命名空间化避免冲突。详见 Skill 发现 和 子代理作用域。
- MCP 服务器 按名称覆盖:本地 > 项目 > 用户。详见 MCP 作用域。
- Hooks 合并:无论来源如何,所有注册的 Hook 都会在匹配事件上触发。详见 Hooks。
理解上下文成本
每个功能都会消耗一些上下文。过多可能填满上下文窗口,或引入干扰导致技能触发不正确、Claude 忘记约定。
| 功能 | 加载时机 | 上下文成本 |
|---|---|---|
| CLAUDE.md | 会话启动 | 每次请求都有 |
| Skills | 启动 + 使用时 | 描述在每次请求中;内容只在使用时加载 |
| MCP 服务器 | 会话启动 | 工具名启动时加载;完整 Schema 延迟到使用时 |
| 代码智能 | 文件编辑后 + 按需 | 编辑后诊断;符号查询时加载 |
| 子代理 | 生成时 | 独立于主会话 |
| Hooks | 触发时 | 零,除非 Hook 返回额外上下文 |
默认情况下,Skill 描述在会话启动时加载以便 Claude 判断何时使用。设置
disable-model-invocation: true可隐藏技能直到你手动调用,将其上下文成本降为零。对于非自己编写的技能,可在 settings 中通过skillOverrides实现相同效果而不修改文件。
各功能加载细节
CLAUDE.md
加载时机:会话启动
加载内容:所有级别(托管、用户、项目)的 CLAUDE.md 完整内容。
继承:Claude 从工作目录向上读取 CLAUDE.md,并在访问子目录时发现嵌套文件。
保持 CLAUDE.md 在 200 行以内。参考资料移至 Skills,按需加载。
Skills
加载时机:取决于配置。默认描述在启动时加载,完整内容在使用时加载。对于 disable-model-invocation: true 的技能,直到你调用才加载。
加载内容:模型可调用的技能,名称和描述在每个请求中可见。调用 /name 或 Claude 自动加载时,完整内容进入对话。
Claude 如何选择技能:Claude 将任务描述与技能描述匹配。描述模糊或重叠时可能选错或遗漏。要指定使用某个技能,用 /name 调用。disable-model-invocation: true 的技能对 Claude 不可见直到你调用。
上下文成本:低直到使用。用户专用技能零开销直到调用。
在子代理中:技能在子代理中不是按需加载,而是 skills 字段中列出的技能在启动时完全预加载。子代理仍可通过 Skill 工具发现和调用未列出的项目、用户和插件技能。
带有副作用的技能使用
disable-model-invocation: true,节省上下文并确保只有你触发。
MCP 服务器
加载时机:会话启动。
加载内容:已连接服务器的工具名称。完整 JSON Schema 延迟到 Claude 需要特定工具时。
上下文成本:工具搜索默认开启,空闲时占用极少量上下文。
可靠性提示:MCP 连接可能在中途静默失败。服务器断开后工具消失而不警告。Claude 可能尝试使用一个已不存在的工具。如果发现 Claude 无法使用之前能访问的 MCP 工具,运行 /mcp 检查连接。
运行
/mcp查看每个服务器的 Token 开销。断开不活跃使用的服务器。
代码智能
加载时机:文件编辑后,以及 Claude 导航代码时按需。
加载内容:编辑后的类型错误和警告。符号查找时的定义、引用和类型信息。
上下文成本:低。符号查找通常替代大范围文件读取,因此净上下文使用可能降低。
LSP 工具需安装代码智能插件后才激活。
子代理
加载时机:当人或 Claude 为任务生成时。
加载内容:全新隔离上下文,包含:
- 代理自身的系统提示(非完整 Claude Code 系统提示)
skills:字段中列出的技能完整内容- CLAUDE.md 和 git 状态(内置的 Explore 和 Plan 代理省略两者)
- 主代理在提示中传递的任何上下文
上下文成本:独立于主会话。子代理不继承对话历史或已调用的技能。
用子代理处理不需要完整对话上下文的工作。隔离性防止主会话膨胀。
Hooks
加载时机:特定事件触发时。
加载内容:默认无加载。Hook 在主对话外部执行。
上下文成本:零,除非 Hook 返回输出消息加入对话。
Hook 最适合副作用(lint、日志记录),不需要影响 Claude 上下文。
组合使用
| 组合 | 工作方式 | 示例 |
|---|---|---|
| Skill + MCP | MCP 提供连接,Skill 教 Claude 如何使用 | MCP 连接数据库,Skill 文档化 Schema 和查询模式 |
| Skill + 子代理 | Skill 调度并行子代理 | /audit 技能启动安全、性能、风格三个子代理 |
| CLAUDE.md + Skills | CLAUDE.md 保持常驻规则,Skills 按需加载参考资料 | CLAUDE.md 说"遵循 API 约定",Skill 包含完整 API 风格指南 |
| Hook + MCP | Hook 通过 MCP 触发外部操作 | 编辑关键文件后,Hook 发送 Slack 通知 |
了解更多
各功能有独立的配置指南、示例和选项:
- CLAUDE.md – 存储项目上下文、约定和指令
- Skills – 提供领域知识和可复用工作流
- 子代理 – 将工作卸载到隔离上下文
- Agent Teams – 协调多个并行会话
- MCP – 连接外部服务
- Hooks – 用钩子自动化工作流
- Plugins – 打包和分享功能集
- Marketplaces – 托管和分发插件集合
常见问题
Claude Code 扩展功能太多会不会把上下文撑满?
CLAUDE.md 和 Skill 的描述每次请求都占用一点上下文,但 Skill 内容按需加载,MCP 工具 Schema 延迟加载,子代理和 Hook 完全隔离。为技能设置 disable-model-invocation: true 可将其上下文成本降为零。建议 CLAUDE.md 保持在 200 行以内,详细内容移到 Skills。
我该先配置哪个扩展功能?
从 CLAUDE.md 开始,写下项目约定和构建命令。当遇到重复输入相同提示时创建 Skill,需要外部服务时接入 MCP,需要自动化时写 Hook。具体触发时机参见上方"逐步搭建你的配置"表格。
Skills 和 Hooks 有什么区别?
Skills 是给 Claude 看的指令,Claude 阅读后决定如何行动,适合需要推理的多步任务。Hooks 是在特定事件触发的确定性脚本,不经过 LLM 直接执行,适合强制性的自动化(如格式化、校验、阻止危险命令)。如果规则必须每次都强制执行,用 Hook;如果适合让 Claude 自主判断,用 Skill。