用 Claude Code 久了你会发现一个问题它原生能力虽强但总有些事需要外挂来补。 查数据库、发 Slack 消息需要用到MCP。自动格式化代码、拦截危险操作需要用到Hooks。让 Claude 遵循一套写作规范需要用到Skills。 三种机制各管一摊单独看都好理解。但一到实际场景选择困难就来了我这个需求到底该用哪个混着用会不会互相冲突token 消耗差多少这个功能该写 Skill 还是 HookMCP 会不会太重三个一起用会不会冲突为什么挂几个 MCP 后 token 消耗突然暴涨 这篇文章就来解决这个问题。我们不重复介绍每种机制的基础用法之前的 Hooks 篇、MCP 篇、Skills 篇 已经讲过了而是聚焦在三个实战问题上它们的本质区别是什么Token 消耗差多少通过数据而不是主观感觉什么场景用什么可以通过一张决策表对号入座一、三种机制介绍 先给结论后面展开机制一句话类比MCP给 Claude 接外设USB 接口连数据库、GitHub、Slack 等外部服务Skills给 Claude 发手册员工入职手册需要的时候翻不看的时候不占桌面Hooks给 Claude 装护栏高速公路护栏不靠 Claude 自觉物理隔离危险操作1.1 区别 三者的根本区别在于谁做决策MCPClaude 决定调用哪个工具 “我需要查一下数据库”SkillsClaude 或用户决定加载哪份知识“这个场景需要参考 API 规范”Hooks没人做决策规则自动触发“只要编辑了文件就跑格式化”。其实Hooks是系统行为不是 AI 行为。 这意味着MCP 和 Skills 是概率性的Claude 大多数时候会正确使用但不保证每次都用。Hooks 是确定性的每次都执行无一例外。 上图展示了三种机制与 Claude Code 的交互方式。注意 MCP 和 Skills 的数据流都穿过了LLM 上下文区域它们会占用 context window而 Hooks 的执行路径完全在 LLM 之外这就是它几乎不消耗 token 的原因。二、一个很多人忽略的问题Token 成本模型完全不同 大多数人只关注“功能”但在 Claude Code 里真正决定体验的是上下文预算context budget。三种机制的 token 模型几乎属于三个世界。2.1 MCP最贵而且是持续都贵MCP 的 token 消耗来自一个机制工具定义注入。 Claude Code 需要知道有哪些 MCP 工具可用才能决定什么时候调用它们。所以在每一轮对话中所有已注册的 MCP 工具的 JSON Schema包括工具名、参数类型、描述文字都会被注入到请求中。(1) 算一笔真实的账 一个典型的 MCP Server比如 GitHub约 15 个工具每个工具的 Schema约 200~300 tokens单个Server的开销15 × 250 ≈ 3 , 750 tokens/turn 15 \times 250 \approx 3,750 \text{ tokens/turn}15×250≈3,750tokens/turn注意这是每轮的开销。不管你这轮有没有用到 MCP 工具只要 Server 连着Schema 就在。聊 20 轮下来光 MCP 工具定义就消耗了$3,750 \times 20 75,000 $ tokens可能已经超过了你对话的有效内容。哪怕你一轮都没调用工具也照样付费。(2) 估算消耗的token 怎么估算自己的 MCP token 开销一个 Server 注册了多少工具不看配置文件配置文件只有启动参数而是看 Server 实际暴露了多少。最直接的办法是问 Claude“帮我数一下当前有多少 MCP 工具”或者去对应 MCP Server 的 GitHub 文档查工具列表。比如chrome-devtools-mcp注册了 29个工具按每个约 250 tokens 算单这一个 Server 每轮就要吃掉250 × 29 7250 250 \times 29 7250250×297250tokens。(3) Tool SearchMCP 的省钱模式 Claude Code 提供了一个缓解机制叫Tool Search。当 MCP 工具定义超过 context window 的 10% 时它会自动开启不再一次性加载所有工具的完整 Schema而是只加载工具的简要描述。Claude 需要用某个工具时先搜索一下再按需加载完整定义。不开 Tool Search每轮 11,000 tokens所有工具全量加载 开了 Tool Search每轮 ~1,000 tokens只加载描述 按需加载效果很明显但有两个限制需要 Sonnet 4 或 Opus 4 以上的模型Haiku 不支持使用代理proxy时默认关闭需要手动开启可以通过环境变量控制# 自动模式推荐超过 10% 时自动开启exportENABLE_TOOL_SEARCHauto# 手动指定阈值超过 5% 就开启exportENABLE_TOOL_SEARCHauto:5# 强制开启exportENABLE_TOOL_SEARCHtrue2.2 Skills轻量级按需加载 Skills 的 token 消耗分两部分上图展示了 Skills 的两阶段 token 消耗模型。左边是启动时的轻量描述加载右边是调用时的完整内容加载。注意两者的视觉体量差异描述加载非常轻完整加载也只在需要时才发生。(1) 会话启动时加载描述 Claude Code 启动时会读取所有已注册 Skill 的描述信息frontmatter 里的description字段让 Claude 知道有哪些技能可用。这部分开销很小每个 Skill 的描述约 100~500 tokens 5 个 Skill 的总开销约 1,000~2,500 tokens一次性 而且这个开销有上限Claude Code 会把 Skill 描述控制在 context window 的 2% 以内。(2) 被调用时加载完整内容 只有当你手动输入/skill-name或 Claude 判断需要使用时完整的 Skill 内容才会被加载到上下文中。一个中等大小的 Skill比如一份 API 风格指南大约 1,000~3,000 tokens。关键区别不用的 Skill 不花钱。这跟 MCP 形成鲜明对比MCP 是挂着就收费Skills 是用了才收费。还有一个省钱技巧如果某个 Skill 你只想手动触发、不希望 Claude 自动调用可以在 frontmatter 里加一行--- disable-model-invocation: true --- 这样连描述都不会被加载彻底零开销直到你主动/skill-name调用它。2.3 Hooks几乎免费 Hooks 的 token 消耗取决于类型Hook 类型Token 开销说明command0Shell 命令在 LLM 上下文之外运行http0HTTP 请求发到外部不经过 LLMprompt500~1,000单轮 LLM 评估默认用 Haiku便宜agent1,000~5,000多轮子代理验证有 60 秒超时 大多数常用 Hook自动格式化、拦截危险操作、发通知都是command类型token 开销为零。 它们在 LLM 的世界之外运行Claude 看不到 Hook 的存在Hook 也不会占用 Claude 的上下文。唯一的例外是 Hook 向 stdout 写了输出这些输出会被注入到上下文中但通常也就几行文字。为什么很多高手优先用 Hooks可以总结成一句工程经验**不要让 AI 决定规则。**如果事情可以确定执行格式化、校验、权限控制、CI Gate等那就不该交给概率模型。Hooks ≈ CI Pipeline 思维。2.4 放在一起看 上图直观展示了三种机制的 token 消耗量级差异。MCP 是常驻成本只要 Server 连着每轮都要付出Skills 和 Hooks 是按需成本不用不花钱。这也是为什么很多人觉得挂了几个 MCP 后 Claude Code 变慢了不是网络慢了是每轮可用的有效 context 被工具定义挤占了。三、三种机制怎么选决策指南3.1 场景对照表你想做什么用什么为什么连接 GitHub/数据库/Slack 等外部服务MCP只有 MCP 能桥接外部 API让 Claude 遵循一套编码规范Skills按需加载Claude 需要时自动参考封装可复用的工作流如/deploy、/review-prSkillsdisable-model-invocation手动触发零常驻开销每次编辑后自动跑格式化HooksPostToolUse确定性执行零 token 开销禁止 Claude 修改某些文件HooksPreToolUse物理拦截不靠 Claude “自觉”任务完成前必须通过测试HooksStop agent质量门禁Claude 无法绕过Claude 停下来时发桌面通知HooksNotification外部通知不需要 LLM 参与项目的基础约定构建命令、目录结构CLAUDE.md每次会话都加载比 Skill 更简单直接3.2 三个经验法则(1)法则一能用 Hooks 就不用 Skills能用 Skills 就不用 MCP 这不是说 MCP 不好而是从 token 效率角度排优先级。如果一个需求可以用确定性规则解决Hooks就不需要让 Claude 来判断Skills/MCP。如果只需要注入知识Skills就不需要挂一个常驻服务MCP。(2)法则二MCP 用完就断 不要同时挂一堆 MCP Server “以备不时之需”。做数据库调查时连 database server查完就断。写代码时连 GitHub server提完 PR 就断。/mcp命令可以随时查看和管理连接状态。(3)法则三混合使用效果最好 实际项目中三种机制往往组合使用。MCP 负责前期调研拉 Issue、看 PRSkill 在编码时提供规范参考两个 Hook 分别在编辑后自动格式化、完成前强制跑测试。四种机制各司其职没有冲突。四、技术细节三种机制的加载机制对比 如果你想更深入理解 token 消耗差异的根源需要看看它们各自的加载机制。4.1 MCP全量注入 vs Tool Search MCP 工具的加载有两种模式全量注入和Tool Search(1) 默认模式全量注入 每轮对话请求发送给 Claude 时所有已注册 MCP 工具的完整 JSON Schema 都会被包含在请求中。Claude 需要这些信息来决定要不要调用某个工具。// 一个典型的 MCP 工具 Schema简化版{name:mcp__github__create_issue,description:Create a new issue in a GitHub repository,input_schema:{type:object,properties:{owner:{type:string,description:Repository owner},repo:{type:string,description:Repository name},title:{type:string,description:Issue title},body:{type:string,description:Issue body (markdown)},labels:{type:array,items:{type:string}}},required:[owner,repo,title]}} 这只是一个工具。一个 GitHub MCP Server 可能注册了create_issue、list_issues、create_pr、merge_pr、add_comment等十几个工具每个都有类似的 Schema。全部加起来轻松几千 tokens。(2) Tool Search 模式按需发现 开启 Tool Search 后Claude 的请求中不再包含完整 Schema而是包含一个特殊的搜索工具。当 Claude 判断需要使用某类功能时先用搜索工具查找匹配的 MCP 工具再加载该工具的完整定义。 这就像是从把整本工具手册塞进口袋变成了带一个搜索引擎需要时再查。4.2 Skills天生就是按需加载 Skills 采用deferred tool延迟工具机制天生就是按需的。启动时只加载目录名称描述需要时才展开完整内容用完还能收回释放空间。这就是它和 MCP 的本质差异MCP 是全套搬进来常驻Skills 是按需借阅用完归还。 你在对话开头看到的available-deferred-tools列表就是这个机制的体现。只有名字没有 Schema按需拉取。4.3 Hooks根本不进 LLM 上下文 Hooks 的执行流程完全绕过了 LLM 整个过程中Claude 甚至不知道 Hook 的存在。它只知道我的编辑请求被拒绝了原因是 xxx或者编辑成功了。Hooks 的配置信息、执行逻辑都不会出现在 LLM 的上下文中。五、常见误区5.1 “Hooks 能替代 CLAUDE.md 里的规则” 不完全对。Hooks 能强制执行的规则是有限的——它只能在工具调用层面做拦截和后处理。“代码要写注释”、变量名用驼峰这类语义级别的要求Hooks 管不了还是得靠 CLAUDE.md 或 Skills。5.2 “MCP 越多越好” 恰恰相反。每多挂一个 MCP Server就多一份常驻 token 开销。更重要的是工具太多会让 Claude 的选择空间变大反而可能选错工具或在不需要时调用工具。少即是多只挂当前任务需要的 Server。5.3 “Skills 和 CLAUDE.md 功能重复” 有重叠但定位不同。CLAUDE.md 是每次会话都加载的基础指令适合放不变的、通用的规则。Skills 是按需加载的专项知识适合放特定场景的详细指南。 一个经验如果内容不超过 10 行放 CLAUDE.md如果是一整套规范或工作流封装成 Skill。六、总结 三种机制的核心差异归结为三个维度MCPSkillsHooks本质连接外部服务注入领域知识确定性自动化决策者Claude 判断Claude 或用户规则自动触发Token 模式常驻开销每轮按需开销调用时几乎为零适合需要外部数据/操作需要参考知识/流程需要强制执行的规则 选择的优先级很简单确定性规则 → Hooks领域知识 → Skills外部连接 → MCP。能用轻量的就不用重量的能按需加载的就不要常驻。 最后一个建议定期用/mcp检查你的 MCP Server 列表。那些装了就没用过的 Server每一轮都在默默消耗你的 token 预算。断开它们把 context window 还给真正有用的对话内容。
【Claude Code三剑客】Claude Code 的三种扩展机制:MCP、Skills、Hooks 怎么选
用 Claude Code 久了你会发现一个问题它原生能力虽强但总有些事需要外挂来补。 查数据库、发 Slack 消息需要用到MCP。自动格式化代码、拦截危险操作需要用到Hooks。让 Claude 遵循一套写作规范需要用到Skills。 三种机制各管一摊单独看都好理解。但一到实际场景选择困难就来了我这个需求到底该用哪个混着用会不会互相冲突token 消耗差多少这个功能该写 Skill 还是 HookMCP 会不会太重三个一起用会不会冲突为什么挂几个 MCP 后 token 消耗突然暴涨 这篇文章就来解决这个问题。我们不重复介绍每种机制的基础用法之前的 Hooks 篇、MCP 篇、Skills 篇 已经讲过了而是聚焦在三个实战问题上它们的本质区别是什么Token 消耗差多少通过数据而不是主观感觉什么场景用什么可以通过一张决策表对号入座一、三种机制介绍 先给结论后面展开机制一句话类比MCP给 Claude 接外设USB 接口连数据库、GitHub、Slack 等外部服务Skills给 Claude 发手册员工入职手册需要的时候翻不看的时候不占桌面Hooks给 Claude 装护栏高速公路护栏不靠 Claude 自觉物理隔离危险操作1.1 区别 三者的根本区别在于谁做决策MCPClaude 决定调用哪个工具 “我需要查一下数据库”SkillsClaude 或用户决定加载哪份知识“这个场景需要参考 API 规范”Hooks没人做决策规则自动触发“只要编辑了文件就跑格式化”。其实Hooks是系统行为不是 AI 行为。 这意味着MCP 和 Skills 是概率性的Claude 大多数时候会正确使用但不保证每次都用。Hooks 是确定性的每次都执行无一例外。 上图展示了三种机制与 Claude Code 的交互方式。注意 MCP 和 Skills 的数据流都穿过了LLM 上下文区域它们会占用 context window而 Hooks 的执行路径完全在 LLM 之外这就是它几乎不消耗 token 的原因。二、一个很多人忽略的问题Token 成本模型完全不同 大多数人只关注“功能”但在 Claude Code 里真正决定体验的是上下文预算context budget。三种机制的 token 模型几乎属于三个世界。2.1 MCP最贵而且是持续都贵MCP 的 token 消耗来自一个机制工具定义注入。 Claude Code 需要知道有哪些 MCP 工具可用才能决定什么时候调用它们。所以在每一轮对话中所有已注册的 MCP 工具的 JSON Schema包括工具名、参数类型、描述文字都会被注入到请求中。(1) 算一笔真实的账 一个典型的 MCP Server比如 GitHub约 15 个工具每个工具的 Schema约 200~300 tokens单个Server的开销15 × 250 ≈ 3 , 750 tokens/turn 15 \times 250 \approx 3,750 \text{ tokens/turn}15×250≈3,750tokens/turn注意这是每轮的开销。不管你这轮有没有用到 MCP 工具只要 Server 连着Schema 就在。聊 20 轮下来光 MCP 工具定义就消耗了$3,750 \times 20 75,000 $ tokens可能已经超过了你对话的有效内容。哪怕你一轮都没调用工具也照样付费。(2) 估算消耗的token 怎么估算自己的 MCP token 开销一个 Server 注册了多少工具不看配置文件配置文件只有启动参数而是看 Server 实际暴露了多少。最直接的办法是问 Claude“帮我数一下当前有多少 MCP 工具”或者去对应 MCP Server 的 GitHub 文档查工具列表。比如chrome-devtools-mcp注册了 29个工具按每个约 250 tokens 算单这一个 Server 每轮就要吃掉250 × 29 7250 250 \times 29 7250250×297250tokens。(3) Tool SearchMCP 的省钱模式 Claude Code 提供了一个缓解机制叫Tool Search。当 MCP 工具定义超过 context window 的 10% 时它会自动开启不再一次性加载所有工具的完整 Schema而是只加载工具的简要描述。Claude 需要用某个工具时先搜索一下再按需加载完整定义。不开 Tool Search每轮 11,000 tokens所有工具全量加载 开了 Tool Search每轮 ~1,000 tokens只加载描述 按需加载效果很明显但有两个限制需要 Sonnet 4 或 Opus 4 以上的模型Haiku 不支持使用代理proxy时默认关闭需要手动开启可以通过环境变量控制# 自动模式推荐超过 10% 时自动开启exportENABLE_TOOL_SEARCHauto# 手动指定阈值超过 5% 就开启exportENABLE_TOOL_SEARCHauto:5# 强制开启exportENABLE_TOOL_SEARCHtrue2.2 Skills轻量级按需加载 Skills 的 token 消耗分两部分上图展示了 Skills 的两阶段 token 消耗模型。左边是启动时的轻量描述加载右边是调用时的完整内容加载。注意两者的视觉体量差异描述加载非常轻完整加载也只在需要时才发生。(1) 会话启动时加载描述 Claude Code 启动时会读取所有已注册 Skill 的描述信息frontmatter 里的description字段让 Claude 知道有哪些技能可用。这部分开销很小每个 Skill 的描述约 100~500 tokens 5 个 Skill 的总开销约 1,000~2,500 tokens一次性 而且这个开销有上限Claude Code 会把 Skill 描述控制在 context window 的 2% 以内。(2) 被调用时加载完整内容 只有当你手动输入/skill-name或 Claude 判断需要使用时完整的 Skill 内容才会被加载到上下文中。一个中等大小的 Skill比如一份 API 风格指南大约 1,000~3,000 tokens。关键区别不用的 Skill 不花钱。这跟 MCP 形成鲜明对比MCP 是挂着就收费Skills 是用了才收费。还有一个省钱技巧如果某个 Skill 你只想手动触发、不希望 Claude 自动调用可以在 frontmatter 里加一行--- disable-model-invocation: true --- 这样连描述都不会被加载彻底零开销直到你主动/skill-name调用它。2.3 Hooks几乎免费 Hooks 的 token 消耗取决于类型Hook 类型Token 开销说明command0Shell 命令在 LLM 上下文之外运行http0HTTP 请求发到外部不经过 LLMprompt500~1,000单轮 LLM 评估默认用 Haiku便宜agent1,000~5,000多轮子代理验证有 60 秒超时 大多数常用 Hook自动格式化、拦截危险操作、发通知都是command类型token 开销为零。 它们在 LLM 的世界之外运行Claude 看不到 Hook 的存在Hook 也不会占用 Claude 的上下文。唯一的例外是 Hook 向 stdout 写了输出这些输出会被注入到上下文中但通常也就几行文字。为什么很多高手优先用 Hooks可以总结成一句工程经验**不要让 AI 决定规则。**如果事情可以确定执行格式化、校验、权限控制、CI Gate等那就不该交给概率模型。Hooks ≈ CI Pipeline 思维。2.4 放在一起看 上图直观展示了三种机制的 token 消耗量级差异。MCP 是常驻成本只要 Server 连着每轮都要付出Skills 和 Hooks 是按需成本不用不花钱。这也是为什么很多人觉得挂了几个 MCP 后 Claude Code 变慢了不是网络慢了是每轮可用的有效 context 被工具定义挤占了。三、三种机制怎么选决策指南3.1 场景对照表你想做什么用什么为什么连接 GitHub/数据库/Slack 等外部服务MCP只有 MCP 能桥接外部 API让 Claude 遵循一套编码规范Skills按需加载Claude 需要时自动参考封装可复用的工作流如/deploy、/review-prSkillsdisable-model-invocation手动触发零常驻开销每次编辑后自动跑格式化HooksPostToolUse确定性执行零 token 开销禁止 Claude 修改某些文件HooksPreToolUse物理拦截不靠 Claude “自觉”任务完成前必须通过测试HooksStop agent质量门禁Claude 无法绕过Claude 停下来时发桌面通知HooksNotification外部通知不需要 LLM 参与项目的基础约定构建命令、目录结构CLAUDE.md每次会话都加载比 Skill 更简单直接3.2 三个经验法则(1)法则一能用 Hooks 就不用 Skills能用 Skills 就不用 MCP 这不是说 MCP 不好而是从 token 效率角度排优先级。如果一个需求可以用确定性规则解决Hooks就不需要让 Claude 来判断Skills/MCP。如果只需要注入知识Skills就不需要挂一个常驻服务MCP。(2)法则二MCP 用完就断 不要同时挂一堆 MCP Server “以备不时之需”。做数据库调查时连 database server查完就断。写代码时连 GitHub server提完 PR 就断。/mcp命令可以随时查看和管理连接状态。(3)法则三混合使用效果最好 实际项目中三种机制往往组合使用。MCP 负责前期调研拉 Issue、看 PRSkill 在编码时提供规范参考两个 Hook 分别在编辑后自动格式化、完成前强制跑测试。四种机制各司其职没有冲突。四、技术细节三种机制的加载机制对比 如果你想更深入理解 token 消耗差异的根源需要看看它们各自的加载机制。4.1 MCP全量注入 vs Tool Search MCP 工具的加载有两种模式全量注入和Tool Search(1) 默认模式全量注入 每轮对话请求发送给 Claude 时所有已注册 MCP 工具的完整 JSON Schema 都会被包含在请求中。Claude 需要这些信息来决定要不要调用某个工具。// 一个典型的 MCP 工具 Schema简化版{name:mcp__github__create_issue,description:Create a new issue in a GitHub repository,input_schema:{type:object,properties:{owner:{type:string,description:Repository owner},repo:{type:string,description:Repository name},title:{type:string,description:Issue title},body:{type:string,description:Issue body (markdown)},labels:{type:array,items:{type:string}}},required:[owner,repo,title]}} 这只是一个工具。一个 GitHub MCP Server 可能注册了create_issue、list_issues、create_pr、merge_pr、add_comment等十几个工具每个都有类似的 Schema。全部加起来轻松几千 tokens。(2) Tool Search 模式按需发现 开启 Tool Search 后Claude 的请求中不再包含完整 Schema而是包含一个特殊的搜索工具。当 Claude 判断需要使用某类功能时先用搜索工具查找匹配的 MCP 工具再加载该工具的完整定义。 这就像是从把整本工具手册塞进口袋变成了带一个搜索引擎需要时再查。4.2 Skills天生就是按需加载 Skills 采用deferred tool延迟工具机制天生就是按需的。启动时只加载目录名称描述需要时才展开完整内容用完还能收回释放空间。这就是它和 MCP 的本质差异MCP 是全套搬进来常驻Skills 是按需借阅用完归还。 你在对话开头看到的available-deferred-tools列表就是这个机制的体现。只有名字没有 Schema按需拉取。4.3 Hooks根本不进 LLM 上下文 Hooks 的执行流程完全绕过了 LLM 整个过程中Claude 甚至不知道 Hook 的存在。它只知道我的编辑请求被拒绝了原因是 xxx或者编辑成功了。Hooks 的配置信息、执行逻辑都不会出现在 LLM 的上下文中。五、常见误区5.1 “Hooks 能替代 CLAUDE.md 里的规则” 不完全对。Hooks 能强制执行的规则是有限的——它只能在工具调用层面做拦截和后处理。“代码要写注释”、变量名用驼峰这类语义级别的要求Hooks 管不了还是得靠 CLAUDE.md 或 Skills。5.2 “MCP 越多越好” 恰恰相反。每多挂一个 MCP Server就多一份常驻 token 开销。更重要的是工具太多会让 Claude 的选择空间变大反而可能选错工具或在不需要时调用工具。少即是多只挂当前任务需要的 Server。5.3 “Skills 和 CLAUDE.md 功能重复” 有重叠但定位不同。CLAUDE.md 是每次会话都加载的基础指令适合放不变的、通用的规则。Skills 是按需加载的专项知识适合放特定场景的详细指南。 一个经验如果内容不超过 10 行放 CLAUDE.md如果是一整套规范或工作流封装成 Skill。六、总结 三种机制的核心差异归结为三个维度MCPSkillsHooks本质连接外部服务注入领域知识确定性自动化决策者Claude 判断Claude 或用户规则自动触发Token 模式常驻开销每轮按需开销调用时几乎为零适合需要外部数据/操作需要参考知识/流程需要强制执行的规则 选择的优先级很简单确定性规则 → Hooks领域知识 → Skills外部连接 → MCP。能用轻量的就不用重量的能按需加载的就不要常驻。 最后一个建议定期用/mcp检查你的 MCP Server 列表。那些装了就没用过的 Server每一轮都在默默消耗你的 token 预算。断开它们把 context window 还给真正有用的对话内容。