MCP 2026 大升级:无状态架构、MRTR 多轮往返与企业托管授权实战指南
> 2026 年 7 月 28 日,MCP(Model Context Protocol)将迎来自 2024 年底发布以来最大规模的规范修订。协议核心从有状态握手架构全面转向无状态模型,新增 MRTR 多轮往返请求模式、EMA 企业托管授权正式稳定、MCP Apps 交互式 UI 扩展上线,IETF 同步推进 MCP over MOQT 标准化。本文将从技术原理、代码实战和迁移路径三个维度,帮你全面掌握这次升级。
引言
如果你曾维护过生产环境的远程 MCP Server,大概率经历过这些痛点:会话亲和性(Session Affinity)让水平扩展步履维艰,initialize 握手增加了接入成本,每个员工都要为每个 MCP Server 单独走一遍 OAuth 授权流程。
2026 年 5 月 21 日,MCP 官方锁定了 2026-07-28 Release Candidate,7 月 28 日正式发布。这是一次系统性重构——六个 SEP(Specification Enhancement Proposals)协同工作,将协议核心彻底转变为无状态架构。Beta SDK 已同步发布(TypeScript、Python、Go、C#),Anthropic、Microsoft、Okta 等已率先落地 EMA 扩展。
本文将覆盖三大核心变更:无状态架构、MRTR 模式、EMA 企业托管授权,并提供可直接运行的 TypeScript 和 Python 代码示例,以及从旧版本迁移的实操步骤。
背景与动机
MCP 传输层演进
MCP 的传输层经历了清晰的演进路径:
- STDIO(2024 年底):最初版本,客户端与服务端通过标准输入输出通信,天然有状态,仅限本地进程间调用。
- Streamable HTTP(2025-03-26):引入 HTTP 传输,但保留了
initialize握手和Mcp-Session-Id会话头,远程部署需要粘性会话或共享会话存储(如 Redis)。 - 无状态 HTTP(2026-07-28):移除协议级会话,每个请求自包含全部上下文,可被任意服务端实例处理。
为什么需要这次重构
旧架构在三个层面暴露了结构性瓶颈:
- 接入成本:任何 MCP 客户端在调用工具前必须先完成握手。对于 CLI 工具、自动化脚本等场景,这层前置交互是不必要的复杂度。
- 集群扩展:
Mcp-Session-Id将客户端绑定到特定实例,水平部署要么依赖粘性路由(破坏弹性伸缩),要么引入集中式会话存储(增加运维负担)。 - 企业授权:每个用户为每个 Server 单独授权,安全团队无法集中管控,个人账号与企业账号混淆无解。
核心变更详解
1. 无状态架构
#### 移除 initialize 握手与协议级会话
这是最根本的变化。initialize/initialized 握手(SEP-2575)和 Mcp-Session-Id 头(SEP-2567)均被移除。每个请求在 _meta 字段中自包含协议版本、客户端身份和能力声明:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "search",
"arguments": { "q": "otters" },
"_meta": {
"io.modelcontextprotocol/protocolVersion": "2026-07-28",
"io.modelcontextprotocol/clientInfo": {
"name": "my-app",
"version": "1.0.0"
}
}
}
}
#### HTTP 请求头路由
新协议要求每个请求携带 Mcp-Method 和 Mcp-Name 头(SEP-2243),网关和负载均衡器无需解析 Body 即可路由:
POST /mcp HTTP/1.1
MCP-Protocol-Version: 2026-07-28
Mcp-Method: tools/call
Mcp-Name: search
Content-Type: application/json
#### 显式句柄模式(Explicit Handle Pattern)
无状态不等于无状态应用。需要跨调用保持状态的 Server 可以通过工具返回标识符(如 basket_id、session_id),模型在后续调用中作为普通参数传回。这使得状态对模型可见,而非隐藏在传输元数据中。
#### 缓存与追踪
tools/list 和资源读取响应新增 ttlMs 和 cacheScope(SEP-2549),客户端可据此缓存。W3C Trace Context 传播规范(SEP-414)也正式写入规范,traceparent、tracestate、baggage 键名固定,支持跨 SDK 和网关的分布式追踪。
2. MRTR 多轮往返请求模式
Multi Round-Trip Requests(SEP-2322)重新定义了服务端与客户端的交互方式。
旧模式的问题:服务端需要向客户端索要额外信息时,依赖 SSE 长连接发送反向请求(如 sampling/createMessage),在 HTTP 模式下实现复杂。
MRTR 模式的解法:服务端在响应中返回 InputRequiredResult,描述需要的信息;客户端收集答案后,携带 inputResponses 和 requestState 重新发起请求。
{
"resultType": "inputRequired",
"inputRequests": {
"confirm": {
"type": "elicitation",
"message": "确认删除这 3 个文件?",
"schema": { "type": "boolean" }
}
},
"requestState": "eyJzdGVwIjoxLCJmaWxlcyI6WyJhIiwiYiIsImMiXX0="
}
关键设计:requestState 是不透明的服务端状态令牌,任何实例都可以解码处理,完美契合无状态架构。
3. EMA 企业托管授权
Enterprise-Managed Authorization(EMA)扩展正式稳定(2026 年 6 月 18 日),核心解决企业场景下的授权难题。
工作原理:
- 组织管理员在 IdP(如 Okta)中定义 MCP Server 访问策略。
- 用户通过 SSO 登录 MCP Host(如 Claude、VS Code)。
- 客户端从 IdP 获取 Identity Assertion JWT Authorization Grant(ID-JAG)。
- 客户端用 ID-JAG 向 MCP Server 的授权服务器交换 Access Token。
- 用户无需为每个 Server 单独走 OAuth 授权流程。
三重收益:
- 授权一次,全局继承:管理员启用 Server 后,用户自动获得访问权限。
- 集中策略与审计:访问决策统一在 IdP 管理控制台,可审计。
- 消除个人/企业混用:移除交互式账号选择步骤,降低数据泄露风险。
已支持的生态:Anthropic(Claude / Claude Code)、Microsoft(VS Code)、Okta(XAA)、以及 Asana、Atlassian、Canva、Figma、Linear、Slack 等数十个 Server 已支持 EMA。
其他重要变更
| 变更 | 说明 |
|---|---|
| MCP Apps 扩展 | 工具可返回交互式 HTML UI 组件,在 Host 的沙箱 iframe 中渲染 |
| Tasks 扩展 | 从实验性核心功能升级为独立扩展,适配无状态模型 |
| Roots / Sampling / Logging 废弃 | 替代方案:工具参数传递路径、直接调用 LLM API、OpenTelemetry |
| 完整 JSON Schema 2020-12 | 工具 inputSchema 支持组合(oneOf/anyOf/allOf)、条件、引用 |
| MCP over MOQT | IETF draft 推进中,探索基于 QUIC 的 pub/sub 传输 |
| 错误码标准化 | 缺失资源错误码从 -32002 改为 JSON-RPC 标准 -32602 |
代码实战
搭建无状态 MCP Server
#### TypeScript 示例
TypeScript v2 SDK 采用分包架构:@modelcontextprotocol/server、@modelcontextprotocol/client,支持 ESM-only,兼容 Node.js 20+、Bun 和 Deno。
// server.ts — 无状态 MCP Server
import { McpServer } from "@modelcontextprotocol/server";
import { StdioServerTransport } from "@modelcontextprotocol/server/stdio";
import * as z from "zod/v4";
const server = new McpServer({
name: "weather-server",
version: "1.0.0",
});
// 注册工具:查询天气
server.registerTool(
"get_weather",
{
description: "获取指定城市的天气信息",
inputSchema: z.object({
city: z.string().describe("城市名称"),
}),
},
async ({ city }) => ({
content: [
{
type: "text",
text: `${city}今日天气:晴,26°C,湿度 45%`,
},
],
})
);
// 注册资源:配置文件
server.registerResource(
"config://{env}",
{
description: "获取环境配置",
},
async (uri, { env }) => ({
contents: [
{
uri: uri.href,
text: `{"environment": "${env}", "version": "1.0.0"}`,
},
],
})
);
async function main() {
const transport = new StdioServerTransport();
await server.connect(transport);
}
main();
HTTP 部署方式(利用无状态架构的核心优势):
// http-server.ts — 适配 Express 的无状态 HTTP 部署
import { createMcpHandler } from "@modelcontextprotocol/server";
import express from "express";
const app = express();
app.use(express.json());
// createMcpHandler 自动处理 2026-07-28 和 2025-11-25 双协议
const handler = createMcpHandler(server);
app.post("/mcp", async (req, res) => {
await handler(req, res);
});
app.listen(3000, () => {
console.log("MCP Server running on port 3000 (stateless)");
});
Nginx 负载均衡配置(无需粘性会话):
upstream mcp_servers {
server 10.0.0.1:3000;
server 10.0.0.2:3000;
server 10.0.0.3:3000;
}
server {
listen 80;
location /mcp {
proxy_pass http://mcp_servers;
proxy_set_header Host $host;
# 无需 ip_hash 或 sticky —— 每个请求都是自包含的
}
}
#### Python 示例
Python v2 SDK 将 FastMCP 重命名为 MCPServer,装饰器 API 保持一致:
# server.py — 无状态 MCP Server
from mcp.server import MCPServer
mcp = MCPServer("weather-server")
@mcp.tool()
def get_weather(city: str) -> str:
"""获取指定城市的天气信息。
Args:
city: 城市名称
"""
# 实际场景中替换为真实 API 调用
return f"{city}今日天气:晴,26°C,湿度 45%"
@mcp.tool()
def create_task(title: str, priority: str = "medium") -> dict:
"""创建任务并返回任务 ID(显式句柄模式示例)。
Args:
title: 任务标题
priority: 优先级 (low/medium/high)
"""
task_id = f"task_{hash(title) % 10000:04d}"
return {"task_id": task_id, "title": title, "priority": priority, "status": "created"}
@mcp.tool()
def get_task_status(task_id: str) -> dict:
"""查询任务状态(接收显式句柄)。
Args:
task_id: 通过 create_task 获取的任务 ID
"""
return {"task_id": task_id, "status": "in_progress", "progress": 60}
@mcp.resource("docs://{page}")
def docs(page: str) -> str:
"""获取项目文档页面。
Args:
page: 页面名称
"""
return f"# {page}\n\n这是 {page} 页面的文档内容。"
if __name__ == "__main__":
mcp.run(transport="stdio")
安装 Beta SDK:
uv add "mcp[cli]==2.0.0b1"
# 或
pip install "mcp[cli]==2.0.0b1"
配置 EMA 企业托管授权
以 Okta 为 IdP 的 EMA 配置步骤:
#### 第一步:在 Okta 中配置 MCP 应用
- 登录 Okta Admin Console,进入 Applications > Applications。
- 创建新 Application,类型选择 "MCP Connector"。
- 在 Cross App Access (XAA) 中配置允许访问的 MCP Server 列表。
- 设置 Group-based 访问策略:例如
engineering组可访问GitHub和LinearMCP Server,design组可访问Figma和Canva。
#### 第二步:MCP Server 配置授权
服务端需要在 .well-known 端点暴露授权服务器元数据:
{
"issuer": "https://your-auth-server.example.com",
"authorization_endpoint": "https://your-auth-server.example.com/authorize",
"token_endpoint": "https://your-auth-server.example.com/token",
"scopes_supported": ["mcp:tools", "mcp:resources"],
"grant_types_supported": ["urn:ietf:params:oauth:grant-type:identity-assertion"]
}
#### 第三步:客户端启用 EMA
客户端侧配置示例(Claude Desktop):
{
"mcpServers": {
"github": {
"url": "https://mcp.github.com/sse",
"auth": {
"type": "enterprise-managed",
"issuer": "https://your-org.okta.com"
}
},
"linear": {
"url": "https://mcp.linear.app/sse",
"auth": {
"type": "enterprise-managed",
"issuer": "https://your-org.okta.com"
}
}
}
}
用户首次登录后,所有配置的 MCP Server 自动连接,无需逐个授权。
迁移指南
从 2025-11-25 迁移到 2026-07-28
#### TypeScript 迁移步骤
# 1. 安装 v2 beta SDK
npm install @modelcontextprotocol/server@beta
npm install @modelcontextprotocol/client@beta
# 2. 运行自动迁移 codemod
npx @modelcontextprotocol/codemod@beta v1-to-v2 .
# 3. 核心代码变更清单:
# - FastMCP → McpServer(包名变更)
# - .tool() → registerTool(方法名变更)
# - 移除 initialize 相关逻辑
# - 错误码 -32002 → -32602
# - 实现 server/discover 端点(SDK 自动处理)
#### Python 迁移步骤
# 1. 安装 v2 beta SDK(精确版本锁定)
pip install "mcp[cli]==2.0.0b1"
# 2. 核心代码变更清单:
# - FastMCP → MCPServer
# - 移除 initialize 相关逻辑
# - 日志迁移:从 Logging 特性 → OpenTelemetry 或 per-request 日志级别
# - 订阅迁移:resources/subscribe → subscriptions/listen
# - Roots/Sampling/Logging 调用替换
#### 兼容性策略
双版本并行:Python v2 和 TypeScript v2 均支持从同一端点同时服务新旧协议。v2 Server 自动响应旧版 initialize 握手和新版 server/discover,客户端无需同步升级。
建议迁移节奏:
- 第一阶段(7 月 28 日前):在测试分支中部署 v2 Beta SDK,用真实流量验证。
- 第二阶段(7-8 月):生产环境上线 v2 Server,保持双协议兼容。
- 第三阶段(9-10 月):确认所有客户端升级后,移除旧协议支持。
高频迁移问题速查
| 旧模式 | 新模式 | 影响范围 |
|---|---|---|
initialize + initialized 握手 | 移除,信息在 _meta 中传递 | 所有 Server 和 Client |
Mcp-Session-Id 头 | 移除,无状态请求 | 远程部署的 Server |
resources/subscribe + unsubscribe | subscriptions/listen | 使用资源订阅的 Server |
sampling/createMessage | 废弃,直接调用 LLM API | 使用 Sampling 的 Server |
logging/setLevel | _meta 中 io.modelcontextprotocol/logLevel | 所有 Server |
roots/list | 废弃,通过工具参数传递 | 使用 Roots 的 Server |
ping | 移除,健康检查由传输层负责 | 心跳检测逻辑 |
常见问题 FAQ
Q1:7 月 28 日之后,旧版 MCP Server 会立即停止工作吗?
不会。7 月 28 日是规范文本的正式发布日期,不是任何实现者的"开关"。旧版 Server 和 Client 在该日期后继续正常工作。新版规范提供至少 12 个月的废弃过渡期,Roots、Sampling、Logging 的移除需要单独的 SEP 流程。
Q2:无状态架构下如何管理需要跨请求的状态?
使用显式句柄模式(Explicit Handle Pattern)。工具返回一个标识符(如 task_id),模型在后续调用中将其作为普通参数传回。这比会话隐藏状态更透明,模型可以跨工具组合和推理这些句柄。
Q3:MRTR 模式下,用户长时间不响应怎么办?
requestState 令牌由服务端控制过期策略。服务端在返回 InputRequiredResult 时可以设置 TTL,超时后客户端重新发起请求时服务端会返回错误并提示重新开始流程。
Q4:EMA 支持哪些 IdP?
目前 Okta 是首个正式支持的 IdP,通过 Okta Cross App Access (XAA) 实现。Microsoft Entra ID 的支持已在路线图中。EMA 规范基于 ID-JAG(IETF draft),理论上任何支持 OIDC 和 SAML 的 IdP 都可以实现。
Q5:Python v2 的 mcp 包会和 v1 冲突吗?
不会。未指定版本时 pip install mcp 仍解析到 v1.x 稳定版。需要显式指定 mcp==2.0.0b1 才会安装 Beta。但建议在依赖声明中添加上限(如 mcp>=1.27,<2),防止 v2 正式发布后意外升级。
Q6:MCP over MOQT 什么时候能落地?
IETF draft-mcp-over-moqt-00 已提交,处于早期阶段。MOQT 基于 QUIC 的 pub/sub 模型适合实时推送场景(如流式数据订阅),但距离生产可用还有较长路径。短期内 Streamable HTTP 仍是远程部署的推荐传输方式。
Q7:MCP Apps 返回的 UI 组件安全吗?
MCP Apps 的 UI 在 Host 的沙箱 iframe 中渲染,使用 CSP(Content Security Policy)严格隔离。UI 发起的操作通过 JSON-RPC 走与工具调用相同的审计和同意路径。Server 需提前声明 UI 模板,Host 可以预检和安全审查。
Q8:如何验证我的 Server 是否兼容新协议?
运行 MCP 官方一致性测试套件(Conformance Suite)。TypeScript/Go SDK 的 Tier 1 评级要求通过一致性测试。也可以使用新版 SDK 的内置 Client 对接 Server 进行端到端验证。
总结
MCP 2026-07-28 规范是一次以工程实践为导向的架构重构,核心逻辑清晰:
- 无状态架构将水平扩展的复杂度从协议层转移到基础设施层——普通 HTTP 负载均衡器即可支撑大规模部署。
- MRTR 模式用"客户端轮询配合"替代"服务端主动推送",在保持交互能力的同时简化传输层实现。
- EMA 扩展解决了企业环境中的授权难题,"一次授权,全局生效"的零接触体验将显著降低 MCP 在组织中的采纳门槛。
对现有开发者而言,迁移路径明确且向后兼容。建议在 7 月 28 日前完成 Beta SDK 验证,9 月前完成双协议并行部署,确保平滑过渡。
> 参考资源
> - MCP 2026-07-28 Release Candidate 公告
> - Beta SDK 发布公告
> - EMA 企业托管授权