问题出现得很突然,日志倒是留得挺全。接入了六个 MCP server,启动后 tools/list 合并返回 40 条工具,每条描述平均 180 字,光工具定义就占了约 8k token,长会话到第十轮开始报上下文超限,把工具全关掉就正常。

刚开始盯着「工具列表每轮都随请求重发,没有做服务端裁剪」,折腾了半个多小时,排掉了。

把日志和配置对完,能解释这个现象的基本就这几处。每个 server 都暴露了同类工具,功能重叠导致定义重复。少数情况下是描述里塞了大段用法示例和返回样例。

还有一种情况,schema 里 required 与 properties 嵌套过深,序列化体积翻倍。

上来先把所有工具的名字和描述长度统计出来

python -c "import json;d=json.load(open('tools.json'));print(sorted([(len(t.get('description','')),t['name']) for t in d['tools']],reverse=True)[:10])"

接着按 server 前缀分组看哪家占得最多

python -c "import json,collections;d=json.load(open('tools.json'));print(collections.Counter(t['name'].split('_')[0] for t in d['tools']))"

随后关掉冗余 server 再取一次列表

python -c "print('disable duplicate servers, keep 2 of 6')"

剩下的就是把工具描述压缩到一句话后重新统计

python -c "import json;d=json.load(open('tools.json'));print(sum(len(t.get('description','')) for t in d['tools']))"

怎么算真的好了,看的是同一批现象。工具定义占用降到 2k token 以内,长会话能跑到二十轮不超限,模型选工具的准确率没有下降。

这里还有个坑。工具描述是每轮都要付的固定成本,接的 server 越多越要定期清理,重复能力合并成一个入口比留十个更像样。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。

作者 9823189