MCP 服务器空转烧掉 1.8 万 Token?实战优化方案

MCP 服务器在尚未执行任何任务前就消耗 18,000 个 Token,严重影响推理效率。本文分析根因并提供可落地的优化方案。
问题:MCP 服务器还没干活,Token 已经烧光了
最近社区里有个案例引发广泛关注:一个 MCP(Model Context Protocol)服务器在尚未执行任何实际任务之前,就消耗了 18,000 个 Token。这意味着模型在真正开始推理前,上下文窗口已经被大量元数据填满,留给实际任务的 Token 预算被严重压缩。
这个问题在开发者中并不少见,但 1.8 万 Token 的空转消耗确实触目惊心。
为什么会这样?
MCP 的核心机制是让 AI 模型通过标准化的工具调用协议与外部服务交互。每次连接 MCP 服务器时,系统会向模型注入以下内容:
- 工具描述与 Schema:每个工具的名称、参数定义、返回值格式等,通常以 JSON Schema 形式呈现
- 服务器元信息:连接状态、可用能力列表、认证信息摘要
- 上下文初始化数据:会话配置、权限声明、示例调用等
当 MCP 服务器注册了大量工具,或每个工具的描述写得过于冗长时,仅初始化阶段就可能吃掉数万 Token。对于上下文窗口有限的模型,这直接导致可用推理空间大幅缩减。
根因分析
| 原因 | 说明 |
|---|---|
| 工具描述冗余 | 开发者为了"写清楚",在描述中塞入大量示例和边界说明 |
| 全量工具注册 | 服务器一次性暴露所有工具,而非按需加载 |
| Schema 过于复杂 | 嵌套过深、字段过多的 JSON Schema 本身就很占 Token |
| 缺乏 Token 预算意识 | 工具作者往往不关心初始化开销 |
实用优化方案
方案一:精简工具描述
核心原则:每个工具的描述控制在 2-3 句话以内。 把详细的参数说明、使用示例放到工具的 description 字段的补充说明中,而不是堆在核心描述里。模型只需要知道"这个工具做什么",不需要在初始化时就读完整个 API 文档。
方案二:按需加载工具(Lazy Loading)
不要一次性注册所有工具。可以采用分组注册策略:
- 初始阶段只注册核心工具(3-5 个最常用的)
- 当模型需要更多能力时,通过一个
discover_tools元工具动态加载 - 用完的工具及时从上下文中移除
方案三:使用 Code Mode 替代纯 JSON 调用
这是社区讨论中提到的一个有效思路:用代码执行模式(Code Mode)替代传统的 JSON 工具调用。在 Code Mode 下,模型直接生成可执行的代码片段来调用工具,而非依赖冗长的 JSON Schema 描述。好处是:
- 工具描述可以更简洁,因为模型理解的是代码语义而非 JSON 结构
- 复杂的多步骤操作可以在一段代码中完成,减少多次调用的开销
- 调试更容易,因为生成的代码可以直接运行和检查
方案四:Token 预算监控
在 MCP 服务器端增加 Token 消耗监控:
# 伪代码示意
import tiktoken
def count_tokens(text):
return len(tiktoken.encoding_for_model("gpt-4").encode(text))
def check_budget(tool_descriptions, budget=4000):
total = sum(count_tokens(t) for t in tool_descriptions)
if total > budget:
raise ValueError(f"Tool descriptions exceed budget: {total} > {budget}")
对谁有价值?
- MCP 服务器开发者:优化工具描述,控制初始化开销
- AI Agent 架构师:设计更高效的工具注册和加载策略
- LLM 应用开发者:理解 Token 预算分配,避免上下文浪费
总结
18,000 Token 的空转消耗是一个信号:MCP 生态在快速发展中,工具描述和注册机制还需要更精细的 Token 预算管理。从精简描述、按需加载到 Code Mode,每一条路径都能显著降低初始化开销。如果你的 MCP 服务器也面临类似问题,建议从方案一和方案三入手,效果最为直接。

本文基于 The New Stack 的公开内容,由 AI 辅助整理改写后发布。
原标题:One MCP server used 18,000 tokens before doing anything. Here’s the workaround.
阅读原文