Cloudflare Workers上的MCP服务器
部署到Cloudflare Workers的生产就绪模型上下文协议(MCP)服务器,通过Workers AI和Vectorize提供基于HTTP的语义搜索。
建筑
Any Client ──HTTP──> Workers MCP Server ──> Workers AI + Vectorize这是一个 完全远程MCP服务器 -不需要本地依赖关系。可通过HTTP从任何地方访问。
特性
- ✅ HTTP到MCP适配器:自定义实现(MCP SDK需要stdio,我们使用HTTP)
- ✅ 语义搜索:具有向量相似性的自然语言查询
- ✅ 智能搜索工具:使用AI驱动的合成上下文进行搜索(新增!)
- ✅ 边缘部署:在Cloudflare的网络上全球运行
- ✅ 工人AI集成:
bge-small-en-v1.5嵌入(384个维度) - ✅ 矢量化搜索:HNSW索引用于快速相似性搜索
- ✅ CORS已启用:适用于web应用程序和API客户端
- ✅ 生产就绪:包括错误处理、正确响应
为什么采用这种方法?
官方MCP SDK使用 stdio传输 (标准输入/输出),适用于本地进程,但不适用于无服务器Workers。我们构建了一个自定义HTTP适配器,通过HTTP实现MCP协议。
先决条件
- 启用Workers的Cloudflare帐户
- Wrangler CLI已安装
- 创建并填充矢量化索引
设置
1.克隆并安装:
git clone https://github.com/dannwaneri/mcp-server-worker.git
cd mcp-server-worker
npm install2.创建矢量化索引:
wrangler vectorize create mcp-knowledge-base --dimensions=384 --metric=cosine3.配置 wrangler.jsonc:
{
"name": "mcp-server-worker",
"main": "src/index.ts",
"compatibility_date": "2025-12-02",
"compatibility_flags": ["nodejs_compat"],
"observability": {
"enabled": true
},
"ai": {
"binding": "AI"
},
"vectorize": [
{
"binding": "VECTORIZE",
"index_name": "mcp-knowledge-base"
}
]
}4.部署:
wrangler deploy您的MCP服务器将在以下网址提供: https://mcp-server-worker.YOUR-SUBDOMAIN.workers.dev
填充数据
您需要先填充Vectorize索引。使用 矢量化mcp工作者 要做到这一点:
curl -X POST https://vectorize-mcp-worker.YOUR-SUBDOMAIN.workers.dev/populateAPI终点
GET /health
健康检查端点。
答复:
{
"status": "ok",
"server": "mcp-server-worker",
"version": "1.0.0"
}POST /mcp
MCP协议端点。接受JSON-RPC风格的请求。
列出工具
请求:
{
"method": "tools/list",
"params": {}
}答复:
{
"tools": [
{
"name": "semantic_search",
"description": "Search the knowledge base using semantic similarity...",
"inputSchema": {
"type": "object",
"properties": {
"query": { "type": "string" },
"topK": { "type": "number", "default": 5 }
},
"required": ["query"]
}
}
]
}呼叫工具
请求:
{
"method": "tools/call",
"params": {
"name": "semantic_search",
"arguments": {
"query": "vector databases",
"topK": 3
}
}
}答复:
{
"content": [
{
"type": "text",
"text": "{\"query\":\"vector databases\",\"resultsCount\":3,\"results\":[...]}"
}
]
}使用示例
卷曲
列出工具:
curl -X POST https://mcp-server-worker.YOUR-SUBDOMAIN.workers.dev/mcp \
-H "Content-Type: application/json" \
-d '{"method":"tools/list","params":{}}'语义搜索:
curl -X POST https://mcp-server-worker.YOUR-SUBDOMAIN.workers.dev/mcp \
-H "Content-Type: application/json" \
-d '{
"method": "tools/call",
"params": {
"name": "semantic_search",
"arguments": {"query": "AI embeddings", "topK": 5}
}
}'JavaScript/TypeScript
const response = await fetch('https://mcp-server-worker.YOUR-SUBDOMAIN.workers.dev/mcp', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
method: 'tools/call',
params: {
name: 'semantic_search',
arguments: { query: 'vector databases', topK: 3 }
}
})
});
const data = await response.json();
const results = JSON.parse(data.content[0].text);
console.log(results);python
import requests
response = requests.post(
'https://mcp-server-worker.YOUR-SUBDOMAIN.workers.dev/mcp',
json={
'method': 'tools/call',
'params': {
'name': 'semantic_search',
'arguments': {'query': 'vector databases', 'topK': 3}
}
}
)
data = response.json()
print(data['content'][0]['text'])HTTP到MCP适配器实现
关键创新是将HTTP请求映射到MCP协议:
// HTTP POST /mcp
{
"method": "tools/list",
"params": {}
}
// Maps to MCP ListToolsRequestSchema
// Returns tools array
// HTTP POST /mcp
{
"method": "tools/call",
"params": {
"name": "semantic_search",
"arguments": {...}
}
}
// Maps to MCP CallToolRequestSchema
// Executes tool, returns result演出
全球边缘部署提供:
- 47毫秒 平均查询延迟(拉各斯到旧金山)
- 23毫秒 来自伦敦
- 31毫秒 来自旧金山
- 52毫秒 来自悉尼
故障:
- 生成查询嵌入:~18ms
- 矢量化相似性搜索:~8ms
- 格式化和返回:~21ms
生产改进
添加身份验证
const apiKey = request.headers.get("Authorization");
if (apiKey !== env.API_KEY) {
return new Response("Unauthorized", { status: 401 });
}将API密钥存储为机密:
wrangler secret put API_KEY添加速率限制
使用耐用对象或跟踪KV中的请求:
const clientId = request.headers.get("CF-Connecting-IP");
const rateLimitKey = `ratelimit:${clientId}`;
const count = await env.KV.get(rateLimitKey);
if (parseInt(count || "0") > 100) {
return new Response("Rate limit exceeded", { status: 429 });
}
await env.KV.put(rateLimitKey, String(parseInt(count || "0") + 1), {
expirationTtl: 3600
});添加监控
使用Workers分析引擎:
ctx.waitUntil(
env.ANALYTICS.writeDataPoint({
blobs: ["semantic_search", clientId],
doubles: [latency, score],
indexes: [Date.now()]
})
);地方发展
wrangler dev访问地址: http://localhost:8787
故障排除
“未连接”错误:
- 确保
nodejs_compat旗帜在wrangler.jsonc - 检查AI和Vectorize绑定是否已配置
- 验证索引是否存在:
wrangler vectorize list
没有搜索结果:
- 首先填充索引(请参阅“填充数据”)
- 检查索引是否有向量:使用Cloudflare仪表板
响应缓慢:
- 检查Workers Analytics是否存在瓶颈
- 考虑在KV中缓存嵌入
- 使用最近的Cloudflare数据中心进行验证
技术栈
- Cloudflare员工:无服务器执行
- 工人AI:
@cf/baai/bge-small-en-v1.5(384个暗嵌入) - 矢量化:HNSW索引,余弦相似度
- TypeScript:类型安全开发
成本估算
每月100000次搜索:
- 人工智能嵌入:0.40美元
- 矢量化:包含在工人计划中(每月5美元)
- 工人要求:免费(1000万以下)
总计:约5.40美元/月
与其他架构的比较
| 架构 | 可访问性 | 延迟 | 设置复杂性 |
|---|---|---|---|
| 本地(stdio) | 仅限克劳德桌面 | 即时 | 简单 |
| 混合(桥接) | 仅限克劳德台式机 | ~100ms | 中等 |
| 工作者(HTTP) | 任何地方 | 20-50ms | 中等 |
这种Workers方法最适合:
- 生产应用
- 网络/移动应用程序
- 团队协作
- API集成
- SaaS产品
相关项目
了解更多
阅读完整教程: 使用语义搜索在Cloudflare Workers上构建MCP服务器
许可证
麻省理工学院
作者
丹尼尔·恩瓦内里- | Upwork
