article
README
🚀 工人 MCP 项目
本项目展示了如何将 WorkerEntrypoint 类暴露为 MCP(模型上下文协议)服务。借助 Wrangler 和一些自定义工具,可实现本地开发与部署,为 MCP 服务的开发和测试提供了便利。
🚀 快速开始
安装和运行
- 克隆项目仓库。
- 运行
npm install安装依赖项。 - 在
scripts/目录中运行node local-proxy.ts启动代理服务器。 - 使用 MCP 工具测试与
WorkerEntrypoint的交互。
✨ 主要特性
- 能够将
WorkerEntrypoint类暴露为 MCP 服务。 - 支持本地开发和部署,方便进行测试。
- 提供文档生成脚本,可生成 MCP 工具文档。
📦 项目结构
project/
├── src/
│ └── index.ts # Worker 的主要入口点
├── lib/
│ └── WorkerMCP.ts # 公共 HTTP 处理器
├── scripts/
│ ├── local-proxy.ts # 本地 MCP 代理
│ └── generate-docs.ts # 文档生成脚本
└── package.json # 项目依赖管理
💻 使用示例
基础用法
src/index.ts - 工人入口点
export class WorkerEntrypoint {
async greet(name: string): Promise<string> {
return `Hello, ${name}!`;
}
}
这个类定义了我们想要通过 MCP 提供的服务。目前只有一个方法 greet,它接受一个字符串参数并返回问候语。
lib/WorkerMCP.ts - 公共 HTTP 处理器
import { expose } from '@modelcontextprotocol/sdk';
import { WorkerEntrypoint } from '../src/index';
class WorkerMCP {
static async fetch(req: Request): Promise<Response> {
const endpoint = new URL('/rpc', req.url);
if (req.method !== 'POST' || !req.headers.get('Content-Type')?.includes('application/json')) {
return Response.json({ error: 'Invalid request' }, 400);
}
try {
const body = await req.json();
const { method } = body;
const instance = new WorkerEntrypoint();
const result = await Reflect.apply(instance[method], instance, body.args || []);
return Response.json({ result });
} catch (error) {
return Response.json({ error: error.message }, 500);
}
}
}
expose(WorkerMCP);
这个文件定义了如何处理传入的 HTTP 请求。它通过 /rpc 路径暴露一个端点,接收 JSON 请求并调用相应的 WorkerEntrypoint 方法。
scripts/local-proxy.ts - 本地 MCP 代理
import { serve } from 'std/server';
import { expose } from '@modelcontextprotocol/sdk';
async function main() {
const port = 8080;
await serve(async (req) => {
if (req.method === 'GET' && req.url.pathname === '/tools/list') {
// 返回 MCP 工具列表
return Response.json({
tools: [{
name: 'WorkerEntrypoint',
methods: ['greet']
}]
});
} else if (req.method === 'POST' && req.url.pathname === '/rpc') {
// 处理 RPC 请求
const body = await req.json();
const instance = new WorkerEntrypoint();
return Response.json({ result: await Reflect.apply(instance[body.method], instance, body.args || []) });
}
}, { port });
}
main();
这个脚本在本地运行一个代理服务器,处理 MCP 的 tools/list 和 /rpc 请求。它允许我们在不部署到云的情况下测试和开发。
scripts/generate-docs.ts - 文档生成脚本
import { writeFileSync } from 'fs';
const docGenerator = () => {
const workerEntrypoint = require.resolve('../src/index');
const content = `See the source file: ${workerEntrypoint}`;
return {
entrypoints: [
{
name: 'WorkerEntrypoint',
description: 'A simple MCP service example.',
docUrl: 'https://example.com/docs'
}
],
tools: [{
name: 'greet',
description: 'Greets a person.',
arguments: [{ name: 'name', type: 'string' }],
returns: { type: 'string' }
}]
};
};
const docs = docGenerator();
writeFileSync('docs.json', JSON.stringify(docs, null, 2));
这个脚本生成用于 MCP 的工具文档。它目前静态生成文档,但可以扩展以包含更多详细信息。
🔧 技术细节
限制和未来计划
- 当前只支持从
src/index.ts公开一个类。 - 只有一个简单的
greet方法可用。 - 文档生成是静态的,未来可以扩展以包含更多详细信息。
📚 结论
这个项目展示了如何使用 Wrangler 和自定义脚本将工人入口点暴露为 MCP 服务,并提供了本地开发的能力。
微信扫一扫