Skills 的加载方式
初始化时只加载元数据(懒加载设计):
启动新会话时,agent 只读取每个 skill 的 name 和 description,以节省 token。当判断某个 skill 与当前任务相关时,才加载 skill 的完整内容。 Towards Data Science
具体来说,Claude Code 会将所有可用 skill 以 <available_skills> 块的形式注入到 Skill 工具的描述中,内容包括 skill 名称和 description 字段。当需要调用时,再通过 Skill 工具按名触发,此时 SKILL.md 的完整正文才展开进入上下文。 Mikhail
调用触发后的完整加载: Claude 调用 Skill 工具后,系统会返回一个 tool_result,内容包括 skill 的 Base Path(本地文件路径)以及 SKILL.md 的完整正文,从这一刻起 skill 的详细指令才真正进入 prompt。 Mikhail
MCP 的加载方式
初始化时加载全量 tool 元数据(与 skills 不同):
MCP 的 tool 元数据会在每条消息中全量加载。举例来看,三个 AWS MCP server 合计约 8,500 token(13 个工具),GitHub MCP 约 2,000 token(26 个工具),Sentry MCP 约 12,500 token(22 个工具)。如果同时连接多个 MCP,总元数据可达 ~32,000 token,无论你是否用到这些工具,都会出现在每条消息里。 Towards Data Science
Tool Search 机制(超量时的优化):
Tool search 默认运行在 auto 模式,即只有当 MCP tool 定义超过上下文阈值时才激活。工具数量少时,所有 tool 正常全量加载;超过阈值后,改为按需通过 MCPSearch 工具搜索。此功能需要 Sonnet 4 或 Opus 4 及以上模型,Haiku 不支持。 Claude
MCP Prompts(斜杠命令):
MCP server 还可以暴露 prompts,这些 prompts 会在 Claude Code 中以斜杠命令的形式呈现。 Claude
总结对比
| 机制 | 初始化时加载内容 | 完整内容何时加载 |
|---|---|---|
| Skills | 仅 name + description | 调用 Skill 工具时按需展开 |
| MCP Tools | 全量 tool schema(所有 server) | 始终全量(除非启用 Tool Search) |
| MCP Prompts | 注册为斜杠命令 | 用户触发时 |
这就是为什么 Skills 是更省 token 的设计——只有真正需要的 skill 才会膨胀进上下文,而 MCP 的 tool 描述是”常驻”的。
MCP 的 tool 元数据会在每条消息中全量加载是执行mcp server获取到toos信息然后加载到prompt吧?
1. 启动阶段 — 连接并拉取 tool 列表
Claude Code 在你开始一个 session 时,会启动配置好的 MCP server。 promptfoo 对于 stdio 类型的 server,就是直接 fork 一个子进程;对于 HTTP/SSE 类型,就是建立远程连接。
连接建立后,Claude Code 立刻向每个 server 发起 tools/list 的 JSON-RPC 请求,拿回该 server 暴露的所有 tool 的 schema(name、description、inputSchema)。这一步叫做 tool/resource fetch 阶段,如果这里失败(比如参数格式不对),即使 server 显示 connected,tool 也不会加载进来。 Claude
2. 注入 prompt — tool schema 全量写入
拿到所有 server 的 tools 后,这些 schema 就以 tools 参数的形式随每次 API 请求发给模型。Tool 的命名格式为 mcp__<server>__<tool> promptfoo,比如 mcp__github__create_issue。
3. 每条消息都带着这些 schema
这就是 token 消耗大的原因——不管你这轮对话用不用某个 tool,它的 schema 都在 payload 里。这与 Skills 的懒加载设计形成了鲜明对比:
| MCP Tools | Skills | |
|---|---|---|
| 加载时机 | session 启动时全量拉取 | 按需触发 |
| 持续占用 | 每条消息都存在 | 只在调用后进入上下文 |
| 来源 | 执行 tools/list RPC 获取 |
读取本地 SKILL.md 文件 |
所以你说的”执行 MCP server 获取 tools 信息然后加载到 prompt”——这个描述完全准确。本质就是一次 RPC 调用的结果被持续注入到每轮对话的 tools 参数里。





