MCP 规范在 7 月 28 日转向无状态。只跑一个 MCP 服务器,改动主要是删掉会话处理、加上 server/discover 方法;但跑网关、前面挂着一堆 MCP 服务器并对客户端呈现为单一服务时,整套工作方式都会变。
Agent Router(AAIF 项目,原名 Envoy AI Gateway)在 9 月合并 PR #2545,为发现和列表类请求加上无状态扇出。它目前还没承接真实流量,这是有意为之。
旧规范下客户端用 initialize 建立会话,之后所有请求都带 Mcp-Session-Id。Agent Router 把会话当骨架:初始化时向路由上每个后端发 initialize,收集各自的会话 ID 和能力,打包成一个加密会话 ID 交回客户端,此后每个请求自带路由、调用方、各后端上游会话 ID 和能力,网关自己不用记东西。2026-07-28 规范把这些全部移除:没有 initialize 握手、没有 Mcp-Session-Id、没有会话,每个请求在 _meta 里自带协议版本、客户端信息和能力,外加 Mcp-Method 和 Mcp-Name 头,让基础设施不解析 body 就能看出请求内容;客户端想提前知道服务器能力就调用 server/discover,elicitation、sampling 这类服务器发起的请求变成多轮往返,服务器返回 input_required,客户端带答案重试。
#2545 为五类需要发往多个后端的请求搭好无状态路径:server/discover、tools/list、resources/list、resources/templates/list、prompts/list。网关把请求发给每个选中的后端,合并响应,返回一个 JSON-RPC 结果。后端选择改为逐请求进行,令牌变化会立刻反映在可见后端上;能力合并复用同一套 helper,新旧路径行为一致;ttlMs 和 cacheScope 取最严格值。某个后端不可达或返回异常会被跳过并记录日志和错误指标,全部失败则返回 500,而不是一个看起来健康的空列表。
代码目前只在测试里被调用,外部没有调用方,这是分阶段计划的一部分。Phase 0 把整条无状态路径作为未被引用的代码逐段搭好,Phase 1 才切换 dispatcher。覆盖 tools/call 等单目标调用的 PR #2692 当时仍处于打开状态,subscriptions/listen 是单独的后续工作。
切换后链路里不再有任何一方持有会话:请求自带所需信息,网关转发,无状态后端由负载均衡器挑任意实例应答,网关和后端都能用普通轮询扩容,不需要粘性路由,提案也明确排除为现代路径引入 Redis 这类共享会话存储。Envoy 可直接按 Mcp-Method 和 Mcp-Name 头路由,不必解析 JSON-RPC body,从而支持按工具限流、按方法策略和边缘路由决策。审批流也更简单:后端返回 input_required,客户端带答案重试,网关按工具名像普通调用一样路由。权限变更在下次请求即生效。
仍需留意:扇出逐个访问后端,多个慢后端会累加延迟;部分失败的结果在客户端看来和完整结果一样,八个工具返回时无法判断是否掉了两个后端,目前只能靠各后端日志和指标发现。发现响应里统计的后端数量是选中数而非应答数。混合部署被推迟到 Phase 2。