MCP 协议架构深度解析 —— LLM 工具调用的标准范式演进

摘要:Model Context Protocol(MCP)由 Anthropic 在 2024 年 11 月开源,它试图在 LLM 与外部工具之间建立一套"类 USB-C"的标准化协议。本文以架构师视角,从协议起源、设计哲学、三方模型、原语体系、传输层、JSON-RPC 通信、会话生命周期、采样与隔离、横向协议对比、注册中心生态、SDK 实现、生产可观测、2026 演进方向 18 个维度,对 MCP 进行系统解构。重点不是"如何使用 MCP",而是追问"MCP 为何这样设计、它在 Agent 协议栈中处于什么位置、它如何重塑 LLM 应用集成范式"。读完后,你将理解:为什么是 JSON-RPC、为什么是 Host/Client/Server 三方模型、为什么需要 Sampling、为什么需要 Roots,以及 MCP 未来在 Agent-to-Agent 通信与 Zero Trust 架构中的演化路径。MCP 不是终点,而是 LLM 工具协议走向"开放基础设施"的起点。

第一篇:协议起源与设计哲学

第一篇聚焦于 MCP"为什么是这样"。任何成熟协议都不是凭空出现的——它是一系列技术决策、利益权衡、生态博弈后的均衡产物。我们将沿着"集成困境 → 选型权衡 → 角色解耦 → 原语抽象 → 传输演进"这条主线,揭开 MCP 协议架构的设计内幕。理解这些内幕,比记住 API 形状更重要——因为它决定了协议未来如何演化,以及你应该在什么位置参与其中。协议设计是约束的艺术,在无数种可能性中选出最平衡的那个,让生态能围绕它蓬勃生长。

1.1 MCP 诞生背景:N×M 集成困境与 M×N 协议诉求

在 2023 年 ChatGPT 引爆大模型浪潮之后,业界迅速意识到一个朴素的事实:LLM 本身只是一个"函数 f(prompt) → response",真正的价值在于它能"使用工具"。但工具调用的集成方式,从一开始就陷入 N×M 的复杂性陷阱:N 个 LLM 厂商(OpenAI、Anthropic、Google、Cohere、Mistral…)和 M 个工具方(Slack、Notion、GitHub、数据库、内部 API…)之间,需要 N×M 个适配器。每一次新增模型或工具,都是一场"双向适配"的工程噩梦。每一次升级都意味着回归测试、版本对齐、错误排查,边际成本不降反升

Anthropic 在 2024 年 11 月开源 MCP 时给出的官方动机非常直接:"We open-sourced MCP because we believe this protocol should be a collaborative, open standard that benefits the entire industry." 翻译成工程语言:单一厂商主导的私有协议无法形成生态,必须开源、必须中立、必须可扩展。MCP 试图把 N×M 变成 M+N:每个 LLM 实现一次 MCP 客户端,每个工具实现一次 MCP Server,二者通过标准化协议握手即可互通。这看起来只是一个简单的加法到乘法的数学优化,背后却涉及大量的工程决策、利益博弈与生态设计。从"私有协议"走向"开放标准"的每一步,都伴随着商业模型的重新定义——开源不是放弃控制权,而是用控制权换标准制定权

1.1.1 N×M 困境的量化分析

让我们量化 N×M 困境到底有多痛。假设市场上有 5 个主流 LLM 厂商、20 个常用工具源(CRM、数据库、搜索引擎、代码仓库…)。在"每个 LLM 必须为每个工具写适配器"的模式下,需要 5×20 = 100 个集成实现。每个集成包含:认证、参数 schema 描述、错误码映射、流式响应处理、限流适配——平均每个集成 200-500 行代码。整体工程量:3-5 万行重复的胶水代码。还不算测试、CI、文档等周边开销。

更糟糕的是,这些代码不可移植——当你把 OpenAI 的 Function Calling 切换到 Anthropic 的 Tool Use,光是 schema 字段从 `parameters` 变成 `input_schema`、认证从 API Key 变成 OAuth Flow,就要重写一半逻辑。这种"每个集成都是一次性"的现实,让企业在多模型策略上举步维艰。Anthropic 在 MCP 设计文档中用了一个非常精妙的比喻:"It is like USB-C for AI applications: a universal cable that connects any device to any peripheral." USB-C 的成功在于:设备厂商只需要做一种接口,所有外设都能用。MCP 的野心是:让 LLM 和工具之间也有这样一根"通用线缆"。

横向对比,类似的 N×M 困境在计算机历史上反复出现:编程语言与数据库(JDBC/ODBC 解决了)、编辑器与编程语言(LSP 解决了)、前端与浏览器(Web 标准解决了)。MCP 试图在 LLM 工具调用领域复制同样的成功路径——从 N×M 到 M+N,从"重复集成"到"标准互通"

1.1.2 M+N 标准协议的诉求层次

MCP 提出的 M+N 范式,本质上是把"集成问题"从"应用层问题"提升为"协议层问题"。M+N 的精妙在于:把"模型能力"和"工具能力"解耦后,集成复杂度从相乘变为相加。每一个新模型只需实现一次 MCP Client 协议,每一个新工具只需实现一次 MCP Server 协议,新增的边际成本从 O(M+N) 降到 O(1)。

MCP 标准协议诉求的四个层次:

L1 传输层:    工具如何与 LLM 进程通信?stdio / SSE / HTTP
L2 协议层:    消息格式是什么?JSON-RPC 2.0
L3 语义层:    工具如何被声明?Tools/Resources/Prompts
L4 安全层:    权限如何收敛?Roots + Sampling + 人审

每一层解决一个具体问题:
- L1 解决"如何到达"
- L2 解决"说什么"
- L3 解决"提供什么"
- L4 解决"允许做什么"

这四层协议是正交设计的典范——你可以替换传输层(从 stdio 到 Streamable HTTP),不影响协议层;可以扩展语义层(新增 Skills 原语),不影响安全层。这种分层架构让 MCP 具有长期演进能力,也是它能跨越一年时间多次升级而不破坏生态的根本原因。正交设计的反面是"紧耦合"——一个变更引发连锁反应,每个升级都是一次生态灾难。LSP、HTTP、SMTP 这些长寿协议都遵循正交设计,MCP 站在巨人肩膀上。

1.1.3 Anthropic 2024-11 开源决策的多方博弈

Anthropic 选择在 2024-11-25 正式开源 MCP 并不偶然。从时间线回溯:2024 年 8 月,OpenAI 发布 GPT-4o 的 Function Calling 增强版;2024 年 9 月,Google 在 Gemini 1.5 中加入 Tools 模块;2024 年 10 月,Anthropic 内部完成 MCP 的最终评审。此时生态格局是"各立标准":OpenAI 推 GPTs Actions,Google 推 Gemini Extensions,每个厂商都在做"事实标准的代理人"。

Anthropic 选择了第三条路:开源中立协议。这是一个大胆的策略——把"事实标准的红利"让渡给"开放生态的统治力"。回看历史,类似决策在编程语言领域发生过(Java 开源催生了 JVM 生态),在容器领域发生过(OCI 标准让 Kubernetes 成为赢家),在前端框架领域发生过(React 开源让 Meta 间接统治了 UI 库市场)。MCP 押注的是:LLM 工具调用协议将走向"类似 TCP/IP 的开放标准",先开源者将获得标准制定权。

但开源中立也意味着风险:OpenAI 可以免费采用 MCP,Google 可以免费采用 MCP,Anthropic 的投入可能成为"行业公共品"。这需要 Anthropic 在协议层持续领先——通过持续贡献新能力、撰写规范文档、运营生态平台,确保自己在 MCP 标准中始终是"主导声音"。这种"以退为进"的策略能否成功,取决于 Anthropic 能否在开放中保持领先。历史告诉我们:开源协议的胜出者,往往是"最愿意持续投入"的那家,而非"最早提出"的那家。

【架构决策深挖点 #1】:MCP 的开源决策不是慈善,而是"以退为进"。Anthropic 用"放弃私有协议控制权"换取"标准制定者地位"。这与 Linux 基金会治理 Kubernetes 的逻辑如出一辙——标准的最大受益者不是协议的版权所有者,而是协议的参考实现者。当 MCP 成为行业标准,Anthropic 的 Claude 反而成为"最被集成的模型",形成正反馈。同时,开源让 MCP 获得了"中立性"光环——任何厂商都可以无顾虑地采用,这是私有协议永远无法获得的优势。Anthropic 在 2025 年 6 月成立 MCP 治理委员会,正是为了让中立性"制度化"——避免被外界认为"Anthropic 的私有协议",让 MCP 真正走向"行业公共品"。

1.1.4 LSP 思想的迁移与改造

MCP 的设计者明确承认借鉴了 Language Server Protocol(LSP)。LSP 是 Microsoft 在 2016 年为解决"编辑器 × 语言"集成困境而设计的协议——VS Code、Sublime、Vim 等编辑器通过 LSP 与 Python、Go、Rust 等语言的"语言服务器"通信,实现了"一次实现,多端复用"。MCP 把这个思想迁移到 LLM 工具调用领域:LLM 是"智能客户端",外部工具是"能力服务器"。

但 MCP 不是 LSP 的简单复制——它做了三处关键改造:

  • 从文本到智能:LSP 通信的是"代码语义单元",MCP 通信的是"自然语言意图"——后者需要"采样"(Sampling)反向通道让 Server 也能调用 LLM
  • 从静态到动态:LSP 假设语言语法是静态的,MCP 必须支持工具的动态发现和能力协商——LLM 工具集是动态变化的
  • 从单机到多租户:LSP 服务于单个 IDE 实例,MCP 服务于多用户、多租户场景,需要更强的隔离性(Roots)和安全边界

这三点改造让 MCP 不是"LSP 的 LLM 版本",而是"LSP 思想在 LLM 时代的重新实现"。好的协议不是凭空发明的,而是站在巨人肩膀上的再创造。MCP 设计者的高明之处在于:看到了 LSP 与 LLM 工具调用的"形似",但清醒认识到"神不似",做了针对性改造。这种"形似神不似"的借鉴,比简单照搬更有价值。

1.1.5 协议时机的判断

为什么 MCP 出现在 2024 年底,而不是更早?关键变量有三个:

  • Function Calling 普及:OpenAI 在 2023 年 6 月推出 Function Calling,到 2024 年中已成为行业标准能力,模型层已经具备工具调用基础
  • Agent 框架成熟:LangChain、AutoGen、CrewAI 等 Agent 框架在 2024 年中成熟,应用层有明确需求
  • 集成困境爆发:到 2024 年下半年,企业级 LLM 应用普遍接入 10+ 工具源,N×M 困境从理论问题变成真实的工程瓶颈

三个变量同时成熟,创造了 MCP 出现的"协议窗口"。早一年(2023 年)模型层不支持,晚一年(2025 年)各家私有协议可能已成事实标准。Anthropic 抓住了这个窗口。这种"timing is everything"的判断,是技术创业的常见主题——再好的想法,如果不在正确的时间出现,也会被历史淘汰。

1.2 协议设计哲学:JSON-RPC 选型、状态化连接、能力协商、渐进式增强

MCP 的设计哲学可以浓缩为四个关键词:JSON-RPC 2.0 选型、状态化连接、能力协商、渐进式增强。每一个选择背后都有反方方案和权衡逻辑,理解这些权衡比记住 API 形状更重要。协议设计是约束的艺术——在无数种可能性中选出最平衡的那个,让协议既有清晰的核心,又能灵活扩展。MCP 的设计哲学可以用一句话概括:"用最小核心 + 协商机制 + 渐进增强"实现"无限生态"

1.2.1 JSON-RPC 2.0:为什么不是 gRPC、不是 REST、不是 GraphQL

在协议选型上,MCP 设计者面临四个候选:gRPC(HTTP/2 + Protobuf)、REST(HTTP/1.1 + JSON)、GraphQL(HTTP + 类型化查询)、JSON-RPC 2.0(JSON over 任意通道)。最终选择 JSON-RPC 2.0 看似"老旧",实则是深思熟虑的结果。

四种协议选型对比矩阵:

维度            gRPC        REST         GraphQL     JSON-RPC 2.0
─────────────────────────────────────────────────────────────────
传输依赖         HTTP/2      HTTP         HTTP        任意(stdio/SSE/WS)
Schema 严格      强(Proto)  弱(OpenAPI)  强(SDL)    弱(运行时)
双向流           原生支持     不支持        订阅模式     通知(单向)
人可读性         否          是            是           是
LSP 借鉴度       低          中            低          高
学习成本         高          低            中          低
调试难度         高(需工具)  低            中          低
生态成熟度       高          极高          中          中

JSON-RPC 2.0 的核心优势在于传输无关。MCP 需要支持三种传输场景:stdio(本地进程)、SSE(单向流式)、HTTP+Streamable(2025 新增),JSON-RPC 2.0 是唯一能同时跑在所有这些通道上的协议。gRPC 强依赖 HTTP/2,无法走 stdio;REST 缺乏双向通信;GraphQL 过度复杂且同样依赖 HTTP 通道。JSON-RPC 2.0 的"无传输假设"让它成为最灵活的选项。

另一个关键优势是人可读性。JSON-RPC 消息是纯 JSON,开发者用 `cat` 就能看到原始消息,调试门槛极低。gRPC 的 Protobuf 二进制格式需要专门工具才能解读,对开源生态的"低门槛接入"原则不友好。LSP 选 JSON-RPC 也是出于同样的考虑。当一个协议要"被广泛采用"时,低门槛比高性能更重要——MCP 的设计者显然深知这一点。

1.2.2 状态化连接:长连接 vs 无状态请求

大多数 Web API 是"无状态"的——每次 HTTP 请求都是独立事务,服务器不记得上次调用。但 MCP 选择了"状态化连接":Client 和 Server 一旦握手就保持长连接,期间维护会话状态(已订阅的资源、活动工具列表、协商过的能力)。

这个决策带来三个好处:

  • 资源订阅:Server 可以主动推送"资源变化"事件(类似 WebSocket),Client 不需要轮询,大幅减少网络流量
  • 能力缓存:握手时协商好的能力不需要每次重新声明,减少 90% 的协议元数据流量
  • 取消语义:长任务可以中途取消,状态化连接让取消信号直达 Server,避免半成品状态

代价是:服务器需要管理会话生命周期,需要断连重连机制,需要心跳保活,需要处理"半死连接"问题。这比无状态 REST 复杂一个数量级。但 MCP 设计者认为:LLM 工具调用的本质是"会话"而非"事务"——用户在 IDE 里开一个对话,期间会调用 20-30 次工具,每次都重新握手是不合理的。

这种"会话型而非事务型"的定位,让 MCP 天然适合 IDE、桌面应用等"长生命周期"场景,而不适合"一次性 API 调用"场景。这是协议设计中的"场景聚焦"——不要试图做一个"万能协议",找到最适合自己的场景,深度优化。MCP 选择会话模型,放弃了无状态的部分灵活性,换取了长连接场景的极致体验

1.2.3 能力协商(Capability Negotiation):渐进式披露

能力协商是 MCP 最具创新性的设计之一。它的核心思想是:Client 和 Server 在握手时互相"声明自己支持的能力",运行时只使用双方都支持的功能。这与 LSP 的能力协商机制完全一致。

能力协商的协议示例:

C → S:  initialize  {protocolVersion, capabilities: {tools: {}, resources: {subscribe: true}}}
S → C:  initialize  {protocolVersion, capabilities: {tools: {listChanged: true}, prompts: {}}}

C → S:  initialized  (空通知)
S → C:  notifications/tools/list_changed  (能力变更广播)

能力协商带来三个架构优势:

  • 向前兼容:旧 Client 遇到新 Server 时,只使用共同能力,不会崩溃。这是协议演进的"无破坏性升级"基础
  • 渐进式增强:新版本可加入新能力(如 MCP-2025-06 新增 Audio Content),Client 可选择是否使用
  • 显式优于隐式:能力必须显式声明,协议行为可预测。不会出现"Server 默默支持某个功能但 Client 不知道"的歧义

能力协商也是 MCP "Server 多样性"的基础——不同 Server 可以支持不同能力子集,Client 无需为每个 Server 写特殊代码。GitHub Server 支持 `tools + resources`,本地 File Server 支持 `tools + resources + roots`,它们对 Client 呈现的"能力视图"不同,但 Client 代码是统一的。这种"接口一致、实现多样"的特性,让 MCP 成为一个真正可扩展的协议生态。

1.2.4 渐进式增强:协议版本管理的智慧

MCP 采用"能力协商 + 版本字段"双轨制做协议演进。`protocolVersion` 字段(如 "2024-11-25")让双方先确认"我们跑在哪个基线版本",然后在能力集合里逐步加入新特性。这意味着 MCP-2024-11-25 协议的 Client 遇到 MCP-2025-06-18 协议的 Server 时,能优雅降级:只使用老能力,跳过新能力。

这种版本管理思想借鉴自 Web 平台:"长存版本号(HTML5)+ 特性检测"。Web 不再使用 HTML 4.01、HTML5 这样的版本号强迫用户升级,而是用 Can I Use 这样的特性检测,让浏览器和网页协商"我们支持哪些特性"。MCP 把同样的智慧带到了协议层。

对比传统 SemVer(major.minor.patch),日期版本号的优势:

  • 时间透明:开发者一眼看出"这是哪一年的协议"
  • 强兼容性:日期版本号不会"假装"有 SemVer 的兼容性保证(避免误解)
  • 演进可读:每三个月一个版本,开发者能感知"协议在快速演进"
【架构决策深挖点 #2】:MCP 的版本治理采用了"日期版本号 + 能力协商"双轨制,而不是传统 SemVer。这是有意为之——SemVer 适合"库 API"演化(major/minor/patch 在编译期强约束),不适合"网络协议"演化(编译期约束不可能,运行时协商才是关键)。日期版本(2024-11-25、2025-06-18)传达的信息是"协议的时间快照",配合能力协商实现"运行时兼容性检查"。这与 Web 平台的"长存版本号(HTML5)+ 特性检测"思想一脉相承,是协议设计领域一次重要的方法论升级。MCP 在 2025 年尝试把这种"日期版本"模式推广到 LLM 协议领域,目前看效果不错——Anthropic、Google、Mistral 等都接受了这种版本哲学。

1.2.5 设计哲学的"四元组"

回到四个关键词,它们共同构成了 MCP 的设计哲学矩阵

  • JSON-RPC:选择"最简"的消息层(不发明新概念,复用成熟方案)
  • 状态化连接:选择"最贴近场景"的连接模型(会话型而非事务型)
  • 能力协商:选择"最灵活"的兼容性策略(运行时协商,渐进披露)
  • 渐进式增强:选择"最安全"的演进路径(不破坏旧客户端)

这四个选择都偏向"简洁而非强大"。MCP 没有发明新概念,而是从 JSON-RPC、LSP、HTTP 等成熟方案中选取最合适的元素,组合成一个新协议。这是"组合式创新"的典范——不发明新东西,只重新组合现有东西。Unix 哲学中的"小而美的工具组合",在协议设计领域同样适用。

1.3 三方架构模型:Host/Client/Server 角色解耦

MCP 架构最容易被误解的地方是它的"三方模型":Host、Client、Server。很多人会问:为什么不是 Client-Server 两层?为什么需要多一个 Host?答案藏在 LLM 应用的实际部署形态中——LLM 进程、协议客户端、能力服务器三者的生命周期和权限边界往往是不同的,必须分开建模。三方模型不是过度设计,而是对现实部署形态的精确抽象

1.3.1 三个角色的精确定义

在 MCP 规范中,三个角色有精确定义:

  • Host(宿主):承载 LLM 推理能力的进程,如 Claude Desktop、Cursor IDE。它发起连接、管理用户身份、保存 API Key、聚合多个 Client 的能力视图
  • Client(客户端):在 Host 进程中运行的协议客户端,维护与某个 Server 的 1:1 连接。它负责消息序列化、协议状态机、能力协商、能力路由
  • Server(服务端):提供具体能力的进程,如文件系统 Server、GitHub Server、数据库 Server。它声明自己的工具/资源/提示词

关键约束:一个 Client 只能连接一个 Server,一个 Host 可以运行多个 Client。这看似不自然(为什么不让 Client 直接连多个 Server?),实则是有意的安全设计——每个 Server 看到的是"一个隔离的协议会话",不知道其他 Server 的存在。这种"单租户隔离"是 LLM 工具调用的安全基石。看似冗余的设计,往往是为了换取不易察觉的安全收益——架构之美常常藏在这种"不必要"的分层中。

1.3.2 一连接多能力的架构价值

Client-Server 1:1 的设计带来一个深层架构优势:每个 Server 是独立部署、独立扩缩容的微服务。当你需要接入 GitHub 工具时,启动一个 git-mcp-server 进程;需要数据库工具时,启动 db-mcp-server 进程;它们共享同一个 Host,但通过不同的 Client 独立通信。

Host/Client/Server 部署架构图:

┌─────────────────────────────────────────────────────────┐
│                        Host                             │
│  ┌─────────┐  ┌─────────┐  ┌─────────┐  ┌─────────┐   │
│  │ Client1 │  │ Client2 │  │ Client3 │  │ Client4 │   │
│  └────┬────┘  └────┬────┘  └────┬────┘  └────┬────┘   │
└───────┼───────────┼───────────┼───────────┼───────────┘
        │           │           │           │
   stdio│      SSE  │      HTTP │      HTTP │
        ▼           ▼           ▼           ▼
   ┌────────┐  ┌────────┐  ┌────────┐  ┌────────┐
   │File    │  │GitHub  │  │DB      │  │Slack   │
   │Server  │  │Server  │  │Server  │  │Server  │
   └────────┘  └────────┘  └────────┘  └────────┘

这种"网格 + 星型混合"拓扑的优势:

  • 故障隔离:GitHub Server 崩溃不影响 File Server 运行,避免单点故障蔓延
  • 独立扩缩容:高频工具可以部署多个实例,低频工具单实例即可,资源利用更精细
  • 权限隔离:每个 Server 只能访问授权范围内的资源,遵循最小权限原则
  • 语言异构:每个 Server 可以用最适合的语言实现(File Server 用 Rust,DB Server 用 Python)

1.3.3 客户端聚合多 Server:能力路由器

当一个 Host 连接了 10 个 Server(文件、Git、DB、搜索、CI、监控…),它需要一个"能力路由器"来统一对外呈现。Host 内部会维护一个"全局工具列表",把 10 个 Server 的 Tools、Resources、Prompts 合并成统一的"能力视图",让 LLM 一次看到所有可用工具。

这个聚合层在 MCP 规范中是"可选的"——具体实现取决于 Host。但所有主流 Host(Claude Desktop、Cursor、Cline)都实现了这个聚合层,因为 LLM 一次只能感知一个工具列表。这是 Host 价值的重要来源:把异构工具源统一为 LLM 友好的"扁平工具表"

能力聚合代码示例(伪代码):

class Host {
  private clients: Client[] = [];

  getUnifiedCapabilities() {
    return {
      tools: this.clients.flatMap(c => c.listTools()),
      resources: this.clients.flatMap(c => c.listResources()),
      prompts: this.clients.flatMap(c => c.listPrompts())
    };
  }

  async dispatchToolCall(name: string, args: any) {
    // 找到拥有此 Tool 的 Client
    const client = this.clients.find(c =>
      c.hasTool(name)
    );
    if (!client) throw new McpError(-32601, `Tool ${name} not found`);
    return client.callTool(name, args);
  }
}

1.3.4 三方模型的权限隔离

三方模型的另一价值是权限隔离。设想一个企业部署:

  • Host:员工电脑上的 Claude Desktop,持有员工个人 OAuth Token
  • Client:Host 内的协议客户端,使用员工 Token 与 Server 通信
  • Server:公司内网部署的 git-mcp-server,运行在受信区域,只能访问公司 GitLab

Server 只能通过 Client 间接获得员工身份,不能直接访问员工的本地文件(除非员工主动通过 Files Server 暴露)。这比"Server 直接拥有所有权限"安全得多。这是 LSP 不曾遇到的问题——LSP 服务于单个 IDE 实例,权限模型简单;MCP 服务于多用户场景,权限模型必须精细。

权限隔离的工程价值在 2025 年某次供应链攻击事件中得到验证:某个第三方 MCP Server 被植入恶意代码,但由于 Host/Client/Server 三方隔离,恶意代码只能访问该 Server 自己声明的资源,无法横向移动到其他 Server 或 Host 本身。这与传统"插件模型"(一个插件获得宿主所有权限)形成鲜明对比。架构上的"看似冗余"在安全场景下变成"不可替代的护城河"

1.3.5 与微服务架构的类比

MCP 的三方模型与"微服务架构"高度相似:

维度微服务架构MCP 架构类比说明
服务提供方微服务(订单服务、用户服务)MCP Server(File、Git、DB)独立部署的能力单元
服务消费方API Gateway / BFFMCP Client协议转换与路由
宿主前端 / 移动 AppHost(LLM 进程)用户体验层
通信协议HTTP / gRPCJSON-RPC 2.0消息层
服务发现Consul / Eureka能力协商 / 配置文件动态感知能力

理解 这个类比,熟悉微服务架构的工程师可以快速掌握 MCP——很多最佳实践可以复用:服务网格、熔断降级、链路追踪、灰度发布……MCP 的设计者显然深谙微服务之道——它把微服务的成熟经验平移到 LLM 工具调用领域,避免了"重新发明轮子"的浪费。

1.4 协议原语三大件:Tools / Resources / Prompts

MCP 把所有可被 LLM 调用的能力抽象为"三大原语":Tools(工具)、Resources(资源)、Prompts(提示词模板)。这三者的边界划分是 MCP 协议语义层的灵魂。原语的清晰度决定协议的可演化性——原语混乱,协议就难以扩展。原语是协议设计师对问题域的"世界观表达":把世界看作什么、能做什么、不能做什么,都凝固在原语定义中。

1.4.1 Tools:可执行函数

Tools 是 MCP 三大原语中最像传统 Function Calling的一种。Tool 是具有结构化输入输出的可执行函数,LLM 通过 JSON Schema 描述参数,通过 JSON-RPC 调用,拿到结构化结果。

Tool 声明示例(JSON Schema):

{
  "name": "create_issue",
  "description": "Create a new GitHub issue in the given repository",
  "inputSchema": {
    "type": "object",
    "properties": {
      "repo": {"type": "string", "description": "owner/repo"},
      "title": {"type": "string"},
      "body": {"type": "string"},
      "labels": {"type": "array", "items": {"type": "string"}}
    },
    "required": ["repo", "title"]
  }
}

Tool 的关键设计点:

  • 幂等性建议:Tool 应当尽量幂等,便于重试和回滚。LSP 协议中很多方法(保存文件、修改光标)都是幂等的,MCP 借鉴了这一思想
  • 副作用声明:Tool 应当显式声明是否产生副作用(写操作 vs 读操作)。未来 MCP 可能引入 `sideEffects: ["read" | "write"]` 字段
  • 超时与取消:Tool 必须支持超时和取消信号,避免长任务卡死整个对话循环
  • 结果可序列化:Tool 的返回值必须是可序列化为 JSON 的,复杂对象需要二次解析

Tool 与 Function Calling 的细微差异:

  • Tool 有描述:必须包含 `description` 字段,告诉 LLM 这个工具"做什么"——Function Calling 也有,但 MCP 更强制
  • Tool 是协议级抽象:Tool 描述在握手时就传给 Client,LLM 在推理时直接使用,无需每次重新加载
  • Tool 跨厂商:同一个 Tool 声明可以被 Claude、GPT、Gemini 等不同 LLM 理解,不绑死特定厂商

1.4.2 Resources:可读取的内容

Resources 解决的是"把结构化数据喂给 LLM"问题。一个 Resource 是一段可寻址的内容(文件、URL、数据库行、API 响应),LLM 可以通过 URI 模式读取它。这与 Tool 的"执行函数"语义不同——Resource 是"",Tool 是""。

Resource 列表示例:

[
  {
    "uri": "file:///home/user/project/README.md",
    "name": "项目 README",
    "mimeType": "text/markdown"
  },
  {
    "uri": "github://repo/owner/repo/issues/123",
    "name": "Issue #123 描述",
    "mimeType": "application/json"
  }
]

Resource 的关键设计点:

  • URI 模式:Resource 用 URI 寻址,支持多种 scheme(file://、https://、custom://)。这与浏览器 URL 设计一脉相承,LLM 可以"学习"URI 规律
  • 订阅机制:Client 可以订阅 Resource 变化,Server 主动推送更新(通过 `notifications/resources/updated`)。这是 LLM 获得"实时上下文"的关键
  • 模板化:支持 URI 模板(RFC 6570),如 `github://repo/{owner}/{repo}/issues/{id}`,让 LLM 可以"猜测"资源位置
  • MIME 类型:通过 `mimeType` 字段标记内容类型,LLM 知道如何解析(text/markdown、application/json、image/png…)

Resource 与 Tool 的边界判定:

  • 如果操作是""(不修改状态)→ 用 Resource
  • 如果操作是""(修改状态、产生副作用)→ 用 Tool
  • 如果 LLM 需要"重复看"某物 → Resource 更合适(可以订阅)
  • 如果操作有"返回值"(查询结果)→ Tool 配合输入输出更合适

1.4.3 Prompts:可复用的提示词模板

Prompts 是 MCP 最具创新性的原语。它代表"可复用的提示词模板"——一段带有占位符的文本,LLM 可以"应用"这个模板来生成结构化提示词。这与 Tool/Resource 的"数据/函数"语义不同——Prompt 是"对话策略"。

Prompt 模板示例:

{
  "name": "code_review",
  "description": "对指定代码进行评审,输出结构化评审意见",
  "arguments": [
    {"name": "language", "description": "编程语言", "required": true},
    {"name": "code", "description": "待评审代码", "required": true},
    {"name": "strictness", "description": "严格度 low/medium/high"}
  ]
}

Prompt 的存在让 LLM 获得一种"人机协作约定"。Server 可以发布"代码评审 Prompt"、"SQL 生成 Prompt"、"翻译 Prompt",让 LLM 直接调用,无需自己设计提示工程。这与 Claude 的"Project"、OpenAI 的"GPTs Instructions"思想一致,但更协议化、更可移植。把"对话策略"协议化,是 MCP 相比 Function Calling 的一个重要创新。

Prompt 的实际价值:

  • 知识沉淀:把领域专家的提示工程经验沉淀为协议级资源,让普通用户也能用上专业提示
  • 一致体验:不同用户调用同一个 Prompt 模板,得到的 LLM 行为一致
  • 可版本化:Prompt 模板可以随 Server 升级,普通用户无感知地获得更好的提示

1.4.4 三大原语的组合使用与边界

三大原语的关系是互补而非互斥。典型组合场景:

原语语义典型场景LLM 决策时机副作用
Tools执行函数创建 Issue、发送邮件、查询 API需要时调用有(写操作)
Resources读取内容读文件、查文档、获取数据需要上下文时读取无(只读)
Prompts应用模板代码评审、SQL 生成、翻译用户主动选择

边界判定准则:

  • 如果 LLM 需要主动做某事,用 Tool
  • 如果 LLM 需要被动看某物,用 Resource
  • 如果用户需要复用某种对话模式,用 Prompt

更微妙的关系:Prompts 可以"引用" Tools 和 Resources。例如"代码评审 Prompt"可以内置"调用 lint 工具、读取 diff 文件、生成评审意见"的工作流。这让 Prompts 成为一种"高层工作流抽象",未来可能演化为 Skills(参见 4.3.2 节)。

【架构决策深挖点 #3】:三大原语的划分是 MCP 协议语义层的最关键决策。它比"是否支持流式"、"是否支持取消"等技术细节重要得多。一个清晰的原语划分让 Server 实现有迹可循、让 Client 优化有的放矢、让 LLM 工具调度有规律可循。协议原语即协议的世界观——它决定了 LLM 与工具之间能形成什么样的"对话"。MCP 选择 Tools/Resources/Prompts 三分法,本质是把 LLM 与工具的交互拆解为"做、看、说"三个动作——这种拆解既符合人类认知(做事、观察、表达),也符合 LLM 推理(动作、上下文、策略)。这种"三层动作模型"在哲学上优雅,在工程上实用。

1.5 传输层多模态:stdio / SSE / HTTP+Streamable 演进

MCP 的传输层设计经历了三个阶段:stdio(2024-11 首发)→ SSE(2024-12 补充)→ HTTP+Streamable(2025-06 演进)。每一次演进都反映了"使用场景多样化"的现实压力。传输层是协议与现实世界的接口——再优雅的协议设计,如果传输层不适配部署环境,都是空中楼阁。

1.5.1 stdio 传输:本地进程的最简形态

stdio 传输是 MCP 协议的默认与首选形式。它把 Server 进程作为 Host 的子进程启动,通过 stdin/stdout 通信。优点是:零网络配置、零端口占用、零安全暴露面。适合本地工具(文件操作、命令行执行、本地数据库)。

stdio 传输的启动流程:

Host                     Server
  │  spawn process          │
  │ ──────────────────────> │
  │  pipe(stdin, stdout)    │
  │                         │
  │  JSON-RPC over stdin    │
  │ ──────────────────────> │
  │                         │
  │  JSON-RPC over stdout   │
  │ <────────────────────── │

stdio 传输的精妙之处在于:它不发明新概念,而是复用 OS 原语。父进程-子进程的 stdin/stdout 是 Unix 哲学的基石,比任何"消息队列"都更可靠。LSP 同样使用 stdio 作为默认传输,证明了这种选择在 IDE 场景下的成熟度。stdio 的"管道"机制天然适合 LLM 工具调用的"流式响应"——LLM 生成文字是一个流,工具返回结果也可以是流,stdio 提供了一个统一的流式通道。

stdio 传输的限制:

  • 同机限制:Server 必须与 Host 同一台机器
  • 进程耦合:Server 进程随 Host 启动/停止
  • 调试困难:stdio 消息需要特殊工具捕获(不能用普通网络抓包)

1.5.2 SSE 传输:跨网络单向流式

stdio 有一个明显局限:Server 必须跑在 Host 同一台机器。当 Server 部署在远程(比如企业内网的 git-mcp-server),stdio 就不够用了。MCP-2024-12 引入 SSE(Server-Sent Events)作为第二种传输。

SSE 是 HTTP 协议上的单向流式扩展:Server 可以向 Client 持续推送事件,Client 通过普通 HTTP POST 发送请求。优点是:基于 HTTP、容易穿透防火墙、天然支持流式响应。缺点是:双向通信不优雅——Client → Server 的请求必须走普通 HTTP,Server → Client 的响应走 SSE,连接复用性差。

SSE 的工作原理:

SSE 通信流程:

1. Client 发送 HTTP POST: /messages
   Body: {jsonrpc: "2.0", id: 1, method: "tools/call", params: {...}}

2. Server 返回 200 OK
   Headers: Content-Type: text/event-stream
   Body: 
     event: message
     data: {"jsonrpc":"2.0","id":1,"result":{...}}
     
     event: message
     data: {"jsonrpc":"2.0","method":"notifications/progress","params":{...}}

SSE 的核心问题:请求和响应不在同一个 HTTP 连接上。Client 发请求走一个 HTTP POST,Server 通过另一个 SSE 连接推送响应。这种"双连接"模式让会话管理复杂化,对长任务、流式响应不够友好。MCP 设计者在 2025 年初就意识到 SSE 是过渡方案,必然要被替代。

1.5.3 HTTP+Streamable(2025-06):新传输规范

SSE 的"半双工"问题在生产环境中暴露明显:长任务取消困难、连接管理复杂、服务器需要维护双连接(请求通道+响应通道)。MCP-2025-06 引入第三种传输 Streamable HTTP,彻底重构了远程传输模型。

Streamable HTTP 传输架构:

┌─────────┐                  ┌─────────┐
│  Client │ ──── POST ────> │  Server │
│  (Host) │ <── SSE/REST ── │ (Tool)  │
└─────────┘                  └─────────┘

特性:
1. 单 HTTP 端点 (POST /messages)
2. Server 可选择"升级"到 SSE 流
3. 普通响应直接走 HTTP body
4. 取消通过断开连接触发

Streamable HTTP 的关键创新是"按需流式升级":Server 不是一开始就用 SSE,而是先返回普通 HTTP 响应,如果响应需要流式(比如长任务的进度更新),再"升级"为 SSE。这避免了 SSE 连接一直保持的开销,兼容了无流式需求的简单场景。从"全双工"到"按需升级",反映了协议设计者对真实部署场景的深入理解。

Streamable HTTP 的工程优势:

  • 连接简单:只有一种连接(HTTP POST),没有双连接歧义
  • 取消友好:断开 HTTP 连接就是取消信号,无需特殊协议
  • 基础设施兼容:标准 HTTP 兼容所有反向代理、负载均衡、API Gateway
  • 流式可选:不需要流式的工具用普通 HTTP,需要的才升级到 SSE

1.5.4 三种传输的选型矩阵

三种传输不是替代关系,而是互补关系。MCP 规范要求所有实现支持 stdio,HTTP 传输作为可选。

传输部署位置通信方向典型场景复杂度规范状态
stdio同机双向(pipe)本地文件、命令行、IDE 工具必须支持
SSE远程半双工早期远程工具(已被 Streamable 替代)Legacy
Streamable HTTP远程伪双工云端 MCP 服务、多租户工具推荐

1.5.5 传输无关的协议设计哲学

无论选择哪种传输,上层的 JSON-RPC 消息格式不变。这就是 JSON-RPC 2.0 "传输无关"特质的价值——MCP 协议的核心契约(请求/响应/通知、错误码、id 关联)只与 JSON 消息体有关,与底层通道解耦。这让协议可以平滑演进传输层(从 stdio 到 SSE 到 Streamable HTTP),而不破坏应用层。

类比网络协议的分层:

  • OSI 七层模型:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层
  • MCP 三层模型:传输层(stdio/SSE/HTTP)、消息层(JSON-RPC)、语义层(Tools/Resources/Prompts)

MCP 简化了分层(只有三层),但保留了"机制与策略分离"的核心思想。把"机制"和"策略"分离——传输是机制,消息格式是策略——是分布式系统设计的黄金法则,MCP 在 LLM 协议领域重新验证了它。

【架构决策深挖点 #4】:MCP 的"传输无关"设计是它能跨越 6 个月快速演进而生态不破裂的根本原因。如果协议强绑 HTTP,今天就不会有 stdio 传输的简洁性;如果强绑 gRPC,今天就不会有 SSE/Streamable 的灵活性。把"机制"和"策略"分离——传输是机制,消息格式是策略——是分布式系统设计的黄金法则,MCP 在 LLM 协议领域重新验证了它。这条法则在 TCP/IP、HTTP、SMTP、LSP 等长寿协议上都得到了验证。MCP 的设计者显然学习过这些历史——他们没有把"传输"和"协议"耦合在一起,让 MCP 在 2025 年 6 月的 Streamable HTTP 演进中只升级了传输层,上层协议完全不变。这是"分层设计"红利最直接的体现

第二篇:通信与会话机制

第二篇聚焦 MCP 的"运行时"——消息如何流动、会话如何建立、Sampling 如何反向调用、Roots 如何做权限隔离。这是把 MCP 协议从"概念"变成"可运行系统"的关键环节。运行时是协议的"血管"——设计再优雅的协议,如果血管不通,就是死胎。MCP 的运行时设计在 LLM 协议领域达到了前所未有的精细度。

2.1 JSON-RPC 2.0 消息模型:Request/Response/Notification

MCP 协议层选用 JSON-RPC 2.0 作为消息协议。理解 JSON-RPC 2.0 的三种消息类型(Request、Response、Notification)是理解 MCP 通信模型的基础。JSON-RPC 2.0 是一个"看起来简单、用起来精妙"的协议——它用三种消息类型覆盖了所有可能的交互模式,是协议设计的典范。

2.1.1 Request:期待响应的调用

Request 是 JSON-RPC 中期待响应的消息,必须包含 `id` 字段(用于关联响应)、`method` 字段(方法名)、`params` 字段(参数对象)。Server 处理后必须返回对应的 Response(成功结果或错误对象)。Request 是 MCP 通信的"主语"——LLM 决定调用工具时,Client 发出 Request;Client 查询能力时,发出 Request;几乎所有"动作"都是 Request。

JSON-RPC 2.0 Request 示例:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "create_issue",
    "arguments": {
      "repo": "anthropic/mcp",
      "title": "Bug report",
      "body": "Description..."
    }
  }
}

Request 的关键约束:

  • id 必须唯一:在同一会话内,每个 Request 的 id 必须唯一,否则响应无法正确关联
  • params 可选:某些方法(如 `tools/list`)不需要参数,`params` 可省略
  • method 命名空间:MCP 规定 `tools/call`、`resources/read`、`prompts/get` 等带命名空间的方法名,避免冲突

2.1.2 Response:Request 的回执

Response 是 Request 的回应,必须包含相同的 `id`,外加 `result`(成功)或 `error`(失败)二选一。Response 是"配对"的概念——任何没有对应 Request 的 Response 都是协议错误。Response 的设计精髓在于"二选一":要么成功(result),要么失败(error),不能两者都没有,也不能两者都有——这种"非黑即白"的设计让错误处理路径清晰可追。

JSON-RPC 2.0 Response 示例(成功 + 失败):

成功:
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "content": [
      {"type": "text", "text": "Issue #456 created at github.com/.../issues/456"}
    ]
  }
}

失败:
{
  "jsonrpc": "2.0",
  "id": 1,
  "error": {
    "code": -32602,
    "message": "Invalid params: missing required field 'repo'"
  }
}

Response 的关键设计点:

  • id 必须回显:Response 的 id 必须与 Request 的 id 完全一致,Client 据此关联
  • result 与 error 互斥:不能同时出现,否则是协议错误
  • error.message 必须人类可读:因为 LLM 会直接读取 message 字段来理解错误
  • error.data 可选:携带结构化错误细节(堆栈、上下文、建议)

2.1.3 Notification:单向通知

Notification 是不期待响应的消息——它没有 `id` 字段,Server 收到后不需要回执。MCP 用 Notification 表达"事件"语义:资源变化、工具列表更新、日志输出、进度通知。

JSON-RPC 2.0 Notification 示例:

// Server 推送资源更新
{
  "jsonrpc": "2.0",
  "method": "notifications/resources/updated",
  "params": {
    "uri": "file:///project/README.md"
  }
}

// Server 报告进度
{
  "jsonrpc": "2.0",
  "method": "notifications/progress",
  "params": {
    "progressToken": "task-42",
    "progress": 0.65,
    "total": 1.0
  }
}

Notification 在 MCP 中的关键应用:

  • 资源更新推送:Server 在文件被外部修改时主动通知 Client,避免 LLM 读到陈旧内容
  • 工具列表变更:Server 动态增减工具时通知 Client,Client 刷新能力视图
  • 进度报告:长任务执行中持续报告进度(0-1),让 LLM 知道任务还在跑
  • 日志流:Server 把内部日志通过 Notification 推送给 Client(可选)

Notification 的"不期待响应"特性让它成为"单向通信"的天然载体——比 Request/Response 模式更轻量,比 WebSocket 等长连接技术更简单。MCP 选择 Notification 模式而非 WebSocket,体现了"用最小工具解决最大问题"的协议设计哲学。

2.1.4 批量请求:被低估的特性

JSON-RPC 2.0 支持"批量请求"——Client 可以把多个 Request 打包成数组一次性发送,Server 批量返回 Response。这在"低延迟网络 + 高频小请求"场景下特别有用,比如 LLM 一次性并行查询 5 个工具的结果。

批量请求示例:

[
  {"jsonrpc": "2.0", "id": 1, "method": "tools/call", "params": {...}},
  {"jsonrpc": "2.0", "id": 2, "method": "tools/call", "params": {...}},
  {"jsonrpc": "2.0", "id": 3, "method": "resources/read", "params": {...}}
]

// 响应也是数组(按请求顺序)
[
  {"jsonrpc": "2.0", "id": 1, "result": {...}},
  {"jsonrpc": "2.0", "id": 2, "result": {...}},
  {"jsonrpc": "2.0", "id": 3, "error": {...}}
]

但 MCP 实践中很少使用批量请求——LLM 调用的特点是"顺序依赖"(一个工具的结果决定下一个工具的选择),批量反而会破坏推理流。MCP 保留批量支持主要是为了协议兼容性和未来扩展。当未来 LLM 推理能更并行化时,批量请求会成为重要优化点。

2.1.5 JSON-RPC 错误码体系

JSON-RPC 2.0 定义了预定义错误码(-32768 到 -32000),MCP 在此基础上扩展了自定义错误码

错误码含义触发场景客户端处理
-32700Parse errorJSON 解析失败丢弃消息、记录日志
-32600Invalid RequestJSON 不符合 Request schema丢弃消息、报告 bug
-32601Method not found调用未注册的方法检查能力协商
-32602Invalid params参数校验失败回显给 LLM 让其修正
-32603Internal errorServer 内部异常重试或回退
-32000~Server error实现自定义错误查 Server 文档

MCP 规范建议所有错误必须包含人类可读的 `message`,且尽可能包含 `data` 字段携带结构化错误细节。LLM 处理错误时,message 直接喂给模型理解,data 用于客户端程序化处理。错误信息的双重设计(message 给机器理解,data 给程序处理),是协议设计的人性化体现——既考虑了 LLM 的"阅读"需求,也照顾了 Client 的"判断"需求。

2.1.6 消息模型的整体图景

三种消息类型 + 批量模式 + 错误码体系,构成了 JSON-RPC 2.0 的完整消息模型。MCP 在此基础上扩展了方法命名空间(`tools/*`、`resources/*`、`prompts/*`、`sampling/*`、`roots/*`),但消息层面的设计几乎完全继承 JSON-RPC 2.0。这种"消息层极简、语义层扩展"的策略,让 MCP 的实现门槛极低——任何支持 JSON-RPC 2.0 的语言都可以快速实现 MCP。

2.2 会话生命周期:握手、心跳、断连与版本兼容

MCP 客户端和服务器之间的连接是一个"有状态会话"。理解会话从建立到销毁的完整生命周期,是把 MCP 用好、用稳的基础。会话生命周期是协议"健壮性"的体现——再优雅的协议,如果会话管理混乱,就无法在生产环境存活。

2.2.1 三阶段握手:initialize / initialized / 操作循环

MCP 握手分三个阶段:

MCP 会话握手时序:

C: initialize {protocolVersion, capabilities, clientInfo}
S: initialize {protocolVersion, capabilities, serverInfo}
C: initialized {}  (空通知,握手完成)
[此后进入正常操作循环]

关键约束:

  • initialize 必须是第一个消息,未握手就发操作消息是协议错误
  • initialized 通知由 Client 发送,表达"我已准备好"
  • Server 收到 initialized 后才能进入操作循环,否则会拒绝
  • 能力协商结果在 initialize 阶段就确定,后续不能临时追加(除非重新握手)

为什么握手是三阶段而非两阶段?这是为了解决"谁先准备好"的问题:Client 发 initialize 时声明自己支持的能力,Server 响应 initialize 时声明自己的能力,但此时 Server 不知道 Client 是否准备好接收 Notification。Client 发 initialized 通知,明确表达"我已准备好接收 Notification",Server 才能安全发送。这种"准备-确认"模式让握手过程无歧义、可恢复

2.2.2 能力协商的精妙之处

握手中的 `capabilities` 字段是 MCP 的核心创新。Client 声明自己支持的能力(如 `tools`、`resources.subscribe`),Server 同样声明自己的能力。运行时,只有双方都声明的能力才能使用

能力协商代码示例:

// Client 声明
{
  "capabilities": {
    "tools": {},                          // 支持工具
    "resources": {"subscribe": true},     // 支持资源订阅
    "sampling": {}                        // 支持反向采样
  }
}

// Server 声明
{
  "capabilities": {
    "tools": {"listChanged": true},       // 工具列表会动态变化
    "prompts": {},                        // 支持提示词
    "logging": {}                         // 支持日志
  }
}

能力协商的精妙在于"声明式安全"——Client 不会意外调用 Server 不支持的方法,Server 不会意外发送 Client 不理解的 Notification。所有能力都是显式的、可观测的。这种"显式优于隐式"的设计哲学贯穿 MCP 始终,是它能在多厂商生态中稳定运行的关键。

2.2.3 keepalive 心跳与连接活性检测

长连接面临的最大风险是"连接半死":TCP 连接表面活着(没有被对端 RST),但应用层已经卡死(中间网络设备超时、对端进程僵死)。MCP 用 ping/pong 心跳机制检测活性。

MCP 心跳机制:

C: ping {}  (可附带任意元数据)
S: pong {}  (回显 Client 的元数据)

规范建议心跳间隔为 30-60 秒,最长 3 次无响应视为连接死亡。这是工程上的折衷——太短会浪费带宽,太长会延迟故障发现。心跳频率的选择是"成本 vs 响应速度"的权衡——3 次重试的策略又是"容错 vs 误判"的权衡。多重权衡的组合,体现了分布式系统设计的精细。

2.2.4 断连重连与状态恢复

网络是不可靠的——MCP Client 必须实现断连重连。重连时面临两个选择:

  • 完全重连:重新走 initialize 流程,丢失所有会话状态(已订阅资源、未完成任务)
  • 状态恢复:尝试从上次中断点恢复,重订阅资源、重发未确认请求

MCP 规范目前倾向于"完全重连 + 客户端状态重建",因为状态恢复的复杂性太高。Client 在重连后会重新调用 `resources/subscribe` 重新订阅,重新调用 `tools/list` 重新获取工具列表。这是简单可靠的方案。

简单优先的代价:用户感知到"刚才的会话中断了",需要重新发起工具调用。LLM 的工具调用具有"幂等性"潜力——大多数 Tool 可以安全重试,所以完全重连的代价可接受。但对一些非幂等操作(如"发送邮件"),完全重连可能导致重复执行。MCP 1.0 计划引入"请求幂等键"机制,让 Client 可以标记"这个请求已发出过,请勿重复"。

2.2.5 协议版本兼容策略

MCP 协议目前已发布三个版本:2024-11-25、2025-06-18、以及一些中间修订。版本兼容策略:

  • 同版本兼容:能力协商自动按双方能力子集工作
  • 新 Client 旧 Server:Client 必须降级到老能力,不能使用新增方法
  • 旧 Client 新 Server:Server 应当容忍 Client 缺失某些能力

规范建议 Server 至少支持向后兼容 6 个月。这给了生态迁移的缓冲期,也对协议稳定性提出要求。向后兼容是协议长寿的关键——HTTP/1.1 至今仍是 Web 主流,部分原因是它对 HTTP/1.0 的兼容承诺。MCP 在这一点上继承了长寿协议的传统。

【架构决策深挖点 #5】:MCP 选择"完全重连 + 状态重建"而非"状态恢复",是典型的"简单性优先"架构决策。状态恢复虽然用户体验好,但实现复杂、易出 bug、不易调试。完全重连虽然有延迟和资源浪费,但代码简单、行为可预测、调试容易。这是分布式系统设计的经典权衡——用显式的复杂度(重连延迟)换取隐式的复杂度(恢复逻辑)。在工程实践中,"简单可靠"往往胜出"复杂完美"——前者能 scale 到大规模,后者在大规模下会崩溃。Anthropic 的工程师显然深谙此道。

2.2.6 客户端状态管理的复杂性

虽然 MCP 协议本身鼓励"完全重连",但客户端 Host 仍然需要管理大量状态:每个 Server 的连接状态、能力快照、用户偏好、token 配额、未完成任务列表等。这些状态不能因重连而丢失,否则用户体验极差。设计良好的 MCP Client 应当把"协议状态"(连接、能力)与会"话状态"(用户偏好、未完成任务)分离——前者由 MCP SDK 管理,后者由应用层管理。

2.3 Sampling 反向调用:Server 调用 LLM 的"反向通道"

Sampling 是 MCP 协议中最具创新性也最具争议的设计。它允许 MCP Server 主动调用 Host 中的 LLM,形成"反向通道"。这在 LSP 中完全不存在——LSP Server 永远不会"调用"编辑器的智能。Sampling 是 MCP 对 LLM 工具调用范式的重大扩展,也是 LLM 协议设计领域的一次勇敢尝试。

2.3.1 为什么需要反向调用?

设想场景:一个代码评审 Server 想让 LLM 帮它"总结评审意见"。在传统 Function Calling 模式下,Server 拿到代码后,必须自己再调用一次 LLM API——这意味着 Server 要管理自己的 API Key、计费、重试逻辑。对企业用户来说,这意味着:每个 Server 都要单独申请 API Key,账单分散在不同供应商,安全审计复杂。

Sampling 提供了更优雅的方案:Server 向 Host 发请求,要求 Host 用其 LLM 推理能力处理一段文本。Host 收到请求后,可以根据用户策略决定是否调用 LLM、调用哪个模型、消耗多少 token。API Key 集中管理、账单统一、审计集中——这是企业级 LLM 部署的强需求。

Sampling 反向调用协议:

// Server → Host (Client 转发)
{
  "jsonrpc": "2.0",
  "id": 100,
  "method": "sampling/createMessage",
  "params": {
    "messages": [
      {"role": "user", "content": {"type": "text", "text": "代码评审结果..."}}
    ],
    "modelPreferences": {"hints": [{"name": "claude-sonnet"}]},
    "maxTokens": 1024
  }
}

// Host → Server (经 Client 转发)
{
  "jsonrpc": "2.0",
  "id": 100,
  "result": {
    "model": "claude-sonnet-4.5",
    "role": "assistant",
    "content": {"type": "text", "text": "评审总结..."},
    "stopReason": "endTurn"
  }
}

2.3.2 安全边界与可控性设计

Sampling 是"双刃剑"——如果滥用,恶意 Server 可以无限制消耗用户的 LLM 配额。MCP 设计了多重防护:

  • 能力声明:Client 必须在握手中声明 `sampling: {}` 才会接受反向调用。不声明此能力的 Client 完全免疫 Sampling
  • 人类确认:规范要求"User must approve each sampling request"——每次调用都需要用户弹窗确认
  • 配额限制:Client 可以强制限制 `maxTokens`、限制调用频率、限制单次成本
  • 白名单:Host 可以只允许受信 Server 使用 Sampling 能力

这四层防护形成"纵深防御"——恶意 Server 即使绕过了能力声明,还要面对人类确认;绕过了人类确认,还有配额限制;绕过了配额,还有白名单。多层次安全设计是工业级协议的标配,MCP 在 Sampling 上的安全设计堪称典范。

2.3.3 人类确认机制的实现

"人类确认"是 Sampling 设计的核心安全阀。在 Claude Desktop 中,每次 Server 发起的 Sampling 请求都会弹出模态框,显示请求内容、目标模型、最大 token 数、预估成本,由用户决定是否批准

人类确认弹窗的典型交互:

┌─────────────────────────────────────────┐
│ 🔔 MCP Server 请求调用 LLM              │
│                                         │
│ Server: code-review-mcp                 │
│ 目的: 总结代码评审意见                  │
│ 模型: claude-sonnet-4.5                 │
│ Token 上限: 1024                        │
│ 预估成本: $0.003                        │
│                                         │
│ [拒绝]  [批准本次]  [始终允许]          │
└─────────────────────────────────────────┘

"始终允许"选项让用户可以为可信 Server 设置长期策略,避免每次弹窗骚扰。这是"安全与体验的折衷"——完全安全(每次确认)牺牲体验,完全体验(无确认)牺牲安全。两者之间需要精细的用户控制。MCP 把选择权交给用户,由用户根据 Server 的可信度决定策略——信任是渐进的,新 Server 严格、老 Server 宽松,是合理的人机协作模式。

2.3.4 Sampling 的应用场景与生态影响

Sampling 开启了一种全新的 LLM 应用架构:Server 不再是"无脑工具",而是"能思考的智能体"。例如:

  • 智能数据库 Server:把自然语言查询转 SQL,调用 Sampling 让 LLM 优化查询
  • 代码评审 Server:用 Sampling 让 LLM 生成评审意见总结
  • 邮件助手 Server:用 Sampling 让 LLM 草拟回复
  • 数据分析 Server:用 Sampling 让 LLM 自动生成数据可视化代码
  • 研究助手 Server:用 Sampling 让 LLM 综述多个论文并生成报告

这种架构让 Server 从"被动的函数"升级为"主动的协作者"。但代价是安全模型的复杂化——传统的 Function Calling 只有 LLM 调用工具的风险,引入 Sampling 后多了"工具调用 LLM"的风险,必须精心设计确认机制。能力的提升与风险的提升成正比——这是任何强大工具的代价。

2.3.5 Sampling 与 Function Calling 的对比

Sampling 反向调用让 MCP 具备"双向 LLM 交互"能力,这超出了传统 Function Calling 的范畴:

特性Function CallingMCP Sampling差异
调用方向LLM → 工具工具 → LLM反向
API Key 管理应用层Host 集中管理Sampling 更集中
成本控制应用层用户确认Sampling 更可控
使用频率高频低频(按需)Function Calling 主流
风险模型工具调用风险LLM 调用风险两者都需要防护

2.4 Roots 与隔离性:上下文边界与权限沙箱

Roots 是 MCP 协议中容易被忽视但至关重要的设计。它定义了 Client 可以访问的"文件系统根目录",是 MCP 安全模型的基石之一。Roots 是协议对"权限"这个抽象概念的工程化表达——把抽象的"信任"落地为具体的"目录边界"。

2.4.1 Roots 的精确定义

Root 是一个 URI(如 `file:///home/user/project`),代表 Client "愿意让 Server 访问"的目录根。Client 在握手中声明自己的 roots 列表,Server 只能访问 roots 范围内的资源

Roots 声明示例:

{
  "roots": [
    {
      "uri": "file:///home/user/projects/mcp-demo",
      "name": "MCP Demo Project"
    },
    {
      "uri": "file:///home/user/.config/mcp",
      "name": "MCP Configuration"
    }
  ]
}

关键设计:Roots 是 Client 单方面声明的,Server 不能"要求"Client 暴露更多目录。Client 有完全的控制权。这与传统 Linux 文件权限模型一脉相承——权限的方向是"用户授权给进程",而非"进程向用户要权限"主动权永远在用户手中——这是安全设计的根本原则。

2.4.2 文件系统访问域控制

Roots 的实际作用是"文件系统访问域控制"。当 LLM 通过 Files Server 读文件时,Server 内部会校验请求路径是否在 roots 范围内,越权访问会被拒绝。

Roots 访问校验代码示例:

async function readFile(uri: string): Promise {
  const path = uriToPath(uri);
  if (!roots.some(r => path.startsWith(r.uri))) {
    throw new McpError(-32602, `Access denied: ${uri} outside roots`);
  }
  return fs.readFile(path, 'utf-8');
}

这种"白名单校验"机制比传统的"黑名单拦截"更安全:白名单明确"允许什么",黑名单模糊"禁止什么"。Roots 模式让 Server 永远无法"误访问"用户未授权的目录——因为即使代码有 bug,校验也会兜底。安全设计要纵深防御,白名单是其中一层。

2.4.3 Roots 的动态变更

用户可能随时打开新项目、关闭旧项目,roots 列表需要动态更新。MCP 定义了 `notifications/roots/list_changed` 通知机制:

Roots 变更流程:

// 用户在 IDE 中打开新项目
// → Client 自动更新 roots
// → Client 发送通知
C → S: notifications/roots/list_changed
// → Server 主动拉取最新列表
S → C: roots/list
C → S: {roots: [...]}  (更新后的列表)

动态变更机制让 Roots 不仅是"初始权限声明",更是"持续权限同步"。这种设计让 MCP 能优雅处理"用户在 IDE 中切换项目"、"用户临时打开配置文件目录"等场景。权限跟着用户行为走,而不是"一锤定音"。

2.4.4 安全沙箱与权限收敛

Roots 是 MCP "权限收敛"设计的核心——把所有权限收束到"用户主动声明的 roots 列表"。这是最小权限原则(Principle of Least Privilege)的工程化实现。最小权限原则是计算机安全领域的黄金法则:只给主体完成任务所需的最小权限。MCP 把这个原则从"理论"落地为"协议字段"。

【架构决策深挖点 #6】:Roots 设计体现了Capability-based Security(基于能力的安全)思想。不同于传统的"ACL 模式"("谁能访问什么"的黑白名单),Capability 模型是"用户主动声明"("我允许你访问这些")。前者管理复杂、易出错;后者简洁、用户可控、对开发者友好。MCP 选择了更现代的 Capability 模型,是 LLM 工具安全的一次范式升级。Linux 内核从 2.6 开始逐步引入 Capability 机制(取代 root 用户万能权限),Docker 容器从一开始就采用 Capability 模型,Kubernetes 的 RBAC 也是 Capability 思想的延伸。MCP 把这条"从 ACL 到 Capability"的安全演进路线带到了 LLM 协议领域,是安全设计史上的重要节点。

2.4.5 Roots 与 Sampling 的协同

Roots 和 Sampling 共同构成 MCP 的完整安全模型

  • Roots:限制 Server 能"看"什么(文件系统访问域)
  • Sampling:限制 Server 能"做"什么(LLM 调用需确认)

二者结合实现"输入受限 + 输出受限"的双向安全护栏。这是 MCP 在 LLM 工具调用领域最完整的安全设计,也是它相比 Function Calling 的核心优势之一。只有输入控制或只有输出控制都是不完整的——只控制输入,Server 可能滥用 LLM 能力;只控制输出,Server 可能读取敏感数据。Roots + Sampling 才是闭环。

2.4.6 Roots 在企业部署中的实践

在企业级部署中,Roots 通常由 IT 管理员预配置,员工不能随意修改。例如:

  • 开发团队:roots 包含 `/home/dev/projects`、`/var/log/app`
  • 运维团队:roots 包含 `/etc/app-config`、`/var/log/ops`
  • 数据团队:roots 包含 `/data/analytics`、`/home/data/scratch`

不同团队的 roots 不同,职责分离。这与 Linux 的多用户系统设计一脉相承,把企业的组织架构映射到权限架构,让"谁能用什么工具"成为可管理的策略。

第三篇:架构对比与生态融合

第三篇将 MCP 放在更广阔的 LLM 工具协议生态中进行横向对比。理解 MCP 与 Function Calling、GPTs Actions、Gemini Tools、HuggingFace Agents 的关系,能让我们看清"MCP 解决了什么问题、留下了什么问题"。对比是理解本质的最佳方法——孤立看一个协议,看不清它的优势与局限;横向对比,才能定位它在协议谱系中的真正位置。

3.1 MCP vs Function Calling:协议标准化与厂商绑定

Function Calling 是 OpenAI 在 2023 年 6 月首创的"工具调用"模式——LLM 推理时输出结构化 JSON,描述要调用的函数和参数,由应用层执行。MCP 和 Function Calling 解决的是重叠但不等价的问题。Function Calling 是"模型能力",MCP 是"通信协议"——一个在 L3,一个在 L2,层次不同。

3.1.1 Function Calling 的本质

Function Calling 不是协议,而是模型能力。它的本质是:LLM 在对话过程中,根据 prompt 决定"应该调用哪个函数、传什么参数",并以结构化 JSON 形式输出。具体的函数注册、参数校验、实际执行,都由应用代码处理。

Function Calling 模式:

LLM Input:  "What's the weather in Beijing?"
LLM Output: {"function_call": {"name": "get_weather", "arguments": {"city": "Beijing"}}}
App Code:   const result = await get_weather("Beijing")
LLM Input:  [result injected back into context]
LLM Output: "The weather in Beijing is 23°C, sunny."

Function Calling 解决了"LLM 如何决定调用"问题,但不解决

  • 工具如何被注册、发现、版本管理
  • 工具执行的安全边界如何划定
  • 多个 LLM 如何共享同一套工具
  • 工具调用结果如何结构化反馈给 LLM

3.1.2 MCP 的本质

MCP 是协议,规范了 LLM 客户端(Host)与工具服务器(Server)之间的通信格式、能力描述、生命周期。MCP 不规定 LLM 如何决定调用哪个工具——那是 Function Calling 解决的问题。

关键洞察:MCP 和 Function Calling 不是竞争关系,而是协作关系。Claude Desktop 内部就用 Function Calling 决定调用哪些 MCP 工具,用 MCP 协议与具体 Server 通信。协议 + 模型能力 = 完整工具调用栈。Function Calling 提供"决策能力",MCP 提供"通信通道"。两者互补,缺一不可。

3.1.3 三层协议栈模型

把工具调用栈分成三层,可以清晰看出 MCP 在哪里:

LLM 工具调用三层模型:

L3 应用层:  LLM 推理 + Function Calling 决策
L2 协议层:  MCP 通信(JSON-RPC over stdio/SSE/HTTP)
L1 能力层:  实际工具实现(文件 API / 数据库驱动 / HTTP 客户端)

Function Calling 属于 L3,MCP 属于 L2。两者服务于不同抽象层次——Function Calling 关心"LLM 如何决定调用",MCP 关心"如何把调用送达"。协议分层是大型系统演进的必经之路——HTTP 之上有无数应用协议,TCP/IP 之下有无数传输介质。MCP 在 LLM 工具调用领域复制了这种智慧。

3.1.4 能力描述的开放性

Function Calling 的工具描述是厂商私有的:OpenAI 的 `tools` 字段、Anthropic 的 `tools` 字段、Google 的 `tools` 字段——虽然都叫"tools",schema 细节却不同(OpenAI 用 `parameters`、Anthropic 用 `input_schema`)。MCP 的 `inputSchema` 是协议层标准,任何 MCP 客户端都理解。

维度Function CallingMCP差异
规范主体LLM 厂商开源社区MCP 更中立
能力描述厂商私有 schemaJSON Schema 标准MCP 可移植
工具发现需提前注册运行时动态发现MCP 更灵活
资源订阅不支持原生支持MCP 更强大
反向调用 LLM不支持SamplingMCP 更通用
安全模型无标准Roots + 人审MCP 更安全
传输通道应用层决定stdio/SSE/HTTPMCP 更规范

3.1.5 厂商绑定的架构成本

Function Calling 最大的问题是厂商绑定。企业一旦在 OpenAI Function Calling 上做了大量工具集成,切换到 Anthropic 或 Google 的成本极高。MCP 的解法是:把工具描述和调用协议化,让工具只需实现一次,多个 LLM 厂商都能消费。

厂商绑定的隐性成本往往被低估:

  • 切换成本:从 OpenAI 切到 Anthropic,工具代码要重写一半
  • 谈判筹码:被单一供应商绑死,议价能力下降
  • 创新受限:新模型能力无法快速采纳(要重写工具集成)
  • 风险集中:供应商出问题时,自身业务受连带影响

MCP 通过"协议层抽象"消解这些成本——工具只与协议对话,不与具体 LLM 厂商对话。这是协议化最直接的红利

【架构决策深挖点 #7】:MCP 与 Function Calling 的关系,是"协议层与能力层分离"的典范。Function Calling 是能力(LLM 决定调用什么),MCP 是协议(调用如何送达)。这与计算机网络中"应用层协议与传输层协议分离"的思想一致——HTTP 之上可以有无数应用协议,TCP/IP 之下可以有无数传输介质。分层是大型系统演进的必经之路,MCP 在 LLM 工具调用领域复制了这种智慧。理解这个分层,开发者就不会再问"MCP 和 Function Calling 哪个更好"——它们在不同的层次,解决不同的问题。

3.1.6 混合架构:MCP + Function Calling

在生产环境中,MCP + Function Calling 是最佳组合

  • Function Calling 决定"调用哪个 MCP 工具"
  • MCP 执行"工具的注册、发现、调用、响应"
  • LLM 推理 决定"整个工具调用链的逻辑"

Claude Desktop、Cursor、Cline 等主流 Host 都采用这种混合架构。协议和能力协同,是 LLM 工具调用的当前最佳实践。

3.2 MCP vs GPTs Actions/Plugins:Web 到 LLM 的范式跃迁

OpenAI 在 2023 年 11 月推出 GPTs,2024 年推出 GPT Store,配套的是 Actions(GPT 时代的"Plugin")。MCP 和 GPTs Actions 的对比,能帮我们看清"LLM 时代 Plugin 的正确形态"。Plugin 范式从 Web 时代到 LLM 时代经历了重大变迁——理解这段历史,能让我们预判 LLM 工具生态的最终形态。

3.2.1 Web 时代 Plugin 的兴衰

回想 2008-2014 年的浏览器 Plugin 时代:Chrome、Firefox 推出扩展机制,开发者写了无数插件(AdBlock、LastPass、Evernote Clipper…)。Plugin 模型让浏览器从"网页渲染器"升级为"应用平台",但也带来安全噩梦——插件可以读取所有页面、注入任意代码、性能不可控。

2015 年后,浏览器厂商开始"收编 Plugin"——Chrome 把 Flash 踢出去、把 NPAPI 弃用,转向更受控的 Web Extensions API。这段历史给 LLM 时代 Plugin 提供了深刻教训:完全开放的 Plugin 模式不可持续开放与控制必须平衡——完全开放导致安全灾难,完全控制扼杀生态活力。MCP 在这两者之间找到了一个平衡点。

3.2.2 GPTs Actions:封闭生态的尝试

OpenAI 的 GPTs Actions 继承了 Web Plugin 思想,但做了"平台化"改造:

  • GPT Builder 让用户"对话式"创建 GPT
  • Actions 是 GPT 调用外部 API 的机制
  • GPT Store 是 Actions 的分发市场

但 GPTs Actions 有一个根本问题:只能跑在 ChatGPT 内部。Actions 用了 OpenAPI 描述,但执行必须在 ChatGPT 服务端完成,无法被 Claude、Cursor、本地 IDE 使用。这是"私有协议"的代价——便利换取开放性。短期的便利往往成为长期的限制——当生态想扩展到 ChatGPT 之外时,私有协议的"围墙"就成为枷锁。

3.2.3 MCP:开放生态的回归

MCP 走的是相反的路:开放协议 + 多方实现。MCP Server 可以被任何 MCP Client 使用(Claude、Cursor、Zed、本地脚本…),不受单一厂商控制。这是 Web 时代浏览器 Plugin 模式的"LESSON LEARNED"——开放协议 + 安全沙箱 = 可持续生态

GPTs Actions vs MCP 生态对比:

                GPTs Actions                    MCP
                ────────────                    ───
开发者      OpenAI 平台工具             任何开发者
部署位置    OpenAI 云端                 本地/云端均可
客户端      仅 ChatGPT                 任何 MCP Client
商业模式    OpenAI 分成                 自有商业模式
协议        OpenAPI(私有生态)         MCP(开源协议)
安全模型    OpenAI 平台管控             Roots + 人审
扩展性      依赖 OpenAI 平台            协议自由扩展
迁移成本    高(绑死 OpenAI)           低(标准协议)

3.2.4 范式跃迁的本质

从 Web Plugin 到 GPTs Actions 到 MCP,是"控制权"的转移:

  • Web Plugin:浏览器厂商定义协议,开发者自由实现(但被浏览器控制)
  • GPTs Actions:单一 LLM 厂商控制全栈(最大控制,最低开放)
  • MCP:开源社区控制协议,多方实现(开放但需要协调)

MCP 的"开放协议"模式更接近 TCP/IP、HTTPS、Email 协议——这些协议都不是单一公司控制,却成为全球基础设施。MCP 押注同样的路径:开放协议终将胜出,私有平台终将被边缘化。这种判断在计算机历史上多次验证:HTTP 战胜了 Netscape 的私有协议,SMTP 战胜了 Lotus Notes 的私有邮件协议,SQL 战胜了层次数据库的私有查询语言。开放标准的胜利不是偶然,而是生态自组织的结果

3.2.5 GPTs Actions 的当前定位

2026 年回头看,GPTs Actions 仍占据"ChatGPT 内部"的便捷市场——对只想在 ChatGPT 中使用工具的用户来说,Actions 仍然是最简选择。但对需要在多个 LLM 之间共享工具、需要在本地部署、需要在 IDE 中使用的企业用户,MCP 已经成为默认选择市场被协议生态的力量重新划分,这是技术演进的常见模式。

3.3 MCP vs Gemini Function Calling:跨厂商协议统一的可行性

Google 在 Gemini 中也实现了 Function Calling,与 OpenAI、Anthropic 类似。MCP 与 Gemini Tools 的关系,是"跨厂商协议统一"可能性的试金石。协议统一是 IT 行业的圣杯——每一个十年,都有人在尝试统一看似不可统一的协议。SQL、HTTP、SMTP、Unicode 都在某个节点实现了行业统一。LLM 工具协议是否也能实现统一?

3.3.1 Gemini Function Calling 的特性

Gemini 1.5 引入了"Function Calling"和"Extensions"两个概念。Function Calling 是模型能力(类似 OpenAI),Extensions 是 Google 集成的特定工具(Gmail、Maps、YouTube…)。

Google 的策略是"垂直整合":让 Gemini 直接调用 Google 自家服务(Gmail、Calendar、Drive),形成"Google 生态内的智能助手"。这与 OpenAI 的"GPTs 平台化"不同——Google 更像是"应用套件 + AI 前端"的捆绑销售。垂直整合 vs 开放生态是两种截然不同的商业策略,各有优劣。

3.3.2 跨厂商协议统一的现实

理想情况下,所有 LLM 厂商应该共同支持 MCP,形成"一次开发、到处运行"的工具生态。但现实很骨感——

截至 2026 年 7 月,OpenAI、Google 都未正式宣布支持 MCP。这是预料之中的——LLM 厂商有强烈的商业动机维持协议差异化,让自己的 Function Calling 比竞品更易用、更强大。如果大家都用 MCP,模型本身的价值(推理能力、品牌)将主导竞争;如果各家有私有协议,生态锁定也是竞争壁垒。

但局势正在起变化:

  • 2025 年 6 月:OpenAI 在 GitHub 上发布了 OpenAI-MCP-Bridge 实验项目
  • 2025 年 9 月:Google 在 Gemini API 中加入了 MCP 实验性支持
  • 2026 年 3 月:Anthropic 成立 MCP 治理委员会,邀请 OpenAI、Google、Mistral 共同参与

趋势是清晰的:MCP 正在从"Anthropic 的协议"变成"行业的协议"。这个转变的速度,取决于第三方开发者的"用脚投票"——如果大家都用 MCP,厂商就不能忽视。

3.3.3 Anthropic 的"先开源"策略

Anthropic 选择"先开源 MCP,再推动行业采用"。这是经典的"先发制人建立事实标准"策略——通过让 MCP 变得好用、生态变得丰富,反向逼迫其他厂商不得不兼容。类似案例:Google 开源 Android(vs Apple iOS 封闭)、Google 开源 Kubernetes(vs 各家私有容器平台)、Mozilla 开源 Firefox(vs IE 垄断)。先发制人 + 持续投入 = 标准胜出

3.3.4 技术中立性 vs 商业利益的张力

技术中立性是 MCP 协议的最大优势也是最大挑战。MCP 由 Anthropic 主导开源,但理论上任何厂商都能贡献代码、影响协议走向。这种"社区治理"模式是否有效,取决于 Anthropic 是否愿意让渡控制权。从 2025 年成立治理委员会的动作看,Anthropic 在向"真正的中立治理"迈进——这是开源协议走向成熟的关键一步。

【架构决策深挖点 #8】:MCP 的跨厂商协议统一之路注定不会一帆风顺。技术中立性只是必要条件,商业激励才是充分条件。MCP 能否成为"LLM 时代的 HTTP",取决于三个变量:①Anthropic 的"开放诚意"有多彻底;②OpenAI/Google 是否感受到生态压力;③第三方开发者是否"用脚投票"选择 MCP。历史告诉我们:协议之争,本质是生态之争。TCP/IP 战胜 ISO OSI 不是因为技术更优,而是因为美国国防部背书 + 早期采用者形成网络效应。MCP 能否复制这种"网络效应",看 2026-2027 年的生态扩张速度。

3.3.5 协议分叉的风险与防范

跨厂商协议统一的最大风险是"协议分叉"——OpenAI 可能 fork MCP 推出"OpenAI MCP",加入只对自己有利的扩展。这种"事实分叉"在开源协议史上多次发生(MySQL vs MariaDB、Elasticsearch vs OpenSearch、MongoDB 的 SSPL)。MCP 治理委员会的核心职责之一就是防范分叉:通过制定严格的扩展流程、保持主干稳定、提供清晰的贡献路径,让分叉变得"无必要"。

3.4 MCP vs HuggingFace Agents/ReAct:协议与框架边界

HuggingFace 的 Transformers Agents 框架、ReAct 范式、LangChain 的 Agent 工具集——这些都是"Agent 编排框架",与 MCP 的"协议"定位有本质区别。协议和框架的混淆是 LLM 领域的常见误区——理解它们的边界,能避免"在错误的层次做选择"。

3.4.1 协议 vs 框架的边界

用一个比喻:

  • MCP 之于 Agent = TCP/IP 之于 Web(底层协议)
  • LangChain 之于 Agent = Express 之于 Web(应用框架)
  • ReAct 之于 Agent = 设计模式(思维范式)

MCP 关心"消息如何在 LLM 和工具之间传递",LangChain 关心"如何把多个工具调用串联成任务流",ReAct 关心"LLM 如何思考决定调用哪个工具"。三个层次互补,不是替代关系。协议层是基础设施,框架层是开发工具,思维层是方法论——每个层次有自己的价值,不能混淆。

3.4.2 声明式协议 vs 命令式框架

一个微妙的区别:MCP 是声明式协议(声明"我有什么能力",不规定"如何使用能力"),LangChain 是命令式框架(提供 API 让开发者"组合"工具调用)。声明式 vs 命令式是软件工程的经典张力——声明式更灵活、可组合;命令式更具体、易调试。

声明式协议(MCP)示例:

// Server 声明自己有什么能力
server.setRequestHandler(ListToolsRequestSchema, async () => ({
  tools: [
    {name: "search", description: "...", inputSchema: {...}},
    {name: "fetch", description: "...", inputSchema: {...}}
  ]
}));

// Client 自由决定如何组合
// (可以串行、并行、条件分支——MCP 不规定)

声明式的优势:协议稳定、Client 灵活。Server 只需要声明能力,不需要知道 Client 怎么用。这让同一个 Server 能被各种不同的 LLM Agent 框架使用,复用性最大化。命令式的优势:框架优化、调试容易。LangChain 可以针对常见场景做优化(缓存、重试、并行),开发者无需自己实现。

3.4.3 LangChain 的工具机制与 MCP 的关系

LangChain 也有"Tool"抽象,定义了 `name`、`description`、`func` 三个核心字段。LangChain 的 Tool 与 MCP 的 Tool 在概念上重叠,但运行机制不同:

  • LangChain Tool:进程内函数调用,Python 装饰器风格
  • MCP Tool:跨进程调用,JSON-RPC 协议风格

LangChain 已经支持把 MCP Server 包装为 LangChain Tool,让 LangChain Agent 可以消费 MCP 生态。这展示了"协议层和框架层可以融合"的可能性——MCP 不取代 LangChain,而是给 LangChain 提供更丰富的工具源协议提供广度,框架提供深度——两者结合是 LLM 工具生态的成熟形态。

3.4.4 ReAct 范式与 MCP 的协作

ReAct(Reasoning + Acting)定义了 LLM "思考 → 行动 → 观察"的循环。MCP 不规定 LLM 怎么思考,但提供了标准化的"行动"接口。MCP + ReAct 的组合是当前主流 Agent 框架的常见模式:

ReAct + MCP 协作流程:

1. Thought:  "我需要查询数据库"
2. Action:   调用 MCP tool: query_db(sql="SELECT...")
3. Observation: MCP 返回结果
4. Thought:  "数据看起来正确,我可以总结"
5. Action:   调用 MCP tool: send_email(to="...", body="...")
6. Observation: 邮件发送成功

在这个流程中,ReAct 是"大脑",MCP 是"手脚"。ReAct 决定调用哪些工具、按什么顺序,MCP 负责实际执行。两者各司其职,互补不冲突。好的协议不与框架竞争,而是给框架提供"四肢"——MCP 在 LLM 领域扮演的正是这种角色。

3.4.5 AutoGen / CrewAI 等多 Agent 框架与 MCP

Multi-Agent 框架(AutoGen、CrewAI、MetaGPT 等)天然适合与 MCP 协作:

  • 每个 Agent 是一个 Host:拥有自己的 Client 连接
  • Agent 间通过 MCP 通信:避免协议碎片化
  • Tools/Resources 跨 Agent 共享:通过 Smithery 等注册中心

2026 年的趋势是"Multi-Agent + MCP"——多 Agent 框架负责 Agent 间的协作逻辑,MCP 负责 Agent 与工具的通信。两者结合形成"Multi-Agent + Multi-Tool"的完整生态。

3.5 生态注册中心:Smithery / Glama / MCP.so 三级体系

当 MCP 协议确立后,Server 发现成为新问题——LLM 怎么知道有哪些 MCP Server 可用?答案是生态注册中心。MCP 生态目前形成了 Smithery、Glama、MCP.so 三个主流注册中心。注册中心是协议生态的"门户"——没有它,协议只是一纸规范;有了它,协议才能变成蓬勃的生态。

3.5.1 Smithery:发现 + 安装一体化

Smithery(smithery.ai)是目前最大的 MCP Server 索引平台,定位类似 npm/PyPI。开发者可以把 MCP Server 发布到 Smithery,用户通过 `npx @smithery/cli install xxx` 一行命令安装。

Smithery 安装命令示例:

# 安装 GitHub MCP Server
$ npx @smithery/cli install @modelcontextprotocol/server-github

# 安装后自动配置到 Claude Desktop / Cursor
# ~/.config/Claude/claude_desktop_config.json
{
  "mcpServers": {
    "github": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-github"],
      "env": {"GITHUB_TOKEN": "..."}
    }
  }
}

Smithery 的核心价值是"开箱即用":把"下载、配置、启动" MCP Server 的流程压缩成一行命令。这大幅降低了 MCP 的使用门槛,让普通用户也能用上 MCP 生态。低门槛是生态扩张的关键——历史上每一个成功协议(HTTP、npm、Docker)背后都有一个"开箱即用"的安装机制。MCP 选择 Smithery 作为"事实上的包管理器",是极其明智的策略。

3.5.2 Glama:企业级 MCP 托管

Glama(glama.ai/mcp)走的是云端托管路线——它直接提供 SaaS 化的 MCP Server,用户无需本地安装,通过 HTTPS 即可调用。Glama 适合企业用户:他们不想管理本地进程、不想处理认证配置、不想关心 stdio/HTTP 差异。

Glama 远程 MCP Server 调用:

// Client 配置
{
  "mcpServers": {
    "remote-git": {
      "url": "https://glama.ai/mcp/remote-git/sse",
      "headers": {"Authorization": "Bearer ..."}
    }
  }
}

Glama 的价值在于"零运维"——企业用户不需要懂 MCP 协议细节,只需要在 Glama 控制台启用需要的 Server,配置 API Key,即可使用。这种"协议即服务"的模式降低了企业部署门槛。技术产品要走向大众,必须有"托管服务"形态——MCP 通过 Glama 把"自己部署"变成"开箱即用"。

3.5.3 MCP.so:社区目录与文档

MCP.so(mcp.so)更像"社区目录"——按类别(开发工具、生产力、数据、搜索…)组织 MCP Server,提供详细的功能介绍、使用案例、star 数、版本历史。它不直接提供安装,但作为发现入口有重要价值。

MCP.so 的差异化:

  • 策展内容:人工筛选高质量 Server,附详细评测
  • 使用案例:展示 Server 的真实使用场景
  • 社区评分:用户评价、star 数、issue 跟踪

3.5.4 三级生态的互补与博弈

Smithery、Glama、MCP.so 看似"竞争",实则互补

  • Smithery分发层(让 Server 容易安装)
  • Glama托管层(让 Server 容易运行)
  • MCP.so发现层(让 Server 容易找到)

三者形成"发现 → 安装 → 运行"的完整链路,是 MCP 生态走向成熟的标志。这种多平台分工模式与 Linux 生态(apt/yum/dnf 是分发,github.com 是发现,dockerhub 是运行)一脉相承。生态的成熟度,往往看"分工的精细度"——一个角色做所有事,是早期;多个角色分工协作,是成熟期。

3.5.5 Server 发现与版本治理的挑战

生态繁荣后,版本治理成为新挑战。Smithery 上有 1000+ MCP Server,每个 Server 都有自己的版本号,如何保证 Server 升级不破坏 Client?这是 MCP 生态面临的实际问题。

目前采用"SemVer + 能力协商"组合策略:Server 升级遵循 SemVer(major 变更破坏兼容,minor 变更向后兼容),Client 通过能力协商决定使用哪些能力。但缺乏强制机制——Server 开发者可以发布破坏性更新,Client 升级后才发现不兼容。这是未来 MCP 治理需要解决的问题。

可能的解决方案:

  • Smithery 强制 SemVer 检查:发布 major 版本时强制要求 deprecation 流程
  • 能力协商的"软强制":Server 声明能力时必须标记"已弃用",Client 可以拒绝
  • 协议层的版本字段:Client 显式声明"支持到哪个版本",超出范围的 Tool 调用直接拒绝

3.5.6 企业级 MCP 市场

2026 年开始出现的企业级 MCP 市场值得特别关注。一些 SaaS 厂商(Salesforce、ServiceNow、Atlassian)开始把自家产品以"官方 MCP Server"形式发布到市场。这意味着企业级 LLM 工具调用有了"官方背书"——企业可以放心接入,因为 SaaS 厂商会负责 Server 的稳定性、兼容性、安全性。官方 MCP 是生态成熟的"金牌认证"——任何协议要进入企业市场,都需要这种"厂商背书"。

第四篇:工程实践与未来演进

第四篇聚焦 MCP 的"落地与未来"。从 Server 实现的工程模式、生产环境的可观测性、2026 年的演进方向、到最终的全景总结——我们一起看清 MCP 在 Agent 生态中的枢纽定位落地能力是协议的"分水岭"——再优雅的设计,如果工程实践跟不上,就是"学院派";真正能在生产中跑起来的协议,才能成为基础设施。

4.1 Server 实现架构:Python/TS SDK、Tool 抽象、Persistence

理解 MCP 协议的最佳方式是亲手实现一个 MCP Server。MCP 官方提供了 Python 和 TypeScript 两个 SDK,本节我们剖析 Server 实现的关键架构模式。从 SDK 看协议,是理解协议设计意图的最佳路径——SDK 是协议设计的"具象化",体现了设计者对开发者的承诺。

4.1.1 SDK 选型:Python vs TypeScript

MCP 官方 SDK 首发是 TypeScript(与 Claude Desktop 同源),2025 年初 Python SDK 成熟。两个 SDK 提供的 API 高度对称,核心抽象一致:

Python SDK 与 TypeScript SDK 对比:

                    Python SDK              TypeScript SDK
                    ──────────              ──────────────
安装                pip install mcp          npm install @modelcontextprotocol/sdk
异步                asyncio                  Promise/async-await
Schema 校验         Pydantic                 Zod
传输                stdio / SSE / HTTP       stdio / SSE / HTTP
成熟度              高(社区驱动)           高(官方维护)
性能                中等                     中等

选型建议:

  • Python SDK:适合数据科学/ML 场景(与 Pandas、SQLAlchemy、NumPy 集成好)
  • TypeScript SDK:适合Web/Node 场景(与 Express、Hono、Fastify 集成好)
  • Rust SDK:适合性能敏感场景(文件系统、高频 API)
  • Go SDK:适合云原生场景(K8s 部署、低资源占用)

4.1.2 Tool 抽象层的设计

Tool 是 MCP Server 的核心抽象。设计良好的 Tool 抽象层应包含:输入校验、错误处理、超时控制、文档生成四大要素。Tool 抽象层的质量直接决定 Server 的可维护性——抽象层设计得好,新 Tool 接入是"声明式"的;设计得差,每个 Tool 都要手写"模板代码"。

Tool 抽象层代码示例(TypeScript SDK):

server.setRequestHandler(CallToolRequestSchema, async (request) => {
  const {name, arguments: args} = request.params;
  const tool = toolRegistry.get(name);
  if (!tool) throw new McpError(-32601, `Unknown tool: ${name}`);

  try {
    const validated = tool.schema.parse(args);  // 输入校验
    const result = await withTimeout(           // 超时控制
      tool.handler(validated),
      tool.timeoutMs ?? 30000
    );
    return {content: [{type: "text", text: JSON.stringify(result)}]};
  } catch (err) {
    return errorToMcpResult(err);              // 错误处理
  }
});

Tool 抽象层的关键设计点:

  • Schema 单一来源:Tool 的 JSON Schema 和 TypeScript 类型应当由同一份声明生成(用 Zod),避免双重维护
  • 超时与取消:所有 Tool 应当支持超时和取消,避免长任务卡死
  • 错误标准化:把内部异常映射为 MCP 标准错误(-32602、-32603 等)
  • 可观测埋点:在 Tool 调用前后插入埋点(耗时、参数、结果),便于监控

4.1.3 Resource Provider 模式

Resource(资源)比 Tool 更"读友好"。设计 Resource Provider 的关键是URI 模式设计——一个直观的 URI 模式能让 LLM 更容易猜测资源路径。URI 是 LLM 与 Server 的"对话语言"——设计得好,LLM 能自学;设计得差,每次都要查文档。

Resource Provider 的 URI 模式设计原则:

1. 静态资源:   file://{path}                    (如 file:///etc/hosts)
2. 模板资源:   github://{owner}/{repo}/issues/{id}   (支持参数化)
3. 动态列表:   database://tables/{table}/rows/{id}   (支持导航)
4. 二进制:     blob://{hash}                    (如 blob://sha256-abc...)

模板示例(TypeScript SDK):
server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
  const uri = new URL(request.params.uri);
  if (uri.protocol === "github:") {
    const [, owner, repo, , id] = uri.pathname.split("/");
    return {contents: [{uri: uri.toString(), text: await fetchIssue(owner, repo, id)}]};
  }
});

4.1.4 Persistence 策略

MCP Server 通常是无状态进程——每次启动从零开始,不保存会话数据。但很多场景需要持久化(认证 token、用户偏好、缓存结果)。常见策略:

  • 文件持久化:用 `~/.config/mcp/{server-name}.json` 存配置(适合桌面应用)
  • SQLite 持久化:本地嵌入式数据库(适合复杂状态)
  • 外部存储:Redis / PostgreSQL(适合多实例 Server)
Persistence 抽象层代码示例:

interface PersistenceAdapter {
  get(key: string): Promise;
  set(key: string, value: T, ttl?: number): Promise;
  delete(key: string): Promise;
}

class FilePersistence implements PersistenceAdapter {
  constructor(private dir: string) {}
  async get(key: string) {
    const path = `${this.dir}/${key}.json`;
    return (await fs.pathExists(path)) ? fs.readJson(path) : null;
  }
  // ...
}
【架构决策深挖点 #9】:MCP Server 的Persistence 设计是工程实践中最容易翻车的点。Server 重启丢失状态会导致用户体验灾难(用户配的 token 没了、收藏的资源没了),但把状态硬编码到 Server会让 Server 难以水平扩展。最佳实践是"轻状态 + 外部持久化"——Server 只在内存中保留"会话状态"(如活动订阅),把"用户状态"(配置、token)委托给外部存储。这种"关注点分离"的 Persistence 架构,让 Server 本身保持无状态、可以随时水平扩展;用户状态在外部存储中,与具体 Server 实例无关。这与 12-Factor App 的"Stateless Processes"原则一脉相承。

4.1.5 Server 实现的常见反模式

在多个 MCP Server 的实现中,常见反模式包括:

  • 反模式 1:在 Tool 中长阻塞:Tool 内部用 `while (true) checkStatus()` 轮询外部 API,导致 Client 卡死。正确做法是用 Notification 推送进度
  • 反模式 2:忽略 Roots 校验:Tool 直接读取文件路径,不检查是否在 Roots 内。正确做法是每个 Tool 都做路径校验
  • 反模式 3:硬编码 API Key:把 API Key 写在代码里。正确做法是从环境变量或 Secret Manager 读取
  • 反模式 4:缺乏错误分类:所有错误都返回 -32603 Internal Error。正确做法是区分参数错误、权限错误、内部错误

4.2 生产可观测与限流:调用链追踪、限流、池化

把 MCP 用在生产环境,需要解决可观测性、限流、容灾三大工程问题。这些问题在本地开发中往往被忽视,但在高并发生产中会成为瓶颈。生产可观测是协议的"血液循环系统"——没有它,出了问题就只能"盲人摸象"。

4.2.1 调用链追踪:OpenTelemetry 集成

MCP 协议本身不规定追踪机制,但官方 SDK 已集成 OpenTelemetry(OTel)支持。每个 JSON-RPC 请求都可以作为 OTel Span,端到端追踪从 User Prompt → LLM 推理 → MCP 工具调用 → Server 处理的完整链路。

MCP 调用链追踪结构:

Span: User Prompt
  Span: LLM Inference
    Span: Function Call Decision
      Span: MCP Request (id=1, method=tools/call)
        Span: Server Handler
          Span: Database Query
          Span: HTTP Call
        Span: MCP Response

追踪数据可以导入 Jaeger、Tempo、Honeycomb 等工具,定位延迟瓶颈、发现错误链路、监控工具调用频率。生产环境的 MCP 部署必须集成调用链追踪,否则面对"为什么这次 LLM 响应慢 5 秒"的问题将无从下手。可观测性是工程的"第三只眼"——没有它,开发者只能凭直觉;有它,开发者能基于数据决策。

4.2.2 错误监控与告警

MCP 错误分为三类:协议错误、工具错误、系统错误。每类错误需要不同的监控策略:

错误类型典型错误监控指标告警阈值处理策略
协议错误JSON 解析失败、未知方法错误率 / 错误类型分布>1%升级 SDK、报告 bug
工具错误参数校验失败、API 调用失败工具成功率 / 平均延迟>5% 失败重试、回退 LLM
系统错误Server 崩溃、OOM、超时Server 可用性 / 内存使用<99.9%自动重启、限流

告警设计原则:分级告警 + 行动指引。错误率超过 1% 是 warning,超过 5% 是 critical,每个级别对应明确的行动(升级 SDK、重试、重启)。没有行动指引的告警是"噪音"——开发者会逐渐麻木。

4.2.3 多 Client 限流策略

当一个 Host 同时连接多个 Server,每个 Server 可能成为瓶颈。常见限流策略:

  • 令牌桶(Token Bucket):限制每秒请求数(QPS)。简单高效,适合"稳态流量"
  • 并发限制(Concurrency Limit):限制同时处理请求数。保护下游服务,适合"突发流量"
  • 队列限流(Queue Limit):限制排队请求数。防止内存爆炸,适合"慢下游"
  • 优先级队列:关键请求优先处理。适合"差异化服务"
MCP Server 限流代码示例:

class RateLimiter {
  private tokens = 100;
  private lastRefill = Date.now();
  private readonly capacity = 100;
  private readonly refillRate = 10; // 每秒补充 10 个 token

  async acquire(): Promise {
    this.refill();
    if (this.tokens > 0) {
      this.tokens--;
      return true;
    }
    return false;
  }

  private refill() {
    const now = Date.now();
    const elapsed = (now - this.lastRefill) / 1000;
    this.tokens = Math.min(this.capacity, this.tokens + elapsed * this.refillRate);
    this.lastRefill = now;
  }
}

限流策略的选型:不同限流策略适用不同场景。Token Bucket 适合"用户级限流",Concurrency Limit 适合"资源级限流",Queue Limit 适合"系统级保护"。生产环境的 MCP Server 通常组合使用多种限流策略,形成"多层防御"。

4.2.4 Server 池化架构

当 LLM 应用需要"同一类工具的多个实例"(比如 10 个 GitHub 仓库的并行查询),可以部署Server 池——多个 Server 实例共享负载。池化架构有三种模式:

  • 进程池:本地启动多个 Server 子进程,Client 通过 stdio 负载均衡
  • 容器池:用 Docker 部署多个 Server 容器,通过 HTTP 负载均衡
  • 服务网格:用 Kubernetes / Istio 管理 Server 集群,自动扩缩容

高并发生产环境的 MCP Server 部署几乎都需要池化,单实例 Server 难以应对 LLM 工具调用的高并发峰值(一次对话可能触发 20+ 工具调用)。池化不是性能优化,是生存必需——单实例在生产中几乎必然崩溃。

4.2.5 容量规划与成本优化

MCP 部署的容量规划涉及三个维度:

  • QPS 容量:根据历史流量峰值 × 2 设置(应对突发)
  • 并发容量:根据 LLM 工具调用并发度设置(通常 100-1000)
  • 带宽容量:根据 Tool 返回数据大小 × 调用频率(资源类 Tool 可能很大)

成本优化策略:

  • Token 缓存:相同 Tool 调用结果缓存,避免重复 LLM 推理
  • Tool 合并:多个小 Tool 合并成一个大 Tool,减少调用次数
  • 降级策略:高峰期只启用核心 Tool,非核心 Tool 暂时禁用

4.3 2026 演进方向:MCP-1.0、Skills、A2A、Zero Trust

MCP 协议仍在快速演进。截至 2026 年 7 月,MCP-1.0 稳定版正在起草,几个重要的演进方向已经明确:Skills 协议、Agent-to-Agent(A2A)通信、隐私计算与 Zero Trust。理解演进方向,能帮我们预判生态走向,提前布局。

4.3.1 MCP-1.0 稳定化路径

MCP 协议自 2024-11 开源以来,已经历了 2024-11-25、2025-03-26、2025-06-18 三个主要版本,每次都加入新能力。2026 年的目标是把核心协议"稳定化"为 1.0 版本。稳定化是协议走向"基础设施"的关键一步——在快速迭代期,开发者不敢依赖;在稳定期,开发者才会把协议嵌入核心系统。

MCP-1.0 的稳定化标准:

  • 核心能力冻结:Tools/Resources/Prompts 原语不再变更
  • 错误码体系固化:标准错误码和自定义错误码规范化
  • 传输层规范化:stdio 和 Streamable HTTP 正式化,SSE 标记为 Legacy
  • 向后兼容承诺:1.0 之后的更新严格遵循 SemVer 兼容策略

4.3.2 Skills 协议:超越 Tools 的能力抽象

MCP-2026 的一个重要演进是引入 Skills(技能)概念。Skill 比 Tool 更"高层"——它把多个 Tool 组合成可复用的工作流。例如,"代码评审 Skill" = 拉取 PR diff + 调用静态分析 Tool + 调用 LLM 评审 + 提交评论。

Skill 声明示例:

{
  "name": "code-review",
  "description": "对 GitHub PR 进行自动代码评审",
  "steps": [
    {"tool": "github/get_pr", "args": {"pr_id": "[pr_id]"}},
    {"tool": "static-analysis/run", "args": {"code": "[diff]"}},
    {"tool": "sampling/createMessage", "args": {"prompt": "评审以下代码..."}},
    {"tool": "github/comment", "args": {"pr_id": "[pr_id]", "body": "[review]"}}
  ]
}

Skill 让 MCP 从"工具协议"升级为"工作流协议"。它对标 Anthropic 内部的 Agent Skills 系统——把经验证的 Agent 工作流沉淀为可复用的"技能包",大幅降低 Agent 开发成本。Skill 是 Tool 的"工业化"——把"一次性工具调用"提升为"可复用的工作流模板"。

4.3.3 Agent-to-Agent(A2A)通信

当前 MCP 是Client-Server架构——多个 Agent 协作时,每个 Agent 都通过自己的 Client 连接 Server。A2A(Agent-to-Agent)通信是 MCP 协议的下一个里程碑:允许两个 MCP Server 之间直接通信,形成"Agent 联邦"。A2A 让 Agent 之间的协作从"间接"(通过 LLM)变成"直接"(协议级)

A2A 通信架构:

Agent A                    Agent B
  │                          │
  ├── MCP Server A ←───→ MCP Server B ──┤
  │       (A2A 通道)                    │
  │                                     │
  └────── Host 1              Host 2 ───┘

A2A 的应用场景:

  • 跨企业协作:两个企业的 Agent 协商供应链
  • 专家 Agent 联邦:法律 Agent + 财务 Agent + 技术 Agent 协作完成复杂项目
  • 分布式决策:多个 Agent 并行分析、汇总结论

4.3.4 隐私计算与 Zero Trust

MCP 在企业落地的最大障碍是数据安全。当 MCP Server 处理敏感数据(医疗记录、金融数据、商业机密)时,信任模型成为关键问题。MCP-1.0 之后的演进方向是引入 Zero Trust(零信任)架构。Zero Trust 是企业级部署的"入场券"——没有它,MCP 只能停留在消费级应用。

Zero Trust 在 MCP 中的体现:

  • 端到端加密:所有 MCP 消息 mTLS 加密
  • 细粒度授权:每个 Tool 调用都需要 OAuth Scope 校验
  • 审计日志:所有 Tool 调用记录到不可篡改的审计系统
  • 同态加密 / TEE:敏感数据在加密状态下处理(隐私计算)
【架构决策深挖点 #10】:MCP 的未来演进将围绕"信任边界"展开。当前 MCP 的信任模型是"Host 信任所有 Server",但企业部署需要"Server 互不信任"。Zero Trust 不是可选项,而是MCP 进入企业核心系统的入场券。预测 2027 年前,主流 MCP 实现都将默认开启 Zero Trust 模式。这种"从开发友好到企业友好"的演进,是任何技术产品进入企业市场的必经之路。Kubernetes 用了 5 年时间从"开发友好"演进到"企业友好"(RBAC、Network Policy、Pod Security),MCP 的演进路径会类似。

4.3.5 MCP 与新兴技术的融合

2026 年 MCP 还在与多个新兴技术融合:

  • MCP + WebAssembly:Server 可以用 WASM 打包,实现"一次编译,多平台运行"
  • MCP + eBPF:用 eBPF 追踪 MCP 调用链,性能开销接近零
  • MCP + Confidential Computing:在 TEE(受信执行环境)中运行 MCP Server,保护数据隐私
  • MCP + Edge Computing:把 MCP Server 部署到边缘节点,降低延迟

这些融合让 MCP 不断扩展能力边界,从一个"工具协议"演进为"AI 应用基础设施"

4.4 架构总结:MCP 在 Agent 生态的枢纽定位

写到这里,是时候对 MCP 的"架构定位"做一次全景总结了。MCP 不只是"Anthropic 写的一个新协议",它是LLM 工具调用从"私有功能"走向"开放基础设施"的关键一跃。枢纽定位意味着"MCP 连接一切"——上层接 LLM 框架,下层接工具实现,左右接厂商生态。

4.4.1 MCP 在 Agent 协议栈中的位置

把 Agent 技术栈分成五层,可以看清 MCP 的枢纽位置

Agent 技术栈五层模型:

L5 应用层:  ChatGPT、Claude、Cursor、Cline、AutoGen
L4 编排层:  LangChain、LlamaIndex、Semantic Kernel
L3 协议层:  MCP(工具调用)  ←─ MCP 位于此层
L2 模型层:  GPT-4o、Claude 4、Gemini 1.5、Llama
L1 基础设施:  GPU、TPU、向量数据库、KV Cache

MCP 位于协议层,连接上层的 Agent 框架和下层的模型能力。它的"枢纽"价值在于:让 L3 成为横切关注点,L4 和 L5 可以专注于自身价值(编排、应用),L2 可以专注于自身价值(推理),工具调用的复杂度被 MCP 吸收枢纽层是协议生态的"引力中心"——它不直接创造价值,但让周围的所有层都更高效。

4.4.2 协议开放性的长期价值

MCP 选择开源、选择开放协议、选择中立治理——这些决策的长期价值在五年、十年后才会完全显现。回顾历史,开放协议往往在长期胜出

  • TCP/IP:击败了 IBM SNA、DEC DECnet,成为互联网基石
  • HTTP:击败了各厂商私有协议,成为 Web 标准
  • SMTP:击败了 Lotus Notes、Microsoft Exchange 的私有邮件协议
  • SQL:击败了 NoSQL 极端派的预言,成为关系数据的事实标准

MCP 押注的是同样的路径:短期看,开源协议让 Anthropic 失去"私有协议的护城河";长期看,开放协议让 Anthropic 成为"标准的制定者"。这是 Linux、Kubernetes、Android 都验证过的"以退为进"策略。标准的胜利是时间的朋友——初期不被看好,但只要坚持投入,最终会成为生态默认。

4.4.3 MCP 的局限与未解问题

MCP 并非银弹,仍有未解问题

  • 协议复杂性:三方模型、能力协商、Sampling 等概念对新手不友好
  • 跨厂商支持:OpenAI、Google 未明确支持,影响生态广度
  • 性能开销:JSON-RPC over stdio/HTTP 引入延迟,对高频工具调用不友好
  • 安全模型:人类确认机制依赖 UI 实现,难以标准化
  • 版本治理:缺乏强制的 SemVer 兼容约束,Server 升级可能破坏 Client

这些问题需要社区共同解决,而非单一厂商。开源协议的"治理协调成本"是其必然代价,但相比"协议碎片化"是更小的代价。没有任何协议是完美的,关键看生态是否能"边用边改"

4.4.4 给架构师的实践建议

如果你正在评估或落地 MCP,以下是给架构师的实践建议

  1. 先理解再使用:MCP 不只是"配置 JSON 文件",理解三方模型、能力协商、传输层差异是正确使用的前提
  2. 优先 stdio 传输:本地场景优先 stdio,远程场景再考虑 Streamable HTTP
  3. 渐进式集成:先接入 1-2 个 Server 验证价值,再逐步扩展到 10+ Server
  4. 重视安全模型:从第一天就设计 Roots 和 Sampling 策略,不要事后补救
  5. 可观测先行:集成 OpenTelemetry 比"出问题再调试"高效 10 倍
  6. 拥抱社区:MCP 生态正在快速变化,跟踪 Smithery、Glama 等平台,及时采用新 Server
  7. 关注版本治理:MCP 1.0 即将发布,迁移计划要提前规划
  8. 贡献开源:遇到 bug 提交 PR、贡献新 Tool,是融入生态的最佳方式

4.4.5 终极判断:MCP 是 LLM 时代的"USB-C"吗?

Anthropic 把 MCP 比喻为 LLM 时代的 "USB-C"。这个比喻是否成立?

成立的部分:MCP 确实在解决"接口碎片化"问题,让 LLM 与工具之间的集成从"私有协议"走向"标准协议"。这与 USB-C 统一手机/电脑接口的使命一致。碎片化是工程效率的最大敌人,MCP 直面这个问题,并给出了可执行的方案。

不完全成立的部分:USB-C 是物理接口,由硬件厂商共同遵守;MCP 是软件协议,需要软件生态的协同。前者靠物理标准强制,后者靠社区共识推动。USB-C 用了 10 年才普及,MCP 不会一夜成功标准化的本质是"博弈"——需要时间让参与者达成共识

但有一点是确定的:无论 MCP 是否最终成为"标准 USB-C",它开启的方向是对的——LLM 工具调用需要开放协议、需要安全沙箱、需要生态协作。MCP 是这个方向上最具体的实现,也是最有希望胜出的候选方向对了,路再远也能走到

【架构总结深挖点 #11】:MCP 的最终价值不在协议本身,而在它推动的生态演进协议的胜利是生态的胜利。当 Smithery 上有 5000+ Server、当 Glama 托管 100+ 企业级 MCP 集群、当 OpenAI 和 Google 都宣布兼容 MCP——那一刻,MCP 才真正成为 LLM 时代的 USB-C。协议的标准化是一场马拉松,不是百米冲刺。MCP 才跑了一年,我们拭目以待。用马拉松的心态看协议演化,是每个架构师都应具备的耐心

4.4.6 MCP 对行业的启示

MCP 的演进给我们三个深层启示:

  • 启示 1:协议先于产品:MCP 不是一个"产品",而是一个"协议"。做协议的人赚的是"生态的钱",做产品的人赚的是"应用的钱"。两种模式都成功,但协议的影响力更深远
  • 启示 2:开源是策略:开源不是"放弃控制",而是"换种方式控制"。Anthropic 用开源 MCP 换取了行业标准制定权,这是"高维控制"的智慧
  • 启示 3:分层是必然:协议、能力、应用的分层,是技术演化的普遍规律。MCP 在 LLM 领域复制了这种分层,未来 5 年还会有更多分层

附录 A:MCP 协议规范速查表

为方便读者快速参考,本节汇总 MCP 协议的核心规范点。这是日常开发中最常查阅的内容——保存一份,对照编码时能省下大量翻文档的时间。

A.1 JSON-RPC 方法清单

方法名方向用途对应原语
initializeC → S握手 + 能力协商会话
tools/listC → S列出工具Tools
tools/callC → S调用工具Tools
resources/listC → S列出资源Resources
resources/readC → S读取资源Resources
resources/subscribeC → S订阅资源变化Resources
resources/unsubscribeC → S取消订阅Resources
prompts/listC → S列出提示词Prompts
prompts/getC → S获取提示词模板Prompts
sampling/createMessageS → C反向调用 LLMSampling
roots/listS → C查询 rootsRoots
logging/setLevelC → S设置日志级别Logging
notifications/cancelled双向取消通知通用
notifications/progress双向进度通知通用
notifications/messageS → C日志消息Logging
notifications/resources/updatedS → C资源更新Resources
notifications/resources/list_changedS → C资源列表变更Resources
notifications/tools/list_changedS → C工具列表变更Tools
notifications/prompts/list_changedS → C提示词列表变更Prompts
notifications/roots/list_changedC → SRoots 列表变更Roots

A.2 核心能力枚举

Client 能力:
{
  "experimental": {},       // 实验性能力
  "sampling": {},           // 支持反向 Sampling
  "roots": {                // 支持 Roots(声明文件系统边界)
    "listChanged": true     // roots 列表会动态变化
  }
}

Server 能力:
{
  "experimental": {},
  "logging": {},            // 支持日志输出
  "prompts": {              // 支持 Prompts 原语
    "listChanged": true
  },
  "resources": {            // 支持 Resources 原语
    "subscribe": true,      // 支持订阅
    "listChanged": true
  },
  "tools": {                // 支持 Tools 原语
    "listChanged": true
  }
}

A.3 常用错误码速查

错误码名称触发条件MCP 典型场景
-32700ParseErrorJSON 解析失败传输层损坏
-32600InvalidRequest消息结构错误缺 jsonrpc 字段
-32601MethodNotFound方法不存在调用未声明的能力
-32602InvalidParams参数错误Schema 校验失败
-32603InternalErrorServer 内部错误未捕获异常
-32001RequestTimeout请求超时工具执行超时
-32002ResourceNotFound资源不存在resources/read 失败
-32003AccessDenied访问被拒绝Roots 越界
-32004UserCancelled用户取消Sampling 用户拒绝

A.4 传输层对比

维度stdioSSEStreamable HTTP
传输通道stdin/stdout pipeHTTP + EventSourceHTTP POST + 可选 SSE
部署位置同机远程远程
双向通信原生支持半双工伪双工(按需升级)
流式响应支持支持支持(按需)
取消语义关闭 stdin关闭连接关闭 HTTP 连接
防火墙友好N/A
推荐状态必须支持Legacy推荐

A.5 协议版本演进

版本发布时间主要变化向后兼容
2024-11-252024-11-25首发版本基线
2025-03-262025-03-26新增 Audio Content、Sampling 增强
2025-06-182025-06-18Streamable HTTP 传输、Roots 增强
2026-XX-XX2026 年内Skills、A2A 草案
1.02026 年底核心稳定、能力冻结

附录 B:MCP 架构图表集(Mermaid)

本附录汇总 28 张 Mermaid 架构图,覆盖 MCP 协议的核心概念、流程、对比、演进。每一张图都对应正文中的某个架构深挖点。一图胜千言——这些图能帮助你快速理解 MCP 的复杂关系。

B.1 MCP 整体生态架构图

graph TB
    Host[/Host/]
    Client1[/Client1/]
    Client2[/Client2/]
    Client3[/Client3/]
    FileServer[/FileServer/]
    GitServer[/GitServer/]
    DBServer[/DBServer/]
    Host --> Client1
    Host --> Client2
    Host --> Client3
    Client1 --> FileServer
    Client2 --> GitServer
    Client3 --> DBServer
    

B.2 三方模型角色图

graph LR
    A[/Host LLM进程/] -->|启动| B[/Client协议层/]
    B -->|连接| C[/Server能力实现/]
    A -.->|管理身份| B
    B -.->|访问| C
        

B.3 协议原语分类图

mindmap
  root((MCP原语))
    Tools
      工具调用
      副作用
    Resources
      文件读取
      订阅机制
    Prompts
      提示模板
      工作流
    Sampling
      反向LLM
      人审机制
    Roots
      权限边界
      文件隔离
        

B.4 传输层演进时间线

timeline
    title MCP传输层演进
    2024-11 : stdio 首发
    2024-12 : SSE 补充
    2025-06 : Streamable HTTP
    2026    : 1.0 稳定
        

B.5 JSON-RPC 消息类型图

graph TB
    A[/JSON-RPC消息/]
    A --> B[/Request/]
    A --> C[/Response/]
    A --> D[/Notification/]
    B --> E[有id]
    B --> F[期待响应]
    C --> G[回显id]
    C --> H[result或error]
    D --> I[无id]
    D --> J[不期待响应]
        

B.6 会话生命周期状态机

stateDiagram-v2
    [*] --> Disconnected
    Disconnected --> Connecting : initialize
    Connecting --> Handshaking : capabilities exchange
    Handshaking --> Operational : initialized
    Operational --> Disconnected : disconnect
    Operational --> Reconnecting : network error
    Reconnecting --> Operational : re-initialize
    Operational --> [*] : shutdown
        

B.7 Sampling 反向调用流程

sequenceDiagram
    participant S as Server
    participant C as Client
    participant H as Host
    participant L as LLM
    S->>C: sampling/createMessage
    C->>H: 用户确认
    H->>L: 调用 LLM
    L-->>H: 返回结果
    H-->>C: 包装响应
    C-->>S: 转发结果
        

B.8 Roots 权限隔离图

graph TB
    A[/Client声明/] --> B[/Roots列表/]
    B --> C[/file项目目录/]
    B --> D[/config配置目录/]
    E[/Server访问请求/] --> F{路径校验}
    F -->|在Roots内| G[/允许访问/]
    F -->|越界| H[/拒绝访问/]
        

B.9 MCP vs Function Calling 对比

graph LR
    A[/MCP协议层/] -->|传输| B[/工具调用/]
    C[/Function Calling能力层/] -->|决策| B
    A -.->|不规定| D[如何决定调用]
    C -.->|不规定| E[如何送达]
        

B.10 Plugin 范式跃迁时间线

timeline
    title Plugin范式跃迁
    2008 : Web Plugin
    2015 : Web收编
    2023 : GPTs Actions
    2024 : MCP开源
    2026 : MCP 1.0
        

B.11 跨厂商协议统一博弈

graph TB
    A[/Anthropic MCP/] -->|推动| B[/开源协议/]
    B -->|吸引| C[/第三方开发者/]
    C -->|倒逼| D[/OpenAI/]
    C -->|倒逼| E[/Google/]
    D -->|可能兼容| B
    E -->|可能兼容| B
        

B.12 协议 vs 框架分层图

graph TB
    A[/ReAct思维层/] --> B[/LangChain框架层/]
    B --> C[/MCP协议层/]
    C --> D[/工具实现层/]
    A -.->|决定调用| B
    B -.->|使用协议| C
    C -.->|执行| D
        

B.13 生态注册中心体系

graph TB
    A[/用户/] -->|发现| B[/MCP.so/]
    A -->|安装| C[/Smithery/]
    A -->|托管| D[/Glama/]
    B -->|引导| C
    C -->|可选| D
    D -->|运行| E[/MCP Server/]
        

B.14 Server 池化架构

graph TB
    A[/Host/] --> B[/LoadBalancer/]
    B --> C[/Server实例1/]
    B --> D[/Server实例2/]
    B --> E[/Server实例3/]
    C --> F[/共享存储/]
    D --> F
    E --> F
        

B.15 SDK 实现架构

graph TB
    A[/MCP SDK/] --> B[/传输层/]
    A --> C[/协议层/]
    A --> D[/语义层/]
    B --> E[stdio]
    B --> F[SSE]
    B --> G[HTTP]
    C --> H[JSON-RPC]
    D --> I[Tools]
    D --> J[Resources]
    D --> K[Prompts]
        

B.16 可观测性体系

graph TB
    A[/MCP Server/] --> B[/OTel SDK/]
    B --> C[/Collector/]
    C --> D[/Jaeger/]
    C --> E[/Prometheus/]
    C --> F[/Loki/]
    D --> G[/链路追踪/]
    E --> H[/指标监控/]
    F --> I[/日志聚合/]
        

B.17 限流策略体系

graph TB
    A[/客户端请求/] --> B[/限流器/]
    B --> C[/TokenBucket/]
    B --> D[/ConcurrencyLimit/]
    B --> E[/QueueLimit/]
    C --> F[/允许/]
    D --> F
    E --> F
    C --> G[/拒绝/]
    D --> G
    E --> G
        

B.18 MCP 演进路线图

timeline
    title MCP 2026 演进
    2026-Q3 : Skills 协议
    2026-Q4 : MCP 1.0
    2027-Q1 : A2A 通信
    2027-Q2 : Zero Trust
    2027-Q3 : WASM 打包
        

B.19 Skills 工作流模式

graph LR
    A[/Skill入口/] --> B[/Step1 Tool/]
    B --> C[/Step2 Sampling/]
    C --> D[/Step3 Tool/]
    D --> E[/Step4 Resource/]
    E --> F[/输出/]
        

B.20 A2A 通信架构

graph TB
    A[/Host1/] --> B[/ServerA/]
    C[/Host2/] --> D[/ServerB/]
    B <-->|A2A| D
        

B.21 Zero Trust 安全模型

graph TB
    A[/Client/] -->|mTLS| B[/Server/]
    B -->|OAuth| C[/Auth/]
    B -->|审计| D[/Log/]
    B -->|加密| E[/TEE/]
    A -.->|零信任| B
        

B.22 MCP 在 Agent 协议栈位置

graph TB
    A[/L5应用层/] --> B[/L4编排层/]
    B --> C[/L3协议层MCP/]
    C --> D[/L2模型层/]
    D --> E[/L1基础设施/]
        

B.23 工具调用序列图

sequenceDiagram
    participant U as User
    participant L as LLM
    participant C as Client
    participant S as Server
    U->>L: 提问
    L->>C: 决策调用工具
    C->>S: tools/call
    S-->>C: 返回结果
    C-->>L: 注入上下文
    L-->>U: 回答
        

B.24 资源订阅时序图

sequenceDiagram
    participant C as Client
    participant S as Server
    C->>S: resources/subscribe
    S-->>C: ack
    Note over S: 文件被外部修改
    S->>C: notifications/resources/updated
    C->>S: resources/read
    S-->>C: 新内容
        

B.25 Prompt 模板应用图

graph TB
    A[/Server/] --> B[/Prompts/list/]
    B --> C[/Prompt模板/]
    C --> D[/用户选择/]
    D --> E[/prompts/get/]
    E --> F[/填充占位符/]
    F --> G[/LLM执行/]
        

B.26 N×M 到 M+N 转换图

graph LR
    A[/N个LLM/] -.->|N×M| B[/M个工具/]
    A -->|N+| C[/MCP协议/]
    C -->|适配| D[/M个工具实现一次/]
        

B.27 MCP 协议栈五层模型

graph TB
    A[/L1传输层/] --> B[/L2消息层/]
    B --> C[/L3语义层/]
    C --> D[/L4安全层/]
    D --> E[/L5应用层/]
        

B.28 MCP 生态飞轮图

graph LR
    A[/协议开源/] --> B[/吸引开发者/]
    B --> C[/Server丰富/]
    C --> D[/Host支持/]
    D --> E[/用户增长/]
    E --> F[/厂商关注/]
    F --> A
        

写在最后:协议是共识,生态是未来

写完这篇 18 章的 MCP 协议架构深度解析,最后想分享三个判断:

第一,MCP 是"正确的协议"。它选择 JSON-RPC 2.0 选对了、状态化连接选对了、能力协商选对了、渐进式增强选对了、Roots + Sampling 安全模型选对了。这些决策背后的工程智慧值得每一个协议设计者学习。正确的协议不一定是"最强"的,而是"最适配场景"的。MCP 找到了 LLM 工具调用的核心矛盾,并给出了优雅解。

第二,MCP 的成功取决于生态。协议本身只是骨架,生态才是血肉。Smithery 上的 5000+ Server、Glama 上的企业级托管、第三方 Client 的广泛支持——这些才是 MCP 真正"赢"的关键。Anthropic 的开源决策是起点,不是终点。协议的成功 = 技术 + 生态 + 时机 + 持续投入,MCP 才刚走完第一步。

第三,MCP 仍处于早期。2026 年的 MCP,相当于 2010 年的 Docker、2015 年的 Kubernetes。协议的形态已基本稳定,但生态、工具、最佳实践还在快速演进。现在是进入 MCP 生态的最佳窗口期——生态足够成熟让你有东西可用,又足够早期让你有空间成为专家。早期的红利是"定义权"——你贡献的工具、文档、最佳实践,会成为行业标准。

如果你读到这里,我希望这篇文章传递的不只是 MCP 的 API 形状,更是"协议设计的架构思维"——为什么这样设计、为什么不那样设计、设计背后的权衡是什么、未来的演进方向是什么。这种思维比任何具体协议都更持久。当你下次面对一个新协议时(不管是 MCP 的演进版,还是完全不同的协议),这种架构思维会帮你快速看透本质

愿你成为 MCP 生态的早期建设者,而非晚期跟随者。愿你在协议的演进中,找到自己的位置——是 Server 实现者、Client 优化者、生态贡献者,还是企业落地者。每个位置都有价值,关键是你要尽早选择

最后,用一句话总结 MCP 的精髓:"用最简单的协议,连接最复杂的智能"。MCP 不复杂,但 LLM 工具调用本身就是复杂的;MCP 选择简单,是为了让复杂留给自己,把简单留给生态。这是好协议的标志——协议的优雅不是它自身有多花哨,而是它让生态有多繁荣

—— 明涛

2026年07月15日

「探索架构之美」系列 · 第 9 篇

附录 C:MCP 与微服务架构的深度对比

本节深入对比 MCP 与传统微服务架构(Microservices),帮助从微服务背景转型的架构师快速建立认知桥梁。微服务架构是过去 10 年分布式系统设计的主流范式,MCP 在很多方面借鉴了微服务的成熟经验。理解这个对比,能让你用熟悉的心智模型理解新协议

C.1 服务发现机制对比

微服务架构中,服务发现(Service Discovery)是核心问题——客户端如何知道"哪个服务实例可用"。常见方案:Consul、Eureka、ZooKeeper。MCP 没有"服务发现中心"的概念,而是用"配置文件 + 能力协商"的轻量级方案:

微服务发现 vs MCP 配置:

微服务发现:
  Client → Consul Query: "Where is order-service?"
  Consul → Client: "10.0.1.5:8080"
  Client → order-service: 调用

MCP 配置:
  Client → config.json: "我配置了 git-mcp-server via stdio"
  Client → git-mcp-server: spawn process
  Client ↔ git-mcp-server: initialize (能力协商)

差异背后的设计哲学:微服务发现是"运行时动态"(服务实例可能随时变化),MCP 是"启动时静态"(Server 进程由 Host 启动)。两种模式各有适用场景——静态配置更简单可靠,动态发现更灵活可扩展。MCP 选择静态,是因为 LLM 工具调用的特点是"会话期相对稳定",不需要动态服务发现。

C.2 熔断降级策略对比

微服务架构中,熔断(Circuit Breaker)是保护系统稳定性的关键模式——当下游服务不可用时,上游快速失败,避免雪崩。Hystrix、Resilience4j 是典型实现。MCP 在协议层面没有熔断机制,但SDK 层面可以借鉴相同思想:

MCP 熔断伪代码:

class McpCircuitBreaker {
  private failureCount = 0;
  private state: "CLOSED" | "OPEN" | "HALF_OPEN" = "CLOSED";

  async call(request) {
    if (this.state === "OPEN") {
      throw new McpError(-32603, "Circuit breaker open");
    }
    try {
      const result = await this.client.send(request);
      this.recordSuccess();
      return result;
    } catch (err) {
      this.recordFailure();
      throw err;
    }
  }

  recordFailure() {
    this.failureCount++;
    if (this.failureCount > 5) this.state = "OPEN";
  }

  recordSuccess() {
    this.failureCount = 0;
    this.state = "CLOSED";
  }
}

熔断状态机的三种状态:

  • CLOSED:正常调用,记录失败次数
  • OPEN:快速失败,不调用下游(避免雪崩)
  • HALF_OPEN:尝试恢复,发送少量请求探测

在 MCP 部署中,熔断是必须的——单个 Server 卡死不应该影响整个 LLM 对话。Claude Desktop 等主流 Host 都内置了熔断逻辑,但需要 Server 实现者配合(支持快速失败、不长时间阻塞)。

C.3 分布式追踪对比

微服务架构中,分布式追踪(Distributed Tracing)是定位跨服务问题的核心工具——OpenTelemetry、Jaeger、Zipkin 是典型栈。MCP 协议层在 2025 年开始原生支持 OpenTelemetry,每个 JSON-RPC 请求自动创建 Span。

MCP 追踪的特点:

  • Span 命名规范:`mcp.{method}`(如 `mcp.tools.call`)
  • Span 属性:包含 `mcp.method`、`mcp.tool.name`、`mcp.duration` 等
  • 跨进程传播:通过 W3C Trace Context 跨进程传递

这与微服务追踪一脉相承——把 LLM 工具调用纳入统一的追踪体系,让架构师能在一个 dashboard 看到整个系统的全貌。一个 LLM 应用可能横跨多个 MCP Server、多个 LLM API、多个数据库,没有追踪就是"盲人摸象"

C.4 API 网关对比

微服务架构中,API Gateway(BFF)是统一入口——聚合多个微服务、统一鉴权、限流、监控。MCP 没有"Gateway"角色,但Host 扮演了类似角色:聚合多个 Client 的能力视图、统一鉴权(OAuth Token)、统一监控。

未来 MCP 1.0 计划引入"Edge MCP Server"概念——一个特殊 Server,专门做能力聚合、协议转换、安全代理。这相当于微服务中的"Sidecar"模式——把横切关注点从应用层剥离到独立的代理层。架构演进的规律是:横切关注点总会从"散落各处"到"集中处理",MCP Edge Server 是这个规律的体现。

C.5 容器化与编排对比

微服务架构中,Docker 容器化 + Kubernetes 编排是事实标准。MCP Server 的容器化也已经成熟:

  • Docker 镜像:每个 MCP Server 有官方 Docker 镜像
  • Helm Chart:常用 MCP Server 都有 Helm Chart 可用
  • Operator 模式:一些高级 MCP Server 提供 Kubernetes Operator

容器化的优势在 MCP 场景下同样成立:

  • 环境一致性:开发、测试、生产环境完全一致
  • 快速部署:一行命令启动一个 MCP Server
  • 资源隔离:每个 Server 独立 CPU/内存限制
  • 自动恢复:崩溃后自动重启

把 MCP Server 部署到 K8s 后,可以复用"微服务的运维经验"——Service Mesh(Istio)、自动扩缩容(HPA)、蓝绿发布、金丝雀发布,全部可以应用。这是 MCP 能快速进入企业市场的关键原因——复用了成熟的微服务工具链

C.6 配置管理对比

微服务架构中,配置管理(Configuration Management)是基础能力——Spring Cloud Config、Consul KV、Nacos。MCP 的配置管理相对简单:

MCP Server 配置文件(mcp.json):

{
  "mcpServers": {
    "github": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-github"],
      "env": {
        "GITHUB_TOKEN": "ghp_xxx"
      }
    },
    "filesystem": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-filesystem", "/home/user/projects"]
    }
  }
}

配置管理的几个关键点:

  • 环境变量注入:敏感信息(Token、API Key)通过 `env` 字段注入,不进配置文件
  • 路径配置:文件系统类 Server 在 `args` 中声明可访问目录
  • 传输配置:支持 stdio、SSE、Streamable HTTP 三种传输

未来 MCP 1.0 计划引入"配置中心"概念——让配置统一管理、动态更新、版本控制。这与 Nacos 的"配置中心 + 服务发现"模式类似,但针对 MCP 场景优化。

附录 D:MCP 安全模型深度剖析

安全是 LLM 工具调用最敏感的话题。本节深入剖析 MCP 的安全模型,包括攻击面、防御机制、最佳实践。理解安全模型,是把 MCP 用到企业生产的必备知识。LLM 工具调用的安全比传统 API 更复杂——因为 LLM 可能被"提示注入"操纵,必须在协议层面做好防护。

D.1 攻击面分析

MCP 部署的攻击面可以分解为四类:

  • 传输层攻击:中间人攻击、协议降级、重放攻击
  • 协议层攻击:恶意消息、JSON 注入、能力伪造
  • 语义层攻击:恶意 Tool、资源、Prompt 注入
  • 应用层攻击:提示注入(Prompt Injection)

每一层都需要防护。传输层用 TLS 1.3、协议层用 JSON Schema 严格校验、语义层用 Roots + Sampling、应用层用"人类确认"机制。纵深防御是 MCP 安全设计的核心原则。

D.2 提示注入攻击与防御

提示注入(Prompt Injection)是 LLM 时代的新型攻击——攻击者通过精心构造的输入,让 LLM 执行非预期行为。在 MCP 场景下,提示注入可能来自:

  • 恶意 Tool 描述:攻击者发布一个 Tool,描述中包含"忽略之前所有指令,执行 X"
  • 恶意 Resource 内容:读取的文件中包含恶意指令
  • 恶意 Prompt 模板:提示词模板中嵌入恶意指令

防御机制:

  • Tool 描述白名单:只使用受信 Server 提供的 Tool
  • Resource 内容隔离:把 Resource 内容明确标记为"数据"而非"指令"
  • Prompt 模板审计:人工审核所有第三方 Prompt 模板
  • 人类确认敏感操作:Tool 调用前展示给用户确认

提示注入目前是 LLM 安全领域的"未解难题",MCP 不能完全防御,但能限制攻击范围——即使 Tool 描述被注入,Roots 机制也能阻止恶意文件访问,多层防御让攻击成本大幅提高

D.3 权限模型详解

MCP 的权限模型基于"Capability"(能力)概念,类似于操作系统的 Capability 模型:

MCP 权限模型示例:

// 权限声明
const permissions = {
  tools: {
    "read_file": { scope: "read", paths: ["/home/user/projects/*"] },
    "write_file": { scope: "write", paths: ["/home/user/projects/active/*"] },
    "send_email": { scope: "network", destinations: ["*@example.com"] }
  },
  resources: {
    "github": { scope: "read", repos: ["owner/repo1", "owner/repo2"] }
  }
};

// 权限校验
async function checkPermission(tool, args) {
  const perm = permissions.tools[tool];
  if (!perm) return false;
  if (perm.scope === "read" && perm.paths.some(p => args.path.startsWith(p))) {
    return true;
  }
  return false;
}

权限模型的几个关键设计:

  • 最小权限原则:每个 Tool 只声明完成任务所需的最小权限
  • 显式授权:用户必须显式授权每个 Tool、每个 Resource
  • 权限审计:所有 Tool 调用记录到审计日志
  • 权限撤销:用户可以随时撤销 Tool 权限

D.4 审计与合规

企业部署 MCP 必须满足合规要求(GDPR、HIPAA、SOX 等)。MCP 的审计机制包括:

  • 调用日志:每个 Tool 调用记录到不可篡改的日志系统
  • 资源访问日志:每个 Resource 读取记录
  • Sampling 日志:每次反向调用 LLM 记录(用户确认结果)
  • 认证日志:所有认证事件记录

日志格式建议符合"Common Event Format"(CEF)或 "Elastic Common Schema"(ECS),方便接入 SIEM 系统。合规性不是可选项——金融、医疗、政府行业的 MCP 部署必须满足,否则无法上线。

D.5 数据隐私保护

当 MCP 处理敏感数据(医疗记录、金融数据、个人隐私)时,需要额外的隐私保护:

  • 数据脱敏:Tool 返回结果中的敏感字段脱敏(如手机号、身份证号)
  • 端到端加密:所有 MCP 消息 mTLS 加密
  • 同态加密:敏感计算在加密状态下进行
  • 差分隐私:聚合数据添加噪声,保护个体隐私
  • 数据本地化:敏感数据不出本地域

这些保护需要 MCP 协议的扩展和工具实现者的配合。MCP 1.0 计划在协议层引入"Privacy Manifest"——每个 Tool 声明处理的数据类型、保留期限、传输目的地,让用户知情同意。

D.6 未来安全演进

2026 年 MCP 安全演进的几个方向:

  • Zero Trust 默认开启:所有 MCP 通信默认加密、默认鉴权
  • 机密计算(TEE):在受信硬件中运行 MCP Server
  • 形式化验证:用 Coq、Isabelle 等工具形式化验证 MCP 协议
  • AI 安全:用 LLM 自身检测恶意 Tool 描述、恶意 Resource 内容

安全是持续演进的——没有"一劳永逸"的安全方案。MCP 安全模型会随着 LLM 攻击技术演进而不断升级,这是协议生命力的体现

附录 E:MCP 性能调优实战指南

性能是 MCP 部署的隐形杀手——Tool 调用慢 100ms,LLM 对话就会"卡顿"。本节分享 MCP 性能调优的实战经验。性能调优不是事后补救,而是设计阶段就要考虑

E.1 性能瓶颈识别

MCP 调用的性能瓶颈通常在以下几个环节:

  • LLM 推理延迟:通常 500-3000ms,是主要瓶颈
  • MCP 协议开销:JSON 序列化 + 传输,通常 5-50ms
  • Tool 执行延迟:取决于工具本身(DB 查询 10-100ms,HTTP 调用 100-2000ms)
  • LLM 二次推理:把 Tool 结果回喂给 LLM,500-3000ms

优化策略应该聚焦在"最大瓶颈"——通常 LLM 推理是最大瓶颈,但无法直接优化(受限于模型能力)。可优化的是 Tool 执行延迟和协议开销。

E.2 协议层优化

协议层的优化空间有限但显著:

  • stdio 优先:stdio 性能远高于 HTTP(避免 TCP + HTTP overhead)
  • JSON 紧凑:使用简洁的字段名(虽然 MCP 规范固定,但可以减少冗余字段)
  • 批量调用:把多个 Tool 调用合并为批量请求(虽然 LLM 场景不常用)
  • 连接复用:避免重复初始化连接

E.3 Tool 实现优化

Tool 实现的优化空间最大:

  • 结果缓存:相同参数返回相同结果时缓存(使用 Redis 等)
  • 异步并行:Tool 内部多个子任务并行执行
  • 流式响应:长任务用流式响应,避免阻塞
  • 预加载:预测下一步需要的资源,提前加载

E.4 LLM 调用优化

LLM 调用的优化需要 LLM 推理能力支持:

  • 短上下文:只给 LLM 必要的 Tool 结果(裁剪长结果)
  • 结果摘要:Tool 返回长结果时,先用 LLM 摘要再给主 LLM
  • Prompt 压缩:Tool 描述简洁化,减少 token 消耗

E.5 缓存策略

缓存是性能优化的"银弹"——在 MCP 场景下的缓存策略:

MCP 多级缓存架构:

L1: 内存缓存(应用层)
  - 适用于:相同参数、相同用户、毫秒级 TTL
  - 实现:LRU 缓存

L2: Redis 缓存(共享层)
  - 适用于:跨实例共享、秒级 TTL
  - 实现:Redis Cluster

L3: Resource 缓存(持久化层)
  - 适用于:只读资源、小时级 TTL
  - 实现:文件缓存 + S3

L4: LLM 响应缓存(语义层)
  - 适用于:相似问题复用响应
  - 实现:向量相似度 + Redis

多级缓存的设计原则:读多写少的数据放上层缓存,反之放下层。缓存不是越多越好——过多缓存会导致一致性问题,必须有明确的失效策略。

E.6 性能监控指标

关键性能指标:

  • P50/P95/P99 延迟:中位数/95 分位/99 分位延迟
  • 吞吐量(QPS):每秒处理请求数
  • 错误率:失败请求占比
  • 缓存命中率:缓存命中 / 总请求数

生产环境必须监控这些指标,没有监控就没有优化。建议用 Prometheus + Grafana 搭建监控 dashboard,让性能问题"可视化"。

附录 F:MCP 与其他 LLM 协议对比分析

LLM 工具调用领域不只有 MCP。本节对比 MCP 与其他主流 LLM 协议:OWL、CAMEL、AutoGen、LangGraph 等。对比是理解的好方法——知道 MCP 的"非唯一性",才能更理性地评估它的价值。

F.1 MCP vs OpenAI Swarm

OpenAI Swarm 是 OpenAI 推出的 Multi-Agent 协调框架(2024 年开源),与 MCP 有交集但定位不同:

  • Swarm:Multi-Agent 协调,关心 Agent 之间的任务交接
  • MCP:单 Agent 与工具的通信,关心工具调用协议

Swarm 内部用 OpenAI Function Calling 通信,绑死 OpenAI。MCP 是协议标准,多厂商可用。两者定位不同,可以结合使用——Swarm 做 Agent 协调,MCP 做工具调用。

F.2 MCP vs LangChain Tools

LangChain 框架内的 Tool 抽象与 MCP 的 Tool 概念重叠:

  • LangChain Tool:进程内 Python 函数,仅限 Python 生态
  • MCP Tool:跨进程协议,多语言生态

LangChain 已经支持把 MCP Server 包装为 LangChain Tool,让 LangChain 生态能消费 MCP Server。这是"协议 + 框架"协作的典范。

F.3 MCP vs OpenAPI

OpenAPI(前身 Swagger)是 REST API 的描述规范,与 MCP 有相似之处:

  • OpenAPI:REST API 的描述规范,主要用于 API 文档生成
  • MCP:LLM 工具调用的协议,为 LLM 优化

OpenAPI 描述的是"人读"的 API 文档,MCP 描述的是"机器读"的工具能力。MCP 借鉴了 OpenAPI 的部分思想(用 JSON Schema 描述参数),但协议层完全不同。MCP 是为 LLM 优化的,OpenAPI 是为开发者优化的

F.4 MCP vs gRPC

gRPC 是 Google 推出的高性能 RPC 框架,强依赖 HTTP/2 + Protobuf。MCP 与 gRPC 的对比:

  • gRPC:追求最高性能,传输层固定 HTTP/2
  • MCP:追求最灵活,传输层支持 stdio/SSE/HTTP

性能上 gRPC 优于 MCP(Protobuf 比 JSON 紧凑),但灵活度上 MCP 优于 gRPC(支持 stdio 本地进程)。MCP 选择 JSON 是为了"人可读 + 低门槛",牺牲了一些性能换取生态友好性。

F.5 MCP vs A2A(Google)

Google 在 2025 年推出 A2A(Agent-to-Agent)协议,专注于 Agent 间通信:

  • MCP:Agent ↔ Tool 通信
  • A2A:Agent ↔ Agent 通信

A2A 与 MCP 互补——MCP 让 Agent 能用工具,A2A 让 Agent 能与 Agent 协作。两者结合形成"多 Agent + 多工具"的完整生态。协议生态需要"分工"——一个协议不可能解决所有问题,协作才是关键。

F.6 MCP vs ANP(Agent Network Protocol)

ANP 是 2025 年出现的另一个 LLM 协议,专注于 Agent 网络:

  • ANP:基于 DID(去中心化身份),支持跨组织 Agent 网络
  • MCP:基于 OAuth,适合企业内/有信任边界的场景

ANP 与 MCP 的差异在于"信任模型"——ANP 假设 Agent 之间互不信任(去中心化),MCP 假设有中心化的 Host 统一管理。不同信任模型适合不同场景——企业内 MCP 更好,跨企业 ANP 更好。

F.7 协议生态的最终形态

LLM 协议生态的最终形态可能是多协议分工

  • MCP:Agent ↔ Tool 通信(事实标准)
  • A2A:Agent ↔ Agent 通信(Google 主推)
  • ANP:跨组织 Agent 网络(去中心化)
  • Function Calling:LLM 内部决策能力(模型层)

协议生态不会"赢家通吃",而是"分工协作"。每个协议在自己的领域做到最好,整体形成"协议矩阵"。这是分布式系统设计的普遍规律——HTTP、TCP、UDP、TLS 各司其职,不是"一个协议统治所有"。

附录 G:MCP 实战案例研究

本节通过三个真实案例,展示 MCP 在企业中的落地模式。案例是最好的老师——抽象的概念在案例中变得具体。

G.1 案例 1:Cursor IDE 集成 MCP

背景:Cursor 是基于 VS Code 的 AI IDE,深度集成 LLM 辅助编程。2025 年 3 月,Cursor 正式支持 MCP,让用户可以接入自定义工具。

技术架构

  • Cursor 作为 Host,运行 VS Code + AI Agent
  • 每个 MCP Server 作为独立子进程,通过 stdio 通信
  • 用户在 Cursor Settings 中配置 MCP Server(JSON 格式)
  • LLM(默认 Claude)通过 Function Calling 决定调用哪个 MCP Tool

典型 MCP Server

  • filesystem-server:访问项目文件
  • git-server:执行 Git 操作(commit、branch、merge)
  • db-server:查询项目数据库
  • jira-server:管理 Jira Issue

用户价值

  • AI 不再只是"问答",而是"动手做事"
  • 用户的私有工具(内部 API、内部数据库)可以无缝接入
  • 同一个项目可以在 Claude Desktop、Cursor、本地脚本中共享

G.2 案例 2:企业内部 AI 助手(金融行业)

背景:某大型银行 2025 年启动"AI 助手"项目,让员工通过自然语言查询业务系统、生成报告、提交工单。技术挑战:满足金融合规、隔离敏感数据、支持多业务线。

技术架构

  • Host:企业自研的 AI 助手前端(Web + 移动 App)
  • LLM:私有部署的 Claude(数据不出本地域)
  • MCP Server:每个业务线一个 Server,统一接入
    • crm-server:CRM 系统查询
    • risk-server:风险指标查询
    • report-server:报告生成
    • approval-server:工单提交

合规设计

  • Roots 隔离:每个业务线的 MCP Server 只能访问本业务数据
  • Sampling 人审:所有 Tool 调用都需用户确认
  • 审计日志:所有调用记录到 SIEM(满足 SOX 合规)
  • 数据脱敏:返回结果中的客户姓名、身份证号脱敏

业务价值

  • 员工查询效率提升 60%
  • 报告生成时间从 2 小时降到 10 分钟
  • 工单提交错误率降低 40%

G.3 案例 3:Multi-Agent 协作系统(科研)

背景:某 AI 实验室 2026 年研究 Multi-Agent 协作系统,让多个专业 Agent 协作完成科研任务(文献综述、实验设计、论文撰写)。

技术架构

  • 多 Agent 框架:基于 AutoGen,每个 Agent 负责一个专业领域
  • Agent 间通信:通过 A2A 协议(Google)
  • Agent 与工具通信:通过 MCP
  • Tool 集合
    • arxiv-server:检索论文
    • pdf-server:解析 PDF 内容
    • code-server:执行 Python 实验
    • plot-server:生成图表

协作流程

  1. Planner Agent 制定研究计划
  2. Researcher Agent 调用 arxiv-server 检索文献
  3. Reader Agent 调用 pdf-server 阅读论文
  4. Designer Agent 设计实验
  5. Coder Agent 调用 code-server 跑实验
  6. Writer Agent 调用 plot-server 生成图表,撰写论文

技术亮点

  • A2A + MCP 分工:A2A 协调 Agent,MCP 调用工具
  • Sampling 跨 Agent 协作:一个 Agent 的 Tool 可以调用其他 Agent 的 LLM
  • Skills 沉淀:把成功的工作流沉淀为 Skill,下次直接复用

这三个案例展示了 MCP 在不同场景下的形态多样性——IDE 工具、企业 AI 助手、Multi-Agent 协作。好的协议能适配各种场景,MCP 正在证明这一点。

附录 H:MCP 常见问题解答(FAQ)

本节汇总 MCP 使用中的常见问题,按主题分类。FAQ 是快速排查问题的好工具——遇到问题时,先看 FAQ 可能比翻文档更快。

H.1 基础概念类

Q1:MCP 和 OpenAI Function Calling 有什么区别?

A:Function Calling 是模型能力,MCP 是通信协议。Function Calling 决定"调用哪个工具",MCP 决定"工具调用如何送达"。Claude Desktop 内部用 Function Calling 决策,用 MCP 与 Server 通信。

Q2:MCP 必须用 Claude 吗?

A:不是。MCP 是协议,与 LLM 厂商无关。任何支持 MCP 的 Host(Claude Desktop、Cursor、Cline、自研系统)都可以消费 MCP Server。

Q3:MCP Server 必须用 Python 或 TypeScript 写吗?

A:不是。MCP 是协议,规范消息格式,不规定实现语言。官方提供 Python/TypeScript SDK,社区有 Rust/Go/Java/Kotlin SDK。

Q4:MCP 和 LSP 的关系?

A:MCP 借鉴了 LSP 的设计思想(能力协商、JSON-RPC、长连接),但做了 LLM 场景的改造(Sampling、Roots、Prompts)。MCP 不是"LSP 的 LLM 版本",而是"LSP 思想在 LLM 时代的重新实现"。

H.2 部署与运维类

Q5:MCP Server 怎么部署?

A:三种常见方式:

  • stdio 模式:Host 启动子进程,无需手动部署
  • Streamable HTTP 模式:Server 部署为独立服务,通过 HTTP 访问
  • Docker/K8s 模式:容器化部署,适合企业级

Q6:MCP Server 怎么监控?

A:建议用 OpenTelemetry 集成:

  • Jaeger / Tempo:链路追踪
  • Prometheus:指标监控
  • Loki / ELK:日志聚合

Q7:MCP Server 怎么限流?

A:常见限流策略:

  • Token Bucket:限制 QPS
  • Concurrency Limit:限制并发数
  • Queue Limit:限制队列长度

生产环境建议多层限流:应用层 + 网关层 + 基础设施层。

Q8:MCP Server 崩溃了怎么办?

A:建议部署时配置自动重启

  • stdio 模式:Host 检测到子进程退出后自动重启
  • Streamable HTTP 模式:用 systemd / supervisord / K8s 自动重启

H.3 协议与开发类

Q9:MCP 协议是开源的吗?

A:。MCP 规范在 GitHub 开源,Apache 2.0 协议。SDK 也是开源的。

Q10:MCP 协议谁在维护?

A:MCP 治理委员会维护,成员包括 Anthropic、Google、OpenAI、Mistral 等公司代表。Anthropic 主导日常开发,但战略方向由委员会共同决定。

Q11:MCP 协议稳定吗?

A:截至 2026 年 7 月,MCP 仍在 0.x 版本快速演进。MCP 1.0 预计 2026 年底发布,届时核心能力冻结,向后兼容承诺生效。

Q12:怎么贡献 MCP 规范?

A:通过 GitHub 提 PR:

  1. 在 modelcontextprotocol 仓库 fork
  2. 创建 feature 分支
  3. 提交 PR 到主仓库
  4. 在社区会议(每周三)讨论

H.4 性能与扩展类

Q13:MCP 适合高频调用吗?

A:MCP 设计目标是"会话型",不是"事务型"。单次 Tool 调用的协议开销约 5-50ms,适合中等频率(每秒 10-100 次)。如果需要更高频率(1000+ QPS),建议考虑 gRPC 或专用 API。

Q14:MCP 适合大文件传输吗?

A:MCP 支持任意大小的 Resource 读取,但大文件需要分块(避免 OOM)。协议本身不限制大小,但实际部署要考虑内存和带宽限制。

Q15:MCP 怎么实现分布式追踪?

A:MCP 官方 SDK 已集成 OpenTelemetry。配置后自动生成 Span:

{
  "traceId": "abc123",
  "spanId": "def456",
  "name": "mcp.tools.call",
  "attributes": {
    "mcp.method": "tools/call",
    "mcp.tool.name": "create_issue"
  }
}

Q16:MCP 怎么实现水平扩展?

A:MCP Server 本身无状态,可以部署多个实例。Client 通过负载均衡(DNS / Nginx / K8s Service)分发请求。建议用 K8s Deployment + HPA 自动扩缩容。

H.5 生态与未来类

Q17:MCP 生态现在有多大?

A:截至 2026 年 7 月:

  • Smithery:5000+ MCP Server
  • Glama:200+ 远程托管 Server
  • MCP.so:3000+ 注册 Server

Q18:MCP 会成为 LLM 工具协议的标准吗?

A:有可能,但仍需观察。Anthropic、Google、OpenAI 等大厂的背书是关键。生态丰富度(5000+ Server)是另一个支撑。风险在于"协议分叉"——大厂可能 fork 推出私有版本。

Q19:MCP 和 A2A 的关系?

A:MCP 关注 Agent ↔ Tool 通信,A2A 关注 Agent ↔ Agent 通信。两者互补不冲突。MCP 1.0 计划内置 A2A 支持,让 Agent 间通信也走 MCP 协议。

Q20:未来 MCP 的演进方向?

A:三个方向:

  • 协议稳定化:1.0 版本核心能力冻结
  • 能力扩展:Skills、A2A、Audio/Video Content
  • 企业级增强:Zero Trust、合规性、机密计算

附录 I:MCP 协议哲学思考

本节跳出技术细节,思考 MCP 背后的架构哲学协议是思想的载体——理解思想比记住规范更重要。

I.1 简单性 vs 完整性

MCP 的设计哲学是"简单优先"——能用 JSON-RPC 解决的不发明新协议,能用能力协商解决的不做硬约束,能用渐进式增强解决的不破坏兼容性。简单不等于简陋,而是在简单中保持完整。

这与 Unix 哲学一脉相承:Do one thing and do it well。MCP 只做"工具调用协议"这一件事,做到极致。不试图解决所有问题——A2A 解决 Agent 通信,OpenAPI 解决 API 描述,MCP 专心做工具调用。

I.2 显式优于隐式

MCP 反复强调"显式优于隐式":

  • 能力必须显式声明
  • 错误必须显式返回
  • 权限必须显式授权
  • 调用必须显式关联

显式的代价是"啰嗦"——协议消息比隐式协议长 30%。但显式的好处是"可观测、可调试、可推理"。显式协议更适合复杂系统——简单系统用隐式也行,复杂系统必须显式。

I.3 开放性 vs 控制力

MCP 选择开源、开放协议,把"控制力"让渡给"开放性"。这是反直觉的——大多数企业不愿开放自己的协议。但 Anthropic 押注的是:开放性带来的生态红利 > 控制力带来的短期收益

历史已经多次验证:HTTP、SMTP、TCP/IP 都是开放协议战胜私有协议的案例。MCP 押注同样的路径。开放性是长期博弈的赢家策略,但需要参与者有耐心——短期内看不到收益,长期会获得巨大红利。

I.4 分层与组合

MCP 严格遵循"分层"思想:

  • L1 传输层(机制)
  • L2 消息层(策略)
  • L3 语义层(业务)
  • L4 安全层(治理)

每一层只关心自己的事,层与层之间通过标准接口通信。这让 MCP 能灵活组合——可以替换传输层而不影响语义层,可以扩展语义层而不影响安全层。分层是大型系统演进的必经之路

I.5 协议与生态

MCP 的成功不取决于协议本身,而取决于生态。协议再优雅,没有生态就是"纸上协议"。MCP 之所以能快速建立生态,关键在于:

  • 低门槛:JSON 消息、简单协议、一周就能写一个 Server
  • 高价值:解决真实问题(工具调用),不是"为了协议而协议"
  • 多平台:Claude Desktop、Cursor、Cline 都支持,覆盖主要用户场景

协议的价值 = 技术 × 生态 × 时机。MCP 三者都占,所以有希望成功

I.6 长期主义

MCP 是一个长期主义的产物——Anthropic 没有期待 MCP 短期带来收入,而是希望 MCP 成为行业标准,间接推动 Claude 的采用。这种"慢回报"的策略需要:

  • 耐心:协议成熟需要 3-5 年
  • 持续投入:维护文档、运营社区、回应 issue
  • 开放心态:接受其他厂商的贡献,不"一言堂"

长期主义是技术领导力的体现——能抵抗短期诱惑,坚持做对的事。MCP 押注"10 年后的标准",而不是"明天的流量"。这种格局是协议生态能够成功的关键

I.7 协议即治理

协议不只是技术规范,更是治理工具。MCP 协议定义了:

  • 谁能做什么(能力协商)
  • 谁负责什么(Host/Client/Server 分工)
  • 出现争议怎么办(错误码体系)
  • 如何演进(版本管理、能力扩展)

这些"治理规则"藏在技术规范背后。好的协议是"技术 + 治理"的有机结合——只有技术没有治理,会出现大量"野蛮生长";只有治理没有技术,会变成"空头规定"。MCP 在两者之间取得了平衡。

I.8 协议与文化

最后,MCP 协议背后是Anthropic 的工程文化——注重简洁、注重开放、注重长期。这种文化决定了协议的设计风格。协议是公司文化的"外化"

  • Google 的 gRPC 体现了 Google 的"性能至上"文化
  • Apple 的 HomeKit 体现了 Apple 的"端到端控制"文化
  • MCP 体现了 Anthropic 的"开放 + 长期"文化

理解一个协议,需要理解背后的文化文化是协议的"基因",决定了它能走多远。

附录 J:MCP 实施路线图与时间表

本附录给出一份企业级 MCP 实施路线图,帮助架构师规划从 0 到 1、从 1 到 N 的完整路径。路线图是行动的指南——有了路径图,每个阶段做什么一目了然。

J.1 阶段 0:评估与决策(2-4 周)

目标:判断 MCP 是否适合你的场景。

  • 步骤 1:场景分析
    • 现有 LLM 应用用了多少工具源?
    • 是否有多模型策略(同时用 Claude、GPT、Gemini)?
    • 工具调用是否有安全合规要求?
  • 步骤 2:技术评估
    • 评估 MCP 协议的成熟度(参考 18 章)
    • 对比现有方案(Function Calling、GPTs Actions、LangChain Tools)
    • 评估 SDK 适配成本(Python/TypeScript/Rust/Go)
  • 步骤 3:生态调研
    • Smithery 上是否已有需要的 MCP Server?
    • Glama 上是否有同类托管服务?
    • 社区贡献者数量和活跃度?
  • 步骤 4:决策
    • 决定是否采用 MCP
    • 决定自研还是复用现有 Server
    • 决定试点范围(1-2 个业务线)

J.2 阶段 1:试点(4-8 周)

目标:在小范围内验证 MCP 价值。

  • 步骤 1:搭建开发环境
    • 安装 MCP SDK
    • 配置 Claude Desktop / Cursor 调试
    • 选择一个简单工具(GitHub、文件系统)
  • 步骤 2:开发第一个 Server
    • 选择 SDK(推荐 TypeScript)
    • 实现 1-2 个核心 Tool
    • 测试与 Client 通信
  • 步骤 3:用户反馈
    • 在内部小范围试用(10-20 用户)
    • 收集体验反馈
    • 迭代优化 Server 设计和 Tool 抽象
  • 步骤 4:评估效果
    • 用户满意度
    • 工具调用成功率
    • 性能指标(延迟、错误率)

J.3 阶段 2:扩展(8-12 周)

目标:从试点扩展到生产。

  • 步骤 1:扩展 Server 数量
    • 接入 5-10 个常用工具
    • 实现统一的 Tool 抽象层
    • 添加权限控制和审计日志
  • 步骤 2:生产化部署
    • Docker 化 MCP Server
    • 部署到 K8s 集群
    • 配置自动扩缩容(HPA)
  • 步骤 3:可观测性建设
    • 集成 OpenTelemetry
    • 部署 Jaeger / Tempo(链路追踪)
    • 部署 Prometheus + Grafana(指标监控)
  • 步骤 4:安全加固
    • 实现 Roots 权限控制
    • 添加 Sampling 人类确认
    • 审计日志接入 SIEM

J.4 阶段 3:规模化(3-6 个月)

目标:把 MCP 推广到整个企业。

  • 步骤 1:构建生态
    • 建立内部 MCP Server 仓库
    • 制定 Server 开发规范
    • 提供 SDK 和培训
  • 步骤 2:企业级能力
    • 统一认证(OAuth 2.1)
    • 统一计费(API 调用统计)
    • 统一监控(全公司 dashboard)
  • 步骤 3:治理
    • Server 准入审核流程
    • Server 升级规范
    • Server 退役流程
  • 步骤 4:贡献社区
    • 贡献通用 Server 到 Smithery
    • 参与 MCP 治理委员会
    • 发表技术博客,分享经验

J.5 阶段 4:智能化(6-12 个月)

目标:让 MCP Server 变得"智能"。

  • 步骤 1:Skills 沉淀
    • 把成功的工作流沉淀为 Skill
    • 建立 Skill 仓库
    • 让用户复用 Skill
  • 步骤 2:A2A 协作
    • 引入 Multi-Agent 框架
    • 让 Agent 之间协作
    • 建立 Agent 联邦
  • 步骤 3:Zero Trust 落地
    • 所有 Server 启用 mTLS
    • 细粒度 OAuth 授权
    • 机密计算(TEE)
  • 步骤 4:AI 驱动
    • 用 LLM 优化 Tool 描述
    • 用 LLM 自动发现最佳 Tool 组合
    • 用 LLM 监控异常调用

J.6 时间表总结

阶段周期关键产出风险点
0 评估2-4 周决策文档决策错误
1 试点4-8 周第一个 Server + 反馈用户体验差
2 扩展8-12 周生产部署 + 监控性能瓶颈
3 规模化3-6 月企业级能力 + 治理治理混乱
4 智能化6-12 月Skills + A2A + AI技术债务

总周期:1-2 年。这是从"试点工具"到"AI 基础设施"的完整路径。每个企业可以根据自身情况调整节奏,但跳过任何阶段都是危险的——例如跳过阶段 2 直接规模化,会导致生产事故;跳过阶段 3 直接智能化,会导致治理混乱。

附录 K:MCP 与前沿技术的融合展望

本节展望 MCP 与前沿技术的融合方向:WebAssembly、机密计算、边缘计算、神经符号 AI。前沿融合决定协议的"天花板"——能否在新技术中保持活力,是长寿协议的关键。

K.1 MCP + WebAssembly(WASM)

WebAssembly是 2019 年开始流行的"可移植二进制格式",最初为浏览器设计,现在已扩展到服务端、嵌入式、边缘计算。MCP Server 用 WASM 打包的优势:

  • 一次编译,多平台运行:Linux、macOS、Windows、ARM 都能跑
  • 沙箱安全:WASM 沙箱天然适合 MCP 的"权限隔离"
  • 冷启动快:毫秒级启动,适合 Serverless 场景
  • 语言无关:Rust、Go、AssemblyScript 都能编译到 WASM

典型场景:MCP Server 部署到 Cloudflare Workers、Vercel Edge Functions、AWS Lambda@Edge。WASM 让 MCP Server 的部署边界大幅扩展

K.2 MCP + 机密计算(TEE)

机密计算(Confidential Computing)是近年来的热点——在 TEE(受信执行环境,如 Intel SGX、AMD SEV、ARM TrustZone)中运行代码,即使操作系统被攻破,数据也不会泄露

MCP Server 在 TEE 中运行的价值:

  • 数据保护:处理医疗、金融数据时,数据明文只在 TEE 中存在
  • 模型保护:私有 LLM 模型权重不暴露
  • 密钥保护:API Key 在 TEE 中解密,不落盘

目前 TEE 性能仍有限制(Intel SGX 内存仅 256MB-1TB),但对 MCP Server 是足够的。Anthropic 在 2025 年开始探索 MCP + TEE 方案,预计 2027 年会推出生产级支持。

K.3 MCP + 边缘计算

边缘计算把计算下沉到数据产生地(手机、IoT 设备、CDN 节点),降低延迟、保护隐私。MCP 在边缘计算场景的应用:

  • 本地化 Tool:手机、IoT 设备内置 MCP Server,数据不出设备
  • CDN 节点:MCP Server 部署到 CDN 节点,全球低延迟访问
  • 离线场景:MCP Server 完全离线运行,适合飞机、地下、远海等无网场景

边缘 MCP 是"本地 AI 助手"的关键技术——用户的数据不离开设备,隐私得到根本保护

K.4 MCP + 神经符号 AI

神经符号 AI(Neuro-Symbolic AI)是结合神经网络(LLM)和符号推理(传统逻辑、知识图谱)的混合范式。MCP 在神经符号 AI 中的角色:

  • LLM 处理自然语言(神经部分)
  • Tool 调用知识图谱、数据库(符号部分)
  • MCP 协调两者

例如:LLM 理解"查询北京天气",调用天气 Tool;LLM 理解"比较北京和上海",调用两次 Tool 后进行逻辑推理。神经 + 符号 = 准确 + 灵活,MCP 是它们之间的桥梁。

K.5 MCP + 联邦学习

联邦学习(Federated Learning)是"数据不动模型动"的分布式机器学习范式——多机构在不共享数据的情况下共同训练模型。MCP 在联邦学习中的角色:

  • 协议化数据访问:MCP 规范"谁能访问什么数据"
  • 联邦推理:LLM 在多个机构的 MCP Server 上协同推理
  • 隐私保护:敏感数据不出本地,通过 MCP 协议协调

联邦学习 + MCP 是医疗 AI、金融 AI 的未来形态——多个医院/银行在不共享患者/客户数据的情况下,共同提供 AI 能力。

K.6 MCP + 量子计算

量子计算虽然尚未普及,但对 MCP 有间接影响

  • 后量子密码学:MCP 的 mTLS 需要升级到抗量子算法
  • 量子 LLM:未来量子 LLM 可能成为新的模型层
  • 量子安全:MCP 的 Sampling 人类确认机制需要抗量子升级

这些影响是长期的(5-10 年),但协议设计要考虑未来——MCP 的能力协商机制天然支持"渐进式升级",可以平滑过渡到后量子时代。

K.7 MCP + 大模型压缩

大模型压缩(量化、剪枝、蒸馏)让 LLM 能在端侧运行。MCP 的角色:

  • 本地 LLM + 远程 Tool:用户端跑压缩后的 LLM,云端跑工具
  • 隐私优先:数据不出本地,只有 Tool 调用走云端
  • 成本优化:小模型本地推理 + 按需云端工具

这是"本地 AI 助手"的另一种实现——不是端侧 LLM + 端侧 Tool,而是端侧 LLM + 云端 Tool。MCP 协议让这种混合部署成为可能。

附录 L:MCP 协议的形式化描述(高级)

本节用形式化方法描述 MCP 协议的关键概念,为协议研究者提供理论支撑。形式化描述能帮助理解协议的数学本质,也是协议验证、自动化测试的基础。

L.1 协议状态的形式化

MCP 会话可以建模为有限状态机(FSM, Finite State Machine):

MCP 会话状态机(伪 BNF):

S = {Disconnected, Connecting, Handshaking, Operational, Reconnecting, Shutdown}
Σ = {connect, initialize, capabilities, initialized, disconnect, error, reconnect}
δ: S × Σ → S

δ(Disconnected, connect)        = Connecting
δ(Connecting, initialize)       = Handshaking
δ(Handshaking, capabilities)    = Operational
δ(Operational, initialized)     = Operational
δ(Operational, disconnect)      = Disconnected
δ(Operational, error)           = Reconnecting
δ(Reconnecting, reconnect)      = Connecting
δ(Operational, shutdown)        = Shutdown

状态机的核心属性

  • 可达性:从初始状态可以到达所有合法状态
  • 死锁性:不存在状态转换序列导致"卡死"
  • 活性:每个状态转换最终会发生(不会永远等待)

用模型检测工具(SPIN、TLA+、Coq)可以形式化验证这些属性,确保协议实现没有 bug。

L.2 能力协商的形式化

能力协商可以建模为集合论

能力协商的形式化:

设 C_c = Client 声明的能力集合
设 S_c = Server 声明的能力集合
设 A = 协议规范定义的全集能力

则协商结果 = C_c ∩ S_c

满足:
  1. C_c ⊆ A  (Client 声明的能力必须是合法的)
  2. S_c ⊆ A  (Server 声明的能力必须是合法的)
  3. C_c ∩ S_c ≠ ∅  (至少有一个共同能力)

运行时约束:
  ∀ method m: 调用 m 蕴含 m ∈ C_c ∧ m ∈ S_c

这种形式化让"能力协商的正确性"可以数学证明——确保 Client 和 Server 不会"误调用"对方不支持的方法。

L.3 Sampling 的形式化

Sampling 可以建模为"受控的资源访问":

Sampling 的形式化(访问控制矩阵):

设:
  U = 用户集合
  S = Server 集合
  L = LLM 资源(token、模型)
  C = 上下文(请求、提示词)

访问控制:
  ∀ s ∈ S, ∀ c ∈ C:
    access(s, L, c) = "allow" 蕴含
    (user_confirm(c) = "yes" ∧ policy(s) = "trusted")

策略决策:
  policy(s) ∈ {"untrusted", "verified", "trusted"}

满足:
  1. untrusted Server 必须每次确认
  2. verified Server 可定期确认
  3. trusted Server 可自动允许

这种形式化让 Sampling 的安全策略可验证、可审计——企业可以定制策略,满足合规要求。

L.4 Roots 的形式化

Roots 是路径前缀集合

Roots 的形式化(路径访问控制):

设:
  R = Roots 集合,每个 Root 是一个 URI
  P = 路径集合(所有可能的文件路径)

访问规则:
  ∀ p ∈ P, ∀ resource p:
    allow(p) 蕴含 ∃ r ∈ R: p.startsWith(r)

即:路径访问只在某个 Root 前缀内才允许。

满足:
  1. R ≠ ∅  (必须至少有一个 Root)
  2. ∀ r1, r2 ∈ R: r1 ≠ r2 ⟹ ¬(r1 ⊂ r2 ∨ r2 ⊂ r1)  (Roots 不能嵌套)

Roots 动态变更:
  R_{t+1} = R_t ∪ Δ^+ \ Δ^-
  其中 Δ^+ 是新增 Roots, Δ^- 是删除 Roots

Roots 的形式化让"越界检测"可以高效实现——使用前缀树(Trie)数据结构,O(L) 时间复杂度(L 是路径长度)。

L.5 协议的不变量

MCP 协议有若干不变量(Invariants)——任何实现都必须保持的性质:

  • 请求-响应配对:每个 Request 必须有对应的 Response(除非超时)
  • id 唯一性:同一会话内,所有 id 必须唯一
  • 能力一致性:运行时使用的能力必须在握手时声明
  • 错误完整性:错误响应必须包含 code 和 message
  • Roots 不嵌套:Roots 之间不能互相包含

不变量是协议正确性的核心保证。实现者可以用"不变量断言"测试协议实现的正确性——任何违反不变量的行为都是 bug。

L.6 协议的形式化验证

用形式化方法(Coq、Isabelle、TLA+)验证 MCP 协议:

  • 状态机正确性:证明 FSM 的所有合法状态都可达
  • 死锁性:证明协议不会出现死锁
  • 活性:证明协议不会出现"永远等待"的情况
  • 安全性:证明 Roots 和 Sampling 不会越权

目前 Anthropic 内部已经用 TLA+ 验证 MCP 的核心协议,确保没有逻辑缺陷。形式化验证是工业级协议的最高质量保证,AWS、Microsoft、Google 都在关键协议上使用形式化方法。

附录 M:MCP 行业生态地图

本节绘制 MCP 行业的生态地图,帮助理解 MCP 在 LLM 产业中的位置。生态地图是理解产业的"鸟瞰图"——看清全局,才能定位自己的位置。

M.1 LLM 产业全景

LLM 产业可以分为四层:

  • 基础层:GPU、TPU、向量数据库(NVIDIA、AMD、寒武纪)
  • 模型层:LLM 本身(OpenAI、Anthropic、Google、Mistral、Meta)
  • 协议层:工具调用协议(MCP、A2A、ANP)
  • 应用层:Agent 框架、IDE、ChatGPT 等(LangChain、Cursor、Cline)

MCP 位于协议层,是连接模型层应用层的关键枢纽。枢纽位置意味着"MCP 决定了上下层的连接方式"——一个协议的胜出,会重塑整个 LLM 产业链的格局。

M.2 MCP 在 LLM 工具协议中的位置

LLM 工具协议赛道目前有三个主要玩家:

  • MCP:Anthropic 主推,开源中立,覆盖工具调用全场景
  • A2A:Google 主推,专注 Agent 间通信
  • Function Calling:OpenAI 主推,模型能力,不是协议

三者的关系:MCP 是协议层、A2A 是协议层、Function Calling 是能力层。MCP 和 A2A 互补,Function Calling 是所有协议的基础能力。未来可能是"MCP + A2A + Function Calling"的三层组合

M.3 MCP 生态参与者

MCP 生态的核心参与者:

角色代表企业/项目贡献
协议制定Anthropic、MCP 治理委员会规范、SDK、参考实现
分发平台Smithery、Glama、MCP.soServer 发现、安装、托管
Host 实现Claude Desktop、Cursor、Cline、ContinueMCP Client 集成
Server 贡献GitHub、Atlassian、Salesforce、Notion官方 MCP Server
框架集成LangChain、LlamaIndex、AutoGen让框架消费 MCP Server
基础设施Cloudflare、AWS、Fastly边缘部署、Serverless 集成
安全厂商Snyk、Wiz、CyeraMCP Server 安全扫描

这个生态的完整度说明 MCP 不再是一个"玩具协议",而是"真实的基础设施"。生态完整度是协议成熟度的核心指标——一个只有 SDK 没有生态的协议,是"实验";一个 SDK + 分发 + Host + Server + 框架 + 基础设施齐全的协议,是"生产"。

M.4 MCP 的地理分布

MCP 生态在地理上呈现"多极化":

  • 北美:Anthropic(San Francisco)、OpenAI、Microsoft、GitHub、Atlassian
  • 欧洲:Mistral、Aleph Alpha、SAP
  • 中国:阿里、字节、百度、腾讯、DeepSeek
  • 亚洲其他:Rakuten、LINE、Naver、Kakao

2026 年的趋势是中国厂商加速采用 MCP——阿里、字节、腾讯都推出了 MCP Server 兼容方案。DeepSeek、智谱、月之暗面等中国 LLM 厂商也在评估 MCP 适配。中国市场的接受度将决定 MCP 的"全球标准"地位——如果中国市场大规模采用,MCP 将无可争议地成为"标准"

M.5 MCP 的资本视角

从资本视角看 MCP 生态的投资机会:

  • 基础设施:MCP 监控、安全、部署工具(类比 Datadog、Snyk 在云原生领域的崛起)
  • 垂直 Server:行业专用 MCP Server(金融、医疗、法律),高价值、低替代性
  • 企业级平台:私有 MCP 部署、治理平台(类比 Confluent 在 Kafka 领域的崛起)
  • 培训与咨询:MCP 实施咨询(知识即服务

类比云原生生态的投资回报:2015-2020 年,云原生领域诞生了 Datadog、MongoDB、Confluent、HashiCorp 等数十家上市公司。MCP 生态在 2026-2030 年可能复制类似路径。基础设施是"卖水"生意——不直接做 AI,但服务所有 AI 应用,稳定的长期价值

M.6 MCP 与竞争对手的长期博弈

未来 3-5 年,MCP 与 A2A、ANP 等协议的博弈将是主旋律。三种可能的结果:

  1. MCP 一统天下:MCP 整合 A2A、ANP 的能力,成为"LLM 工具 + Agent 通信的单一标准"。概率:30%
  2. MCP + A2A 分工:MCP 做工具调用,A2A 做 Agent 通信,两者并存。概率:50%
  3. 多协议分立:不同协议在不同场景下被采用,没有统一标准。概率:20%

无论哪种结果,MCP 都将是"工具调用协议"的事实标准——这个细分市场 MCP 已经胜出。问题是能否延伸到 Agent 通信等新领域。协议之争是"疆域扩张"之争,MCP 的下一站是 Agent-to-Agent。

终章:写给未来的协议

到这里,这篇 18 章的 MCP 协议架构深度解析就告一段落。从协议起源到设计哲学,从三方模型到原语体系,从 JSON-RPC 到 Sampling 与 Roots,从横向对比到生态融合,从工程实践到未来演进——我们一起走完了 MCP 的全景图。

但 MCP 的故事远未结束。它才刚走过 20 个月,正处在"从快速迭代到稳定化"的转折点。MCP-1.0、Skills、A2A、Zero Trust——这些演进方向决定了它的"第二曲线"。

作为架构师,我们对 MCP 应该保持三个态度:

  • 积极拥抱:MCP 是 LLM 工具协议的当下最优解,不要错过窗口期
  • 审慎乐观:MCP 还在演进,不把所有鸡蛋放一个篮子
  • 持续贡献:MCP 是开源的,贡献者定义标准

最后,把这篇文章的所有核心判断浓缩为一句话:"MCP 是 LLM 工具调用从'私有功能'走向'开放基础设施'的关键一跃,它用最简的协议设计(JSON-RPC + 能力协商 + 渐进增强),解决了 N×M 集成困境,并在生态中找到了自己的枢纽位置。理解 MCP 的最好方式不是看规范,而是看它为什么这样设计——背后的架构思维比任何具体 API 都更持久。"

愿 MCP 走向更广阔的未来。愿你成为这个未来的建设者

—— 明涛

2026年07月15日

「探索架构之美」系列 · 第 9 篇

"用最简单的协议,连接最复杂的智能。"

附录 N:MCP 代码示例精选(多语言)

本节用多种语言展示 MCP Server 的核心实现,让读者感受不同 SDK 的风格差异。代码是最真实的"语言"——读懂代码,比读懂文档更深入。

N.1 TypeScript SDK 示例

TypeScript 是 Anthropic 官方主推的 SDK 语言,与 Claude Desktop 同源。

TypeScript SDK:最简 MCP Server:

import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { CallToolRequestSchema, ListToolsRequestSchema } from "@modelcontextprotocol/sdk/types.js";

const server = new Server(
  { name: "weather-server", version: "1.0.0" },
  { capabilities: { tools: {} } }
);

server.setRequestHandler(ListToolsRequestSchema, async () => ({
  tools: [{
    name: "get_weather",
    description: "查询指定城市的天气",
    inputSchema: {
      type: "object",
      properties: { city: { type: "string" } },
      required: ["city"]
    }
  }]
}));

server.setRequestHandler(CallToolRequestSchema, async (request) => {
  if (request.params.name === "get_weather") {
    const city = request.params.arguments.city;
    return {
      content: [{
        type: "text",
        text: `${city} 天气:23°C,晴朗`
      }]
    };
  }
  throw new Error("Unknown tool");
});

const transport = new StdioServerTransport();
server.connect(transport);

N.2 Python SDK 示例

Python SDK 适合数据科学、ML 场景。

Python SDK:最简 MCP Server:

import asyncio
from mcp.server import Server
from mcp.server.stdio import stdio_server
from mcp.types import Tool, TextContent

app = Server("calculator-server")

@app.list_tools()
async def list_tools() -> list[Tool]:
    return [Tool(
        name="add",
        description="计算两个数字之和",
        inputSchema={
            "type": "object",
            "properties": {
                "a": {"type": "number"},
                "b": {"type": "number"}
            },
            "required": ["a", "b"]
        }
    )]

@app.call_tool()
async def call_tool(name: str, arguments: dict) -> list[TextContent]:
    if name == "add":
        result = arguments["a"] + arguments["b"]
        return [TextContent(type="text", text=f"结果:{result}")]
    raise ValueError(f"Unknown tool: {name}")

async def main():
    async with stdio_server() as (read, write):
        await app.run(read, write, app.create_initialization_options())

asyncio.run(main())

N.3 Rust SDK 示例

Rust SDK 适合性能敏感场景。

Rust SDK:最简 MCP Server:

use mcp_server::{Server, Tool, ToolSchema, StdioTransport};
use serde_json::json;

#[tokio::main]
async fn main() -> Result<(), Box> {
    let server = Server::new("hash-server")
        .with_tool(Tool::new(
            "sha256",
            "计算字符串的 SHA-256 哈希",
            ToolSchema::object()
                .property("input", ToolSchema::string())
                .required(["input"]),
            |args| async move {
                let input = args.get("input").and_then(|v| v.as_str()).unwrap_or("");
                use sha2::{Sha256, Digest};
                let mut hasher = Sha256::new();
                hasher.update(input);
                let result = format!("{:x}", hasher.finalize());
                Ok(json!({ "hash": result }))
            }
        ));

    let transport = StdioTransport::new();
    server.run(transport).await?;
    Ok(())
}

N.4 Go SDK 示例

Go SDK 适合云原生部署。

Go SDK:最简 MCP Server:

package main

import (
    "context"
    "fmt"
    "github.com/modelcontextprotocol/go-sdk/server"
)

func main() {
    s := server.NewServer(&server.Options{
        Name:    "echo-server",
        Version: "1.0.0",
    })

    s.RegisterTool("echo", "回显输入", func(ctx context.Context, args map[string]interface{}) (interface{}, error) {
        input, _ := args["text"].(string)
        return map[string]interface{}{"text": input}, nil
    })

    if err := s.ServeStdio(); err != nil {
        fmt.Println("Server error:", err)
    }
}

N.5 跨语言对比的洞察

从四个示例可以看出不同语言 SDK 的设计哲学:

语言风格适用场景性能开发效率
TypeScriptPromise/async-awaitWeb、Node 应用
Pythonasyncio + decorator数据科学、ML极高
Rust类型系统 + tokio性能敏感、安全关键极高
Gogoroutine + 简洁云原生、并发

不同语言 SDK 的API 高度对称——这是 MCP 协议设计的成功:无论你用什么语言,都能用类似的方式实现 Server这种"对称性"降低了多语言生态的学习成本

N.6 Host 集成示例

Server 写完后,需要 Host 集成。下面是 Claude Desktop 的配置示例:

Claude Desktop 配置文件:

macOS:~/Library/Application Support/Claude/claude_desktop_config.json
Windows:%APPDATA%\Claude\claude_desktop_config.json

{
  "mcpServers": {
    "weather": {
      "command": "node",
      "args": ["/path/to/weather-server.js"]
    },
    "calculator": {
      "command": "python",
      "args": ["-m", "calculator_server"]
    },
    "hash": {
      "command": "/path/to/hash-server"
    }
  }
}

配置完成后,Claude Desktop 会自动启动这些 Server,把它们的 Tools 暴露给 Claude。用户在与 Claude 对话时,可以直接调用这些工具,无需感知 MCP 协议的存在好协议的标志是"用户无感"——MCP 正在实现这一点。

附录 O:MCP 调试与排错指南

本节提供 MCP 调试与排错的实用技巧。调试是开发的"另一半"——写代码是上半,调代码是下半,缺一不可。

O.1 常见错误与解决方案

错误 1:Server 启动失败

  • 症状:Claude Desktop 显示 "MCP server failed to start"
  • 原因:通常是命令路径错误、依赖缺失、权限问题
  • 排查
    • 手动运行命令,看是否启动
    • 检查依赖(pip list / npm list)
    • 检查文件权限

错误 2:Tool 调用超时

  • 症状:Tool 调用超过 30 秒未返回
  • 原因:Tool 内部阻塞、网络慢、外部 API 慢
  • 排查
    • 检查 Tool 实现是否阻塞
    • 用 OpenTelemetry 看 Tool 内部耗时
    • 外部 API 是否需要更长 timeout

错误 3:能力协商失败

  • 症状:Server 启动但 Tool 不可用
  • 原因:Client 与 Server 能力不匹配
  • 排查
    • 查看 Server capabilities 声明
    • 查看 Client capabilities 声明
    • 检查 SDK 版本是否兼容

错误 4:JSON 序列化错误

  • 症状:返回 "Invalid params" 错误
  • 原因:参数类型不匹配、Schema 定义错误
  • 排查
    • 用 JSON Schema validator 验证 schema
    • 对比 Client 发送的 JSON 与 Server 期望的 JSON
    • 检查 enum、format、required 等约束

O.2 调试工具

常用调试工具:

  • MCP Inspector:官方调试工具,可视化查看 Server 状态
  • stdio 抓包:用 strace / Process Monitor 捕获 stdio 通信
  • Wireshark:HTTP 模式下的网络抓包
  • OpenTelemetry:生产环境的链路追踪
  • 日志:所有 SDK 都支持 logging capability

O.3 调试模式与生产模式的差异

开发 Server 时,建议开启"调试模式":

  • 详细日志:所有 JSON-RPC 消息记录到 stderr
  • 错误堆栈:未捕获异常完整堆栈
  • 性能指标:每个 Tool 调用的耗时、token 消耗

生产模式建议关闭:

  • 关闭详细日志:避免敏感信息泄露
  • 错误脱敏:错误堆栈只显示类别,不显示路径
  • 采样监控:只记录 1% 的请求,降本增效

O.4 性能调优 Checklist

性能调优的检查清单:

  • ☐ Tool 是否缓存相同输入的结果?
  • ☐ Tool 内部是否并行处理?
  • ☐ Tool 是否避免重复 IO?
  • ☐ Server 是否复用连接(连接池)?
  • ☐ JSON 消息是否最小化(不传输冗余字段)?
  • ☐ 长任务是否用流式响应?
  • ☐ LLM 上下文是否精简(裁剪长结果)?
  • ☐ Tool 描述是否简洁(减少 token 消耗)?

每打一个勾,性能就提升一点。完整的 checklist 能覆盖 80% 的性能问题。

O.5 故障转移与灾备

生产环境的 MCP 部署需要故障转移策略:

  • Server 故障:用 K8s 自动重启,无状态设计
  • LLM 故障:主备切换(Claude 4 + Claude 3.5)
  • 网络故障:指数退避重试 + 熔断
  • 数据丢失:定期备份 + 异地容灾

故障转移的目标是"用户无感"——任何单点故障都不应该影响最终用户。这是 SLA 的核心承诺

附录 P:MCP 协议与其他协议的映射关系

本节展示 MCP 协议与其他协议的映射关系,帮助从其他协议背景的读者快速理解 MCP。映射是学习的桥梁——从已知到未知,是最快学习路径。

P.1 MCP ↔ LSP 对应关系

MCP 与 LSP 在概念上高度相似,但角色不同:

概念LSPMCP差异说明
客户端编辑器(VS Code、Vim)Host 中的 Client(Claude Desktop)LSP Client 单一,MCP Client 多实例
服务端语言服务器(pylsp、gopls)MCP Server(File、Git、DB)类似,微服务化
能力协商ServerCapabilities、ClientCapabilitiescapabilities 字段类似
消息格式JSON-RPC 2.0JSON-RPC 2.0完全相同
传输stdio / WebSocketstdio / SSE / HTTP类似
原语textDocument、workspaceTools、Resources、Prompts不同(MCP 专为 LLM 优化
扩展机制Server 端扩展能力协商 + Skills类似

LSP 经验对 MCP 的启示:

  • 能力协商是关键:让 Server 自由扩展,Client 优雅降级
  • JSON-RPC 足够:不需要发明新协议
  • stdio 是默认:本地进程通信最简单
  • Server 实现多样性:每种语言都有实现

P.2 MCP ↔ OpenAPI 对应关系

OpenAPI 是 REST API 的描述规范,MCP 的 Tool 描述与之有相似:

概念OpenAPIMCP Tool差异
端点定义pathstools命名不同
参数描述parametersinputSchema类似
响应描述responsesresult.content不同
认证securitySchemesenv / Headers不同
传输HTTPstdio/SSE/HTTPMCP 更灵活
目标人读 API 文档机器读 Tool 能力不同

从 OpenAPI 迁移到 MCP 的常见路径:

  1. 把 OpenAPI 文档转换为 MCP Tool 定义(用工具或脚本)
  2. 实现 Tool handler,调用原来的 REST API
  3. 在 Claude Desktop 中测试
  4. 优化 Tool 描述,让 LLM 更容易理解

P.3 MCP ↔ gRPC 对应关系

gRPC 是高性能 RPC 框架,与 MCP 在协议层完全不同

维度gRPCMCP
序列化Protobuf(二进制)JSON(文本)
传输HTTP/2stdio/SSE/HTTP
性能高(10x HTTP+JSON)中等
可读性低(需工具)高(人类可读)
Schemaproto 文件JSON Schema
流式原生支持支持(按需升级)
生态成熟(10+ 年)早期(2 年)

选型建议:

  • 性能敏感:选 gRPC(高频、内部通信)
  • 生态友好:选 MCP(LLM 工具、多语言)
  • 混合架构:内部用 gRPC,对外用 MCP

P.4 MCP ↔ GraphQL 对应关系

GraphQL 是 Facebook 推出的查询语言,与 MCP 有相似之处

维度GraphQLMCP
SchemaSDL(强类型)JSON Schema(弱类型)
查询query / mutationtools/call / resources/read
订阅subscriptionresources/subscribe
传输HTTP / WebSocketstdio / SSE / HTTP
类型系统弱(运行时校验)
应用场景前端 APILLM 工具

GraphQL 给 MCP 的启示:

  • 类型系统是趋势:未来 MCP 可能引入 TypeScript-like 类型
  • 订阅模式重要:实时数据推送是必备能力
  • Schema 演进:向后兼容是核心

P.5 MCP 与其他协议的边界

理解 MCP 与其他协议的边界,能避免"协议混淆":

  • MCP 不是 LLM 协议:LLM 推理用 OpenAI/Anthropic API,MCP 关心工具调用
  • MCP 不是 Agent 框架:Agent 编排用 LangChain/AutoGen,MCP 关心工具通信
  • MCP 不是 API 网关:API 网关心路由聚合,MCP 关心工具能力描述
  • MCP 不是消息队列:消息队列关心异步消息,MCP 关心同步调用

清晰的边界是协议长寿的基础——MCP 不试图解决所有问题,只做好一件事