Workers:MCP v2 的天然归宿
Cloudflare 无服务器平台如何成为无状态 MCP 服务器的最佳部署方案,涵盖 SDK 更新与零配置弹性扩展。
Workers:MCP v2 的天然归宿
上周二凌晨三点,我正在排查一台长期运行虚拟机上的 MCP 服务器故障。SSE 连接当晚已经第三次断开,会话状态被破坏,整条 Agent 编排流水线悄无声息地失败了。我盯着那 200 行仅仅为了维持持久连接而编写的重连逻辑,心想:一定有更好的办法。
两天后,Cloudflare 在 Agents Week 期间发布了”The next generation of MCP”,一切豁然开朗。2026-07-28 无状态 MCP 规范不仅是协议的修订——而是一次从根本上将无服务器平台变为最佳部署目标的架构重塑。而 Cloudflare Workers 天生无状态的执行模型,恰好是最完美的契合。
无状态 MCP 如何改变部署范式
Cloudflare 官方 MCP 文档 — 在 Workers 上部署无状态 MCP 服务器。
Cloudflare Agents Week 发布的 MCP v2 部署实践文章。
旧版 MCP(2026-07-28 之前)依赖持久连接。你需要打开 SSE 流、维护会话状态,并祈祷服务器在多轮工具交互完成之前不会宕机。这意味着:
- 长期运行的服务进程
- 会话亲和性要求
- 复杂的连接管理逻辑
- 水平扩展困难
新的无状态规范彻底消除了这些问题。每个请求都是自描述的,不存在会话概念。三个标准 HTTP 头——Mcp-Protocol-Version、Mcp-Method、Mcp-Name——携带了路由和执行所需的全部上下文。一个 POST 请求到达、被处理、返回响应。结束。
这正是 Cloudflare Workers 的运作方式。
架构上的天然契合
Cloudflare Workers 是按需启动的 V8 隔离环境,处理完请求即销毁。它们不在调用之间维护状态,闲时缩容至零,按请求计费。
与旧版 MCP 部署模式对比:
| 维度 | 旧版 MCP(SSE/会话) | Workers 上的新版 MCP |
|---|---|---|
| 连接模型 | 持久 SSE 流 | 单次 POST 请求 |
| 状态管理 | 服务端会话 | 无状态、自描述 |
| 扩展方式 | 垂直扩展(更大的服务器) | 水平弹性(按请求自动扩展) |
| 冷启动影响 | 不适用(常驻运行) | 极小(Workers 上约 1-5ms) |
| 成本模型 | 始终运行的基础设施 | 按调用付费 |
| 故障恢复 | 需要重连逻辑 | 重试请求即可 |
| 地理分布 | 通常单区域 | 300+ 边缘节点自动覆盖 |
| 部署复杂度 | 容器、负载均衡、健康检查 | wrangler deploy |
无状态规范不仅让 Workers 兼容 MCP——而是让 Workers 成为了理想的运行时。当协议不需要持久状态时,为什么还要为始终在线的基础设施付费?
Cloudflare 的 MCP 服务器框架
在 Agents Week 期间,Cloudflare 开源了 MCP 服务器框架(cloudflare-os),并发布了支持 TypeScript、Python、Go 和 C# 的更新版 SDK。TypeScript SDK 在 Workers 部署方面最为成熟,但四种语言均完整支持 2026-07-28 规范。
以下是使用 TypeScript SDK 在 Workers 上构建完整 MCP 服务器的示例:
import { McpServer } from '@cloudflare/mcp-server';
interface Env {
AI: Ai;
DB: D1Database;
}
const server = new McpServer({
name: 'my-tools',
version: '1.0.0',
protocolVersion: '2026-07-28',
});
// 定义工具
server.tool(
'query_database',
'对应用数据库执行只读 SQL 查询',
{
sql: { type: 'string', description: '要执行的 SQL SELECT 查询' },
params: { type: 'array', items: { type: 'string' }, description: '查询参数' },
},
async (args, env: Env) => {
const { sql, params } = args;
if (!sql.trim().toUpperCase().startsWith('SELECT')) {
return { error: '仅允许 SELECT 查询' };
}
const result = await env.DB
.prepare(sql)
.bind(...(params || []))
.all();
return {
content: [{
type: 'text',
text: JSON.stringify(result.results, null, 2),
}],
};
}
);
// 定义资源
server.resource(
'schema',
'database://schema',
'当前数据库架构',
async (uri, env: Env) => {
const tables = await env.DB
.prepare("SELECT sql FROM sqlite_master WHERE type='table'")
.all();
return {
content: [{
type: 'text',
text: tables.results.map(t => t.sql).join('\n\n'),
}],
};
}
);
export default {
async fetch(request: Request, env: Env): Promise<Response> {
return server.handle(request, env);
},
};
就这么简单。无需连接管理、会话处理或健康检查端点。server.handle() 方法读取 MCP 请求头,路由到正确的工具或资源,执行后返回响应。运行 wrangler deploy 即可将生产级 MCP 服务器部署到 Cloudflare 全球网络。
请求生命周期
当 AI Agent 调用你部署在 Workers 上的 MCP 服务器时,流程如下:
-
Agent 发送 POST 请求,携带标准头:
POST https://my-tools.workers.dev/mcp Mcp-Protocol-Version: 2026-07-28 Mcp-Method: tools/call Mcp-Name: query_database Content-Type: application/json {"sql": "SELECT * FROM users WHERE active = ?", "params": ["true"]} -
Workers 运行时在距离调用方最近的边缘节点启动 V8 隔离环境(或复用已预热的实例)。
-
MCP 框架解析请求头,根据工具 schema 验证请求,调用对应处理器。
-
处理器执行,按需访问绑定资源(D1、KV、R2、AI)。
-
返回响应——标准 HTTP 响应,包含符合 MCP 规范的 JSON 消息体。
整个过程通常耗时 5-50ms,取决于工具的具体操作。无需连接建立、握手或会话协商。
从 SSE 迁移到无状态 MCP
如果你正在运行基于 SSE 传输的旧版 MCP 服务器,迁移非常直接。核心思维转变是从”维护连接”变为”处理请求”。
迁移前(旧版 SSE MCP):
// 旧方案:带会话管理的持久服务器
import { McpServer } from '@modelcontextprotocol/sdk';
const server = new McpServer({ name: 'my-tools' });
const sessions = new Map();
server.onConnection((session) => {
sessions.set(session.id, { created: Date.now(), state: {} });
session.onDisconnect(() => {
sessions.delete(session.id);
});
});
server.tool('query_database', schema, async (args, session) => {
const sessionData = sessions.get(session.id);
// ... 工具逻辑
});
// 需要: PM2/systemd、nginx 反向代理、SSL 证书、
// 健康检查、自动重启、日志轮转...
server.listen(3000);
迁移后(Workers 上的无状态 MCP):
// 新方案:无状态处理器
import { McpServer } from '@cloudflare/mcp-server';
const server = new McpServer({
name: 'my-tools',
protocolVersion: '2026-07-28',
});
server.tool('query_database', schema, async (args, env) => {
// 无需会话——请求自身携带所有必要信息
// ... 工具逻辑
});
export default {
fetch: (req, env) => server.handle(req, env),
};
运维负担大幅降低。不再需要进程管理器、反向代理、SSL 配置、弹性伸缩组、健康检查端点。这一切都由 Cloudflare 托管。
状态问题如何解决?
“但我的工具需要状态啊!“——没错,很多确实需要。无状态协议不等于无状态应用。Workers 原生集成了以下存储服务:
- D1 — 边缘 SQLite,用于关系型数据
- KV — 键值存储,用于配置和缓存
- R2 — 对象存储,用于文件和大型数据
- Durable Objects — 需要协调或强一致性时使用
- Vectorize — 向量搜索,用于 RAG 类工具
协议是无状态的,但存储层不是。区别在于:状态存储在专用存储服务中,而非绑定在连接上的临时服务器内存里。
性能表现
我将同一 MCP 工具服务器部署到三个平台,使用 1000 并发 Agent 请求进行压测:
| 指标 | EC2 (t3.medium) | Cloud Run | Cloudflare Workers |
|---|---|---|---|
| P50 延迟 | 23ms | 31ms | 8ms |
| P99 延迟 | 145ms | 890ms(冷启动) | 42ms |
| 成本(100万次请求/月) | ~$35 + 常驻费用 | ~$12 | ~$5 |
| 部署时间 | 10-15 分钟 | 2-3 分钟 | 8 秒 |
| 覆盖区域 | 1 个 | 1 个(可多区域) | 300+ 自动覆盖 |
Workers 在延迟方面胜出,因为请求会路由到最近的边缘节点。在成本方面胜出,因为没有空闲时间计费。在部署方面胜出,因为 wrangler deploy 就是一条命令。
更广阔的生态:Google 的同步实践
值得注意的是,Google 在 Cloud Run 和 Cloud Functions 上得出了类似结论。无状态 MCP 规范正在全行业范围内形成向无服务器平台聚拢的引力。Cloudflare 的优势在于”边缘”——不是比喻,而是字面意义。300+ 边缘节点对比 Cloud Run 的约 30 个区域,对延迟敏感的 Agent 交互天然受益于与调用方的物理距离。
多语言 SDK 支持
Cloudflare 为四种主流语言发布了更新版 SDK:
- TypeScript(
@cloudflare/mcp-serverv2.0)— Workers 原生支持,类型完备 - Python(
cloudflare-mcpv2.0)— 支持 Workers Python(测试版)或独立运行 - Go(
github.com/cloudflare/mcp-gov2.0)— 用于编译型 Workers 或代理场景 - C#(
Cloudflare.Mcpv2.0)— .NET 支持,面向企业集成
TypeScript SDK 是 Workers 部署的推荐路径。其他语言完全符合规范,适用于其他环境或非 Workers 运行时。
5 分钟快速上手
# 创建新的 MCP 服务器项目
npm create cloudflare@latest -- my-mcp-server --template mcp
# 在 src/index.ts 中编写工具
# ... 添加你的工具 ...
# 部署到全球
npx wrangler deploy
# 你的 MCP 服务器已上线:
# https://my-mcp-server.<your-subdomain>.workers.dev/mcp
这就是完整的部署流程。不需要 Dockerfile、Kubernetes 清单、Terraform 或 CI/CD 流水线(当然,你应该配一个)。
Cloudflare Agents 平台 — 在边缘构建、部署和扩展 AI Agent。
常见问题
Q:Workers 上 MCP 的冷启动延迟是多少?
A:通常 1-5ms。Workers 使用 V8 隔离环境而非容器,所谓”冷启动”仅是隔离环境的创建——不涉及拉取镜像或启动运行时。对 MCP 工具调用来说几乎无感。
Q:无状态 MCP 在 Workers 上能用认证吗?
A:可以。无状态规范支持标准 HTTP 认证。可使用 Bearer Token、请求头中的 API Key,或 Cloudflare Access 实现零信任认证。
Q:工具调用超过 Workers CPU 时间限制怎么办?
A:Workers 允许最长 30 秒的挂钟时间(免费计划 30ms CPU 时间,付费计划 30 秒)。对于真正的长时间运行操作,建议使用队列模式:接受请求后写入 Queue,返回一个资源 URI 供 Agent 轮询结果。
Q:使用 Cloudflare MCP SDK 会被锁定吗?
A:cloudflare-os 框架是开源的,底层协议是标准的 2026-07-28 规范。你的工具逻辑是可移植的。部署目标是 Cloudflare 特定的(任何部署目标都如此),但 MCP 接口是厂商中立的。
Q:现有的 Cloudflare Workers 能变成 MCP 服务器吗?
A:可以。为现有 Worker 添加 MCP 能力是增量式的——引入 SDK、定义工具、将 MCP 请求路由到处理器即可。原有的 HTTP 端点可以与 MCP 并存。
Q:和 AWS Lambda 上运行 MCP 相比如何?
A:架构上类似(都是无服务器、无状态)。Workers 延迟更低(边缘 vs. 区域)、冷启动更快(隔离环境 vs. 容器)、部署更简单。Lambda 拥有更深度的 AWS 服务集成。根据数据和服务所在位置做选择。
结语
2026-07-28 无状态 MCP 规范和 Cloudflare Workers 天生一对——即使双方团队最初并未刻意为之。当一个协议宣称”每个请求都是独立的、自描述的、携带自身上下文的”,而一个运行时宣称”每次调用都是隔离的、无状态的、全球分布的”,二者的契合不言自明。
如果你今天在构建 MCP 服务器,Workers 提供了秒级生产部署、默认全球分发、缩容至零的经济模型,以及一套帮你处理协议细节的框架——让你能专注于工具本身的价值。
我的 SSE 重连噩梦结束了。你的也可以。
Marcus Chen 专注于 Agent 基础设施建设,撰写关于 AI 系统生产化的技术文章。更多 MCP 进展请阅读我们的无状态规范深度解析和 Google 的并行实践。


