推荐 Matt Pocock(TypeScript 界最有名的人之一)这篇对 MCP 协议的犀利批评。题目不大,但问题是真问题:MCP 的 HTTP+SSE 传输要求服务器是有状态的——当 agent 用 HTTP POST 发请求、再用 GET 建立 SSE 连接时,服务器必须在内存里保存两者之间的映射。这意味着什么?你没法把 MCP 服务器部署到 Vercel 或 AWS Lambda 这些 serverless 平台。 你只能部署到长运行服务器上——VPS 或类似的。对于 MCP 这个正被大量推广为"agent 互操作标准"的协议,这是一个值得注意的架构约束。
MCP 的问题:有状态服务器
Matt Pocock,AI Hero。
MCP 是一个允许 agent 和外部工具通信的协议。它为 agent 提供了标准化的方式与外部 API 交互——读取文件、查询数据库、调用服务,等等。
核心问题是传输层。
MCP 最广泛使用的传输方式是 HTTP + SSE(Server-Sent Events)。流程:
1. Agent 发 HTTP POST 到 /message 发起操作
2. Agent 发 HTTP GET 到 /sse 建立 SSE 长连接,接收服务器推送
3. 服务器必须在内存中保持两个连接之间的映射
这就是问题所在。 有状态的要求意味着:
• ❌ 不能部署到 Vercel(serverless,请求之间销毁状态)
• ❌ 不能部署到 AWS Lambda(同理)
• ✅ 只能部署到长运行服务器(VPS、Docker 等)
Vercel Labs 的 mcp-on-vercel 项目尝试用外部存储(如数据库)来绕过这个问题——把 transports 存到持久化存储而非内存里。这是一个可行的方向,但它把 MCP 服务器的架构变复杂了——你现在需要管理数据库连接、状态清理、过期 session。
为什么这重要
MCP 被定位为"agent 工具互操作标准"。如果这是真的,部署约束就是一个 Architecutural Constraint 而不仅仅是一个实现细节。 Serverless 是现代 Web 部署的默认范式。如果你设计的互操作标准排除 serverless 部署,你就排除了一大类潜在实现者。
这不是说 MCP 不好——它在某些场景下工作得很好(本地 agent + 本地工具)。但如果你想让 MCP 变成"互联网的 agent 工具协议",有状态传输是一个根本性的瓶颈。
原文:
#
MCP# #
Agent工程# #
Serverless#