SEP-1699:通过服务器端断开连接支持 SSE 轮询

SEP-1699:通过服务器端断开连接支持 SSE 轮询

社区译文;来源: MCP 29affa6b

本 SEP 已达到 Final 状态,并作为已接受设计的历史记录保留。 定稿后对协议所做的更改不会反映在此处。权威要求请参阅当前规范 及其变更日志。
字段值
SEP1699
标题通过服务器端断开连接支持 SSE 轮询
状态Final
类型标准跟踪
创建日期2025-10-22
作者Jonathan Hefner (@jonathanhefner)
发起人无
PR#1699

摘要

本 SEP 提议修改 Streamable HTTP 传输,以缓解长时间连接和可恢复性方面的问题。

动机

Streamable HTTP 传输规范不允许服务器在计算结果期间关闭连接。换言之,除非客户端主动断开连接,否则服务器必须维持可能持续很长时间的连接。

规范

服务器启动 SSE 流时,MUST 立即发送一个 SSE 事件,其中包含一个 id 和一个空的 data 字符串,以便客户端使用该事件 ID 作为 Last-Event-ID 重新连接。

需要注意的是,SSE 标准明确允许将 data 设置为空字符串,并规定客户端应记录该 id,以供 Last-Event-ID 使用,但除此之外应忽略该事件(即不调用事件处理器回调)。

服务器向客户端发送事件 ID 后,MAY 在任意时刻自行断开连接。具体而言,MCP 规范的这一部分将从:

服务器在发送所接收 JSON-RPC request 对应的 JSON-RPC response 之前,SHOULD NOT 关闭 SSE 流

改为:

如果服务器已向客户端发送带有事件 ID 的 SSE 事件,则在发送 JSON-RPC response 之前,服务器MAY关闭连接

如果服务器断开连接,客户端会将其视同网络故障,并尝试重新连接。为防止客户端过于频繁地重新连接或轮询,服务器 SHOULD 发送一个带有 retry 字段的 SSE 事件,指明客户端重新连接前应等待多长时间。客户端 MUST 遵守 retry 字段。

理由

服务器可以自行断开连接,从而避免长时间连接。发送 retry 字段可以防止客户端以不合理的频率反复请求服务器。

向后兼容性

  • 新客户端 + 旧服务器:无变化,不存在向后兼容问题。
  • 旧客户端 + 新服务器:客户端应将服务器自行断开连接视同网络故障。retry 字段是 SSE 标准的一部分。如果客户端已经正确实现 SSE 恢复逻辑,则不存在向后兼容问题。

其他信息

本 SEP 部分取代 SEP-1335。