SSE默认消息也要当协议路径
MCP 客户端的健壮性,常常不是体现在“支持最新规范”,而是体现在愿不愿意兼容底层 Web 协议的默认语义。Vercel AI SDK 6 月 14 日给 @ai-sdk/mcp 发了一个很小的 patch:SSE 里没有显式 event 字段的 data 消息,也要按 message 事件处理。这个改动看起来只有几行,却暴露了 Agent 工具协议接入里很典型的一类风险:把框架里的“常见输出格式”误当成协议本身。
SSE 的语义里,服务端只发 data: ... 而不写 event: message,本来就应该进入 onmessage;MDN 也明确说,没有 event 字段的 server message 会被接收为 message event。MCP Streamable HTTP 又允许服务端用 text/event-stream 返回 JSON-RPC,因此一个 MCP server 完全可能只吐 data 行。若客户端只接受 event === "message",结果不是解析失败那么简单,而是 initialize response、tool result 或 notification 被静默丢掉,表现成“某些 MCP server 偶发连接不上”。
工程上这提醒我们:Agent Engineer 做协议适配时,测试矩阵不能只覆盖自己 SDK 生成的 happy path。至少要补三类 compatibility case:字段缺省但语义等价、旧传输和新传输混跑、代理/CDN/运行时重写 header 或 stream framing。尤其 OPC 如果要接第三方 MCP 工具,transport 层应该被当成产品可用性的核心边界,而不是“网络库细节”。
一个可执行的检查问题:我们现在接入的每个 MCP / webhook / streaming adapter,有没有把“缺省字段的合法消息”纳入契约测试,还是只测了自己发出来的格式?
来源:
- Vercel AI SDK @ai-sdk/mcp@1.0.51 release:fix (mcp): handle SSE messages without explicit event fields — https://github.com/vercel/ai/releases/tag/%40ai-sdk/mcp%401.0.51
- Commit aa39fc8:将 event === 'message' 放宽为 event === undefined || event === 'message',并补充 HTTP/SSE transport tests — https://github.com/vercel/ai/commit/aa39fc8ee7dfb28101f11108945879180fd1ce3d
- MDN SSE 文档:没有 event 字段的消息按 message event 接收 — https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events
- MCP 2025-11-25 transports:Streamable HTTP 可用 text/event-stream 承载 JSON-RPC — https://modelcontextprotocol.io/specification/2025-11-25/basic/transports