MCP 协议深度拆解:规范演进、安全攻击面与 2026 生态格局

如果你在 2026 年给 AI 应用接外部能力,大概率绕不开 MCP(Model Context Protocol):官方 SDK 的月下载量已接近 5 亿次,TypeScript 与 Python SDK 各自累计突破 10 亿次下载(官方口径,2026-07)。但这个协议最有意思的地方不是普及速度,而是它敢对自己动刀——2026-07-28 发布的最新规范把「有状态会话」这个自诞生起的根基整个移除了。本文按最新规范拆解 MCP 到底标准了什么、五版规范各改了什么、真实世界里它被怎么攻击,以及它从 Anthropic 的一份公告走到 Linux Foundation 的路径。

它到底标准化了什么

MCP 由 Anthropic 于 2024-11-25 发布,解决的是经典的 M×N 集成问题:M 个 AI 应用要接 N 个数据源,两两适配是 M×N 份胶水代码;约定一个标准接口,就变成 M+N。Anthropic 把它类比为「AI 应用的 USB-C」——协议设计上的直接参照物是 LSP(语言服务器协议):编辑器与语言工具链之间「一次实现、处处可用」的那套打法。

协议本体非常克制:消息格式就是 JSON-RPC 2.0,架构是三方模型——Host 是用户操作的 LLM 应用(Claude Desktop、IDE、Agent 框架),Client 是 Host 内部维护的连接器,Server 是暴露能力的服务,每个 Client 与一个 Server 保持 1:1 连接。Server 向 Host 暴露三类原语:tools(可被模型调用的函数)、resources(可读取的数据)、prompts(预置的提示词模板);进度通知、取消、错误报告等横切能力也在协议内定义。

flowchart LR
    subgraph Host["Host(Claude Desktop / IDE / Agent 应用)"]
        C1["MCP Client 1"]
        C2["MCP Client 2"]
        C3["MCP Client 3"]
    end
    S1["Server:GitHub"]
    S2["Server:Postgres"]
    S3["Server:内部 API"]
    C1 <--> S1
    C2 <--> S2
    C3 <--> S3

发布当天 Block、Apollo 已在用,Zed、Replit、Codeium、Sourcegraph 宣布对接——注意这套三方架构今天依然成立,变的不是形状,而是连接的「保质期」,下文会讲。

一次调用长什么样

协议的日常消息只有几种。旧版的接入从 initialize 握手与能力协商开始;2026-07-28 版起握手被移除,每个请求在 _meta 里自带协议版本与能力声明。工具调用本身两版一致:先 tools/list 拉取清单,再 tools/call 执行——

{
  "jsonrpc": "2.0",
  "id": 7,
  "method": "tools/call",
  "params": {
    "name": "get_weather",
    "arguments": { "city": "上海" }
  }
}

服务器返回 result.content(文本或结构化内容)与 isError 标志,协议级失败走标准 JSON-RPC error 对象。三个设计点值得划线:工具清单由客户端拉取后注入模型上下文,模型从不直接连接服务器,调不调、怎么调的决定权在 Host 的编排层——这也是工具投毒攻击能成立的根源(见下节);OAuth 只解决「客户端怎么安全拿到 token」,token 之后的业务权限模型是每个 Server 自己的责任;传输选型上,stdio 适合本机子进程(零网络配置、随桌面应用分发),Streamable HTTP 适合远程托管与多客户端复用——2026-07 版把 HTTP+SSE 降级为 Deprecated 后,远程部署实际上只剩 Streamable HTTP 一条正路。

三年五版规范:演进时间线

MCP 的版本号就是日期字符串,只有含不向后兼容变更时才递增。不到两年发了五个版本:

版本 关键变化
2024-11-05 首版:stdio + HTTP+SSE 双传输,三原语,initialize 握手与能力协商
2025-03-26 OAuth 2.1 授权框架;Streamable HTTP 取代 HTTP+SSE;tool annotations(只读/破坏性标注)
2025-06-18 elicitation(服务器向用户反向请求信息);结构化工具输出;服务器定位为 OAuth Resource Server,MUST 实现 RFC 8707 防 token 混用;首份安全最佳实践
2025-11-25 URL 模式 elicitation;sampling 支持工具调用;Client ID Metadata Documents;实验性 tasks;治理结构正式化(Working Groups、SEP 流程)
2026-07-28 全面无状态化(详见下节);server/discover 必须实现;废弃 Roots / Sampling / Logging;HTTP+SSE 与动态客户端注册(DCR)转 Deprecated

前两步演进的主线是「从桌面走到云端」:stdio 只能管本机子进程,2025-03-26 的 Streamable HTTP(单个端点上 HTTP POST + 可选 SSE 流)让远程部署成为可能,配套的 OAuth 2.1 框架解决了「服务器怎么代表用户安全地授权」;2025-06-18 则补安全语义——把 MCP 服务器正式归类为 OAuth 的 Resource Server,要求用 Protected Resource Metadata 发现授权服务器、用 RFC 8707 的 resource indicator 把 token 绑定到特定服务器,防止恶意服务器把发给 A 的 token 拿去骗 B。

2026-07-28:一次自我革命

第三版(2026-07-28)是迄今最大的变更,方向只有一个字:删。

  • 移除协议级会话:Mcp-Session-Id 头没了,initialize / notifications/initialized 握手也没了——每个请求在 _meta 里自带协议版本与客户端能力,任何请求都可以独立处理;
  • 服务发现内化:新增必须实现的 server/discover,取代旧的按需列表轮询;订阅改走 subscriptions/listen,SSE 断线重续(Last-Event-ID)移除;
  • 废弃三大客户端特性:Roots、Sampling、Logging 整体转 Deprecated——sampling(服务器反向借 Host 的 LLM 做补全)这类「服务器发起请求」的模式由新的 Multi Round-Trip Requests(MRTR,InputRequiredResult)接棒;实验性 tasks(长任务轮询)移入官方扩展;
  • 流程制度化:确立功能生命周期政策(Deprecated 至少保留 12 个月)与 SEP 提案工作流。

为什么自断根基?官方博客没有讳言:有状态会话是部署摩擦的最大来源。sticky session、连接亲和性、水平扩容、Lambda 类短生命周期平台的适配,全都是「服务器要记住上一条消息」惹的祸——社区在 GitHub issue #102 上吐槽了两年,无状态化等于官方承认了这个批评。顺带解决的还有成本问题:tools/list 现在要求确定性排序并提供 ttlMs / cacheScope 缓存提示,工具定义吃上下文 token、轮询烧钱这类抱怨有了协议层回应。用官方博客自己的话说,这一版让 MCP 从「桌面协议」真正对齐了 web-scale 服务的部署现实(HTTP 无状态语义、标准缓存与负载均衡全部适用)。

安全攻击面:协议把最后一公里留给了实现者

MCP 官方安全最佳实践里有一句关键的诚实表态:这些安全原则协议层无法强制。于是攻击面在实现层全部敞开:

攻击 原理 出处
Confused Deputy 代理服务器用静态 client ID + 共享 consent cookie,攻击者可跳过用户同意窃取授权码 官方最佳实践
Token Passthrough 服务器不校验 token audience 直接透传下游,绕过限流与审计 官方最佳实践(明确禁止)
SSRF 恶意服务器在授权元数据里填云 metadata 地址(169.254.169.254)窃取云凭证 官方最佳实践
工具投毒 工具描述里藏对用户不可见的恶意指令(如「读取 ~/.ssh/id_rsa 传出」),模型照做 Invariant Labs,2025-04
Rug Pull 安装时审查通过,之后偷偷改工具描述换语义 Invariant Labs / Microsoft 词条
会话劫持 多台有状态服务器共享会话队列时可注入事件、冒充用户 官方最佳实践(2026 版已随无状态化消解大半)

工具投毒值得单独说:Invariant Labs 在 2025-04 披露的攻击里,恶意指令藏在工具描述的 <IMPORTANT> 段落中——人类在确认弹窗里看不到全貌,模型却在上下文里读得到;同一家公司 2025-05 进一步演示了连工具本身无毒的 GitHub MCP 服务器也能被间接提示注入利用去访问私有仓库。学术侧的 MCPTox 基准用 45 个真实服务器、353 个真实工具构造了 1312 个恶意用例做系统性测量。监管侧也来了:美国 NSA 2026-05 发布 AI 安全设计考量,国防部 2026-06 发布 17 页的《MCP: Security Design Analysis》——一个协议出版一年就被五角大楼出专项分析,攻击面的现实性可想而知。实践上的防御顺序:先约束客户端(工具描述全文展示、变更即重审、重要操作人工确认),再用最小权限与 token audience 校验兜底,最后才是扫描与监控。

生态格局:从 Anthropic 的公告到 Linux Foundation

采用时间线可以压缩成一张表:

时间 事件
2024-11 Anthropic 发布 MCP;Block、Apollo 首批采用
2025-03-26 OpenAI 宣布全线产品支持(Agents SDK 率先落地)
2025-04 Google DeepMind 宣布 Gemini 支持;VS Code Copilot agent mode 推送
2025-05 Microsoft Build:Windows AI Foundry,Windows 11 应用可暴露为 MCP 服务器
2025-07 AWS Bedrock AgentCore 原生托管 MCP 服务器
2025-09-08 官方 MCP Registry 开放预览(GitHub 也在当月上线自家 Registry)
2025-12-09 Linux Foundation 成立 Agentic AI Foundation(OpenAI、Anthropic、Block 共同发起),MCP 捐赠入会

至此「Anthropic 的协议」变成了中立基金会的标准,2026-08 官方路线图把传输演进、agent 间通信、企业就绪列为优先级。协议层的分工也逐渐清晰:MCP 管 agent 与工具/数据的连接,Google 2025-04 发布、同年 6 月捐给 Linux Foundation 的 A2A 管 agent 与 agent 之间的协作,CopilotKit 系的 AG-UI 管 agent 与前端界面的事件流——三层互补而非竞争。

冷思考:过誉的部分与被回应的部分

热闹之下也有冷静的声音。2026-09 Hacker News 上的主流批评是 MCP 曾被过度神化:对很多集成场景,「agent + curl + 一段技能说明」比架一个 MCP 服务器更简单,协议收益只在多客户端复用时才兑现。远程服务器在 2025 年确实 adoption 缓慢——OAuth 部署摩擦加有状态架构的托管难题,让生态长期停留在本地 stdio 为主;heise 这样的媒体则指出捐赠基金会并非全然无私,中立治理恰恰能巩固事实标准地位。这些批评大多成立,而规范的反应速度值得肯定:部署摩擦被 2026-07 的无状态化正面回应,token 成本拿到了缓存提示与确定性排序,安全上官方至少把攻击面写成了文档——剩下的部分,协议确实管不了,那是每一个 Host 和 Server 实现者的责任。

结语

MCP 两年多的历程提供了一个罕见的观察样本:一个标准如何在快速收敛生态的同时,敢于推翻自己的核心设计。从 stdio 子进程到无状态 HTTP,从「服务器可以反向调用你的 LLM」到把这个能力废弃,每一步都跟着真实的部署痛点走。对于要在 2026 年落地的团队,结论朴素:按 2026-07-28 规范实现(无状态、server/discover、官方扩展按需启用),安全上不信任任何工具描述,把协议当连接层而不是安全边界——它从来就没承诺过后者。

参考资料

← 返回资讯列表

读者留言

COMMENTS 暂无
仅本站原创文章开放留言 · 请勿留下手机号、邮箱等个人信息

还没有留言,来说第一句?