——以“协议税”为主线,拆解工具调用开销的结构、边界与治理路径
摘要
同一项“读取文件并做一次条件替换”的任务,用命令行接口(CLI)驱动往往只需数百个token,而经由模型上下文协议(MCP)调用同类能力,实测与公开复现中常见4–32倍的token膨胀。这个倍数区间并非营销话术,它对应着一组可分解的结构性开销:工具Schema注入、工具发现与命名空间描述、多轮参数协商、结构化结果回传,以及为容错而预留的重试冗余。本文把这些开销统称为协议税(protocol tax)——为获得互操作性、可审计性与跨客户端复用而支付的上下文成本。
文章的主线是:MCP的token溢价不是“浪费”,而是把原本隐含在人类操作者脑中的上下文显式化、把原本硬编码在脚本里的契约标准化所付出的代价。理解这条主线,才能判断何时该付这笔税、何时该绕开它。全文依次给出问题定义、开销分解模型、量化方法与实测数据、工程治理清单、选型决策树,并对协议演进方向作出审慎预判。
目录
一、背景与问题定义:从函数调用到协议调用
1.1 三个层次的概念需要先分清
讨论token开销之前,必须先厘清三个常被混用的概念。工具调用(tool calling / function calling)指模型在生成过程中输出一段结构化参数,由宿主程序执行并把结果回填给模型,这是能力层概念;CLI指以命令行程序为执行载体,模型通常通过一个通用的“执行shell命令”工具间接操作,这是载体层概念;MCP(Model Context Protocol)则是一套基于JSON-RPC 2.0的客户端—服务器协议,规定了工具如何被发现(tools/list)、如何被调用(tools/call)、资源与提示如何暴露,这是协议层概念。三者不在同一抽象层,直接比较“MCP vs CLI”的token消耗,本质上比较的是协议层显式契约与载体层隐式契约的上下文成本差异。
MCP由Anthropic于2024年11月开源发布,其后在2025年经历多次规范修订,逐步补充了授权、流式传输与工具注解等机制。规范文本与社区实现可在modelcontextprotocol.io查阅,参考实现仓库见github.com/modelcontextprotocol。本文评述:MCP的定位不是“更省token的工具调用”,而是“让工具能力可跨客户端移植的接口标准”,把它当作性能优化方案来评估,从一开始就错位了。
1.2 为什么4–32倍这个区间值得认真对待
倍数区间的宽窄本身携带信息。下界约4倍,通常出现在“单个工具、参数简单、结果短小”的场景;上界约32倍,多出现在“工具数量多、Schema冗长、需要多轮澄清、返回结构化大对象”的场景。这个跨度说明:协议税不是常数,而是随工具面规模、Schema复杂度与交互轮次近似超线性增长的变量。若把它当作固定成本做预算,会在工具面扩张后严重低估开销。
需要强调,本文引用的倍数来自公开复现、社区基准与笔者基于公开计费口径的整合测算,凡属模拟或整合数据均在文中明确标注。不同模型的分词器差异会带来±15%左右的波动,因此任何单点数字都不应被当作精确常数使用。笔者认为,工程上更有价值的做法不是记住“32倍”这个数,而是掌握一套能把自家场景倍数算清楚的分解方法——这正是第三节与第四节的任务。
1.3 一条贯穿全文的分析主线
本文确立的主线是“协议税 = 显式化成本 + 标准化成本 + 容错成本 − 隐式复用收益”。显式化成本指把工具契约写进上下文;标准化成本指为跨客户端兼容而保留的描述冗余;容错成本指为多轮协商与重试预留的预算;隐式复用收益指一次Schema注入可服务多次调用、跨会话缓存可摊薄发现开销。四项中前三项随规模上升,第四项随复用次数上升,二者的交点决定了MCP在该场景是否经济。后续所有章节都围绕这条主线展开,避免滑向泛泛的“MCP好不好”的价值判断。
二、原理拆解:4–32倍token究竟花在哪里
2.1 开销的五个来源
把一次MCP工具调用拆到消息粒度,token开销可归入五类。第一类是Schema注入:客户端需把可用工具的name、description、inputSchema(JSON Schema)放入系统提示或工具定义区,这部分在每个会话中重复出现。第二类是发现开销:tools/list的请求与响应本身消耗token,工具多时响应体可达数千token。第三类是协商开销:模型输出调用意图、宿主校验失败后回填错误、模型修正参数,这一来一回可能重复两到三轮。第四类是结果封装:MCP要求结果以content数组返回,含type、text等字段,结构化程度越高,包装开销越大。第五类是冗余描述:为兼容不同客户端,工具描述往往写得比实际需要更长。
对照之下,CLI路径的对应开销被大幅压缩:模型只需知道“有一个执行shell的工具”,具体命令由模型凭预训练知识生成,Schema注入近乎常数;发现开销为零;协商开销主要来自命令执行失败后的报错回填;结果封装是纯文本stdout。本文评述:CLI把契约藏进了模型的参数化知识里,MCP把契约搬到了上下文里——这是两者成本差异的第一性来源,而非实现优劣。
2.2 一个可计算的分解模型
设单会话内工具数量为N,第i个工具的Schema长度为s_i(token),会话轮次为R,单次调用的协商轮次为k,结果封装系数为α(结构化结果相对裸文本的膨胀比),则MCP路径的近似token总量可写作:
T_mcp ≈ Σ(s_i) + D(N) + R·(k·c_neg + α·c_out) + ε
其中D(N)为发现开销,c_neg为单轮协商成本,c_out为裸结果长度,ε为重试冗余。CLI路径可近似为:
T_cli ≈ s_shell + R·(c_cmd + c_err + c_out)
两式相除即得倍数。可以看到,当N增大、s_i变长时,Σ(s_i)项主导,倍数迅速抬升;当R增大而N固定时,Schema注入被摊薄,倍数回落。这解释了一个常被忽略的现象:长会话中MCP的相对溢价会下降,短会话中溢价最刺眼。笔者认为,很多“MCP贵得离谱”的抱怨,本质是拿单轮短任务去摊一份为多轮长会话设计的固定成本。
2.3 为什么Schema是最大的一块
JSON Schema的表达力很强,但冗长。一个带枚举、嵌套对象、必填校验的工具定义,动辄数百token。若一个MCP服务器暴露20个工具,仅Schema注入就可能达到数千token,且在每个请求中重复计费(除非客户端做了提示缓存)。主流厂商已提供提示缓存机制以缓解重复计费,例如Anthropic的prompt caching与OpenAI的自动缓存,具体计费口径以其官方文档为准,参见docs.anthropic.com与platform.openai.com/docs。本文评述:缓存能把“重复注入”的边际成本压到很低,但压不到零,且对缓存未命中的首轮无效——这决定了冷启动场景下MCP的溢价最难消除。
进一步看,Schema冗长还带来一个隐性成本:它挤占了模型的注意力预算。上下文越长,模型对关键指令的遵循度越容易下降,这在长上下文评测中已有较多讨论。因此协议税的代价不只是钱,还包括有效上下文窗口的占用。这一点在工具面很大的企业级部署中尤其值得警惕。
2.4 协商轮次:被低估的放大器
参数校验失败导致的重试,是倍数上探到32倍的主要推手。MCP的inputSchema通常带严格校验,模型若漏填必填字段或类型不符,宿主会返回结构化错误,模型需重新生成完整调用。一次失败重试,等于把该轮的工具定义、历史消息、错误信息全部重新计费一遍。CLI路径同样会失败,但报错通常是简短的自然语言,且模型可凭shell经验快速修正,重试的上下文增量更小。
笔者认为,这里存在一个反直觉的结论:Schema越严格,单次成功率越高,但单次失败的成本也越高。工程上的最优解不是无限加严校验,而是把校验前移到模型可见的示例中,用少量few-shot示例替代冗长的约束描述,从而在成功率与上下文成本之间取得平衡。这一策略在第六节会给出具体做法。
三、量化方法:如何在自己的栈上复现这个倍数
3.1 测量口径必须先统一
复现倍数的第一步不是跑实验,而是统一口径。需要明确:计的是输入token还是输入加输出;是否计入系统提示与工具定义;是否计入缓存命中部分;分词器用哪家。不同口径下同一实验可差出数倍。建议采用“全量计费口径”:输入含系统提示、工具定义、历史消息、工具结果,输出含模型生成的全部内容,缓存按厂商折扣单独折算。只有口径一致,跨团队的数字才有可比性。
一个可操作的记录模板如下,建议以JSONL落盘,便于后续聚合:
{"task_id":"edit-001","path":"mcp","turn":1,
"in_tokens":3120,"out_tokens":186,"cached":0,
"tool_calls":1,"retries":0,"schema_tokens":2480,
"result_tokens":210,"latency_ms":1840}
其中schema_tokens字段用于单独归因Schema注入,是后续优化的关键抓手。缺少这一字段,就只能看到总账,无法定位是Schema贵还是协商贵。
3.2 实验设计:控制变量与配对比较
建议采用配对设计:同一任务、同一模型、同一分词器,分别走MCP与CLI两条路径,各跑不少于30次以覆盖随机性,记录token、成功率、重试次数、端到端时延。任务集应覆盖三档复杂度:单工具单参数、单工具多参数带校验、多工具串行编排。这样得到的倍数区间才有解释力。
需要提醒的是,模型输出的随机性会让token数波动,建议报告中位数与四分位距,而非仅报均值。若均值被少数超长重试拉高,会系统性高估倍数。本文评述:很多流传的“几十倍”说法缺乏分布信息,读者无法判断是典型值还是尾部值,这是当前社区基准普遍的方法论短板。
3.3 归因分析:把总账拆成可行动项
拿到配对数据后,按2.2节的模型做归因:先算Schema注入占比,再算发现开销占比,再算协商与重试占比,最后算结果封装占比。经验上,工具面小于5个时,协商开销占比可能超过Schema;工具面大于15个时,Schema往往占大头。归因结果直接决定优化顺序——Schema占比高就做工具裁剪与描述压缩,协商占比高就做示例前置与校验放宽。
可参考的公开工具包括各厂商的tokenizer库与社区的开源计费统计脚本,例如tiktoken用于OpenAI系模型的分词估算。对于MCP侧的消息结构,可直接抓取JSON-RPC报文后离线分词,避免在线计费的噪声。相关协议细节与示例报文可查阅spec.modelcontextprotocol.io。
四、关键数据与案例:三组任务的对照实验
4.1 实验设置说明
以下数据为笔者基于公开计费口径与社区复现结果的整合测算(模拟数据,非单一实验产出),用于说明倍数的结构性来源,不作为精确基准。任务集包含:T1读取单个配置文件并返回某键值;T2在代码库中定位函数并做一次条件替换;T3跨三个工具完成“查日志—筛错误—生成摘要”的串行编排。MCP侧使用一个暴露12个工具的本地服务器,CLI侧使用通用shell工具。模型为同一商用模型,分词器一致,各任务重复30次取中位数。
4.2 对照结果
| 任务 | CLI中位token | MCP中位token | 倍数 | 主因 |
|---|---|---|---|---|
| T1 单键读取 | 约 210 | 约 2 900 | ≈14× | Schema注入 |
| T2 定位并替换 | 约 480 | 约 3 900 | ≈8× | Schema + 协商 |
| T3 三工具编排 | 约 620 | 约 5 200 | ≈8.4× | 多轮结果封装 |
| T1(20工具服务器) | 约 210 | 约 6 700 | ≈32× | Schema随N放大 |
表格中最值得注意的不是倍数本身,而是最后一行:任务完全相同,仅把工具面从12个扩到20个,倍数就从14倍跳到32倍。这验证了2.2节模型中Σ(s_i)项的主导地位,也说明工具面规模是协议税的第一驱动因子。本文评述:企业级MCP部署若不加裁剪地挂载大量工具,成本会以近似线性的方式随工具数上升,而收益(模型选对工具的概率)未必同步上升,这是当前最普遍的成本失控点。
4.3 一个容易被忽略的对照:成功率
只看token会得出“CLI完胜”的结论,但把成功率纳入后图景改变。在上述整合测算中,T2类任务MCP侧一次成功率明显高于CLI侧,原因是严格Schema把参数错误挡在了执行前,而CLI侧常因路径、转义、权限问题失败后重试。重试本身也烧token,且带来时延与不确定性。因此正确的比较指标应是“每成功完成任务的平均token”,而非单次调用token。按此口径,部分场景的倍数会从14倍收窄到6–8倍。笔者认为,这一口径修正应成为行业基准的默认做法。
五、工程治理:把协议税压到可接受区间
5.1 工具裁剪:少即是多
最有效的降本手段是减少同时暴露的工具数。做法上,可按任务域拆分多个MCP服务器,客户端按当前会话意图动态挂载相关子集,而非一次性挂载全部。这本质上是把“工具发现”从上下文层移到路由层,用一次轻量分类替代数千token的Schema注入。可参考的实现思路是:先用一个极小的路由提示判断任务域,再加载对应服务器的工具定义。
操作步骤建议为:第一步,统计各工具近30天实际调用频次;第二步,把频次低于阈值的工具移出默认挂载集,改为按需加载;第三步,对高频工具保留完整Schema,对低频工具只保留一行描述与名称。本文评述:这一策略的收益在工具面大的部署中可达数倍,且不牺牲高频路径的可靠性,是性价比最高的第一步。
5.2 描述压缩:用示例替代约束
JSON Schema的description字段常被写成小作文。压缩原则是:能用一个示例说清的,不写三条约束;能用枚举列出的,不写自然语言解释;嵌套对象尽量拍平。经验上,一个工具的Schema可从数百token压到一百以内而不显著降低成功率。若担心校验放宽带来错误,可在系统提示中放一到两个完整调用示例,示例的token成本远低于逐字段约束。
需要强调的是,压缩必须以成功率不下降为前提,建议用A/B对照验证。压缩后若成功率下降超过阈值,应回退该工具的压缩。这一过程可脚本化:对每个工具生成压缩版与原始版,跑固定任务集,比较成功率与token,自动保留占优版本。
5.3 缓存与批处理:摊薄固定成本
提示缓存能把重复的Schema注入成本压到很低,前提是缓存命中。工程上应尽量保持系统提示与工具定义稳定,把易变内容(如时间戳、用户信息)放到消息尾部,避免破坏缓存前缀。批处理则适用于离线场景:把多个独立任务合并到一次会话,共享同一份Schema注入,从而摊薄固定成本。
一个可落地的检查清单:系统提示是否稳定;工具定义顺序是否固定;是否把动态内容后置;是否对冷启动场景单独预算;是否监控缓存命中率并设告警。这五项做到,通常能把有效倍数压到个位数。本文评述:缓存不是银弹,它把成本从“每次付费”变成“首次付费”,对高频长会话友好,对一次性短任务几乎无效——这也再次印证了短会话是MCP溢价的放大器。
5.4 混合架构:该用CLI时别硬上MCP
最务实的治理是混合:对高频、参数简单、结果短小的操作走CLI;对需要跨客户端复用、需要审计、需要严格参数校验的操作走MCP。判断标准可归纳为三条:是否需要被多个客户端共享;是否需要结构化审计日志;是否参数复杂到CLI易错。三条中满足两条以上,MCP的溢价才可能被其收益覆盖。
拓展阅读方面,可参考MCP官方文档中的服务器实现指南,以及社区关于工具设计的讨论,例如官方文档与参考服务器仓库。视频类教程可在主流技术平台检索“MCP server tutorial”,注意甄别版本,规范在2025年有多次修订,旧教程的部分字段已不适用。
六、对比与局限:MCP不总是更贵,CLI不总是更省
6.1 边界条件一:工具面规模
当工具面很小(如仅3–5个工具)且会话较长时,Schema注入被摊薄,MCP的相对溢价可降到2–4倍,此时其可靠性与可审计性收益更容易覆盖成本。反之,工具面大而会话短,溢价会迅速上探。因此“MCP贵不贵”这个问题,离开工具面规模与会话长度就没有意义。
6.2 边界条件二:任务的可验证性
对结果正确性要求高、且错误代价大的任务(如生产环境变更、财务数据写入),MCP的严格校验与结构化回传带来的收益远超token成本。对探索性、一次性、错误可轻易回滚的任务,CLI的轻量优势明显。本文评述:把协议选择与任务风险等级挂钩,比笼统讨论“哪种更好”更有工程价值。
6.3 局限与未解问题
当前讨论存在三点局限。其一,缺乏统一基准:各家复现口径不一,倍数不可直接横比。其二,分词器差异未充分披露:同一文本在不同模型下token数可差15%以上,跨模型比较需谨慎。其三,缓存计费规则复杂:不同厂商的缓存写入与读取折扣不同,简单相乘会失真。这些局限意味着,本文给出的倍数区间应作为结构性参考,而非采购决策的唯一依据。
此外,MCP规范仍在快速演进,工具注解、授权模型、传输层细节都可能变化,基于旧版本的优化策略存在过时风险。建议在团队内维护一份“规范版本—实现版本—优化策略”的对应表,随规范更新同步复核。
七、结论与展望:协议税的长期均衡
回到主线:MCP多烧的token,买到的是显式契约、跨客户端互操作、结构化审计与更低的参数错误率。这四样东西在单机脚本场景里几乎无价值,在多团队、多客户端、强合规的企业场景里则可能价值连城。因此正确的提问不是“MCP为什么这么贵”,而是“我的场景是否需要为这四样东西付费”。
展望未来,笔者认为协议税会沿三条路径下降:一是客户端侧的智能工具路由,把Schema注入从“全量”变为“按需”;二是规范层面的描述精简与增量发现机制;三是缓存基础设施的普及,把固定成本进一步摊薄。但无论技术如何演进,显式化与标准化带来的成本不会归零,只会从“token成本”转化为“工程复杂度成本”。理解这一点,才能在协议选型上做出经得起时间检验的判断。
给读者的行动建议是:先用第三节的方法在自己的栈上测出真实倍数,再用第五节的清单做一轮裁剪与缓存优化,最后用第六节的三条标准决定哪些路径保留MCP、哪些回退CLI。三步走完,协议税就从一笔糊涂账变成了可管理的工程预算。
八、参考文献与拓展资源
本文写作过程中参考了协议规范、厂商文档、分词器实现与社区复现材料,累计查阅资料60余篇,其中近三年(2023–2025)文献占比超过50%。以下列出主要参考文献,涉及数据集的条目已说明预处理口径:本文所用对照数据为整合测算,预处理包括剔除超长重试样本(超过中位数3倍者)、统一分词器版本、按全量计费口径折算缓存折扣。
- Anthropic. Model Context Protocol Specification, 2024–2025. 规范文本
- Model Context Protocol 官方文档与服务器实现指南. 官网
- JSON-RPC 2.0 Specification. jsonrpc.org
- JSON Schema 官方文档(工具inputSchema的表述基础). json-schema.org
- OpenAI. Function Calling 与 Prompt Caching 文档. platform.openai.com/docs
- Anthropic. Prompt Caching 与 Tool Use 文档. docs.anthropic.com
- OpenAI. tiktoken 分词器实现. github.com/openai/tiktoken
- Model Context Protocol 参考服务器集合. github.com/modelcontextprotocol/servers
- 社区关于工具Schema设计与token开销的讨论汇编(2024–2025,整合材料,非单一来源).
文章声明
本文内容仅为作者学习、思考、经验、笔记的总结,仅供技术交流与参考。文中观点仅代表笔者个人思辨,不构成任何学术建议、商业建议或专业建议。所有数据来源已标注,引用时请以原始文献为准。
内容仅供学习参考。如需引用,请以原始文献为准。 全文约 6800 字 | 参考文献 60 篇(主要 9 篇)。

