你接了Linear、Notion、Slack、Postgres四个MCP Server后,Claude Code的上下文窗口被工具定义吃掉了10.5%。这不是你的问题,是MCP协议的设计问题。本文给出3种解决方案,附可复制配置。
问题:你的MCP工具在偷吃上下文
2026年5月,Quandri工程团队发了一篇博客《MCP is dead?》,在HN上引发151分146评论的大讨论。他们做了一个简单但惊人的实验:
接4个常见MCP Server后,工具定义占了多少上下文?
| MCP Server | 工具数 | Schema字符数 | Token估算 |
|---|---|---|---|
| Linear | 42个 | 51,229 chars | ~12,807 |
| Notion | 14个 | 16,156 chars | ~4,039 |
| Slack | 12个 | 15,168 chars | ~3,792 |
| Postgres | 9个 | 1,755 chars | ~439 |
| 合计 | 77个 | 84,308 chars | ~21,077 |
Claude的200K上下文窗口,21K token看起来不多。但实际场景中:
- 你的代码文件已经占了100K+
- 对话历史占30K+
- 项目规则和CLAUDE.md占10K+
- 再加21K工具定义 = 窗口告急
更要命的是,每次对话开始都会把全部工具定义塞进system prompt,不管这次对话用不用得到Slack或Linear。这就是MCP最被诟病的问题:工具定义不按需加载。
HN社区的三种声音
这场讨论里,社区形成了三派:
"MCP该死了"派:
"Skills + 小脚本 > MCP。MCP调用消耗更多token,出错概率更高,调试还麻烦。"
"MCP已经修好了"派:
"Claude Code的progressive discovery + tool nudging早就解决这个问题了。我的体验是MCP比自定义工具更好用。"
"看场景"派(最多人):
"MCP在组织级别有用——统一、安全、允许非技术人员使用内部Agent工具。但个人开发场景下,CLI往往更高效。"
三种声音都有道理。但作为AI创业者,你最关心的是:怎么让我的Agent在工具繁多的情况下还能高效工作?
下面给出3种实操方案,从简单到深入。
方案1:Claude Code Tool Search + Deferred Loading(推荐)
Claude Code在2026年初引入了Tool Search with Deferred Loading机制。核心逻辑:
传统MCP加载:
启动 → 加载全部77个工具schema → 填满system prompt → 开始对话
Deferred Loading:
启动 → 加载工具名称列表(少量) → 开始对话
→ Agent需要用某个工具时 → 才加载该工具的完整schema
实测效果:上下文占用从21K token降至约3K token(仅工具名列表),降低85%+。
配置步骤
第一步:确认Claude Code版本
claude --version
# 需要 ≥ 2.0.0(2026年3月后的版本都支持)
第二步:启用Tool Search
在项目根目录创建或编辑 .claude/settings.json:
{
"mcp": {
"toolSearch": {
"enabled": true,
"mode": "deferred"
}
}
}
第三步:配置MCP Server
.claude/mcp.json 示例(关键:每个server加 toolSearch: true):
{
"mcpServers": {
"linear": {
"command": "npx",
"args": ["-y", "@linear/mcp-server"],
"env": {
"LINEAR_API_KEY": "${LINEAR_API_KEY}"
},
"toolSearch": true
},
"postgres": {
"command": "npx",
"args": ["-y", "@anthropic/mcp-server-postgres", "postgresql://localhost/mydb"],
"toolSearch": true
}
}
}
第四步:验证
启动Claude Code后,运行:
/mcp
你会看到工具列表,但注意观察首次启动速度——应该比之前快很多(因为没加载完整schema)。当你第一次调用Linear的 linear_search_issues 时,Claude Code会实时加载该工具的完整定义。后续调用同一工具不再重复加载。
进阶:手动Tool Nudging
有时你想让Claude主动搜索某个工具,可以在对话中使用 /tools 命令:
/tools search "create issue"
Claude会返回匹配的工具列表,你可以选择需要的工具,它会自动加载schema。
方案2:裁剪MCP Server(适合工具数>30的场景)
不是所有MCP Server的所有工具你都需要。比如Linear MCP Server提供42个工具,但你可能只需要5个。
做法:用自定义MCP Wrapper过滤工具
创建一个过滤脚本 ~/.mcp/filter-linear.py:
#!/usr/bin/env python3
"""MCP工具过滤器:只暴露Linear核心工具"""
import json
import sys
# 只保留这些工具
KEEP_TOOLS = [
"linear_search_issues",
"linear_get_issue",
"linear_create_issue",
"linear_update_issue",
"linear_add_comment"
]
def filter_tools(input_json):
data = json.loads(input_json)
if "tools" in data:
data["tools"] = [t for t in data["tools"] if t.get("name") in KEEP_TOOLS]
return json.dumps(data)
if __name__ == "__main__":
for line in sys.stdin:
print(filter_tools(line.strip()), flush=True)
然后在 mcp.json 里用wrapper:
{
"linear": {
"command": "python3",
"args": ["~/.mcp/filter-linear.py"],
"transport": "stdio",
"toolSearch": true
}
}
效果: Linear从42个工具→5个工具,schema从51K chars→~6K chars,单Server减少88%。
方案3:用CLI替代MCP(适合固定工作流)
很多场景下,直接用命令行工具比MCP更高效。原因是:
| 维度 | MCP | CLI |
|---|---|---|
| 上下文占用 | 每个工具有schema定义 | 零工具定义开销 |
| 调用延迟 | MCP Server进程通信 | 直接shell执行 |
| 调试难度 | 需要看MCP日志 | 标准stdout/stderr |
| 灵活性 | 受限于工具定义 | 可以pipe/chain任意命令 |
| 安全性 | MCP Server隔离 | 需要自行控制权限 |
实例:用CLI替代Notion MCP Server
# 不用MCP,用Notion CLI(如果有的话)
# 或者直接用API curl
# 在Claude Code中:
# 告诉Claude: "用bash执行以下命令查询Notion"
curl -s -X POST "https://api.notion.com/v1/databases/{DB_ID}/query" \
-H "Authorization: Bearer $NOTION_TOKEN" \
-H "Notion-Version: 2022-06-28" \
-H "Content-Type: application/json" \
-d '{"filter":{"property":"Status","select":{"equals":"In Progress"}}}'
在 .claude/settings.json 中允许bash执行Notion相关命令:
{
"permissions": {
"allowBash": {
"patterns": ["curl *notion*", "notion-cli *"]
}
}
}
效果: Notion从16K chars工具定义→0 chars,且调用速度更快(少了MCP进程中转)。
决策框架:什么时候用哪种方案
你的MCP Server数量?
├─ 1-3个 → 直接全量加载,不需要优化
├─ 4-10个 → 方案1:Tool Search + Deferred Loading
│ (5分钟配置,85%+上下文节省)
└─ 11+个 → 方案1 + 方案2组合
(Deferred Loading + 过滤不需要的工具)
你的使用频率?
├─ 每天多次调用 → MCP值得保留(tool search模式)
├─ 每周几次 → 考虑方案3,用CLI替代低频工具
└─ 几乎不用 → 直接移除该MCP Server
可复制的优化清单
把下面这个checklist放到你的CLAUDE.md或项目文档里:
## MCP工具优化清单
- [ ] 列出所有MCP Server及其工具数(`/mcp` 查看)
- [ ] 标记每个Server的使用频率(高/中/低/从不)
- [ ] 对「低/从不」的Server:直接移除
- [ ] 对剩余的Server:启用 toolSearch deferred mode
- [ ] 对工具数>30的Server:用filter只保留核心工具
- [ ] 对每周只用1-2次的工具:改用CLI调用
- [ ] 每月复查一次:有没有新增的冗余工具?
总结
MCP不会被"杀死",但它确实需要聪明地使用。核心原则是:
- 工具定义是昂贵的:每多一个MCP Server,你就在损失上下文空间
- 按需加载是默认选项:Claude Code的Deferred Loading应该默认开启
- CLI永远是最轻量的工具调用方式:固定工作流优先考虑CLI
- 定期审查工具清单:就像定期清理node_modules,MCP Server也需要清理
你的Agent聪明不聪明,不只看模型能力,也看你能不能给它一个干净、高效的"工具工作台"。
