Code Execution with MCP: Building More Efficient Agents(用 MCP 代码执行构建更高效的 Agent)
- 原文标题
- Code Execution with MCP: Building More Efficient Agents(用 MCP 代码执行构建更高效的 Agent)
- 原文链接
- https://www.anthropic.com/engineering/code-execution-with-mcp
- 作者
- Adam Jones、Conor Kelly(Anthropic)
- 发布日期
- 2025-11-04
🎯 一句话
与其让模型一次次调用工具、每次都把结果读回上下文,不如让它写一段代码,在沙箱里一次跑完。⭐ 这样中间结果留在执行环境里,不占上下文。
随着 Agent 通过 MCP 连接的工具越来越多,传统的直接工具调用变得低效。把 MCP server 呈现为可编程的代码 API,让 Agent 用代码与之交互,可以大幅减少 token 消耗。
两个低效问题
1. 工具定义过载
MCP 客户端把所有工具定义预先载入上下文窗口——连接数千个工具时,Agent 在读用户请求之前就要先处理「数十万 token」的文档,徒增延迟和成本。
2. 中间结果重复过境
直接工具调用要求所有结果流经模型上下文。典型例子:从 Google Drive 下载会议转录并附加到 Salesforce——完整转录文本要过境上下文两次(一次作为检索结果,一次写入更新调用)。一场 2 小时会议可能多耗 50,000 token。
解法:代码执行
把 MCP server 组织成文件系统结构:
servers/
├── google-drive/
├── salesforce/
└── ...
每个工具是一个带类型接口的 TypeScript 文件。Agent 通过探索文件系统按需发现和加载工具,编写代码直接处理数据,只把最终结果返回给模型。
效果: 文中案例 token 用量从 150,000 降到 2,000——节省 98.7%。
五大收益
- 渐进式披露: 模型擅长导航文件系统,按需加载工具定义;辅以可配置详细级别的
search_tools(仅名称/含描述/完整 schema) - 上下文高效的工具结果: 在执行环境内过滤转换数据——获取 10,000 行表格时「Agent 只看到 5 行而不是 10,000 行」
- 控制流效率: 循环、条件、错误处理都在代码环境中执行,不需要在 Agent 循环中反复推理,还降低首 token 延迟
- 隐私保护: 中间结果默认留在执行环境;PII 可由 MCP 客户端自动 token 化,数据从来源流向目的地而不进入模型上下文
- 状态持久化与技能: 中间结果可写文件跨会话续用;可复用的代码实现可以保存为「技能」,让 Agent 的工具箱随时间进化
注意事项
代码执行引入复杂性:需要安全的执行环境(沙箱、资源限制、监控),这些基础设施带来「直接工具调用所没有的运维开销和安全考量」。需要在 token 效率收益与实现成本之间权衡。
结论
这一方法本质上是把成熟的软件工程模式应用到 Agent 架构。MCP 是基础协议,代码执行是其上的演进中的最佳实践——作者鼓励社区分享实践发现。
✅ 检查点
- 「代码执行」相比逐次调用工具,主要省下了什么?
- 什么类型的任务最适合这种模式?
- 它引入了什么新风险?
👀 答案
- ⭐ 省下的主要是上下文。逐次调用时,每个中间结果都要读回上下文;而写代码时,中间变量留在执行环境里,只有最终结果回到模型。此外还省下了多轮往返的延迟。
- 需要多步组合、且中间结果很大的任务:批量处理文件、数据筛选聚合、需要循环或条件分支的流程。⭐ 判断标准:如果中间结果模型其实不需要看,那就适合。反过来,每一步都需要模型判断后再决定下一步的任务,不适合。
- 代码执行的权限面比单个工具大得多。单个工具的能力边界是明确的,而一段代码理论上能做沙箱允许的任何事。⭐ 所以沙箱隔离、网络白名单、文件系统范围限制都必须到位——这在提示注入的场景下尤其重要,因为注入的指令现在能变成可执行代码。
🛑 可以停在这里
⚡ 走神救援
⭐与其逐次调用工具把每个结果读回上下文,不如让模型写一段代码在沙箱里一次跑完。省下的主要是上下文(中间变量留在执行环境,只有最终结果回到模型),外加多轮往返的延迟。⭐适合的任务:多步组合且中间结果很大(批量处理文件、数据筛选聚合、需要循环分支);判断标准是「中间结果模型其实不需要看」;反之每步都要模型判断后再决定下一步的任务不适合。⚠️新风险:代码执行的权限面比单个工具大得多——单个工具边界明确,而代码理论上能做沙箱允许的任何事;沙箱隔离/网络白名单/文件系统范围限制必须到位,提示注入场景下尤其重要,因为注入的指令现在能变成可执行代码。