AgentHubAgentHub
返回全部博客

在 Cloudflare Workers 上部署 Serverless 边缘 MCP Server:全球低延迟与零服务器运维

AgentHub 核心团队··4 分钟阅读·63 次阅读
在 Cloudflare Workers 上部署 Serverless 边缘 MCP Server:全球低延迟与零服务器运维

先把适用边界划清楚

边缘部署的收益是免运维与就近响应,代价是不能再依赖本地文件系统、本机 Git 仓库与内网服务。开工前判断一次:要暴露的工具是否只依赖 HTTP 就能完成?答案是要,这套架构才成立。

为什么选择 Serverless 边缘架构?

传统的云主机部署需要持续支付服务器租金、维护系统补丁与网络证书。而 MCP 工具调用通常是离散的、按需触发的。

Cloudflare Workers 具有秒级冷启动、全球 300+ 边缘节点路由以及极高性价比(每天免费 10 万次请求),是部署公共或团队轻量 MCP Server 的绝佳平台。


1. 创建 Worker 项目

npm create cloudflare@latest mcp-edge-worker
cd mcp-edge-worker
npm install @modelcontextprotocol/sdk

模板选择以你熟悉的为准;上面这三步只保证项目骨架与 SDK 就位,真正的协议处理还需要自己写。


2. 实现边缘端 SSE 处理

利用 Web 标准的 ReadableStream 与 TransformStream 响应客户端的长连接请求,实现无需持久 Node.js 进程的高并发服务。

配合 Cloudflare Access 或自定义 API Key 头部鉴权,可以安全将内部系统能力暴露给团队成员的 Cursor 或 Claude。

这里有一个绕不开的结构问题:SSE 与 Streamable HTTP 都是有会话状态的连接,而 Worker 实例是无状态的。实践中的常规做法是用 Durable Object 承载每个会话的状态与消息通道,让同一会话的请求落到同一个实例上。具体绑定写法以官方文档为准。

3. 用 wrangler 管配置与密钥

项目根的 wrangler.toml 至少需要这几项(字段随版本演进,以官方文档为准):

配置项作用备注
nameWorker 名称决定默认访问域名
main入口脚本指向上一步的源文件
compatibility_date运行时能力开关升级前先把这一项对齐
vars非敏感配置例如上游 API 基址

密钥不要写进 vars:

wrangler secret put MCP_API_TOKEN
wrangler dev
wrangler deploy

wrangler dev 在本地起一个与边缘同构的运行时,先在这里把工具列表与调用跑通,再部署。

4. 哪些工具适合放边缘

适合不适合
公共数据查询、汇率/天气/文档检索读写本地代码仓库
封装只读内部 API需要长事务或大文件上传的任务
无状态计算与格式转换依赖内网可达性的操作

判断标准是"单次请求能否自成一体"。需要跨调用维持大量中间状态的 Agent 工作流,更适合放在持久进程里,由边缘只做鉴权与转发。

怎么验证部署成功

按顺序做四项检查,任何一步失败都能立刻定位层次:

  1. curl -i https://<worker-url>/sse(路径按你的实现)响应头是 text/event-stream,并且能持续收到首条事件。
  2. wrangler tail 里能看到对应请求,且没有未捕获异常。
  3. 客户端把端点填进去后能拉到工具列表,调用一个最轻的工具能拿到结构化结果。
  4. 故意去掉鉴权头再请求,应当返回 401 而不是工具清单——这条不通过,说明鉴权逻辑根本没生效。

常见故障速查

现象原因处理
连接立刻关闭响应未声明 SSE 内容类型或被缓冲检查响应头与代理缓冲
工具列表为空初始化握手未完成就返回用 Inspector 直连端点看报文
会话状态丢失请求落到不同实例用 Durable Object 绑定会话
偶发 5xx 且无日志CPU 或执行时长达到上限拆分调用、把重活交给上游服务
跨域请求被拒未处理 OPTIONS 预检补 CORS 中间件与允许头
冷启动感觉慢依赖体积过大精简包体、减少顶层初始化

小结

边缘 MCP 的选型可以用三个问题收口:工具是否只依赖 HTTP、会话能否用 Durable Object 承载、单请求计算量是否在额度内。三条都为是,边缘方案的成本优势很实在;有一条为否,就应该回到容器或本地进程,别为了"零服务器"硬迁。

延伸阅读

推荐阅读

实战教程

为什么 AI 读错截图里的数字:它拿到的图比屏幕上那张小得多

你把截图原图丢给 AI,它把 9,847 读成 9,347,或者把发票上一行小字整段编出来。原因大概率不在「眼神」,在尺寸:Claude 官方明写它按 28×28 的像素块看图,每块算一个视觉词元,超过上限的图会先缩小;1920×1080 压到 1456×819,你屏幕上 12 像素的小字到它眼里只剩 9.1 像素,而 4K 截图压完和 1080p 一模一样大——分辨率白涨了。这篇给出三张能自己复算的数:面积、字高、词元。最有用的结论反直觉:别放大整张图,裁一块再发——600×400 的局部不缩、字高完整保留、只付 330 个词元,比整张的 1,560 还便宜 4.7 倍。另附一个扫描口径:论文实测约 300ppi 追平传统 OCR、150ppi 以下明显退化,而 9.1 像素的字折算下来只有 62ppi。

实战教程

为什么同一个问题问 AI 两遍,答案不一样:它不是在算答案,是在按概率抽一个词

同一句话原封不动问两遍,AI 的措辞不一样、甚至结论不一样。原因不是它心情不好:它每步拿到的不是一个答案,而是「一整排候选加各自的概率」,然后从中抽一个,连抽几百次就是一篇回答。这篇把「温度」讲回它的本义——softmax 公式里那个除号(Hinton 原话「T 是通常设为 1 的温度」「T 越大概率越平」),再给三张你我能自己复算的表:同一排候选,温度 0 抽一千次只出 1 种结果、0.2 出 2 种、2.0 时最冷门的词已占 7.35%;每个词有九成把握一致,写到 50 个词整段逐字一致的概率只剩 0.5%;单次七成答对的模型,抽九次投票变 90.1%(谷歌 Self-Consistency 论文实测 GSM8K +17.9 个百分点)。最关键的一条纠正:温度调到 0 官方也不保证复现——Anthropic 明写它「从未保证输出相同」,微软 Azure 的 seed=42 自家示例第三遍照样变了。还有一个 2026 年的现在时:Kimi 固定 1.0、传其他值报错,Gemini 新模型直接忽略,Claude 新代传非默认值返回 400,大厂正在把这些旋钮拆掉。

实战教程

为什么 AI 数不清 strawberry 里有几个 r:它看到的不是十个字母,是三块

问 ChatGPT「strawberry 里有几个 r」,它常常答 2。原因不是笨,而是它根本没收到十个字母——我用官方分词库实测,strawberry 在三本不同词表里都是三块:st / raw / berry,三个 r 分散在其中两块里,而「逐块拆开再累加」这个动作从来没被训练过。这篇用「矗字里有几个直」讲清这件事,再给你四个自己跑得出来的数:同一句 17 个汉字,老词表切 34 块、新词表切 15 块;站内一篇 5,500 汉字的中文稿实测 7,112 块,约 0.77 汉字一块,换本词表变 9,491 块、多算 33%(和 Anthropic 官方那句「约 30 percent more tokens」对得上);9.11 之所以比 9.9 大,是因为它看到的是整块「11」。也有一条必须纠正的流行说法:分词不是唯一原因,arXiv 三篇论文给的图景更麻烦,而「换了 tokenizer 就修好了」厂商从未公开解释过。

实战教程

冬天掉的电会还给你,夏天掉的不会:笔记本电池的两条账

冬天续航从六小时掉到三小时,进屋放一会儿又涨回来——这不是电池冻坏了,而是低温让你“暂时取不出”那部分电。Battery University 的 BU-502 给的数是:同一块电池在 27°C 能放出 100%,到 -18°C 只放得出约 50%。真正不会还给你的是另外三件事:高温、长期满电、低温充电。而“充到 80% 更耐用”也有代价——BU-808 的表写明 4.20V(充到 100%)大约 300–500 次循环,压到 4.00V 能到 1,200–2,000 次,但每次能用的电量也更少。这篇把八家厂商(微软、苹果 iPhone、苹果 Mac、华硕、戴尔、三星、谷歌、联想)的官方充电上限摆在一起,讲清“电池健康 87%”是怎么算的、为什么 0°C 以下不要充电,以及充电宝上的 3C 为什么是 2024 年才强制的。

探索更多生产力神器

不想只停留在理论?立即体验下一代 AI 工具与 MCP 插件

收录 ChatGPT 6、Claude 3.7、Devin 等热门 AI,以及 3000+ 开发者开源 MCP 插件与一键安装脚本。