这个月,准确说是2025年11月4日, anthropic 发布了MCP的新特性——代码执行,这一特性解决了哪些问题?又有怎样条件约束呢?该特性适用于哪些应用场景呢?
如果您希望快速上手MCP,可以参考本人的《MCP极简入门》一书——
MCP 代码执行特性使LLM能够在沙箱中编写并运行 Python/JavaScript 代码,将工具能力转化为可导入的代码模块,而非依赖前端的预定义。这带来了显著的 Token 节省,工具定义和数据管道可以从数十万token降至数百。该机制支持动态数据分析、多步运算、格式转换以及无需维护函数库的隐私安全管道。其核心逻辑在于:从代码执行出发,根据实际需求动态生成代码,再将稳定流程固化为函数,从而在“灵活生成”与“稳定复用”之间保持平衡。
然而,其代价是执行延迟较高。即便简单操作也需要 5–15 秒,远超函数调用的亚秒级响应,并需额外投入沙箱基础设施,带来系统复杂性的提升。
这一机制在 Agent 系统中体现了延迟与灵活性的关键权衡。函数调用适用于高并发、预定义的生产 API,响应快且稳定,但每项新功能均需开发周期。代码执行则反向运作,由 Agent 即时编写代码响应新需求,无需开发者介入,特别适用于内部工具、原型设计与长尾任务——约 80% 的场景无需定制代码。有团队借此将“开发新功能”的周期从两周压缩至 30 秒,实现了从“提交工单”到“直接询问模型”的转变。
但MCP的代码执行并非万能。在高频 API 或关键任务流程中,传统函数在延迟、可靠性和运维简洁性上仍具优势。成功上线的系统通常策略性地结合两者,兼顾灵活与稳定。
目前 LLM 仍主要扮演“协调者”角色,所有数据都流经模型,导致 Token 快速膨胀;每个决策都触发新一轮推理,加剧延迟;而基础编程结构(如循环、变量、重试)的缺失,进一步限制了执行效率。
假设您正在构建一个销售运营 Agent,它需要调用来自 Google Drive(15 个工具)、Salesforce(30 个工具)、Slack(20 个工具)和 Gmail(25 个工具)的共 90 个工具接口。
在响应用户请求之前,大模型需要预先加载所有工具的定义——这个过程耗时约 3 秒,消耗约 15 万 Token,成本约 0.45 美元,而目的仅仅是让模型“知道”自己具备哪些能力。
当用户提出诸如“提取会议记录,用电子邮件发给张三”这样的请求时,实际仅需使用两个工具:gdrive.readDocument 与 gmail.sendEmail。然而在传统机制下,我们仍不得不为其余 88 个未被调用的工具承担额外开销。
当用户提出“将 Drive 上的第三季度销售记录同步到 Salesforce”这类请求时,Agent 通常需要先读取约 12,000 字(约 50,000 Token)的文本内容,再将完全相同的内容复制并提交至 Salesforce。这一过程不仅消耗约 250,000 Token、引入近 10 秒延迟,更造成了资源浪费——我们实际是在付费让 AI 执行一次简单的“复制粘贴”操作,却重复计费两次。
以“监控 Slack 中的部署消息并发送确认邮件”为例,由于缺乏原生循环支持,Agent 必须反复查询 Slack、进行多次推理。十轮检查可能累积 20 秒以上的延迟,且每次“重新检查”都会消耗额外的 Token 与时间。
我们应当从根本上转变对 AI Agent 的认知定位:它不应是被步步指挥的“顾问”,而应是被赋予开发能力的“执行者”。
关于Agent 的开发的更多内容可以参考高强文老师的《Agent开发与应用》一书——
传统函数调用模式将 Agent 视为高成本顾问,每个步骤都需经过其思考、决策、反馈与等待,你持续为它的“注意力”付费。而新一代 Agent 架构应支持将稳定流程封装为可复用的代码模块,让 AI 能够自主编写、调试与运行脚本,仅在必要时进行干预,从而实现高效、低成本的长尾任务自动化。
MCP 代码执行将 AI Agent 视为一名熟练的开发人员:你提出任务要求,它编写脚本一次性完成所有处理。开发人员(即大语言模型)只需介入一次——理解需求并编写解决方案脚本,之后便由脚本自主处理循环、重试、数据整理与条件判断等重复性工作。
与传统做法不同——即在 Agent 明确需求前就强行载入 90 项工具手册——MCP 采用更高效的方式:将工具组织为结构化的文件系统,让 Agent 按需取用。
可以将 MCP 工具库比作一个图书馆。过去,系统会在你提问前就将所有 90 本书的内容复印并堆在你面前;而现在,它只提供一张目录卡。你查看“Google Drive”和“Gmail”类目,走到对应书架,仅取出需要的两本书,其余 88 本仍安静地留在原位。
传统配置(全部载入 LLM 上下文):
SYSTEM:
- gdrive.readDocument(...)
- gdrive.writeDocument(...)
- salesforce.createLead(...)
...
约 150,000 Token 用于工具定义。
MCP 文件系统结构:
./servers/
├── google-drive/
│ ├── index.ts
│ ├── readDocument.ts
│ ├── writeDocument.ts
│ └── ...
├── salesforce/
│ ├── index.ts
│ ├── createLead.ts
│ └── ...
├── slack/
│ └── ...
└── gmail/
└── ...
仅需了解文件夹名称,用数个词代替了 150,000 Token。
用户请求:“从 Drive 获取会议记录并发送至 abel@company.com”
步骤 1:查看可用系统
Agent 列出服务器目录:
javascript
const availableServers = await fs.readdir('./servers');
// 返回:['google-drive', 'gmail', 'salesforce', 'slack']
Agent 判断:“我需要 Google Drive 获取文档,Gmail 发送邮件,暂不需要 Salesforce 或 Slack。”
Token 消耗:约 100(仅文件夹名称)。
步骤 2:查看 Google Drive 功能
javascript
const gdriveTools = await fs.readdir('./servers/google-drive');
// 返回:['index.ts', 'readDocument.ts', 'writeDocument.ts', ...]
Agent 判断:“我需要读取文档,因此选择 readDocument.ts。”
累计 Token 消耗:约 300。
步骤 3:理解 readDocument 的使用方式 Agent 仅载入所需工具文件:
// ./servers/google-drive/readDocument.ts
import{ callMCPTool } from "../../../client.js";
interfaceReadDocumentInput{
documentId:string;
fields?:string;
}
interfaceReadDocumentResponse{
title:string;
content:string;
metadata:{ createdAt:string; modifiedAt:string; owner:string};
}
/**
* 从 Google Drive 获取文档
*/
export async functionreadDocument(
input: ReadDocumentInput
): Promise<ReadDocumentResponse>{
return callMCPTool<ReadDocumentResponse>('google_drive__read_document', input);
}Agent 理解该工具需要 documentId,并返回标题和内容。此步骤 Token 消耗:约 200。
步骤 4:对 Gmail 执行相同操作 检查 gmail 目录,找到 sendEmail.ts,仅载入该工具定义,累计 Token 消耗:约 650。
相较于传统方式需预先载入全部 90 项工具(150,000 Token),MCP 仅需不到 1% 的 Token 成本,实现精准工具调用。
步骤 5:编写并执行解决方案
import { readDocument } from './servers/google-drive';
import { sendEmail } from './servers/gmail';
// 获取会议记录
const doc = await readDocument({ documentId: 'abc123' });
// 通过邮件发送
await sendEmail({
to: 'abel@company.com',
subject: `Meeting Notes: ${doc.title}`,
body: doc.content
});
console.log(`Sent "${doc.title}" to john@company.com`);此脚本首先导入所需工具,接着调用 Google Drive 获取文档内容,最后使用 Gmail 发送邮件。即使系统扩展至 50 个服务器、500 项工具,Agent 仍仅载入当前任务所需的 2–3 项,Token 成本保持稳定,系统能力却呈指数级提升。
用户请求:“将 12,000 字的销售记录从 Google Drive 同步至 Salesforce”
传统模式下,数据如同经过“传话游戏”,必须流经 LLM 处理:
而在代码执行模式下,数据完全不经过 LLM,实现端到端直接传输:
import { readDocument } from './servers/google-drive';
import { updateOpportunity } from './servers/salesforce';
// 步骤 1:读取文档(数据保留在执行环境中)
const transcript = await readDocument({ documentId: 'abc123' });
// 步骤 2:将数据附加至 Salesforce(服务端直连)
await updateOpportunity({
opportunityId: '006Qx000000abcd',
fields: { Notes: transcript.content }
});
// 步骤 3:仅将摘要发送给 LLM
console.log(`Attached "${transcript.title}" (${transcript.content.length} chars) to opportunity`);执行过程说明:
用户请求:“监控 Slack 中的部署完成消息,并发送确认邮件至 team@company.com”
传统 Agent 需反复主动查询与推理,效率低下:
检查 Slack →“无结果”→ LLM 推理 →“再次检查”
...
检查 Slack →“发现目标”→ LLM 推理 →“发送邮件”该流程通常需要 10 次推理周期、约 20 秒完成,且成本高昂。
代码执行模式下,Agent 编写自主监控脚本,实现持续检测:
import { getChannelHistory } from './servers/slack';
import { sendEmail } from './servers/gmail';
let found = false;
let attempts = 0;
const MAX_ATTEMPTS = 60; // 最长 5 分钟
while (!found && attempts < MAX_ATTEMPTS) {
const messages = await getChannelHistory({
channel: 'C123456',
limit: 10
});
found = messages.some(m =>
m.text.toLowerCase().includes('deployment complete')
);
if (!found) {
console.log(`Attempt ${attempts + 1}: No deployment message yet`);
await new Promise(resolve => setTimeout(resolve, 5000)); // 等待 5 秒
attempts++;
}
}
if (found) {
await sendEmail({
to: 'team@company.com',
subject: '✅ Deployment Confirmed',
body: 'Production deployment completed successfully.'
});
console.log('Confirmation email sent');
} else {
console.log('Timeout: No deployment message after 5 minutes');
}脚本逻辑说明:
该脚本仅需一次生成(约 3 秒),即可自主运行。例如若在第 9 次检查时发现目标,总耗时约 45 秒。虽然总时间可能略长,但带来显著优势:
真正的优势在于可预测性与可靠性。传统方法中每个推理周期都可能出错,而生成的脚本行为完全确定,严格按代码逻辑执行,杜绝随机性错误,实现稳定自动化监控。
如果您希望进一步采用MCP 来开发智能体应用,可以参考:
以下是一种传统函数调用难以实现的高价值模式:让敏感数据全程不接触 LLM。
用户请求: “将我的 Google 表格中的 847 条客户联系人导入 Salesforce,但我不希望你看到任何人的电子邮件或电话号码。”
通过代码执行,这可以轻松实现:
import{ getSheet }from'./servers/google-drive';
import{ createLead }from'./servers/salesforce';
const sheet =awaitgetSheet({ sheetId:'xyz789'});
console.log(`Found ${sheet.rows.length} rows to import`);
let successCount =0;
let errorCount =0;
for(const row of sheet.rows){
try{
awaitcreateLead({
firstName: row.firstName,
lastName: row.lastName,
email: row.email,// 个人数据仅流经执行环境
phone: row.phone,// 从不进入 LLM 上下文
company: row.company
});
successCount++;
}catch(error){
console.log(`Error on row ${row.rowNumber}: ${error.message}`);
errorCount++;
}
}
console.log(`Import complete: ${successCount} created, ${errorCount} failed`);执行流程解析:
可以将执行环境理解为“密封运输车”:敏感数据从源系统安全送达目标系统,LLM 作为调度员只知晓任务起止,从不接触具体内容。
隐私合规优势: - LLM 服务商无法接触个人身份信息 - 系统日志不包含敏感数据 - 更易于满足 GDPR/CCPA 等合规要求 - 安全审计流程更加清晰
部分实施方案还加入了额外的保护层:当 Agent 意外尝试记录敏感数据时,MCP 客户端会自动拦截并执行标记化处理:
{
firstName: 'John',
lastName: 'Smith',
email: '[EMAIL_0]', // 经 MCP 客户端标记化
phone: '[PHONE_0]', // 真实值被替换
company: 'Acme Corp'
}MCP 客户端维护私有查询表,在数据需要发送至 Salesforce 时自动还原真实值。即使 LLM 尝试查看,也始终无法获取原始信息。
这一模式为下列高风险场景开启了自动化可能: - 人力资源数据(员工档案、薪酬信息) - 财务记录同步(交易数据、账户信息) - 医疗健康信息(患者记录、诊断数据) - 任何要求“AI 不得接触个人数据”的合规场景
代码执行并非万能解决方案。对于高频 API 调用或任务关键型流程,传统函数调用在延迟控制和运维复杂度上仍具优势。实际系统中,两者应战略性地结合使用。
MCP 代码执行尤其适用于需要高度灵活性与快速迭代的场景。例如,在面对临时性数据分析请求时,传统函数调用方式往往需要经历长达两周的需求排队、功能开发与部署上线流程。而通过代码执行,分析人员只需向Agent提出需求,即可在30秒内获得一个能够自动查询、排序并返回结果的定制脚本;当分析维度需要调整时,Agent也能立即修改脚本而无需重新部署。这使得数据洞察的周期从以“周”为单位缩短至以“秒”为单位,彻底改变了内部数据分析的工作范式。
同样,在处理涉及多步操作的复杂ETL任务时,代码执行也展现出显著优势。传统方法需要将流程拆分为多个独立函数,导致数据需要多次流经LLM,不仅成本高昂,调试也极为困难。而代码执行允许Agent生成一个端到端的连贯脚本,让数据在受保护的执行环境中完成全部转换与处理,全程不接触LLM上下文。这不仅大幅降低了Token消耗,还提供了精确的错误定位和灵活的流程控制能力。
如果您希望了解MCP的更多使用场景,可以参考——
然而,代码执行并非万能解决方案,传统函数调用在特定场景下仍不可或缺。对于面向用户的高频API,例如每日被调用上万次的创建线索接口,用户期望的是亚秒级的响应速度。传统函数调用可以实现200毫秒内的稳定响应,而代码执行因包含生成、启动与执行环节,延迟通常高达数秒,难以满足用户体验要求。在支付处理等关键任务工作流中,系统的首要目标是极致的可靠性与可预测性。传统函数经过严格测试,拥有清晰的故障处理和审计链路,能提供99.99%的可用性保障;而代码执行则引入了代码生成不确定性、运行时异常等新型风险,其“灵活但脆弱”的特性在此类场景中可能带来直接的经济损失。
一个明智的技术策略在于认清这两种模式各自的优势领域。代码执行是实现敏捷性与自动化的利器,尤其适合探索性、长尾的内部任务;而传统函数调用则是构建高稳定、高性能生产系统的基石。成功的系统架构,往往来自于对二者有清晰认识的战略性组合运用。
在实际生产环境中,纯粹的代码执行或纯粹的函数调用都难以独立支撑复杂系统。真正有效的模式是“渐进式形式化”——以灵活的方式开始,将稳定的部分逐步固化,并根据不同需求保留两种方式的优势。
可以这样理解:代码执行如同原型设计工作室,强调快速试错与创新;而传统函数则像是标准化生产线,追求效率与可靠性。正如你不会在原型车间里批量生产iPhone,也不会用僵化的流水线去研发新功能,一个成熟的系统需要同时兼备这两种能力。
整个过程始于探索阶段。当业务团队提出一个新需求时——例如“能否生成每周销售管线健康度报告?”——你可以立即通过代码执行让Agent尝试解决。Agent会快速编写脚本,自动完成从数据查询、分组汇总到生成报告的整个流程。在30秒内,你就能验证关键数据来源、核心转换逻辑以及输出形式是否合理。这一阶段无需设计文档、排期或部署流程,核心目标是快速验证需求的价值与可行性,避免在明确价值前投入宝贵的工程资源。
当某个模式被反复验证时,便进入了正式化阶段。如果销售团队持续使用该报告,并且你观察到Agent多次生成结构相似的代码——包括查询数据、按阶段分组、汇总计算和发送邮件——这就形成了一个明确的固化信号。重复3-5次以上的相同操作强烈暗示:“将我正式化!”
此时,便可将这个稳定模式转化为一个经过充分测试的MCP函数。新的函数不仅实现了Agent探索出的核心逻辑,更具备了生产级能力:可配置的过滤条件、多种输出格式、完善的错误处理与重试机制,以及全面的可观测性支持。结果是亚秒级的响应速度、完整的测试覆盖和清晰的接口文档——它快速、可靠,并且“枯燥”,而这正是生产系统最需要的特质。
最终阶段是实现两种模式的协同共存。正式化的函数调用高效处理标准的每周报告,而代码执行则继续服务于变化与探索。当有人提出“能否按销售代表进行细分?”这类新需求时,Agent可以导入已有的稳定函数作为基础,快速扩展新维度进行分析。如果这个新变化被反复使用,则可将其进一步形式化;若仅为一次性需求,则代码执行已无需工程介入即可完成。
这一模式形成了一个完整的价值闭环:通过代码执行快速探索并确认需求价值,依据重复频率识别稳定模式,将验证过的逻辑形式化为生产级函数,并始终保持代码执行为长尾需求提供灵活支持。正如一个高效运转的餐厅厨房:招牌菜拥有标准食谱和专用工位(形式化函数),而备餐区则允许厨师自由尝试新菜品(代码执行)。
该策略的核心优势在于资源优化:通过代码执行快速验证想法,仅对经过反复使用的需求投入工程时间进行固化。这远比在未知价值的情况下进行长达数周的功能开发更为高效。让代码执行成为发现用户真实需求的探针,再为已验证的需求构建可靠的生产函数,如此才能在保持系统灵活性的同时,确保核心流程的稳健可靠。
这种方法与过去一年中各种“新人工智能范式”的根本区别在于:MCP 代码执行的目标并非取代现有技术栈,而是构建一个能够与既有基础设施协同进化的“学习层”。传统函数如同肌肉记忆——快速、可靠、无需刻意控制;代码执行则更像解决问题的思维过程——灵活、探索性强、动态适应。两者缺一不可。
如今真正创造价值的团队,采用的既非纯代码执行,也非纯函数调用,而是构建了能够智能路由的自适应系统:将重复出现的模式固化为优化函数,将新颖的请求导向灵活的代码执行,并将成功的实验逐步转化为生产级功能。这形成了一个自我增强的良性循环:
用户提出问题,代码执行率先探索解决方案; 成功模式显现后,工程团队将其形式化为可靠函数; 随着函数库不断丰富,Agent 具备了更强大的基础能力; 用户从而提出更具挑战的新问题,代码执行继续开创新的解决路径。 如此循环往复。
在这一过程中,你的 Agent 系统将日益成熟:既积累了经过实战检验的高质量函数库,又始终保有应对未来不确定需求的灵活性与创造力。
关于生产级 AI 系统的真相是:最终胜出的并非那些架构最炫酷或模型最庞大的系统,而是那些在可靠与灵活之间找到平衡、全面监控运行状态、具备优雅降级能力,并能根据真实使用反馈持续演进优化的系统。
MCP 代码执行正是实现这种平衡的战略工具——它不是包治百病的万能方案,而是一个精准解决特定类别问题的高效路径。当被用于正确的场景时,它能够出色地完成使命。
【参考资料与关联阅读】