
Session ID not present in memory store should return 404, not 400
快速结论:该报错发生在使用 MCP Python SDK 的 Streamable HTTP 传输时,当客户端提供的 Session ID 在内存中不存在(例如服务器重启后),服务器错误地返回 HTTP 400 而非 404。优先检查你的 MCP Python SDK 版本是否已合并修复 PR #1945。
问题场景
在运行基于 MCP Python SDK 构建的 Streamable HTTP 服务器时,客户端连接时若提供的 Mcp-Session-Id 在服务器内存存储中不存在(例如服务器重启导致 session 丢失),本应返回 404 让客户端重新初始化,但服务器返回了 400。这会阻止客户端正确恢复连接。
报错原文
# 问题代码位置: src/mcp/server/streamable_http_manager.py 第250-256行
# 服务器在 session 不存在时返回 HTTP 400,而不是预期的 404
HTTP 400 Bad Request: Session ID not present in memory store
原因分析
这是 MCP Python SDK 的一个已知行为缺陷。如 Issue #880 所述,session 不会在服务器重启间持久化。当客户端使用一个未持久化的 session ID 连接时,服务器将其视为“错误请求”(400),但实际上该请求本身并无错误,只是 session 因服务器重启而丢失。正确的语义是返回 404 Not Found,这样客户端可以据此发起新的初始化流程获取新 session ID。该问题在 src/mcp/server/streamable_http.py 第371行已有类似 404 处理逻辑,但在 streamable_http_manager.py 中未被覆盖。
环境排查
- 确认 MCP Python SDK 版本(Issue 报告环境:Python 3.10.12 + MCP SDK 2.3.4)
- 检查是否使用了
StreamableHTTPSessionManager作为 session 管理 - 确认服务器已重启且 session 未被持久化(如不使用外部 session 存储)
解决步骤
- 更新 SDK 到修复版本:升级 MCP Python SDK 到包含 PR #1945 的版本。该 PR 在
v1.x分支和main分支均已合入,StreamableHTTPSessionManager现在会对未知/过期 session ID 返回 HTTP 404。 - 验证修复来源:确认你的版本包含 commit 引用自 PR #1945(等同于之前修复 #1727 的变更)。
- 检查客户端重试逻辑:确保客户端(例如基于
mcp-go的实现)在收到 404 后能正确发起重新初始化并获取新 session ID(参考mark3labs/mcp-go客户端的 streamable_http.go:257 处理)。 - 替代方案(如无法升级):手动修改
streamable_http_manager.py中返回 400 的逻辑,改为返回 404。但注意此修改需自行维护,官方已修复。
验证方法
在服务器重启后,使用原有(已失效)的 Mcp-Session-Id 发送请求,确认服务器返回 HTTP 404 而非 400。然后检查客户端是否能据此发起新的初始化请求并获得新的有效 session ID,后续正常通信。



