1. 概念Streamable HTTP HTTP JSON-RPC JSON/SSE响应 MCP 规则Streamable HTTP 是 MCP 远程通信的一种传输范式由以下成熟技术组合而成HTTP传输层直接复用反向代理、鉴权、网关、监控等基础设施。JSON-RPC消息格式以method/params/id/result/error统一描述请求与响应。SSE可选流式下行仅在需要边处理边输出时启用短任务直接返回普通 JSON。MCP 规则补充端点约定、协议版本协商、会话与断线语义。2. 为什么需要 Streamable HTTP早期远程传输采用 HTTP SSE 双端点需分别维护/messages与/sse在生产环境暴露三大痛点会话绑定同一客户端必须固定路由到同一节点负载均衡需维持会话粘性水平扩展难粘性路由制约扩缩容难以适配 Serverless长连接成本高SSE 通道长期占用内存与文件描述符。为此MCP 以“单一端点、按需流式”的 Streamable HTTP 取代旧方案演进历经三个阶段2025-03-26首次引入确立单端点架构2025-11-25机制完善会话管理、断线重连、服务端主动推送齐备2026-07-28无状态重构移除会话与独立 SSE 通道原生支持 Serverless。3. 设计原理在 MCP 生态中Streamable HTTP 需与 stdio、SSE、WebSocket 三种常见传输并列理解维度stdioSSEWebSocketStreamable HTTP传输层本地标准输入输出HTTP 单向流TCP 升级全双工HTTP JSON-RPC 可选 SSE通信方向双向进程内服务端→客户端全双工双向请求/响应为主按需流式跨网络否仅本机是是是典型场景IDE、桌面本地 MCP浏览器流式推送、旧版双端点高频双向交互远程 MCP 生产部署断线恢复不适用依赖Last-Event-ID需自定义重连/心跳经典版重放无状态版整请求重试Serverless 适配不适用弱长连接弱长连接原生友好简言之stdio 适合本地进程SSE 与 WebSocket 的长连接对网关和弹性扩展不友好Streamable HTTP 复用普通 HTTP 请求语义同时支持一次性 JSON 与按需 SSE 流式响应更贴近云原生部署。3.1 单一端点与三种响应模式服务端暴露一个端点如https://example.com/mcp所有 JSON-RPC 消息以 POST 送达服务端按消息类型选择三种响应模式 A一次性 JSON 响应——快速请求如tools/list模式 BSSE 流式响应——长时任务如tools/call、模型推理模式 C202 空响应——仅通知类消息返回202 Accepted与空响应体。服务端客户端服务端客户端alt[模式A请求一次性响应][模式B长任务流式][模式C仅通知]POST /mcpJSON-RPC消息1200 OKContent-Type: application/json完整结果2200 OKContent-Type: text/event-stream3event: message进度通知4event: message最终结果5202 Accepted空body6图2 三种响应模式时序图3.2 有状态经典交互2025-11-25经典版本通过initialize→InitializeResult→initialized三步建立会话并以Mcp-Session-Id标识会话服务端可为 SSE 事件附加id客户端重连时携带Last-Event-ID重放错过的消息。核心协议头头字段方向作用Accept请求需同时声明application/json, text/event-streamMcp-Session-Id双向会话唯一标识初始化后由服务端下发Last-Event-ID请求断线重连重放错过的事件服务端客户端服务端客户端✅ 会话建立完成POST /mcpBody: initialize请求Accept: application/json, text/event-stream1200 OKMcp-Session-Id: xxxBody: InitializeResult2POST /mcpMcp-Session-Id: xxxBody: initialized通知3202 Accepted空响应体4图3 经典版本会话初始化时序图3.3 无状态重构2026-07-28无状态重构核心变化有三移除会话不再有Mcp-Session-Id与握手流程每个请求自包含新增路由头Mcp-Method、Mcp-Name使网关无需解析请求体即可路由过滤扩展机制重构能力改为按需协商。版本协商按需进行服务端实现server/discoverRPC 公布版本与能力请求元数据放入_meta版本不支持时返回UnsupportedProtocolVersionError错误码-32022。服务端主动交互分两类请求式改用多轮次请求MRTR服务端返回InputRequiredResult客户端收集答案后携带inputResponses重试广播式由subscriptions/listen长连接 POST 响应流承载。服务节点任意负载均衡器客户端服务节点任意负载均衡器客户端可选步骤按需发现非握手工具调用完全自包含MCP-Protocol-Version: 2026-07-28Mcp-Method: tools/callMcp-Name: search_meta: 协议版本/客户端能力客户端收集答案后携带 inputResponses 重试原请求alt[简单请求][需要中途交互MRTR]server/discover1转发任意节点2支持的协议版本 能力 身份3POST /mcp4任意节点均可处理5200 OKJSON 响应6resultType: input_requiredinputRequests 携带所需信息请求7POST /mcp携带 inputResponses8转发任意节点均可9resultType: complete10图4 无状态版本请求交互时序图4. 最小实现示例以下示例均按 2026-07-28 无状态语义编写。4.1 curl 命令验证# 一次性 JSON 查询tools/listcurl-XPOST https://example.com/mcp\-HContent-Type: application/json\-HAccept: application/json, text/event-stream\-HMCP-Protocol-Version: 2026-07-28\-HMcp-Method: tools/list\-d{jsonrpc:2.0,id:1,method:tools/list}# SSE 流式工具调用tools/callcurl-XPOST https://example.com/mcp\-HContent-Type: application/json\-HAccept: text/event-stream\-HMCP-Protocol-Version: 2026-07-28\-HMcp-Method: tools/call\-d{jsonrpc:2.0,id:2,method:tools/call,params:{name:search,arguments:{query:mcp}}}\--no-buffer4.2 Python 服务端实现FastAPI以下为基于 FastAPI 的极简 Streamable HTTP 服务端实现fromfastapiimportFastAPI,Requestfromfastapi.responsesimportJSONResponse,StreamingResponseimportjson,asyncio appFastAPI()TOOLS[{name:echo,description:回显输入支持流式输出,inputSchema:{type:object,properties:{message:{type:string}},required:[message]}}]defrpc(rid,**kw):return{jsonrpc:2.0,id:rid,**kw}app.post(/mcp)asyncdefmcp_endpoint(request:Request):bodyawaitrequest.json()rid,methodbody.get(id),body.get(method)ifmethodtools/list:returnJSONResponse(rpc(rid,result{tools:TOOLS}))ifmethodtools/call:msgbody.get(params,{}).get(arguments,{}).get(message,)asyncdefgen():forchinmsg:chunkrpc(rid,result{content:[{type:text,text:ch}]})yieldfevent: message\ndata:{json.dumps(chunk)}\n\nawaitasyncio.sleep(0.1)returnStreamingResponse(gen(),media_typetext/event-stream,headers{Cache-Control:no-cache})returnJSONResponse(rpc(rid,error{code:-32601,message:Method not found}),status_code200)if__name____main__:importuvicorn uvicorn.run(app,port8000)依赖安装pipinstallfastapi uvicorn requests4.3 Python 客户端调用示例importrequests,json BASEhttp://localhost:8000/mcpdefcall(method,paramsNone,sseFalse):headers{Content-Type:application/json,MCP-Protocol-Version:2026-07-28,Accept:text/event-streamifsseelseapplication/json}returnrequests.post(BASE,json{jsonrpc:2.0,id:1,method:method,params:paramsor{}},headersheaders,streamsse)# 一次性 JSONprint(call(tools/list).json())# SSE 流式rcall(tools/call,{name:echo,arguments:{message:Hi}},sseTrue)forlineinr.iter_lines(decode_unicodeTrue):ifline.startswith(data: ):print(json.loads(line[6:])[result][content][0][text],end)5. 意义Streamable HTTP 的核心价值可归纳为三点云原生友好无状态化后每个请求自包含负载均衡无需会话粘性Serverless 冷启动实例可直接服务闲置长连接成本消失。部署简化单端点复用现有 HTTP 网关的鉴权、限流、审计能力无状态版关闭响应缓冲即可横向扩容。关键提醒断线恢复被移除有副作用的工具必须实现幂等非全双工不适合高频实时交互。它是远程 MCP 服务的事实标准未来将围绕应用层订阅、任务承载、幂等机制持续演进。6. 参考文献Model Context Protocol Specification — Streamable HTTP Transport. https://modelcontextprotocol.io/specification/2025-03-26/transports/streamable-httpModel Context Protocol Specification — Streamable HTTP Transport (2025-11-25). https://modelcontextprotocol.io/specification/2025-11-25/transports/streamable-httpModel Context Protocol Specification — Streamable HTTP Transport (2026-07-28). https://modelcontextprotocol.io/specification/2026-07-28/transports/streamable-httpModel Context Protocol — Architecture. https://modelcontextprotocol.io/docs/architectureJSON-RPC 2.0 Specification. https://www.jsonrpc.org/specificationServer-Sent Events (SSE) — WHATWG HTML Standard. https://html.spec.whatwg.org/multipage/server-sent-events.htmlModel Context Protocol — Python SDK. https://github.com/modelcontextprotocol/python-sdkModel Context Protocol — TypeScript SDK. https://github.com/modelcontextprotocol/typescript-sdk
