你的 MCP 服务器在你开口说话前就在消耗 Token 了
你正在为从未使用的数据买单。
上周我追踪了一个智能体(agent)会话。它加载了 47 个 MCP 工具。每个工具都会将其完整的 JSON schema 发送到系统提示词(system prompt)中。而这一切发生在我输入第一个字之前。
每个工具的 schema 会占用 150 到 400 个 token。47 个工具就产生了 11,000 个 token 的额外开销。模型在每一轮对话中都会读取这些 token。即使你只使用了两个工具,你也必须为这些上下文付费。
大多数人担心大文件上传,却忽略了工具菜单本身的成本。
当你堆叠 GitHub、Slack 和数据库等服务器时,最终会拥有 60 到 100 个工具。我见过有些会话中,工具定义占用了整个上下文预算的 20%。
不要一次性加载所有内容。改用延迟加载(deferred loading)。
以下是这种模式: • 仅按名称和简短描述列出工具。 • 使用搜索工具按需获取完整的 schema。
与其为每个工具注入一个庞大的 JSON 对象,不如只提供一个简单的名称。当模型需要某个特定工具时,它会调用一个搜索函数。该函数仅返回匹配工具的完整 schema。
结果非常显著: • 预加载(Eager loading)80 个工具:约 18,000 个 token。 • 延迟加载(Deferred loading)80 个工具:约 1,000 个 token。
这让工具定义从一项重大开销变成了微不足道的误差。
这种策略之所以有效,是因为大多数会话只使用可用工具的一小部分。如果你在一次会话中使用所有工具,成本保持不变。但对于大多数用户来说,这节省了大量的上下文。
不要问模型需要调用哪些工具,而要问模型默认需要知道哪些工具的存在。
大多数目录为了方便会一次性提供所有内容。但这也是在没人阅读的菜单上快速烧光预算的最快方式。
保持简单。提供一个名称、一个描述和一个搜索函数。为你使用的三个工具付费,而不是为你忽略的八十个工具付费。
Source: https://dev.to/enjoy_kumawat/your-mcp-servers-are-burning-tokens-before-you-type-a-word-3076
Optional learning community: https://t.me/GyaanSetuAi
