MCP 最新 RFC 更新! 从状态服务器切换为无状态、可恢复的纯 HTTP 实现!

MCP 的可流式 HTTP 传输提案

本文翻译并整理自 GitHub Pull Request #206,介绍了 Model Context Protocol (MCP) 的可流式 HTTP 传输方案。这一方案旨在解决当前 HTTP+SSE 传输的局限性,同时保留其优势。

特别感谢 @atesgoral@topherbullock(Shopify)、@samuelcolvin@Kludex(Pydantic)、@calclavia、Cloudflare、LangChain、Vercel、Anthropic 团队以及 MCP 社区的众多成员!本提案得以成型离不开 GitHub 讨论 中收到的宝贵反馈。


简要概述 (TL;DR)

与当前的 HTTP+SSE 传输 相比,新提案:

  1. 移除 /sse 端点;
  2. 所有客户端到服务器的消息通过 /message(或类似)端点发送;
  3. 所有客户端到服务器的请求可由服务器升级为 SSE,用于发送通知或请求;
  4. 客户端在请求头中提供会话 ID(Mcp-Session-Id),服务器可根据需要处理;
  5. 客户端可通过空的 GET 请求到 /message 发起 SSE 流。

此方法支持向后兼容,并允许服务器实现完全无状态设计。


动机

当前远程 MCP 使用 HTTP+SSE 传输,存在以下问题:

  • 不支持断点续传;
  • 要求服务器维持高可用性的长连接;
  • 仅能通过 SSE 传递服务器消息。

优势

  • 支持无状态服务器:不再需要高可用性的长连接;
  • 纯 HTTP 实现:无需 SSE 即可在普通 HTTP 服务器上实现 MCP;
  • 基础设施兼容性:仅使用标准 HTTP,与中间件和基础设施无缝兼容;
  • 向后兼容性:是对现有传输的渐进式改进;
  • 灵活升级路径:服务器可选择在需要时使用 SSE 进行流式响应。

示例用例

无状态服务器

完全无状态、不支持长连接的服务器可按以下方式实现:

  1. 始终确认初始化请求(无需持久化任何状态);
  2. 对任何 ToolListRequest 返回单一 JSON-RPC 响应;
  3. 处理 CallToolRequest,执行工具,完成后以单一 CallToolResponse 作为 HTTP 响应体。

支持流式的无状态服务器

无状态服务器仍可利用流式设计。例如,在工具调用期间发送进度通知:

  1. 当收到 CallToolRequest 的 POST 请求时,服务器指示响应将使用 SSE;
  2. 服务器开始执行工具;
  3. 在工具执行期间,通过 SSE 发送任意数量的 ProgressNotification;
  4. 工具执行完成后,通过 SSE 发送 CallToolResponse;
  5. 服务器关闭 SSE 流。

有状态服务器

有状态服务器的实现与当前类似。主要区别在于服务器需处理 Mcp-Session-Id 请求头,并利用它在消息总线上路由消息。例如,在水平扩展部署中,POST 消息可能到达任意服务器节点,需通过服务器端持久存储(如 Redis)连接到现有会话。


为什么不使用 WebSocket?

核心团队深入讨论了将 WebSocket 作为主要远程传输(替代 SSE)并使其支持断开和续传的可能性,但最终决定暂不采用,原因如下:

  1. 如果将 MCP 用作"类 RPC"方式(例如,仅暴露基本工具的无状态服务器),每次调用都使用 WebSocket 会带来不必要的运营和网络开销;
  2. 在浏览器中,无法为 WebSocket 附加头信息(如 Authorization),且第三方库无法从头实现 WebSocket(不像 SSE);
  3. 只有 GET 请求可透明升级为 WebSocket(其他 HTTP 方法不支持升级),这意味着 POST 端点需两步升级流程,增加复杂性和延迟。

我们也避免将 WebSocket 作为规范中的额外选项,以限制官方指定的传输协议数量,避免客户端与服务器间的组合兼容性问题。(不过,这不妨碍社区非标准地采用 WebSocket 传输。)

本提案不排除未来进一步探索 WebSocket,如果 SSE 效果不佳。


待办事项

  • 将会话 ID 责任移交至服务器端

    • 定义会话 ID 的有效范围
    • 确保会话 ID 可被中间件/WAF 检查
  • 明确取消机制

  • 要求集中式 SSE GET 用于服务器到客户端的请求和通知

  • 将续传功能转化为按流概念

  • 支持批量客户端到服务器消息

  • 设计主动"结束会话"的方式

  • "如果客户端持有授权令牌,应在每个 MCP 请求中包含它"


补充说明

如果客户端持有授权令牌(auth token),它应当在每个 MCP 请求中包含该令牌,以确保安全性与身份验证的连续性。这一要求将进一步明确并纳入规范。


MCP 最新 RFC 更新! 从状态服务器切换为无状态、可恢复的纯 HTTP 实现! 感觉这一波兼容性又拉大了,肉眼可见会小起飞一波 以上内容整理自提案原文,旨在清晰传达其核心思想与技术细节。如需更深入探讨,欢迎参考原始文档或参与讨论!

相关推荐
VIP_CQCRE2 小时前
AceData Cloud MCP:把整个平台能力接入你的 AI 助手
ai·api·mcp·acedatacloud
pnoker10 小时前
MCP 落地工业平台:从大模型对话到设备点位
人工智能·物联网·智能体·mcp
VIP_CQCRE1 天前
用 Ace Data Cloud 开启 AI 能力商业化:推广平台,或打造自己的白标 AI 平台
ai·api·mcp·ace data cloud·白标平台
ChaITSimpleLove1 天前
.NET 10 的 AI 技术栈全景:M.E.AI、MCP 与 Agent Framework 深度解析
人工智能·.net·ai agent·mcp·agent framework·m.e.ai·hosted agents
ERD Online1 天前
Cursor 连上 MCP:读一张 ER 图,提交一版建议
数据库·后端·开源·cursor·mcp
华科大胡子1 天前
MCP 协议开发实战:从零搭建 AI Agent 工具链
mcp
xrlfreedom1 天前
大厂 MCP 面试实录:将内部 REST API 封装为可审计 MCP Tools 的设计与实践
mcp·oauth 2.1·java mcp sdk·stdio 传输
北漂燕郊杨哥2 天前
VS Code 安装微信小程序 MCP 介绍
vscode·微信小程序·小程序·mcp
LayZhangStrive2 天前
Agent开发 - MCP Client使用MCP Server的几种方式(Spring AI)
java·spring ai·mcp
跨境Jacky2 天前
Shopee AI 选品教程:6 步流程 + 5 类工具横评
跨境电商·mcp·sorftime