文章总结: 文章指出传统MCP工具调用在规模化时因上下文膨胀与LLM训练错配导致token浪费与性能下降,提出以CodeMode让LLM生成代码调用API,通过渐进式披露、沙箱执行、预处理数据等策略,token可降98.7%,并带来更强逻辑、安全与技能沉淀,但需额外沙箱基础设施与运维成本,是对补丁式MCP的修正。 综合评分: 88 文章分类: AI安全,安全工具,解决方案,安全开发,实战经验
Anthropic说,你的MCP工具可能大半都只是在浪费token
原创
hhh
黑极客hijackY
2026年1月6日 16:40 四川
引言:从希望到瓶颈
模型上下文协议(Model Context Protocol,MCP)的诞生,无疑是 AI Agent 发展史上的重要一步。作为开放标准,它为连接 AI Agent 与外部工具搭建了桥梁,让我们对 Agent 执行复杂现实任务充满期待。
然而,随着 Agent 连接的工具数量从几十个增长到数百上千,一个严重影响效率和成本的“阴暗面”逐渐浮现:当 Agent 需要连接大量外部工具时,海量的工具定义和中间数据会迅速占满上下文窗口,导致成本飙升、效率下降。
如果你也遇到类似问题,Anthropic 发布的一篇技术博客提出了全新的解决思路,巧合的是,Cloudflare 在另一篇文章中也有类似洞察。
在深入探讨其“阴暗面”之前,我们先回顾 MCP 的初衷。
1. MCP 的初衷
在分析一种模式的局限之前,我们必须先理解其设计目标与核心价值。MCP 的出现,旨在解决 AI Agent 生态中的一个根本问题。
简单来说,MCP 是一个开放的统一协议,使 AI Agent 能够发现并使用外部工具(如 API),从而执行如“从 Google Drive 下载会议纪要并更新到 Salesforce”这类实际任务。根据 Cloudflare 的总结, MCP 提供三大核心价值:
- 统一的 API 接口:将所有外部工具抽象为一组标准“工具”,本质是远程过程调用(RPC),为 Agent 提供一致交互方式。
- 自带的说明文档:协议内包含 LLM 理解和使用 API 所需的全部文档,无需 Agent 自行搜索。
- 标准化的授权机制:以带外(out-of-band)方式处理认证流程,简化 Agent 与工具的安全连接。
MCP 的重要性在于将 Agent 开发者与工具提供者解耦,催生了繁荣的生态。然而,其主流实现方式——直接工具调用,却带来了意想不到的瓶颈。
2. MCP 工作原理的“阴暗面”
传统 MCP 工具调用机制在规模化时为何效率低下?存在核心问题。
传统的“工具调用”机制
在传统模式下,LLM 不直接输出代码,而是生成特殊 token 来标记工具调用的开始和结束。例如,查询天气时,LLM 的内部工作流可能如下:
我将使用天气 MCP 服务器来查询德克萨斯州奥斯汀的天气。 <|toolcall|> { “name”: “getcurrentweather”, “arguments”: { “location”: “Austin, TX, USA” } } <|endtool_call|>
系统监测到这些特殊 token 后,会暂停 LLM 生成,解析 JSON 指令并调用外部工具。工具执行完毕后,结果以类似格式返回:
<|toolresult|> { “location”: “Austin, TX, USA”, “temperature”: 93, “unit”: “fahrenheit”, “conditions”: “sunny” } <|endtool_result|>
LLM 读取结果后继续生成文本。这一循环看似合理,却隐藏两大问题。
核心问题一:能力与训练的错配
第一个问题源于 LLM 的训练方式。Cloudflare 指出,LLM 并非天生擅长工具调用。用于标记工具调用的特殊令牌在真实语料中从未出现,模型能理解它们,完全依赖后期基于“人工合成数据”的微调。这导致 LLM 在面对大量或复杂工具时表现不稳定。
相比之下,LLM 在编写真实代码方面表现出色,因为训练数据包含数百万开源项目的高质量代码。Cloudflare 的比喻生动说明了这种错配:
“让 LLM 通过工具调用来执行任务,就像让莎士比亚上一个月中文速成班后写一部中文戏剧——这绝不会是他的最佳作品。”
核心问题二:上下文窗口的过度膨胀
第二个问题更致命,直接影响成本和性能。Anthropic 的分析揭示两种导致 token 消耗激增的场景:
- 工具定义过载:当 Agent 连接数百个工具时,主流做法是将所有工具定义和描述预先加载到上下文。这在处理用户请求前就可能消耗数万 token,增加延迟和费用。
- 中间结果冗余:执行多步任务时,每一步工具调用的完整输出都必须返回上下文,再由模型复制到下一步调用。(Anthropic 这里给出一个 “Google Drive 到 Salesforce” 的案例显示,如果一份会议纪要先被读入上下文,再被完整写入下一步参数。对于两小时的会议,这可能额外消耗 50,000 token,并易因上下文长度限制导致任务失败。)
上下文的急剧膨胀加剧了“能力错配”问题:在拥挤的上下文中,强迫不擅长工具调用的模型做出正确决策,难度和出错率倍增。这种低效高耗模式是限制 AI Agent 发展的关键瓶颈。幸运的是,解决方案是一次优雅的范式转移。
3. “Code Mode” 用代码生成代替工具调用
解决问题的核心思路不是抛弃 MCP,而是改变互动方式。这里 Anthropic 和 Cloudflare 提出的新范式核心一致:
让 LLM 不再直接“调用”工具,而是“编写代码”调用这些工具的 API。
Cloudflare 称之为“代码模式”(Code Mode),Anthropic 称之为“通过 MCP 进行代码执行”(Code execution with MCP)。
这一转变有效是因为它避开 LLM 在工具调用上的弱点(依赖人工数据),充分利用其代码生成能力(基于海量真实代码训练)。
新模式下,系统工作流程大致为:将 MCP 工具集自动转换为标准编程语言 API(如 TypeScript),让 LLM 在安全沙箱中生成并执行代码来完成任务。
即使采用代码模式,MCP 的价值依然关键。Cloudflare 指出,MCP 的“统一性”至关重要,它提供标准化方式连接、发现和授权 API,这是传统 API 不具备的。Agent 无需学习每种 API 的认证方式或搜索文档,这正是 MCP 的精髓。
4. 深入实践:代码模式如何落地?
将“代码模式”变为现实需要技术实现。Anthropic 和 Cloudflare 展示了两种路径。
Cloudflare 的 SDK 动态转换
Cloudflare 的 Agents SDK 实现动态转换机制。连接 MCP 服务器时,SDK 自动获取服务器 schema(工具定义),并即时转换为完整 TypeScript API 定义文件,含文档注释。
例如,连接查询 Cloudflare Agents 文档的 MCP 服务器后,SDK 生成如下 TypeScript 接口:
interface FetchAgentsDocumentationInput { [k: string]: unknown; } interface FetchAgentsDocumentationOutput { [key: string]: any; }
interface SearchAgentsDocumentationInput { /** * The search query to find relevant documentation */ query: string; } interface SearchAgentsDocumentationOutput { [key: string]: any; }
interface SearchAgentsCodeInput { /** * The search query to find relevant code files / query: string; /* * Page number to retrieve (starting from 1). Each page contains 30 * results. */ page?: number; } interface SearchAgentsCodeOutput { [key: string]: any; }
interface FetchGenericUrlContentInput { /** * The URL of the document or page to fetch */ url: string; } interface FetchGenericUrlContentOutput { [key: string]: any; }
declare const codemode: {
/**
* Fetch entire documentation file from GitHub repository: * cloudflare/agents. Useful for general questions. Always call
* this tool first if asked about cloudflare/agents.
*/
fetchagentsdocumentation: (
input: FetchAgentsDocumentationInput
) => Promise
/**
* Semantically search within the fetched documentation from
* GitHub repository: cloudflare/agents. Useful for specific queries.
*/
searchagentsdocumentation: (
input: SearchAgentsDocumentationInput
) => Promise
/**
* Search for code within the GitHub repository: “cloudflare/agents”
* using the GitHub Search API (exact match). Returns matching files
* for you to query further if relevant.
*/
searchagentscode: (
input: SearchAgentsCodeInput
) => Promise
/**
* Generic tool to fetch content from any absolute URL, respecting
* robots.txt rules. Use this to retrieve referenced urls (absolute
* urls) that were mentioned in previously fetched documentation.
*/
fetchgenericurl_content: (
input: FetchGenericUrlContentInput
) => Promise
生成的 API 定义呈现给 LLM,使其能像人类开发者一样编写调用这些函数的代码,代码在安全沙箱中执行。
Anthropic 的文件系统发现机制
Anthropic 提出基于文件系统的发现机制,将所有可用 MCP 工具生成清晰的文件树结构,每个工具对应一个文件。
例如,连接 Google Drive 和 Salesforce 的 MCP 服务器后,生成如下目录结构:
servers/ ├── google-drive/ │ ├── getDocument.ts │ └── index.ts └── salesforce/ ├── updateRecord.ts └── index.ts
其中,getDocument.ts文件内容封装底层 MCP 调用:
// ./servers/google-drive/getDocument.ts import { callMCPTool } from “../../../client.js”;
interface GetDocumentInput { documentId: string; }
interface GetDocumentResponse { content: string; }
/* Read a document from Google Drive */
export async function getDocument(input: GetDocumentInput): Promise
此模式下,Agent 可像开发者浏览项目一样,通过列出目录和读取文件按需发现工具,而非一次性加载所有信息到上下文。
安全沙箱不可或缺
两种实现都强调关键点:执行 LLM 生成的任意代码必须在高度安全的沙箱中进行。
Cloudflare 的 isolates技术优势明显。与传统容器相比,isolates基于 V8 引擎,启动速度达毫秒级,内存占用仅几兆字节,极其轻量。可为每段代码即时创建新沙箱,用完即弃,开销可忽略,同时提供高安全性。
这些实现共同为“代码模式”带来颠覆性优势。
5. 代码模式带来的收益
“代码模式”不仅是技术优化,更是 AI Agent 能力的质变,从多维度解决传统工具调用的核心痛点。
颠覆性的上下文效率
这里省成本是最直观的优势。
- 渐进式披露(Progressive Disclosure): 正如 Anthropic 所展示的,Agent 不再需要一次性加载所有工具定义。通过文件系统浏览或搜索,它可以按需加载当前任务所需的工具。Anthropic 数据显示,处理复杂任务时,token 使用量可从 150,000 锐减至 2,000,节省高达 98.7%。
- 精简的工具结果: Agent 可以在代码中对海量数据进行预处理。例如,在获取一个包含 10,000 行数据的电子表格后,Agent 可以在代码中先执行过滤或聚合操作,最终只将小规模的关键结果(比如 5 行摘要)返回给模型,避免了用海量原始数据淹没宝贵的上下文窗口。
更强大的逻辑与控制流
Agent 可以利用编程语言原生的、强大的逻辑结构(如循环、条件判断、错误处理)来执行复杂任务。Anthropic 的 Slack 部署通知轮询案例就是一个典型场景。Agent 可以编写一个 while 循环来持续检查频道消息,这远比通过模型在多个工具调用和 sleep 指令之间来回切换要高效得多,延迟也更低。
显著增强的安全性与隐私性
- 杜绝 API 密钥泄露:Cloudflare 的“绑定”(bindings)机制从根本上解决密钥安全问题。API 密钥由代理监督程序(Supervisor)持有管理,沙箱中代码无法接触密钥原文,彻底杜绝泄露。
- 保护隐私数据:Anthropic 的方案展示强大隐私保护能力。敏感信息(如 PII)可在执行环境中自动“标记化”(tokenize)。客户真实数据在工具间流动时,进入模型上下文的仅是 [EMAIL_1]等占位符,真实数据永不暴露。
状态持久化与“技能”沉淀
- 通过文件系统,Agent 可将任务中间结果或状态写入文件,实现复杂任务的断点续传。
- 更重要的是,Agent 可将高效可靠代码片段保存为可复用“技能”(Skills)。随时间推移,Agent 能自主构建高层次能力库,提升解决问题效率。
这些优势共同使 AI Agent 能处理更复杂、长链条任务,成为强大数字助手。
6. 代码模式的成本与复杂性的权衡
当然,任何强大的技术方案都有其另一面。“代码模式”在带来巨大收益的同时,也引入了新的挑战和成本。
Anthropic 明确指出,代码执行模式的主要缺点在于引入额外的基础设施开销和复杂性,具体包括:
- 安全执行环境:需构建和维护能安全运行任意代码的沙箱环境,这本身就是一个复杂的系统工程。
- 资源限制与监控:必须严格限制代码运行资源(如 CPU、内存)并监控行为,防止恶意或低效代码耗尽资源。
- 运维开销:相比于简单的直接工具调用,这种模式无疑增加了系统的运维负担和对安全性的考量。
从 Cloudflare 投入巨大精力开发 isolates 和 Worker Loader API 等专用基础设施,也从侧面印证了解决这一复杂性问题的高门槛和必要性。所以还是需要在效率提升与实现成本间权衡。对于需要处理大量工具、复杂逻辑或长链条任务的 Agent 应用而言,这种投入几乎是必然的选择。比如最近看到很多在做智能渗透agent的团队也用到了这种思想。
7. 写在最后
其实 MCP 在诞生之初感觉就是不太完美的一个方案,还是在原有的一些问题上打补丁,只是 Anthropic 影响力太大,导致了意料之外的火爆,有点将错就错的味道,这些方法感觉也是对这些补丁的一些修正。未来应该有更优秀的方案吧,憧憬一下未来。
参考:
https://blog.cloudflare.com/code-mode/ https://www.anthropic.com/engineering/code-execution-with-mcp
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:黑极客hijackY hhh《Anthropic说,你的MCP工具可能大半都只是在浪费token》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论