SEP-1699:通过服务器端断开连接支持 SSE 轮询
SEP-1699:通过服务器端断开连接支持 SSE 轮询
社区译文;来源: MCP 29affa6b
本 SEP 已达到 Final 状态,并作为已接受设计的历史记录保留。
定稿后对协议所做的更改不会反映在此处。权威要求请参阅当前规范
及其变更日志。
| 字段 | 值 |
|---|---|
| SEP | 1699 |
| 标题 | 通过服务器端断开连接支持 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。