MCP 2026-07-28 无状态架构深度拆解:当协议从「有状态」切换到「无状态」,AI 工具集成发生了哪些本质变化
一、引言:MCP 协议迎来了它诞生以来最大的一次架构升级
2024 年 11 月,Anthropic 推出 Model Context Protocol(MCP)时,社区把它类比为"AI 系统的 USB-C 接口"——一个统一大语言模型与外部数据源、工具之间通信方式的开放标准。这个定位在当时的背景下非常准确:每个 AI 平台各自为政,OpenAI 有 Function Calling、Anthropic 有 Tool Use、Google 又有自己的格式,互相不兼容。MCP 要做的事情,就是把这个混乱的战国时代终结掉。
两年过去了,MCP 已经从"有趣的开源协议"成长为 AI Agent 工具集成的事实标准之一。GitHub 上的 MCP 服务器数量从最初几个官方示例,爆炸式增长到数千个。Cursor、Claude Desktop、Codebuddy 等主流 AI 编程工具都原生支持 MCP。然而,支撑这套生态的协议架构,却在企业级部署面前暴露出了根本性的瓶颈。
2026 年 7 月 28 日,MCP 规范发布了它问世以来最大的一次更新——协议核心从"有状态"全面转向"无状态"。这个变化不是修修补补,而是触及了协议设计的最底层逻辑。本文将从协议演进背景出发,深度剖析这次架构变革的技术原理、对开发者的实际影响,以及如何在生产环境中落地这套新范式。
二、背景:为什么「有状态」架构在企业级场景下成了瓶颈
2.1 MCP 协议的基本架构回顾
在深入理解这次无状态化之前,我们需要先搞清楚 MCP 协议原本是怎么工作的。
MCP 协议的核心是 Client-Server 架构,定义了四类基本能力:
1. Tools(工具):AI 模型可以调用的外部函数,比如查询数据库、发送邮件、操作文件系统。Tool 是 MCP 最核心的能力,也是它区别于纯 RAG 方案的本质优势。
2. Resources(资源):AI 可以读取但不能修改的数据源,比如配置信息、业务数据切片。Resources 类似于"只读上下文",让 AI 在需要时主动拉取相关信息。
3. Prompts(提示词模板):预定义的提示词片段,可参数化复用。这解决了反复构造复杂提示词的问题。
4. Sampling(采样):允许 MCP Server 反向调用 AI 模型——这是一个容易被忽视但极其重要的能力,意味着 Server 端也能利用 AI 进行推理。
传输层支持两种模式:stdio(本地进程通信)和 HTTP+SSE(网络通信)。stdio 是最常用的方式,因为它天然实现了安全隔离——AI 工具运行在独立进程中,不会因为恶意工具代码直接获得宿主系统的 root 权限。
2.2 有状态连接的问题
MCP 的 2025-11-25 版本(也就是目前主流使用的版本)采用的是有状态连接模型。Connection 建立之后,Client 和 Server 之间会维持一个长连接,会话状态(包括已打开的资源游标、已初始化的工具上下文等)都存储在 Server 端的内存中。
这种设计在开发和测试场景下工作得很好,但在企业级部署时会遇到三个核心问题:
第一个问题是水平扩展困难。有状态连接天然绑定到特定的 Server 实例。这意味着如果你想部署多个 Server 实例做负载均衡,Client 的每个连接都必须路由到同一个实例,否则状态就丢失了。Kubernetes 的 Session Affinity 策略可以缓解这个问题,但引入了运维复杂度,也违背了云原生追求的无状态原则。
第二个问题是故障恢复脆弱。一旦 Server 实例崩溃,Client 和 Server 之间的所有会话状态全部丢失。Client 需要重新建立连接、重新完成初始化握手、重新注册所有工具。这个过程不仅耗时,而且对于需要维护复杂上下文的 AI 应用来说,重新建立上下文本身就是一笔不小的 token 成本。
第三个问题是调试和可观测性复杂。有状态系统中的请求不是孤立的,每个请求都依赖于之前的状态。这让请求追踪、日志分析、性能分析都变得异常复杂。生产环境中遇到问题,你很难确定"这个错误是当前请求导致的,还是之前某个请求遗留下来的状态引起的"。
这三点正好对应了企业在将 AI 试点项目推进到生产环境时最常遇到的挑战。所以当新版 MCP 规范宣布转向无状态架构时,社区的反响非常热烈——这正是企业级用户一直在等待的改变。
2.3 行业背景:无状态化是 2026 年中间件架构的主旋律
MCP 的无状态化并不是孤立的技术决策。它是 2026 年整个中间件和协议层向云原生架构靠拢的大趋势的一部分。
看看 2026 年的技术生态:gRPC 在 2.x 版本中引入了官方的负载均衡和无状态化支持;GraphQL 的 DataLoader 模式从有状态缓存进化到全局请求级上下文;甚至传统的 WebSocket 协议也有了"无状态 WebSocket"的提案。
背后的驱动力是相同的:随着 AI 应用从"单点实验"走向"大规模生产部署",架构的可扩展性、可观测性和容错能力变得比开发便利性更重要。无状态化是解决这三个问题的最直接路径。
三、核心变化:2026-07-28 规范的无状态架构设计
3.1 协议层的根本性重构
新版 MCP 协议(2026-07-28)的核心变化,可以概括为一句话:移除协议层面的会话机制,让每个请求都是自包含的。
在旧版本中,一个典型的 MCP 工具调用流程是这样的:
Client ──→ Initialize Request ──→ Server
Server ──→ Initialize Response (connectionId) ──→ Client
Client ──→ CallTool Request (connectionId) ──→ Server
Server ──→ CallTool Response ──→ Client
... (后续所有请求都携带 connectionId,Server 通过它恢复状态)
connectionId 是 Server 端内存中会话状态的引用。所有后续请求都必须携带这个 ID,Server 通过它从内存中找到对应的会话上下文。这意味着 Client 和 Server 之间存在一条隐式的"状态纽带"。
在新版本中,这个流程被彻底重新设计:
Client ──→ JSON-RPC Request (自包含,所有上下文信息在请求体内) ──→ Server
Server ──→ JSON-RPC Response (自包含,响应体内包含所有状态变更信息) ──→ Client
每个 JSON-RPC 请求都包含了处理该请求所需的全部信息。Server 不再需要维护跨请求的内存状态。响应体内会返回所有状态变更信息(新的资源游标位置、更新的上下文等),Client 负责将这些信息存储在自己的状态中,并在下一个请求中携带它们。
这意味着 Server 变成了真正的纯函数(Pure Function):给定一个请求,总是返回可预期的响应,不依赖任何外部可变状态。
3.2 版本化扩展框架:MCP Apps 和 Tasks
除了无状态化这一核心变化,新版规范还引入了一个重要的生态扩展——版本化扩展框架,正式纳入了 MCP Apps 和 Tasks 两个扩展类型。
MCP Apps 是 MCP 协议的交互式界面扩展。在旧版协议中,MCP 的能力主要通过 Tools/Resources/Prompts 这些机制暴露给 AI 模型,由 AI 模型决定何时调用、如何展示结果。MCP Apps 允许开发者定义交互式界面组件——比如 AI 生成的表单需要用户确认后才能继续执行,或者 AI 需要实时展示进度而不仅仅是最终结果。
Tasks 是 MCP 协议的长时间运行任务扩展。AI Agent 在执行复杂任务时,经常需要跨越多个请求周期。比如"帮我分析这个代码仓库的所有安全问题",可能需要几十分钟才能完成,期间涉及数百次工具调用。在有状态架构下,这个任务可以一直保持运行;但在无状态架构下,每个请求都是独立的,如何让一个任务跨越多个请求周期?
Tasks 扩展通过引入任务 ID 和任务状态快照解决了这个问题。Client 可以创建一个任务,获取一个任务 ID,然后在多个请求周期内通过这个 ID 恢复任务状态。Server 返回的每个响应中包含完整的任务状态快照,Client 负责持久化这些快照。这样,即使 Server 实例崩溃,Client 也可以从最后一个快照恢复任务。
Tasks 的设计非常巧妙:它没有破坏无状态的核心原则,而是通过"快照-恢复"机制在 Client 侧实现了状态的跨请求持久化。Server 依然是纯函数的,但 Client 可以选择将 Server 返回的状态快照存储在 Redis、数据库或文件系统等外部存储中。
3.3 安全性增强:企业级 OAuth 2.0 与 OIDC
新版规范的另一个重要变化是对企业身份认证的原生支持。
旧版 MCP 在 OAuth 2.0 支持方面存在设计缺陷:MCP Server 往往需要使用各种变通方案才能接入 Microsoft Entra(微软的企业身份管理服务)或 Okta 这类企业身份系统。这些变通方案不仅增加了实现复杂度,还在安全审计时带来了合规风险。
2026-07-28 规范重新设计了认证层,完全适配 OAuth 2.0 和 OIDC(OpenID Connect)标准。企业可以直接将 MCP Server 注册为 OAuth Client,使用企业现有的身份提供商进行认证。这意味着:
- MCP Server 可以接入 Entra ID 或 Okta,无需第三方认证代理
- AI 应用可以继承企业已有的访问控制策略(RBAC)
- 所有工具调用都可以在企业审计日志中追溯到具体的人
对于需要在企业内网部署 AI Agent 的团队来说,这是一个关键的能力升级。之前很多企业之所以对 MCP 持观望态度,正是因为缺乏企业级认证方案。现在这个问题在协议层面得到了解决。
四、技术实现:从有状态到无状态的实际代码变化
4.1 Server 端的变化:从状态管理器到纯函数
让我们看看具体代码层面会发生哪些变化。这里以 TypeScript SDK 为例,展示一个有状态工具在旧版和新版协议下的不同实现方式。
旧版有状态实现(2025-11-25 版本):
import { McpServer } from "@modelcontextprotocol/sdk/server";
import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp";
import { CallToolRequest } from "@modelcontextprotocol/sdk/types";
// 旧版有状态 Server:维护内部状态
class StatefulDatabaseServer {
private server: McpServer;
private connectionStates: Map<string, ConnectionState> = new Map();
constructor() {
this.server = new McpServer({
name: "database-server",
version: "1.0.0",
});
this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
// 旧版:从请求上下文获取 connectionId,查询内存状态
const connectionId = request.context.connectionId;
const state = this.connectionStates.get(connectionId);
// 从内存状态恢复游标位置
const cursor = state?.lastCursor || 0;
const query = request.params.arguments.query;
const results = await this.executeQuery(query, cursor);
// 更新内存状态
state.lastCursor = results.nextCursor;
this.connectionStates.set(connectionId, state);
return {
content: [
{ type: "text", text: JSON.stringify(results.data) },
],
};
});
}
}
新版无状态实现(2026-07-28 版本):
import { McpServer } from "@modelcontextprotocol/sdk/server";
import { StatelessServerTransport } from "@modelcontextprotocol/sdk/server/stateless";
import { CallToolRequest } from "@modelcontextprotocol/sdk/types";
// 新版无状态 Server:每个请求完全自包含
class StatelessDatabaseServer {
private server: McpServer;
constructor() {
this.server = new McpServer({
name: "database-server",
version: "2.0.0", // 注意版本升级
});
this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
// 新版:从请求体内直接获取所有需要的上下文
// 不再依赖 connectionId 或内存状态
const cursor = request.params.arguments.cursor || 0;
const query = request.params.arguments.query;
const pageSize = request.params.arguments.pageSize || 50;
const results = await this.executeQuery(query, {
cursor,
pageSize,
});
// 返回结果和下一个游标位置(客户端负责存储)
return {
content: [
{ type: "text", text: JSON.stringify(results.data) },
],
// 状态快照由客户端维护
nextCursor: results.nextCursor,
hasMore: results.hasMore,
// 新增无状态元数据
_meta: {
stateless: true,
requestId: request.id,
serverVersion: "2.0.0",
},
};
});
}
}
关键差异:
- 没有 connectionId 引用:Server 不再从请求上下文获取连接 ID
- 参数直接传递:游标位置等状态通过请求参数传递,由 Client 负责维护
- 响应包含完整状态信息:Server 返回的响应包含
nextCursor、hasMore等状态信息,Client 存储这些信息并在下一个请求中传回 - 元数据标记:
_meta字段标识了无状态响应,便于 Client 做版本兼容处理
4.2 Client 端的变化:状态管理器的外移
对应的,Client 端需要承担起"状态管理器"的角色——将 Server 返回的状态快照存储起来,并在下一个请求中携带它们。
// Client 侧的状态管理(需要开发者自行实现)
class MCPStateManager {
private stateStore: Map<string, SessionState> = new Map();
private persistentStorage: KVStore; // 可以是 Redis、SQLite 或文件
constructor(private store: KVStore) {
this.persistentStorage = store;
}
async callTool(
serverName: string,
toolName: string,
args: Record<string, any>
): Promise<ToolResponse> {
// 1. 从持久化存储恢复该 Server 的最新状态
const savedState = await this.persistentStorage.get(
`mcp:${serverName}:state`
);
const state = savedState ? JSON.parse(savedState) : { cursor: 0 };
// 2. 将状态注入到请求参数中
const enrichedArgs = {
...args,
cursor: state.cursor, // 关键:将 Server 状态注入到请求
_stateToken: state.stateToken,
};
// 3. 发送请求
const response = await this.sendRequest(serverName, toolName, enrichedArgs);
// 4. 从响应中提取新状态并持久化
if (response._meta?.stateless) {
const newState = {
cursor: response.nextCursor ?? state.cursor,
stateToken: response._meta?.stateToken ?? state.stateToken,
updatedAt: Date.now(),
};
await this.persistentStorage.set(
`mcp:${serverName}:state`,
JSON.stringify(newState)
);
}
return response;
}
}
这段代码看起来比旧版复杂了,但实际上它解决了一个根本问题:状态不再被困在 Server 的内存里,而是可以被外部系统管理和持久化。这意味着:
- 即使 Server 重启,Client 可以从持久化存储中恢复完整状态
- 同一个 Client 可以将状态分享给其他 Client 实例(只读场景)
- 状态可以被备份、审计、回滚
4.3 Tasks 扩展:长时间运行任务的跨请求恢复
对于需要长时间运行的任务,新版 MCP 引入了 Tasks 扩展机制:
// 创建长时间运行任务
const task = await client.tasks.create({
description: "分析代码仓库安全问题",
tools: ["filesystem-read", "code-analyzer"],
params: {
repoPath: "/path/to/repo",
analysisType: "security",
},
});
// 轮询任务状态
while (!(await task.isComplete())) {
const status = await task.status();
console.log(`进度: ${status.progress}%`);
console.log(`当前: ${status.currentStep}`);
// 可以随时中断
if (status.progress >= 50 && shouldPause()) {
await task.pause();
break;
}
await sleep(5000); // 每5秒轮询一次
}
// 如果中断,可以恢复
if (await task.isPaused()) {
// 稍后恢复
await task.resume();
// Client 会自动从持久化的任务快照恢复
}
// 获取最终结果
const report = await task.getResult();
Tasks 的内部实现基于以下机制:
// Server 端的任务快照返回格式
{
taskId: "task_abc123",
status: "paused", // running | paused | completed | failed
progress: 52,
currentStep: "analyzing module auth",
nextSteps: ["analyze module billing", "generate report"],
stateSnapshot: {
analyzedFiles: ["auth.go", "middleware.go", "..."],
findings: ["CVE-2026-xxxx", "injection risk in user input"],
checkpointId: "checkpoint_20260818_143022",
},
expiresAt: "2026-08-19T12:00:00Z", // 快照过期时间
}
Client 负责将 stateSnapshot 持久化。当 Client 调用 task.resume() 时,它会在请求中携带 checkpointId,Server 从该检查点恢复任务执行。
五、生产环境部署实战
5.1 Kubernetes 部署:无状态化带来的架构红利
无状态化最直接的红利体现在云原生部署上。下面是一个基于 Kubernetes 的生产级部署方案:
# deployment.yaml - 无状态 MCP Server 部署
apiVersion: apps/v1
kind: Deployment
metadata:
name: mcp-database-server
labels:
app: mcp-database-server
spec:
replicas: 3 # 轻松扩展到多个副本
selector:
matchLabels:
app: mcp-database-server
template:
metadata:
labels:
app: mcp-database-server
spec:
containers:
- name: server
image: your-registry/mcp-database-server:v2.0.0
ports:
- containerPort: 8080
env:
- name: MCP_VERSION
value: "2.0.0" # 标识无状态版本
- name: DB_CONNECTION_POOL_SIZE
value: "20"
- name: LOG_LEVEL
value: "info"
resources:
requests:
memory: "256Mi"
cpu: "250m"
limits:
memory: "512Mi"
cpu: "500m"
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 10
periodSeconds: 15
readinessProbe:
httpGet:
path: /ready
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
---
# 无状态服务不需要 Session Affinity,标准 LoadBalancer 即可
apiVersion: v1
kind: Service
metadata:
name: mcp-database-server
spec:
type: LoadBalancer
selector:
app: mcp-database-server
ports:
- port: 8080
targetPort: 8080
无状态化带来的部署优势是立竿见影的:
- 零配置的水平扩展:
replicas: 10即可,Kubernetes 自动分配流量,无需任何粘性会话配置 - 滚动更新零中断:
kubectl rollout restart不会丢失任何连接状态,因为压根没有连接状态 - 故障恢复瞬间完成:Pod 崩溃后,新 Pod 立即接管流量,Client 从持久化状态恢复
5.2 状态持久化方案选型
Client 侧的状态持久化有多种方案可选,需要根据实际场景选择:
方案一:Redis(推荐生产环境)
// 使用 Redis 作为状态持久化后端
import { Redis } from "ioredis";
import { createClient, RedisStateStore } from "@modelcontextprotocol/client";
const redis = new Redis({
host: process.env.REDIS_HOST,
port: 6379,
password: process.env.REDIS_PASSWORD,
tls: {},
});
const redisStore = new RedisStateStore(redis, {
keyPrefix: "mcp:",
ttl: 86400 * 7, // 状态保留7天
serializer: JSON.stringify,
deserializer: JSON.parse,
});
const client = createClient({
serverUrl: process.env.MCP_SERVER_URL,
stateStore: redisStore, // 接入状态存储
});
// 跨进程共享:多个进程可以操作同一个状态
// AI Gateway 和 Web Interface 可以共享同一个数据库 Server 的会话状态
方案二:SQLite(推荐边缘部署/单机场景)
// SQLite 适合边缘节点或资源受限环境
import Database from "better-sqlite3";
import { SQLiteStateStore } from "@modelcontextprotocol/client";
const db = new Database("./mcp-state.db");
const sqliteStore = new SQLiteStateStore(db, {
tableName: "mcp_sessions",
autoMigrate: true,
});
const client = createClient({
serverUrl: "http://localhost:8080",
stateStore: sqliteStore,
});
5.3 OAuth 2.0 企业认证集成
新版 MCP 的 OAuth 2.0 支持使得企业内网部署变得简单:
// MCP Server 端配置企业 OAuth
import { OAuth2Server } from "@modelcontextprotocol/sdk/auth/oauth2";
const oauthServer = new OAuth2Server({
issuer: process.env.OAUTH_ISSUER,
clientId: process.env.MCP_CLIENT_ID,
clientSecret: process.env.MCP_CLIENT_SECRET,
grantTypes: ["client_credentials", "authorization_code"],
providers: {
microsoft_entra: {
discoveryUrl: `${process.env.ENTRA_DISCOVERY_URL}/.well-known/openid-configuration`,
scopes: ["api://mcp-server/.default"],
},
okta: {
discoveryUrl: `${process.env.OKTA_DOMAIN}/.well-known/openid-configuration`,
scopes: ["openid", "profile", "mcp:tools"],
},
},
});
const server = new McpServer({
name: "enterprise-database-server",
auth: oauthServer.middleware,
});
六、性能对比:无状态架构的真实代价与收益
6.1 理论分析:每请求额外开销
无状态化并非没有代价。每次请求都需要携带更多的上下文信息,这会带来额外的序列化/反序列化和网络传输开销。
在一个有 1000 次工具调用的复杂 AI Agent 任务中,如果每次调用平均多传输 200 字节的额外状态信息,总额外传输量约为 200KB。这个量级对于现代网络来说可以忽略不计。
6.2 实际测试数据
根据官方基准测试:
| 指标 | 有状态架构 | 无状态架构 | 变化 |
|---|---|---|---|
| 首次连接延迟 | 45ms | 48ms | +3ms |
| 单次工具调用延迟 | 12ms | 13.5ms | +1.5ms |
| 1000次连续调用总耗时 | 12.3s | 13.8s | +12% |
| Server 内存占用 | ~50MB(随连接数线性增长) | ~5MB(固定) | -90% |
| 水平扩展效率 | 0.7 | 0.95 | +36% |
| 故障恢复时间 | 2-30s | <100ms | -97% |
关键结论:
- 单次调用延迟增加约 12%,这是不可避免的序列化代价
- Server 内存占用从线性增长变为固定值——企业级部署的关键指标
- 故障恢复时间从秒级降到毫秒级
6.3 优化策略
批量工具调用:新版 MCP 协议支持批量工具调用,将多个工具调用打包成一次请求,减少请求次数和状态传递次数。
// 批量调用减少请求次数
const batchResult = await client.batchCall([
{ server: "db", tool: "query", args: { sql: "SELECT COUNT(*) FROM users" } },
{ server: "db", tool: "query", args: { sql: "SELECT COUNT(*) FROM orders" } },
{ server: "db", tool: "query", args: { sql: "SELECT COUNT(*) FROM products" } },
], {
parallel: true,
stateToken: currentState.stateToken, // 共享一次状态传递
});
七、迁移指南:从旧版协议平滑升级
7.1 版本检测与协商
新版 MCP 支持协议版本协商,Client 和 Server 可以在握手阶段协商使用的协议版本:
const server = new McpServer({
name: "my-server",
version: "2.0.0",
capabilities: { tools: true, resources: true },
transportModes: ["stateless", "stateful"], // 按优先级排序
});
const client = createClient({
serverUrl: "http://mcp-server:8080",
transportPreference: "stateless",
fallbackTransport: "stateful",
});
7.2 渐进式迁移策略
阶段一:双模式运行(1-2 周):Server 同时支持有状态和无状态两种传输模式,Client 逐步切换。
阶段二:性能调优(1 周):根据生产环境数据,调整批量调用参数、状态压缩级别、缓存策略。
阶段三:全量切换:确认稳定性后,下线有状态传输模式,Server 切换到纯无状态架构。
7.3 常见迁移问题与解决方案
问题一:旧版 Client 不支持无状态
对于无法升级的旧版 Client,需要保留有状态端点作为兼容层:
// 兼容层:在无状态 Server 前加一个有状态代理
const compatibilityLayer = new StatefulCompatibilityProxy({
statelessServer: modernServer,
statefulToStateless: (statefulRequest) => {
return {
...statefulRequest,
cursor: statefulRequest.context?.lastCursor || 0,
_compatibilityMode: true,
};
},
});
问题二:状态迁移
将旧版 Server 内存中的连接状态迁移到新版的持久化存储:
async function migrateStates() {
const oldStates = await exportOldServerStates();
const redis = new Redis(process.env.REDIS_URL);
for (const [connectionId, state] of Object.entries(oldStates)) {
await redis.set(
`mcp:legacy:${connectionId}`,
JSON.stringify(state),
"EX",
86400
);
}
const migratedCount = await redis.keys("mcp:legacy:*").then(k => k.length);
console.log(`迁移完成:${migratedCount} 个会话状态`);
}
八、生态影响与未来展望
8.1 对 MCP 生态的短期影响
Server 实现简化:Server 开发者不再需要维护复杂的连接状态管理逻辑。连接池管理、会话超时处理、内存泄漏排查这些头疼的问题将大幅减少。
Client 复杂度上升:Client 侧的状态管理复杂度会增加。但好消息是,主要的 SDK 都会提供开箱即用的状态管理实现。
中间件和基础设施层机会:无状态化打开了新的中间件市场——专门管理 MCP 状态持久化的中间件、跨 Server 的状态协调服务、状态快照的备份和审计服务。
8.2 长期演进方向
多 Server 状态协调:对于复杂的多 Agent 协作场景,可能需要跨 Server 的状态协调机制。
状态快照的版本化和回滚:类比 Git 的分支和回滚,MCP 的状态快照可以引入版本化机制。当 AI Agent 执行了错误操作时,可以"回滚"到之前的状态快照重新执行。
状态相关的访问控制:无状态化之后,可以引入更细粒度的"谁能访问哪个状态快照"控制。
九、总结
MCP 2026-07-28 规范的无状态化,是这个协议诞生以来最重要的架构升级。它不是简单的技术选型变化,而是反映了 AI Agent 从"实验阶段"走向"生产阶段"的整体范式转变。
核心变化回顾:
- 协议层:从有状态连接变为自包含请求,Server 退化为纯函数,每个响应携带完整状态快照
- 扩展层:引入 MCP Apps(交互式界面)和 Tasks(长时间任务)的版本化扩展框架
- 安全层:原生支持 OAuth 2.0 / OIDC,企业可直接对接 Entra ID 和 Okta
- 部署层:云原生友好,无状态 Server 支持零配置水平扩展和快速故障恢复
对开发者的实际影响:
- 短期:有约 12% 的单次调用延迟增加,但换来 Server 内存占用降低 90%、故障恢复时间缩短 97%、水平扩展效率提升 36%
- 中期:Client 侧需要承担状态管理职责,但主流 SDK 会提供开箱即用的解决方案
- 长期:MCP 生态将从"工具集成协议"进化为"企业级 AI 基础设施"
这次无状态化让我想起 2010 年代 RESTful API 取代 SOAP 的过程。两者有相似之处:旧协议在功能上更"方便",但新协议在规模化场景下更"正确"。RESTful 的核心洞察是"无状态是规模化的前提",MCP 无状态化的洞察是相同的——当你的 AI Agent 需要在生产环境处理每天百万次工具调用时,Server 内存中不能存放任何不可恢复的状态。
对于已经在使用 MCP 的团队:尽快升级到 2026-07-28 版本,采用渐进式迁移策略。无状态化的长期收益远超短期的迁移成本。对于还未采用 MCP 的团队,这次升级也提供了一个更好的起点——新的企业认证支持和云原生友好架构,让 MCP 不再只是"极客玩具",而是真正可以用于生产的企业级工具集成标准。
MCP 协议的无状态化,标志着一个新阶段的开始:AI 工具集成正在从"能用"走向"好用"和"工业级好用"。