上周把 Claude Code 升到 2.1.76,顺手装了一堆 MCP Server------Playwright、GitHub、Notion、Slack、数据库、文件系统... 加起来大概 10 个。结果发现一个让人崩溃的问题:还没开始干活,上下文就被吃掉了一大半。
打开 session 一看,光是 MCP 工具的定义就占了 77K tokens。我 200K 的上下文窗口,工具描述就干掉了快 40%。稍微聊几轮就开始压缩历史消息,之前说的需求全忘了。
后来翻 changelog 发现 2.1.76 悄悄加了一个叫 MCP Tool Search 的功能,实测下来上下文占用从 77K 直接降到 8.7K。今天把整个排查和配置过程写出来。
先说结论
| 指标 | 装 Tool Search 前 | 装 Tool Search 后 |
|---|---|---|
| MCP 工具上下文占用 | ~77K tokens | ~8.7K tokens |
| 上下文节省比例 | - | 约 89% |
| 工具加载方式 | 全量加载 | 按需懒加载 |
| 是否需要手动配置 | - | 不需要,自动触发 |
| 工具调用体验 | 无变化 | 无变化 |
问题到底出在哪
先说清楚为什么 MCP Server 装多了会卡。
Claude Code 启动 session 时,会把所有已注册 MCP Server 的全部工具定义塞进系统提示词。每个工具都有名字、描述、参数 schema------一个稍微复杂点的 Server(比如 Playwright,自带 20 多个工具)就能占掉上万 tokens。
10 个 Server 加起来少说 50+ 个工具,工具描述直接炸到 77K。这还没算你自己的 CLAUDE.md、项目上下文、聊天历史。
objectivec
Session 上下文分布(优化前):
├── 系统提示词:~10K tokens
├── MCP 工具定义:~77K tokens ← 罪魁祸首
├── CLAUDE.md + 项目上下文:~15K tokens
├── 聊天历史:~30K tokens
└── 剩余可用:~68K tokens(200K 窗口)
看到没,工具定义比你实际的聊天内容还多。这就是为什么装多了 MCP Server 之后,Claude 动不动就"忘记"之前的对话------因为上下文被工具描述挤占了。
MCP Tool Search 是什么
简单说就是工具定义的懒加载。
不加载 Tool Search 时,Claude 启动就看到所有 50+ 个工具的完整定义。加载后,Claude 只看到一个叫 ToolSearch 的搜索工具,外加一个轻量的工具名称索引。当它判断需要某个工具时,先搜索,再按需加载完整定义。
打个比方:以前是开机就把整个 npm registry 下载到本地,现在是 npm install 的时候才下载你需要的包。
触发条件
不需要手动开启。当你注册的 MCP 工具描述总量超过上下文窗口的 10% 时,Claude Code 会自动启用 Tool Search。
对于 200K 上下文窗口,阈值大概是 20K tokens------也就是说,你装了 3-4 个 Server 基本就会自动触发。
两种搜索模式
Tool Search 支持两种查找方式:
1. 正则匹配(精确查找)
当 Claude 大概知道要找什么工具时,会用正则模式:
scss
ToolSearch("select:browser_click,browser_navigate,browser_screenshot")
直接按工具名精确拉取,速度最快。
2. BM25 语义搜索(探索式查找)
不确定具体工具名时,用自然语言描述需求:
scss
ToolSearch("take screenshot of webpage")
系统用 BM25 算法从工具描述中做相似度匹配,返回最相关的几个工具。
实测数据
我在自己的环境里测了一下(10 个 MCP Server,53 个工具):
python
# 优化前
total_tool_tokens = 77_000 # 所有工具定义
context_window = 200_000
tool_overhead = 77_000 / 200_000 # 38.5%
# 优化后(Tool Search 自动启用)
toolsearch_tokens = 8_700 # ToolSearch 工具 + 轻量索引
tool_overhead_after = 8_700 / 200_000 # 4.35%
# 节省
saved = (77_000 - 8_700) / 77_000 # 88.7%
实际使用下来体感差异很明显:
- 之前聊 10 轮左右就开始压缩历史,现在 30+ 轮依然流畅
- 首次调用某个 MCP 工具会多花 1-2 秒(加载定义),后续调用无延迟
- 工具调用成功率没有下降
你需要注意的坑
1. MCP Server 的 instructions 字段很关键
Tool Search 启用后,Claude 不再一开始就看到你所有工具的完整描述。它靠什么判断该搜索哪些工具?靠 MCP Server 的 instructions 字段。
如果你自己写了 MCP Server,一定要在 instructions 里写清楚这个 Server 是干什么的:
json
{
"mcpServers": {
"my-db-server": {
"command": "node",
"args": ["./my-mcp-server.js"],
"instructions": "Database operations: query, insert, update PostgreSQL tables. Use for any database-related tasks."
}
}
}
没有 instructions 的话,Claude 可能搜不到你的工具。
2. 不要手动禁用 Tool Search
有些人看到 ToolSearch 出现在工具列表里,觉得碍事想禁掉。别这么干------禁掉之后所有工具定义会重新全量加载,上下文直接爆。
3. 工具加载后会一直保留
某个工具被搜索加载后,会在当前 session 一直保留。不用担心重复加载的开销。
配合 /mcp 命令管理 Server
2.1.76 还加了一个 /mcp 命令,可以在聊天面板里直接管理 MCP Server:
- 查看所有已注册的 Server 状态
- 启用/禁用某个 Server
- 重新连接断开的 Server
- 管理 OAuth 认证
以前管理 MCP Server 得去改 settings.json,现在直接在对话里 /mcp 就行。配合 Tool Search,可以按需启用/禁用 Server,进一步控制上下文占用。
我的 MCP Server 推荐配置
分享一下我目前在用的配置,供参考:
json
{
"mcpServers": {
"playwright": {
"command": "npx",
"args": ["@anthropic/mcp-playwright"]
},
"github": {
"command": "npx",
"args": ["@anthropic/mcp-github"],
"env": { "GITHUB_TOKEN": "ghp_xxx" }
},
"filesystem": {
"command": "npx",
"args": ["@anthropic/mcp-filesystem", "/path/to/project"]
}
}
}
有了 Tool Search,不用再纠结"装多少个 Server 合适"的问题------放心装,Claude 自己会按需加载。
关于模型 API 的一个题外话
写这篇的时候顺手测了一下不同模型在 Claude Code 里的表现。Claude Code 本身默认用 Anthropic 官方 API,但如果你想在国内低延迟使用,可以改 base_url 指向兼容 OpenAI 协议的聚合接口(比如我在用 ofox.ai),Claude、GPT、Gemini 都能切着用,延迟比直连好不少。
小结
MCP Tool Search 算是 Claude Code 最近最实用的更新之一了。如果你也是 MCP 重度用户,建议:
- 升级到 2.1.76+(
npm update -g @anthropic-ai/claude-code) - 给自建 MCP Server 加上
instructions字段 - 用
/mcp命令随时查看 Server 状态 - 不要禁用
ToolSearch工具
装了十几个 MCP Server 不再是负担,反而成了优势------需要啥能力随时调用,不需要的不占上下文。这才是 MCP 生态该有的样子。