跳转到主要内容

Claude Code MCP 上下文爆掉:为什么服务器太多会吃窗口,怎么筛选和压缩

A
12 分钟阅读Claude Code

MCP 上下文爆掉不只是服务器数量问题。用这套 Claude Code 预算表判断是工具定义、返回结果、会话残留还是工具设计在吃窗口,然后保留真正属于当前任务的访问面。

Claude Code MCP 上下文爆掉:为什么服务器太多会吃窗口,怎么筛选和压缩

Claude Code 接太多 MCP server 之后变慢、提前 compact、或者一调用工具就开始丢重点,通常不是“Claude 变笨”这么简单。每个连接都会带来一类上下文成本:工具名称、说明和 schema 可能提前进入可见范围;工具调用后的日志、表格、文件和数据库行会继续占用窗口;一次长会话里的失败分支、旧计划和重复尝试也会留下残留。Tool Search 能缓解一部分工具定义负担,但它不会让无关 server、超大返回结果、代理路径差异或旧会话免费。

截至 2026 年 5 月 23 日,Claude Code 文档已经说明 MCP 控制、Tool Search 以及输出超过 10,000 tokens 时的警告;如果你走的是代理、兼容网关、自定义模型或非默认 provider,先在自己的环境里验证,不要把别人的截图当成当前事实。

先用一张预算表判断问题来自哪里:

成本现场表现第一修复动作
工具定义还没调用外部工具,模型已经面对一堆名称、描述和参数。确认 Tool Search 是否生效;把当前任务不需要的 server 延后或关掉。
工具返回一次日志、表格、issue、搜索或数据库调用后,窗口迅速变重。在源头做摘要、过滤、分页、limit、cursor 或返回文件句柄。
会话残留多次修 bug、重试、撤回方案之后,Claude 开始混淆新旧判断。总结当前决策,关闭旧分支,必要时开新线程。
决策面多个 server 都叫 search、read、list,Claude 不确定该用哪个。每个工作流只留一个 owner;把过宽的自建 server 拆开或重做。

马上可以做的动作很窄:在 Claude Code 里跑 /mcp,列出本次任务真的需要的 server,然后给每个 server 标记 keep、defer、disable、split 或 redesign。缺的是固定方法,就用 skill;缺的是外部数据或动作面,才保留 MCP,并压缩它返回给对话的内容。

先把问题拆成上下文预算

MCP server 不是 settings.json 里的一行名字。一个 MCP tool 至少会有名称、描述、输入 schema,可能还有输出 schema 和返回内容。客户端什么时候把这些信息暴露给模型,取决于 Claude Code 的加载路径、Tool Search 状态和具体 provider 行为;但无论怎样,工具定义本身都不是零成本。

更容易被忽略的是第二类成本:工具调用结果。你可以只启用一个数据库 MCP,但如果它默认吐出 8,000 行、完整 trace、整份文档或所有匹配文件,窗口照样被吃满。相反,三个清晰、安静、只返回小摘要的 server 往往不会造成同样的压力。

四类 MCP 上下文成本:工具定义、工具返回、会话残留和决策面

因此,排查时不要只问“我装了几个 MCP server”。要问“这次任务中,有多少内容被放进了当前工作窗口”。如果痛点发生在任何 tool call 之前,重点看工具定义、重复命名和 server 选择面;如果痛点发生在某次调用之后,重点看返回体大小;如果痛点发生在长时间反复修复之后,重点看会话残留。

你看到的症状更可能的成本检查位置
刚开始就慢或犹豫工具定义、决策面/mcp、server 列表、重复工具名、过长描述
调用一次后开始乱工具返回日志、表格、文件、数据库行、检索返回数量
修几轮后判断倒退会话残留旧错误、旧计划、未关闭分支、重复输出
总选错工具决策面多个 server 暴露相似 read/search/list 动作

这个预算模型比“全部删掉”更稳定。你要的是更少的当前选择、更小的返回内容、更清楚的 owner,而不是把所有外部能力都关掉以后再从头猜。

Tool Search 只处理一部分成本

Tool Search 的价值在于延后工具发现和工具定义加载。以前很多建议会说“接入 MCP 就一定把 schema 全塞进上下文”;现在这个说法需要加条件:在 Claude Code 支持的路径上,Tool Search 可以减少 upfront 的定义负担。

但它不是免税卡。Claude 一旦真的调用工具,返回结果仍然进入当前对话,仍然会消耗 context window。Anthropic 对 context window 的解释很直接:这是当前交互的工作记忆,历史轮次和工具结果都会累积。Tool Search 主要改变“什么时候看到工具定义”,不是“工具可以返回多少数据”。

Tool Search 能减少前置工具定义,但工具返回仍然占用上下文

三个边界要分开看:

边界Tool Search 能帮什么它不解决什么
前置工具定义支持路径上延后发现和加载工具工具名太泛、描述太长、多个 server 争同一件事
工具返回本身不压缩返回体大表、日志、trace、文件、API 原始 payload
会话残留本身不清理旧轮次长线程、失败分支、重复尝试、过期判断

如果你使用 ANTHROPIC_BASE_URL、兼容 provider、代理网关或自定义模型路径,不要只看“Tool Search 已经发布”这个结论。实际做一次任务,看模型在 /mcp 之后是否仍然加载了过多工具,或者是否在工具返回后才开始变差。前者是定义问题,后者是输出压缩问题。

Keep、Defer、Disable、Split、Redesign

清理 MCP 的关键不是追求最小数量,而是让当前激活列表有解释力。每个 server 都必须能填上这句话:“这次任务里,它负责 ____。”如果空格里只能写“可能有用”,它就不该默认待在主会话里。

动作什么时候用例子
Keep它确实拥有当前 workflow,且本地文件、memory、skill 都替代不了。PR review 时保留 GitHub MCP,查框架迁移时保留 docs MCP。
Defer它有价值,但只在后续阶段或少数分支使用。UI 还没改完之前,先不启用浏览器 QA server。
Disable它不服务当前任务,或和另一个 active owner 重复。两个 docs server 都回答同一个库。
Split一个自建 server 打包了互不相关的读写动作。把只读 issue 搜索和部署写操作拆成不同 server。
Redesignserver 是你写的,工具形状太宽、太吵、默认返回太多。把 dump_database 改成 search_errors(service, time_range, limit)。

/mcp 适合在 Claude Code 里快速看 active server;claude mcp list、claude mcp get、claude mcp remove 适合在终端层做配置清点。做这件事时不要只数数量。要看每个工具名是否能让 Claude 做出稳定选择,描述是否短而有区分度,默认输出是否足够小。

如果你其实还在决定“第一批 MCP server 应该装哪些”,先看 Claude Code MCP Server 推荐。本文解决的是另一个阶段:配置已经长胖,现在要把它缩回适合当前工作的形状。

在工具输出进入对话前压缩

Tool Search 生效以后,真正伤窗口的常常是 tool output。一次 Playwright snapshot、GitHub issue 列表、数据库查询、日志拉取或全文搜索,比几个安静 server 更容易把上下文压爆。

Claude Code 的 10,000 token 输出警告和 MAX_MCP_OUTPUT_TOKENS 是护栏,不是设计目标。好的 MCP 返回不是“刚好没超过上限”,而是“足够让 Claude 做下一步判断”。如果下一步只需要三条错误样例,就不要返回整份日志;如果下一步只需要 owner、状态和数量,就不要返回每一行原始记录。

规则坏返回更好的返回
先摘要完整日志流异常类型、计数、3 条样例
源头过滤所有行服务、时间、状态、owner 命中的行
分页一个巨大响应第一页加 next_cursor
默认上限无限制文件或匹配limit: 20,需要时显式放大
返回句柄完整文件或数据集file path、object id、job id、stored result
预览和深挖分开直接原始 payload摘要先返回,raw fetch 另开参数

用户侧也能做压缩。不要问“读一下数据库”,而是问“按 service 汇总过去 24 小时 top 20 error,每类给 count 和一条 sample trace”。不要问“看日志”,而是问“只看部署失败后的错误行,健康检查和重复 warning 忽略”。问题越窄,工具越不容易把无关内容塞进窗口。

设计紧凑的 MCP server

如果你能改 server,最高杠杆不是开关它,而是重做工具形状。一个紧凑的 MCP server 应该让 Claude 很容易走 compact path:少量工具、清楚 owner、短描述、默认安全、默认摘要、需要时再取更多。

紧凑 MCP server 设计清单与 before/after 工具形状

设计时按这个清单过一遍:

  1. 一个 tool 只做一件事,不要同时读 issue、日志、指标、文件和部署。
  2. 工具名写结果,不写实现。search_recent_errors 比 query_system 更好。
  3. 描述要帮 Claude 选择工具,不要把整个后端文档塞进去。
  4. 相似模式尽量参数化,例如 mode: summary/detail/export,而不是三组重叠工具。
  5. 默认返回 summary,raw output 必须显式请求。
  6. 高频、大数据工具必须支持 filter、limit、pagination 或 cursor。
  7. 超大 payload 返回 path、id、handle,让后续步骤按需打开。
  8. 读写分开,昂贵或破坏性动作要在名称和描述里清楚标出。

一个坏工具是 get_everything_from_database(),返回 rows、logs、traces 和 unrelated metadata;一个紧凑工具是 search_errors(service, time_range, limit),先返回摘要、top rows 和 next_cursor。区别不只是 token 数。后者让 Claude 知道下一步该问什么,前者会把模型推回“先读完再说”的坏习惯。

把重活移出主线程

有些时候,正确答案不是“少用 MCP”,而是“不要在主线程里做所有 MCP 探索”。Claude Code subagents 可以把噪声调查隔离出去:让一个窄工具集的 subagent 查日志、整理候选、返回摘要,主线程只保留决策。

但 subagent 不是天然压缩边界。工具继承如果太宽,它可能拿到和主会话一样多的 server,最后只是把噪声复制到另一个地方。给探索型 agent 只开它需要的工具,并要求它返回 findings、counts、paths、next actions,而不是 raw payload。

Skill 也是压缩路线,但它解决的是“方法”而不是“外部访问”。缺一套固定检查步骤,写 skill;缺 GitHub、Sentry、数据库或浏览器动作面,用 MCP;两者都缺时,让 MCP 提供触达,让 skill 提供操作方法。可复用方法可以看 Claude Code Skills 推荐,长期规则则适合放到 Claude Code Memory

20 分钟清理流程

当 Claude Code 因为 MCP 太多而提前 compact、回答变慢或工具选择变差时,用这个流程:

  1. 在当前任务里运行 /mcp,列出 active server。
  2. 给每个 server 标记 keep、defer、disable、split 或 redesign。
  3. 关掉没有当前 workflow owner 的项,不要因为“未来可能用”保留。
  4. 重跑同一个小任务,观察痛点发生在 tool call 前还是 tool call 后。
  5. 如果发生在 tool call 前,检查 Tool Search、工具名、描述、重复 owner。
  6. 如果发生在 tool call 后,检查返回体,改 summary、filter、limit、cursor、handle。
  7. 如果发生在多轮修复后,总结当前决策并开新线程。
  8. 如果缺的是方法而不是访问,写 skill,不要再加 server。

好指标不是总共配置了几个 server,而是当前任务中 Claude 需要考虑多少 active choice,以及每个 tool call 会把多少数据带回对话。最小有用配置通常不是最酷的配置,而是 Claude 能稳定推理的配置。

一个常见排查例子是:你同时开了 GitHub、Sentry、数据库、浏览器、文档和内部后台 MCP,但当前任务只是修一个 API 500。此时 GitHub 可能只需要读 issue,Sentry 可能负责错误样本,数据库可能只负责最近 24 小时的失败计数。浏览器 QA、通用文档、后台写操作都可以先 defer。这样 Claude 面前的 active owner 会少很多,问题也更容易被拆成“错误样本、影响范围、修复验证”三步。

另一个例子是自建日志 MCP。坏设计会默认返回整段日志、所有 request headers、完整 stack trace 和周边 debug 行;好设计会先返回错误类型、count、时间范围、代表 trace、受影响 route 和 next_cursor。只有当 Claude 明确需要原始证据时,才通过 handle 打开对应片段。这样做不会降低可追溯性,反而让主线程保留更多空间来判断修复方向。

常见问题

Tool Search 能解决 Claude Code MCP 上下文爆掉吗?

不能完全解决。它能在支持路径上减少前置工具定义负担,但不能压缩工具返回、清理旧会话、消除重复 server,也不能修复过宽的自建工具。

Claude Code 应该启用多少 MCP server?

没有通用数字。只启用当前 workflow 的 owner,其余延后或关闭。一个会返回巨大数据库结果的 server 也能吃爆窗口,几个安静、职责清楚的 server 反而可能没问题。

MCP tool output 很大怎么办?

在源头压缩。让工具返回 summary、filter、limit、pagination、cursor、file path、object id 或 handle。能不把 raw data 塞进对话,就不要塞。

什么时候用 skill 替代 MCP?

缺的是可重复方法、检查清单、参考包或脚本顺序时,用 skill。缺的是外部数据、外部系统或动作面时,用 MCP。两者同时需要时,把访问和方法分开设计。

怎么设计紧凑 MCP server?

少工具、清楚 owner、短描述、默认摘要、可过滤、可分页、有 limit 和 cursor,超大数据返回句柄。避免一个工具为了方便而返回所有东西。

把所有 MCP server 都关掉是不是最安全?

不是。全关只适合诊断。长期方案是一个紧凑 active set:保留当前任务必须的外部访问,延后非必要项,并重做那些默认返回太多数据的工具。

Claude Code MCP 上下文爆掉是可以修的。把窗口当预算,不要把每个集成都放进主线程。留下当前任务真正需要的 server,把大结果在源头压缩,把固定方法交给 skill,把噪声探索放进受限上下文。Claude 能推理得好的 MCP 设置,通常也是最小但够用的设置。

分享文章:

laozhang.ai

一个 API,所有 AI 模型

AI 图片

Gemini 3 Pro Image

$0.05/张
官方2折
AI 视频

Sora 2 · Veo 3.1

$0.15/个
异步API
AI 对话

GPT · Claude · Gemini

200+ 模型
同官方价
已服务 10万+ 开发者
|@laozhang_cn|送$0.1