直接调用工具时,每次工具定义和执行结果都会占用上下文资源。而让智能体通过编写代码来调用工具,能实现更好的扩展性,以下是借助 MCP 实现这一方案的具体原理。
模型上下文协议(Model Context Protocol,简称 MCP)是一套用于连接 AI 智能体与外部系统的开放标准。传统方式中,智能体与工具、数据的对接需要为每一组配对开发定制化集成方案,这会造成系统碎片化和重复开发,难以构建真正可扩展的连接系统。MCP 提供了统一的协议:开发者只需在智能体中实现一次 MCP 集成,就能解锁整个生态的各类工具对接能力。
自 2024 年 11 月 MCP 发布以来,其普及速度迅猛:社区已搭建数千台 MCP 服务器,所有主流编程语言均已推出对应的 SDK,MCP 也已成为行业内智能体对接工具与数据的事实标准。
如今,开发者构建的智能体通常能访问数十台 MCP 服务器上的数百甚至数千个工具。但随着对接工具数量的增加,预先加载所有工具定义以及通过上下文窗口传递中间结果的方式,会导致智能体运行变慢、成本上升。
本文将探讨如何通过代码执行让智能体更高效地与 MCP 服务器交互,在支持更多工具的同时减少 Token 消耗。
1、工具引发的 Token 消耗过量问题降低了智能体效率
随着 MCP 使用规模扩大,两种常见模式会增加智能体的成本和延迟:
第一、工具定义占用过多上下文窗口;
第二、中间工具结果消耗额外 Token。
1.1 工具定义占用过多上下文窗口
大多数 MCP 客户端会预先将所有工具定义直接加载到上下文,并通过直接工具调用语法暴露给模型。这些工具定义可能如下所示:
gdrive.getDocument 描述:从 Google 云端硬盘获取文档 参数: documentId(必填,字符串类型):待获取文档的 ID fields(可选,字符串类型):需返回的特定字段 返回值:包含标题、正文内容、元数据、权限等信息的文档对象salesforce.updateRecord 描述:更新 Salesforce 中的记录 参数: objectType(必填,字符串类型):Salesforce 对象类型(潜在客户、联系人、客户等) recordId(必填,字符串类型):待更新记录的 ID data(必填,对象类型):需更新的字段及对应新值 返回值:包含确认信息的更新后记录对象工具描述会占用大量上下文窗口空间,导致响应时间延长、成本增加。当智能体对接数千个工具时,模型在处理用户请求前,需要先处理数十万个 Token。
1.2 中间工具结果消耗额外 Token
大多数 MCP 客户端允许模型直接调用 MCP 工具。例如,你可能会向智能体发起请求:“从 Google 云端硬盘下载我的会议记录,并将其附加到 Salesforce 潜在客户信息中”。
模型会执行如下调用:
工具调用:gdrive.getDocument(documentId: "abc123") → 返回结果:"讨论了第四季度目标...\n[完整会议记录文本]" (该结果会加载到模型上下文) 工具调用:salesforce.updateRecord( objectType: "SalesMeeting", recordId: "00Q5f000001abcXYZ", data: { "备注": "讨论了第四季度目标...\n[完整会议记录文本]" } ) (模型需再次将完整会议记录写入上下文)每一个中间结果都必须经过模型传递。在上述示例中,完整的会议记录会两次流经上下文。对于一场 2 小时的销售会议,这可能意味着额外处理 5 万个 Token。而对于更大的文档,甚至可能超出上下文窗口限制,导致工作流程中断。当处理大型文档或复杂数据结构时,模型在工具调用之间复制数据时更容易出错。
| 模型 | Claude 3.5 Sonnet(新版) | Claude 3.5 Haiku | Claude 3.5 Sonnet | GPT-4o* | GPT-4o mini* | Gemini 1.5 Pro | Gemini 1.5 Flash |
|---|---|---|---|---|---|---|---|
| 研究生水平推理(GPQA 钻石级) | 65.0%(零样本思维链) | 41.6%(零样本思维链) | 59.4%(零样本思维链) | 53.6%(零样本思维链) | 40.2%(零样本思维链) | 59.1%(零样本思维链) | 51.0%(零样本思维链) |
| 本科水平知识(MMLU Pro) | 78.0%(零样本思维链) | 65.0%(零样本思维链) | 75.1%(零样本思维链) | - | - | 75.8%(零样本思维链) | 67.3%(零样本思维链) |
| 代码能力(HumanEval) | 93.7%(零样本) | 88.1%(零样本) | 92.0%(零样本) | 90.2%(零样本) | 87.2%(零样本) | - | - |
| 数学解题(MATH) | 78.3%(零样本思维链) | 69.2%(零样本思维链) | 71.1%(零样本思维链) | 76.6%(零样本思维链) | 70.2%(零样本思维链) | 86.5%(四样本思维链) | 77.9%(四样本思维链) |
| 高中数学竞赛(AIME2024) | 16.0%(零样本思维链) | 5.3%(零样本思维链) | 9.6%(零样本思维链) | 9.3%(零样本思维链) | - | - | - |
| 视觉问答(MMMU) | 70.4%(零样本思维链) | - | 68.3%(零样本思维链) | 69.1%(零样本思维链) | 59.4%(零样本思维链) | 65.9%(零样本思维链) | 62.3%(零样本思维链) |
| 智能体编码(SWE-bench 验证集) | 49.0% | 40.6% | 33.4% | - | - | - | - |
| 智能体工具使用(TAU-bench) | 零售行业 69.2% / 航空行业 46.0% | 零售行业 51.0% / 航空行业 22.8% | 零售行业 62.6% / 航空行业 36.0% | - | - | - | - |
- 注:我们的评估表格未纳入 OpenAI 的 o1 模型系列,因其依赖大量响应前计算时间,与常规模型存在本质差异,难以进行公平的性能对比。
MCP 客户端会将工具定义加载到模型的上下文窗口,并编排一个消息循环,使得每次工具调用和结果都需在操作之间经过模型传递。
2、借助 MCP 实现代码执行,提升上下文效率
随着代码执行环境在智能体中的普及,一种解决方案是将 MCP 服务器呈现为代码 API,而非直接的工具调用。智能体可通过编写代码与 MCP 服务器交互,这种方式能同时解决上述两个问题:智能体仅加载所需工具,并在执行环境中处理数据后,再将结果返回给模型。
实现方式有多种。其中一种是为所有已连接的 MCP 服务器生成工具文件目录,以下是 TypeScript 实现示例:
servers├── google-drive │ ├── getDocument.ts │ ├── ...(其他工具) │ └── index.ts ├── salesforce │ ├── updateRecord.ts │ ├── ...(其他工具) │ └── index.ts └── ...(其他服务器)
每个工具对应一个文件,示例如下:
// ./servers/google-drive/getDocument.ts import { callMCPTool } from "../../../client.js"; interface GetDocumentInput { documentId: string; } interface GetDocumentResponse { content: string; } /* 从 Google 云端硬盘读取文档 */ export async function getDocument(input: GetDocumentInput): Promise<GetDocumentResponse> { return callMCPTool<GetDocumentResponse>('google_drive__get_document', input); }前文提到的 “从 Google 云端硬盘到 Salesforce” 的示例,可转化为如下代码:
// 从 Google 文档读取会议记录,并添加到 Salesforce 潜在客户信息中 import * as gdrive from './servers/google-drive'; import * as salesforce from './servers/salesforce'; const transcript = (await gdrive.getDocument({ documentId: 'abc123' })).content; await salesforce.updateRecord({ objectType: 'SalesMeeting', recordId: '00Q5f000001abcXYZ', data: { Notes: transcript } });智能体通过浏览文件系统发现工具:列出./servers/目录找到可用服务器(如google-drive和salesforce),再读取所需的特定工具文件(如getDocument.ts和updateRecord.ts),以理解每个工具的接口。这种方式让智能体仅加载当前任务所需的工具定义,将 Token 消耗量从 15 万个降至 2000 个,时间和成本节省达 98.7%。
Cloudflare 也发布了类似研究结果,并将这种 MCP 代码执行方式称为 “代码模式(Code Mode)”。核心思路一致:大语言模型擅长编写代码,开发者应利用这一优势,构建更高效与 MCP 服务器交互的智能体。
3、借助 MCP 实现代码执行的优势
通过 MCP 代码执行,智能体可按需加载工具、在数据到达模型前进行过滤、一步执行复杂逻辑,从而更高效地利用上下文。此外,这种方式还具备安全和状态管理方面的优势。
3.1 渐进式暴露工具
模型擅长导航文件系统。将工具以代码形式呈现于文件系统,允许模型按需读取工具定义,而非一次性加载全部。
此外,还可在服务器中添加search_tools工具以查找相关定义。例如,在使用前文假设的 Salesforce 服务器时,智能体搜索 “salesforce” 并仅加载当前任务所需的工具。在search_tools工具中加入细节级别参数,允许智能体选择所需的信息详细程度(例如:仅名称、名称和描述、或包含模式的完整定义),也有助于智能体节省上下文并高效查找工具。
3.2 上下文高效的工具结果
处理大型数据集时,智能体可在代码中对结果进行过滤和转换后再返回。例如,获取包含 1 万行数据的电子表格:
// 无代码执行场景 - 所有行均流经上下文 工具调用:gdrive.getSheet(sheetId: 'abc123') → 1 万行数据加载到上下文,需手动过滤 // 代码执行场景 - 在执行环境中过滤 const allRows = await gdrive.getSheet({ sheetId: 'abc123' }); const pendingOrders = allRows.filter(row => row["状态"] === '待处理' ); console.log(`找到 ${pendingOrders.length} 个待处理订单`); console.log(pendingOrders.slice(0, 5)); // 仅输出前 5 条供查看智能体仅需查看 5 行数据,而非 1 万行。类似模式适用于数据聚合、多数据源关联查询或特定字段提取 —— 所有操作均不会占用过多上下文窗口。
3.3 更强大且上下文高效的控制流
循环、条件判断和错误处理可通过熟悉的代码模式实现,而非串联多个独立工具调用。例如,若需在 Slack 中接收部署通知,智能体可编写如下代码:
let found = false; while (!found) { const messages = await slack.getChannelHistory({ channel: 'C123456' }); found = messages.some(m => m.text.includes('部署完成')); if (!found) await new Promise(r => setTimeout(r, 5000)); } console.log('已收到部署通知');这种方式比在智能体循环中交替执行 MCP 工具调用和睡眠命令更高效。
此外,编写可执行的条件分支树还能减少 “首 Token 响应时间” 延迟:无需等待模型评估条件语句,可直接让代码执行环境处理。
3.4 隐私保护操作
当智能体通过代码执行使用 MCP 时,中间结果默认保留在执行环境中。这样一来,智能体仅能看到明确日志或返回的数据,意味着不希望与模型共享的数据可在工作流程中传递,而无需进入模型上下文。
对于更敏感的工作负载,智能体框架可自动对敏感数据进行令牌化处理。例如,需将电子表格中的客户联系信息导入 Salesforce 时,智能体编写如下代码:
const sheet = await gdrive.getSheet({ sheetId: 'abc123' }); for (const row of sheet.rows) { await salesforce.updateRecord({ objectType: 'Lead', recordId: row.salesforceId, data: { Email: row.email, Phone: row.phone, Name: row.name } }); } console.log(`已更新 ${sheet.rows.length} 条潜在客户记录`);MCP 客户端会拦截数据,并在其到达模型前对个人身份信息(PII)进行令牌化处理:
// 若智能体日志输出 sheet.rows,将看到以下内容: [ { salesforceId: '00Q...', email: '[邮箱_1]', phone: '[电话_1]', name: '[姓名_1]' }, { salesforceId: '00Q...', email: '[邮箱_2]', phone: '[电话_2]', name: '[姓名_2]' }, ... ]之后,当该数据在另一个 MCP 工具调用中共享时,MCP 客户端会通过查找表还原令牌化数据。真实的邮箱地址、电话号码和姓名会从 Google 表格流转至 Salesforce,但全程不会经过模型。这能防止智能体意外记录或处理敏感数据,也可通过这种方式定义确定性安全规则,指定数据的流转范围。
3.5 状态持久化与技能沉淀
支持文件系统访问的代码执行,允许智能体在多个操作间维持状态。智能体可将中间结果写入文件,以便恢复工作和跟踪进度:
const leads = await salesforce.query({ query: 'SELECT Id, Email FROM Lead LIMIT 1000' }); const csvData = leads.map(l => `${l.Id},${l.Email}`).join('\n'); await fs.writeFile('./workspace/leads.csv', csvData); // 后续执行可从断点继续 const saved = await fs.readFile('./workspace/leads.csv', 'utf-8');智能体还可将自身代码保存为可复用函数。当智能体开发出某一任务的可用代码后,可将其保存供未来使用:
// ./skills/save-sheet-as-csv.ts import * as gdrive from './servers/google-drive'; export async function saveSheetAsCsv(sheetId: string) { const data = await gdrive.getSheet({ sheetId }); const csv = data.map(row => row.join(',')).join('\n'); await fs.writeFile(`./workspace/sheet-${sheetId}.csv`, csv); return `./workspace/sheet-${sheetId}.csv`; } // 后续任何智能体执行过程中均可调用: import { saveSheetAsCsv } from './skills/save-sheet-as-csv'; const csvPath = await saveSheetAsCsv('abc123');这与 “技能(Skills)” 概念密切相关 ——“技能” 是包含可复用指令、脚本和资源的文件夹,帮助模型提升特定任务的执行性能。在这些保存的函数中添加 SKILL.md 文件,可创建结构化技能供模型参考和使用。久而久之,智能体将构建起一套高阶能力工具箱,不断优化自身工作所需的支撑架构。
需注意的是,代码执行也会带来额外复杂性。运行智能体生成的代码需要安全的执行环境,包括适当的沙箱隔离、资源限制和监控机制。这些基础设施要求会增加运营开销和安全考量,而直接工具调用则可避免这些问题。因此,在采用代码执行方式时,需权衡其带来的优势(降低 Token 成本、减少延迟、提升工具组合能力)与实现成本。
4、总结
MCP 为智能体连接各类工具和系统提供了基础协议。但当连接的服务器过多时,工具定义和结果会消耗过量 Token,降低智能体效率。
尽管文中提到的许多问题(上下文管理、工具组合、状态持久化)看似新颖,但在软件工程领域已有成熟解决方案。代码执行将这些既定模式应用于智能体,让智能体能够通过熟悉的编程结构更高效地与 MCP 服务器交互。若你采用了这种方案,欢迎与 MCP 社区分享你的实践成果。
好了,这就是我今天想分享的内容。如果你对构建企业级 AI 原生应用新架构设计和落地实践感兴趣,别忘了点赞、关注噢~
那么,如何系统的去学习大模型LLM?
作为一名深耕行业的资深大模型算法工程师,我经常会收到一些评论和私信,我是小白,学习大模型该从哪里入手呢?我自学没有方向怎么办?这个地方我不会啊。如果你也有类似的经历,一定要继续看下去!这些问题啊,也不是三言两语啊就能讲明白的。
所以我综合了大模型的所有知识点,给大家带来一套全网最全最细的大模型零基础教程。在做这套教程之前呢,我就曾放空大脑,以一个大模型小白的角度去重新解析它,采用基础知识和实战项目相结合的教学方式,历时3个月,终于完成了这样的课程,让你真正体会到什么是每一秒都在疯狂输出知识点。
由于篇幅有限,⚡️ 朋友们如果有需要全套 《2025全新制作的大模型全套资料》,扫码获取~
👉大模型学习指南+路线汇总👈
我们这套大模型资料呢,会从基础篇、进阶篇和项目实战篇等三大方面来讲解。
👉①.基础篇👈
基础篇里面包括了Python快速入门、AI开发环境搭建及提示词工程,带你学习大模型核心原理、prompt使用技巧、Transformer架构和预训练、SFT、RLHF等一些基础概念,用最易懂的方式带你入门大模型。
👉②.进阶篇👈
接下来是进阶篇,你将掌握RAG、Agent、Langchain、大模型微调和私有化部署,学习如何构建外挂知识库并和自己的企业相结合,学习如何使用langchain框架提高开发效率和代码质量、学习如何选择合适的基座模型并进行数据集的收集预处理以及具体的模型微调等等。
👉③.实战篇👈
实战篇会手把手带着大家练习企业级的落地项目(已脱敏),比如RAG医疗问答系统、Agent智能电商客服系统、数字人项目实战、教育行业智能助教等等,从而帮助大家更好的应对大模型时代的挑战。
👉④.福利篇👈
最后呢,会给大家一个小福利,课程视频中的所有素材,有搭建AI开发环境资料包,还有学习计划表,几十上百G素材、电子书和课件等等,只要你能想到的素材,我这里几乎都有。我已经全部上传到CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】
相信我,这套大模型系统教程将会是全网最齐全 最易懂的小白专用课!!