MCP Streamable HTTP 的 SSE 保活与代理缓冲:工具调用响应为何被中间层攒住
远程 MCP Server 经反向代理暴露时,工具调用结果常在客户端迟迟不出现。本文以 nginx 反代场景为例,解释 SSE 流为何需要周期性保活事件、代理缓冲与空闲超时如何攒住响应、Content-Type 改写为何让客户端解析失败,并给出可观测指标与部署边界。
共 5 篇文章
远程 MCP Server 经反向代理暴露时,工具调用结果常在客户端迟迟不出现。本文以 nginx 反代场景为例,解释 SSE 流为何需要周期性保活事件、代理缓冲与空闲超时如何攒住响应、Content-Type 改写为何让客户端解析失败,并给出可观测指标与部署边界。
远程 MCP Server 排障时,服务端明明调高了日志级别,客户端却只看到 info 以上日志。文章从 logging/setLevel 与 notifications/message 的职责划分入手,解释级别未同步、通知未订阅、会话重连后级别重置三类日志缺失,并对比本地日志与轮询方案的取舍。
远程 MCP Server 返回单次工具结果时,服务端可以直接用 application/json 响应,而不必开启 SSE 流。这篇文章解释规范允许的两种响应形态、客户端对 Content-Type 的解析假设、请求与响应的配对方式,以及 JSON 单次响应与 SSE 流式响应在兼容性、可观测性和失败模式上的差异。
远程 MCP Server 暴露在公网时,Mcp-Session-Id 只负责关联一次有状态会话,并不自动证明请求者是谁。文章解释会话 ID 与会话状态如何建立、为何可预测或未与访问令牌绑定,以及重连后不重新校验如何导致会话劫持,并对比无状态模式与每请求鉴权,给出绑定与轮换的可观测指标。
移动网络下远程 MCP Server 断线重连后,工具调用结果可能凭空消失。文章从会话 ID、SSE 事件 ID 与 Last-Event-ID 重放机制入手,说明恢复成立的前提、服务端事件缓冲的边界,以及无状态模式为何无法重放,并给出可观测指标与部署取舍。