Rejected streamable-HTTP requests leave live sessions behind: the session is registered before the request is validated

该报错发生在 MCP Python SDK 的有状态 streamable-HTTP 模式下。当服务器拒绝请求(如 400/406/421)时,会话仍会在注册后才进行校验,导致未终止的会话残留。优先排查是否有会话清理机制,并考虑升级 SDK 版本。

快速结论:该报错发生在 MCP Python SDK 的有状态 streamable-HTTP 模式下。当服务器拒绝请求(如 400/406/421)时,会话仍会在注册后才进行校验,导致未终止的会话残留。优先排查是否有会话清理机制,并考虑升级 SDK 版本。

适用环境:MCP Python SDK 2.x(main 分支),以及已确认的 1.29.0 版本;使用默认的有状态 HTTP 配置(`stateless_http=False`),`session_idle_timeout` 默认为 `None`。

最快修复方案:暂无确认的一步修复方案。可优先尝试使用有身份验证的中间件(如 `RequireAuthMiddleware`)避免未授权请求触发该问题,或确保使用 `stateless_http=True` 模式。

注意事项:该问题涉及内存资源耗尽风险(每个被拒绝的请求保留约 22.6 KiB),但非安全漏洞。修复可能涉及 SDK 内部实现,需关注官方更新。

问题场景

用户使用 MCP Python SDK 的 `MCPServer(…).streamable_http_app()`、`Server(…).streamable_http_app()` 或 `mcp.run(“streamable-http”)` 构建有状态服务器时,接收到如 400、406、421 等被服务器主动拒绝的请求,但会话并未被正确注销,导致服务器内存和状态持续增长。

报错原文

Rejected streamable-HTTP requests leave live sessions behind: the session is registered before the request is validated

原因分析

可能原因:在 `_handle_stateful_request` 分支中,服务器仅根据 `request_mcp_session_id is None` 来判断是否创建新会话,并在请求校验之前完成了会话注册和任务启动。所有实际校验(如 Host、Accept、Content-Type、JSON-RPC 校验等)都在传输层执行,但没有任何错误路径调用 `terminate()` 或从 `_server_instances` 字典中清理已注册的会话。此外,`session_idle_timeout` 默认值为 `None`,导致回收机制无法启用。

环境排查

  • 确认 MCP Python SDK 版本(2.x main 分支,已复现版本 a4f4ccd0;1.29.0 也已确认受影响)
  • 确认服务器配置是否为默认有状态模式(即未设置 `stateless_http=True`)
  • 检查是否有 `RequireAuthMiddleware` 或类似认证中间件(已在 Issue 中确认可避免此问题)
  • 检查是否使用 Python 3.10 及以上版本
  • 确认依赖:`httpx`、`uvicorn`、`starlette` 版本是否满足复现条件

解决步骤

  1. 在服务器外层添加 `RequireAuthMiddleware` 认证中间件,确保未授权请求在进入会话管理器前被拦截(已验证有效)。
  2. 如果业务允许,考虑改用无状态模式 `stateless_http=True`,该模式下每个请求的传输层会被终止,不会产生会话残留(但需评估对业务的影响)。
  3. 关注 MCP Python SDK 官方 Issue #3228 和相关问题 #2455 的修复进展,等待官方更新。
  4. 作为临时缓解措施,可通过监控 `_server_instances` 字典大小来预警资源异常增长,但需注意该属性并非公共 API。

验证方法

可通过向服务器发送被拒绝的请求(如 GET /mcp/)、无效的 HTTP 方法(HEAD、OPTIONS)或缺失必要头的请求,然后检查 `session_idle_timeout` 覆盖或使用自定义监控脚本读取 `_server_instances` 字典长度,确认会话数量是否持续增长。添加认证中间件后,重复上述操作,确认会话数量不再增加。

参考来源

modelcontextprotocol/python-sdk #3228

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 21235

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注