MCP 协议 2026 新特性与生产实战
MCP 协议 2026 新特性与生产实战
一、问题背景:为什么 LLM 与外部工具需要一套协议
在大模型落地工程中,”让模型能调用工具”是 Agent 化的核心命题。2024 年之前,业界普遍的做法是各家框架(LangChain、AutoGen、CrewAI、各家 IDE 插件)各自定义 Tool Calling 格式:OpenAI 用 function_call 的 JSON Schema、Anthropic 用 tool_use 的 XML 嵌套、Google 又换了一套。如果一个 SaaS 想把自己的能力(”查订单”、”发工单”、”读 Jira”)接入到所有客户端,面临的就是经典的 N×M 集成问题——N 个客户端对接 M 个工具,需要写 N×M 套适配器。
MCP(Model Context Protocol)的提出正是为了把这条曲线压平:把”工具”和”上下文”做成一等公民的协议原语,让任何 LLM 应用(Host)通过标准协议与任何能力服务(Server)通信,工具提供方只需要实现一次 Server,即可被所有 Host 调用。这就是 LSP(Language Server Protocol)在 AI 时代的翻版——LSP 让 Neovim、VSCode、Emacs 共享一套语言服务实现,MCP 同样让 Claude Desktop、Cursor、Continue、自研 Agent 共享一套工具服务实现。
MCP 的第一个稳定版(2025-06-18)由 Anthropic 主导开源并联合 OpenAI、Google、Block、Replit 等 30+ 厂商成立治理委员会。2025-11-25 版本加入了 OAuth 2.1 标准化鉴权、Resource Templates、Elicitation 主动询问机制,并把传输层从 HTTP+SSE 重构为 Streamable HTTP。2026 年(截至 06-03)规范在生态治理、UI 扩展、Async Tasks 等方向继续演进。
二、MCP 核心架构:Host / Client / Server 与 JSON-RPC 2.0
MCP 采用经典三层架构,所有通信都基于 JSON-RPC 2.0 协议:
- Host:发起连接的一方,是 LLM 应用本身(Claude Desktop、Cursor、JetBrains AI Assistant、Spring AI Agent 等)。它管理一个或多个 Client。
- Client:在 Host 进程内运行,与远端 Server 维持 1:1 长连接。Client 的职责是协议解析、能力协商、消息路由,不做任何业务逻辑。
- Server:暴露 Resources / Prompts / Tools 三类原语的服务进程。它不知道背后接的是 GPT 还是 Claude,只管按 JSON-RPC 协议回应请求。
1 | ┌─────────────────────────────┐ |
底层 JSON-RPC 2.0 选型并非偶然。JSON-RPC 的无状态、单连接多请求、id 关联的特性正好契合 LLM 工具调用的”一次 prompt 触发多次工具调用”的模式。Google 的 A2A 协议选择了 gRPC/Protobuf + HTTP/2,而 MCP 坚守 JSON/JSON-RPC,背后的取舍是 生态兼容优先——任何语言 5 分钟内能写完 SDK,HTTP/JSON 天然穿透反向代理、CDN、API 网关。
三、2026 协议层新特性深度拆解
3.1 Streamable HTTP:彻底重构传输层
2024-11-05 版本的 MCP 使用 HTTP+SSE(Server-Sent Events)做服务端到客户端的推送。这种模式有两个生产痛点:
- 长连接吞噬服务器资源:每个 Client 都要独占一条 SSE 长连接,在云原生环境下,K8s Pod 数 = 客户端数,资源水位极高。
- 断连重放语义模糊:SSE 自带
Last-Event-ID但缺乏标准的 resume 协议,断线后状态恢复完全由应用自己处理。 - 不友好的中间件生态:Nginx、API Gateway 对 SSE 的超时、缓冲策略默认不友好,常常需要
proxy_buffering off、proxy_read_timeout 3600s之类的魔改。
2025-06-18 规范正式引入 Streamable HTTP 取代 HTTP+SSE,2026 年已经稳定。核心变化:
- 单端点、双方法:Server 只暴露一个 URL(例
https://api.example.com/mcp),同时支持POST和GET。 POST的两种返回模式:客户端用Accept: application/json, text/event-stream表达”我两种都能收”。Server 可以选择:简单请求直接Content-Type: application/json一次性返回 JSON;流式响应则升级为text/event-stream。这是 Streamable HTTP 的精髓——流式是可选的,不强制。GET订阅流:客户端可以不带 body 发起GET来”订阅”Server 主动推送(通知、异步结果),这是单向server→client的通道。- 可恢复性(Resumability):Server 在断开前可以发带
id的 SSE 事件,客户端重连时通过Last-Event-ID头 resume。 - 会话可选:Server 可以决定是否发
Mcp-Session-Id头启用有状态会话,纯无状态工具(翻译、计算)连会话头都不用发。
1 | # 客户端发送带 streaming 能力的请求 |
Why this design:设计哲学是”HTTP 是一等公民,SSE 是可选加速器”。这让 MCP Server 能直接跑在 Lambda、Cloud Run Workers、Vercel Functions 这类无服务器平台上——以前 SSE 长连接根本跑不起来。
3.2 OAuth 2.1:把鉴权从”魔法字符串”变成”工业级”
2025-11-25 之前,MCP Server 的鉴权是”各显神通”:有的用静态 API Key,有的直接读 HTTP Header,没有任何标准。这导致两个问题:
- 用户无法用同一个 Token 在多个 Host 之间漫游(Claude Desktop 不能用企业 SSO 发的 JWT 调内部 Jira MCP Server)。
- 工具提供方无法实现细粒度的 Scope 授权(”这个 Token 只能读不能写”)。
2025-11-25 规范把鉴权统一为 OAuth 2.1(基于 IETF draft-ietf-oauth-v2-1) + 三个配套 RFC:
| 规范 | 作用 |
|---|---|
| RFC 8414 | Authorization Server Metadata,客户端发现 /metadata 端点 |
| RFC 9728 | Protected Resource Metadata,MCP Server 声明”我受哪个 AS 保护” |
| RFC 7591 | Dynamic Client Registration,让 Host 端能自动注册 OAuth Client |
| draft-ietf-oauth-client-id-metadata-document | 用 URL 作为 Client ID,免去注册流程 |
关键工作流:
1 | 1. Host 调 MCP Server 的任意受保护端点 |
Why this design:不发明新协议,复用 OAuth 2.1 这套已经被 IdP(Okta、Auth0、Keycloak、企业自建 CAS)成熟实现的体系。Client ID Metadata Documents 这个新草案允许 Host 把自己的 logo、policy 托管到一个 URL,Server 直接通过 URL 注册 Client——这是 2026 年的关键 UX 改进。
3.3 UI Extensions:把工具调用从”纯文本”升级为”富交互”
2025 规范里 Server 只能返回 text 或 image 内容块。2026 年规范加入了 UI Extensions(draft-spec 阶段),允许 Tool 的返回结果携带结构化的 UI 描述:
ui://schema:声明返回的是 UI 组件树(类似 React JSON Schema)application/json+ui:MIME type 携带可渲染的 UI payloadui://interactive:声明支持用户点击后回传(例:地图选择器、文件选择器)
1 | { |
Host 端的渲染器(Webview、Electron、SwiftUI)按 spec 渲染成原生组件,用户交互后通过 Elicitation 机制把结果回传给 Server。
Why this design:避免 Server 返回 10MB 的 base64 图片或 markdown 表格,让 Host 用原生 UI 组件渲染——既降 token 成本又提交互质量。Mapbox、File Picker、Date Range 这类高频 UI 终于不用每个 Agent 各写一份。
3.4 Resource Templates:从”固定路径”到”参数化资源”
旧规范里 Resource 是固定 URI(如 file:///docs/readme.md)。2025-11-25 加入 ResourceTemplate:
1 | # 声明一个模板 |
Host 端 LLM 可以做”参数绑定”:根据用户问句自动填充 city=Beijing, date=2026-06-03 并发起 resources/read。2026 年进一步支持:
- 多参数模板:
db://{schema}/{table}/{id} - 可选段:
docs://{lang}/{path*}(lang可缺省,path*捕获多级) - List 操作的模板感知:
resources/templates/list返回可用模板列表,LLM 推理时把模板当作”可调用的能力”。
3.5 Async Tasks 与 Server-Initiated Requests
传统 MCP 是”请求-响应”模型,但很多工具调用是长任务(视频转码、批量 ETL)。2026 规范加入:
tasks/create+tasks/result:把工具调用建模为 task,Client 立即拿到task_id,Server 在后台执行,完成后通过 SSE 或 Webhook 推送结果。- Server-Initiated Sampling:Server 在执行长任务时主动调 LLM 推理(例:让 LLM 总结转码结果),这是 2025 规范就有但 2026 加了完整的 Progress Notification 协议——
notifications/progress携带progressToken和progress数值(0-100)。
1 | // Server 推送进度 |
四、Python 实战:官方 SDK 1.x 写文件系统 MCP Server
为什么用文件系统做示例:足够简单、能覆盖 Resources / Tools / Prompts 三大原语、不依赖外部服务,方便复制即跑。
1 | # file_mcp_server.py |
逐行讲解:
safe_resolve:所有路径操作的前置守卫。MCP 的安全模型里,Server 自身就是最后一道防线——Host 的沙箱可能并不可信。ResourcevsResourceTemplatevsTool的区别:Resource 是被动数据,LLM 主动read;Tool 是 LLM 主动 invoke 的副作用动作;Prompt 是”提示词模板”,Host 把变量填入后注入到对话。transport="streamable-http":2026 推荐。stdio 仍然保留给 Claude Desktop 这类本机进程集成。- 异常处理:MCP SDK 会自动把 Python 异常转成
JSON-RPC error返回,无需手动包装。
五、Java 实战:Spring AI MCP Starter 1.0+ 企业级实现
为什么用 Spring AI:Spring AI 1.0 GA(2025-Q4)正式把 MCP 纳入第一方支持,提供 spring-ai-starter-mcp-server 自动配置,比手写 JSON-RPC 节省 80% 样板代码。
5.1 Maven 依赖
1 | <dependencies> |
5.2 业务实现:Jira 工单 MCP Server
1 | // JiraTools.java |
5.3 配置:application.yml
1 | spring: |
5.4 Spring Security 集成:保护 MCP 端点
1 | // SecurityConfig.java |
逐行讲解:
transport: streamable_http:明确启用 2026 推荐传输。Spring AI 默认就是它,但写出来是反”魔法配置”的最佳实践。oauth2ResourceServer.jwt:让 MCP Server 作为 OAuth 2.1 Resource Server 验证 Bearer Token。每个 Tool 调用都会自动经过 Spring Security 过滤器,Token 里的scope字段可以映射到方法级权限(用@PreAuthorize)。csrf.disable():Streamable HTTP 是无状态 API,不需要 CSRF 保护。cors严格白名单:Streamable HTTP 最大的攻击面是 DNS rebinding + 跨 Origin 攻击,必须把允许的 Host 列清楚。
六、生产实践:鉴权、限流、可观测性、Token 成本
6.1 鉴权分层
- L1 传输层:mTLS 或 CloudFront/ALB 层的 IP 白名单,挡掉 90% 扫描流量。
- L2 协议层:OAuth 2.1 Bearer Token,由 IdP 签发。这是 MCP 规范规定的”必备”。
- L3 应用层:每个 Tool 方法上的
@PreAuthorize("hasAuthority('SCOPE_jira:write')"),把 Scope 映射到方法权限。
6.2 限流
MCP 的限流不能用传统 QPS 思维,因为一个用户的一次 LLM 调用可能触发 5-20 次 Tool Call。应该按 Session 维度 限流:
1 | // Resilience4j 限流配置 |
把 Mcp-Session-Id 作为限流 key,而非 IP。一个真实用户用一个会话执行 100 次工具调用是合理的;用 100 个 IP 各调 1 次是攻击。
6.3 可观测性
必须打的关键 Span:
mcp.request:JSON-RPC 方法名、id、durationmcp.tool.call:Tool 名称、参数摘要(脱敏后)、返回大小mcp.token.usage:每个 Tool 的输入输出 token 计数——这是成本黑洞
1 | // Micrometer + OpenTelemetry |
把 trace 接到 Jaeger/Tempo,关联到上游 LLM 的 trace——这样一次完整 Agent 调用的成本、延迟、调用链一目了然。
6.4 Token 成本控制
MCP 最大的隐藏成本是把 Tool 返回灌进 LLM 的 context window。三招降本:
- 返回截断:
read_file类工具默认只返回前 2000 token,超出返回truncated: true标志。 - 摘要回写:在 Server 端先 LLM 摘要一次再返回(”小模型预处理”模式)。
- 结构化输出:让 Tool 返回 JSON 而非自然语言,JSON 在 prompt 里能更紧凑。
七、避坑指南:5 个常见坑
DNS Rebinding 攻击:Streamable HTTP 的致命陷阱。开发时本地 Server 习惯绑
0.0.0.0,生产必须127.0.0.1(本机)或加严格的OriginHeader 校验。规范明确要求”Origin 头无效必须 403”。stdio 的 stdout 污染:stdio 模式下 Server 进程
print("debug info")到 stdout 会破坏 JSON-RPC 帧。所有日志必须走 stderr。Python 用logging.StreamHandler(sys.stderr),Java 用logback的target=System.err。会话状态丢失:Streamable HTTP 默认无状态,工具调用间的上下文(如”上一步查到的工单 ID”)不能依赖 Server 内存。要么让 LLM 把状态塞回 prompt,要么改用 Database Session。
Tool 描述质量:LLM 决定调哪个 Tool,靠的就是
@Tool(description=...)里的自然语言。描述模糊会导致 LLM 永远不调或乱调。规范建议 description 包含:”何时调用 + 输入是什么 + 返回什么 + 一个调用示例”。OAuth Scope 粒度爆炸:给每个 Tool 一个独立 Scope 会导致用户授权体验极差。正确做法是按”资源域”分组(
jira:read/jira:write/db:read),一个域下所有 Tool 共享。
八、思想总结:MCP 之于 Agent 的真正价值
MCP 的成功不只在协议本身,而在它赌对了一个生态命题:Agent 时代的能力复用范式,必须从”私有插件”走向”开放协议”。LSP 让 Neovim 在 10 年前能共享 Clangd 这种重量级语言服务,MCP 让 Claude/Cursor/自研 Agent 在 2026 年能共享任何 SaaS 能力。
对工程师而言,MCP 的真正价值在于 把”集成工作”从项目级降为配置级——以前给一个 Agent 接入 Jira 需要写 200 行胶水代码,现在只需要在 Cursor 的 MCP 配置里加 5 行 JSON。对架构师而言,MCP 给了我们”在 LLM 之上搭中台”的标准化抓手:所有业务能力封装为 MCP Server,前端 LLM 应用不再关心数据在哪、API 怎么调。
2026 年的 MCP 仍在快速演进,下一阶段值得关注的方向是:
- 多模态 Tool Return:返回原生音视频流而非 base64。
- 联邦发现:跨组织的 MCP Server 注册表(类似 Maven Central for Tools)。
- 沙箱执行:让 Server 能直接执行用户提供的代码片段,类似 Jupyter Kernel。
但万变不离其宗——协议先行、生态跟上、商业模式自然涌现。这正是 30 年前 HTTP、20 年前 REST、10 年前 gRPC 走过的路。MCP 正在走同一条路,而我们这代工程师,正站在它从玩具走向生产的关键节点上。
说明:本文基于 2025-11-25 MCP 规范(已落地)以及 2026 年规范草案(Streamable HTTP 稳定化、UI Extensions、Async Tasks)整理,部分 2026 演进方向基于已公开的 SEP(Specification Enhancement Proposal)做合理推断。生产落地时请以 modelcontextprotocol.io 最新规范为准。