SSE与Streamable HTTP:MCP 背后的传输技术

MCP 使用的传输协议背后的历史

MCP(模型上下文协议)是当今最流行、应用最广泛的人工智能协议之一,它从 2025-03-26 版本开始,用 Streamable HTTP 取代了 HTTP+SSE 传输机制。这标志着该协议架构的重大变革。

现在,在解释这两种传输机制的含义之前,让我们先更好地理解这一变化。

为什么AI协议需要传输机制

像 MCP 这样的 AI 协议需要传输机制来促进协议架构中不同组件之间的信息交换。

具体来说,MCP 使用 JSON-RPC 2.0 作为客户端和服务器之间的连接格式。对于 JSON-RPC 消息的传输,它依赖于标准传输机制,如 HTTP+SSEStreamable HTTP(在 stdio 中 - 用于通过本地服务器上的标准输入和标准输出进行通信)。

这些专用的传输层是必需的,因为传统 HTTP 的请求-响应模型对于实时 AI 通信来说效率低下。这是因为纯 HTTP 频繁建立连接会导致高开销和延迟。相比之下,MCP 需要连续、低延迟的数据流——HTTP+SSEStreamable HTTP 正是为此而设计的。

为什么从 SSE 转变到 Streamable HTTP

MCP 最初使用 HTTP+SSE 来实现远程场景下的服务器到客户端的流式传输。然而,以下三个主要限制使得这一改变变得合理:

  • 不支持可恢复流:无法从断开处恢复数据流。
  • 需要维护长连接:服务器需要维护长时间的、高可用的连接,消耗资源,尤其是在大 规模部署时。
  • 仅允许通过 SSE 传递服务器消息:客户端必须使用单独的 HTTP POST 请求发送消息, 无法在同一通道内双向通信。

Streamable HTTP 解决了这些问题。它支持无状态通信,甚至支持按需升级到 SSE。这提高了与现代基础设施的兼容性,并确保了更稳定、更高效的通信。同时,这一转变体现了 MCP 在追求以下目标:

  • 提升可伸缩性:通过支持无状态服务器和减少长连接依赖,MCP 能够更好地应对大规模并发请求,为 AI 服务的爆发式增长提供坚实基础。
  • 增强鲁棒性:可恢复流的引入,使得 MCP 在面对不稳定的网络环境时,依然能够保证数据传输的可靠性,减少因网络问题导致的数据丢失或服务中断。
  • 优化资源利用:减少长连接的维护成本,使得服务器资源能够更高效地分配和利用,降低运营成本。
  • 拥抱未来趋势:Streamable HTTP 与现代 Web 技术栈和云原生架构更加契合,为 MCP 未来的发展和与其他技术的融合提供了更广阔的空间。

SSE

SSE(Server-Sent Events)是一种允许 Web 客户端从服务器接收自动更新的机制。这些更新被称为“事件”,并通过单个长寿命 HTTP 连接发送。

WebSockets 不同,SSE 是单向的,这意味着数据仅从服务器流向客户端。SSE 的工作原理是服务器通过此开放连接发送事件流,通常格式为text/event-streamMIME类型。

MCP 中使用 HTTP+SSE

sse

服务器必须提供两个端点:

  1. 客户端用于建立连接并从服务器接收消息的 SSE GET 端点。
  2. 客户端向服务器发送 JSON-RPC 消息的常规 HTTP POST 端点。

当客户端连接时,服务器必须发送一个端点事件,其中包含客户端将用于发送消息的 URI。所有客户端 JSON-RPC 消息都将作为 HTTP POST 请求发送到此 URI。

服务器通过打开的 SSE 连接发送流式事件来响应,模拟持久会话。具体来说,服务器消息以 SSE 消息事件的形式传递,其内容在事件数据中以 JSON 格式编码。

对于单个响应,服务器发送消息并关闭流。对于正在进行的通信,连接保持打开状态。

优点和缺点

优点:

  • 流式传输大量结果:允许立即发送部分结果,允许立即发送部分结果,避免 MCP 工具处理大量数据或等待外部 API 响应时的延迟。
  • 事件驱动触发器:支持未经请求的服务器事件,通过警报或状态更新通知客户端有关更改。
  • 简单:使用标准 HTTP,无需特殊协议或复杂设置。

缺点:

  • 仅限单向:数据只能在 SSE 通道中从服务器流向客户端。客户端必须使用单独的 HTTP POST 请求来发送消息。
  • 长连接资源使用:维护开放连接会消耗大量服务器资源,尤其是在大规模连接时。

Streamable HTTP

MCP 的语境中,Streamable HTTP 是一种使用纯 HTTP 在客户端和服务器之间传输流式数据的方法。它为实时通信打开了大门,无需长连接。

虽然它仍然可以使用 SSE 来实现灵活性和向后兼容性,但不再需要该传输方式。这使得 MCP 能够支持无状态服务器,而无需维护高可用性持久连接的开销。

为什么是Streamable HTTP + 可选 SSE 而不是 WebSockets?

  1. 避免不必要的开销:对于简单的 RPC 调用或数据流,WebSocket 的全双工特性可能引入不必要的协议开销和复杂性。Streamable HTTP 在保持流式传输能力的同时,更加轻量。
  2. 更好的 HTTP 兼容性:WebSocket 的协议升级机制有时会与现有的 HTTP 基础设施(如代理、负载均衡器)产生兼容性问题,并且浏览器无法直接在 WebSocket 连接上附加 HTTP 头(如 Authorization)。Streamable HTTP 则完全兼容 HTTP,避免了这些问题。
  3. POST 请求的灵活性:WebSocket 的升级握手主要基于 GET 请求,这使得基于 POST 的复杂交互流程实现起来较为繁琐。Streamable HTTP 则对 POST 和 GET 请求都提供了良好的支持。

MCP 中使用 Streamable HTTP

Streamable HTTP 传输中,服务器作为一个独立进程,能够处理多个客户端连接。它使用标准的 HTTP POSTGET 请求进行通信。

服务器可以选择使用 SSE 将多条消息流式传输到客户端。这既适用于用于简单请求/响应工具的基本 MCP 服务器,也适用于提供更高级功能(例如流式传输和实时服务器到客户端通知)的服务器。

服务器必须公开一个支持 POSTGET 方法的 HTTP 端点(称为 “MCP 端点“)。

下图说明了使用 Streamable HTTP 的 MCP 客户端和服务器之间的通信流程:

streamable-http

为了支持恢复断开的连接并重新传递可能丢失的消息,MCP 服务器会为每个流分配 ID。这些 ID 在每个流中充当游标。

优点和缺点

优点:

  • 支持无状态服务器:无需始终在线的长连接。
  • 纯 HTTP:可以使用任何标准 HTTP 服务器实现,而无需 SSE
  • 基础设施友好:与常见的 HTTP 中间件、代理和托管平台兼容。
  • 向后兼容:在以前的 HTTP+SSE 传输基础上逐步构建。
  • 可选流式传输:服务器可在需要时升级为 SSE,以实现流式传输响应。
  • 解决 SSE 局限性:支持可恢复流,无需维护长连接,且允许客户端和服务器在同一 HTTP 端点进行通信(通过 POST 和 GET)。
  • 效率更高:对于大负载或自定义二进制协议,数据传输更高效,没有 SSE 的事件格式 开销。
  • 更强的控制力:应用可以更精细地控制缓冲策略,可能减少内存开销。

缺点:

  • 暂无

SSE 与Streamable HTTP对比

类型 HTTP+SSE Streamable HTTP
通信类型 单向(服务器→客户端) 双向(客户端通过 GET/POST ↔ 服务器)
HTTP 协议的使用 GET 用于流媒体,POST 用于客户端信息 从一个端点使用标准 HTTP POST 和 GET
状态性 有状态 有状态,但支持无状态服务器
需要长期 HTTP 连接
要求高可用性 是,用于连接持久性 否,适用于无状态或临时服务器
可扩展性 有限
流媒体支持 是(通过文本/事件流) 是(通过 SSE 作为可选增强功能)
身份验证支持
支持可恢复性和重新交付 没有 没有
客户数量 多个 多个
在 MCP 中的使用 自协议版本 2025-03-26 起已弃用 在 2025-03-26 版协议中引入
向后兼容性 - 完全向后兼容基于 SSE 的客户端