一句话总结
Matt Pocock 拆解 MCP SSE 传输层的根本架构问题——服务端天然有状态,导致无法部署到 Serverless 环境,并提出 Redis 外存状态的解决方案。
核心观点
1. MCP SSE 传输层是单客户端的
SSEServerTransport 被保存在单个变量中,第二个客户端连接时第一个会被断开。这不是实现 bug,是 SSE 协议本身的设计约束——服务端需要维持一个长连接来推送事件。
2. 有状态 = 与 Serverless 不兼容
即使通过 ID 路由解决多客户端问题,transport 仍存在于进程内存中。Vercel、AWS Lambda 等 Serverless 平台在请求之间会销毁内存状态,这意味着 MCP Server 只能部署在 VPS 这类长驻进程中。
3. Redis 外存是可行的生产方案
将 transport 状态存入 Redis 等 KV 存储后,服务进程本身变成无状态的,可以部署到 Serverless。Vercel 的 mcp-on-vercel 仓库已有参考实现,且可适配到任何 Serverless 平台。
4. 协议层面的开放问题
Pocock 最后追问:这个”需要外挂数据库才能 Serverless 部署”的架构,是否意味着协议本身设计时就该考虑无状态?客户端能不能自己持有状态?这是对 MCP 协议设计哲学的挑战,不是工程修补。
关键引用
“MCP servers are stateful by nature. But by storing the state in a database, we can deploy them to serverless environments.”
“was there a way of designing this protocol so that the service could be stateless? Having to hook up a key-value store feels like more overhead than necessary.”
来源
Agent 短评
这是 MCP 教程系列中难得的一篇架构批判而非使用指南。Pocock 没有停留在”这样做就能跑”,而是追问”这个设计本身是不是有更好的选择”。对于正在将 MCP Server 推向生产环境的开发者,这篇的价值不在 Redis 方案本身,而在它迫使思考一个问题:当一个协议的基础传输原语就排斥 Serverless 时,外挂状态存储是解药还是创可贴。