远程MCP服务器

一个在Cloudflare Workers上实现的远程MCP服务器,提供沙盒化V8隔离环境中的JavaScript执行和SQL数据库功能,适用于AI代理开发。

  • by QuentinCody
  • TypeScript
  • 本地部署
  • 1 星标
  • 更新于
在 GitHub 查看 QuentinCody/mcp-codemode-templates

使用说明

代码模式MCP服务器(无身份验证)

Cloudflare Workers上的远程MCP服务器实现了 代码模式 模式——一个通用的计算+存储平台,AI代理通过MCP连接,获取类型化API,并可以在沙盒V8隔离中执行代码。

  • DO中的SQLite --每个实例的完整SQL数据库(高达10GB,零延迟)
  • 代码模式 --使用类型化工具访问在沙盒V8隔离中执行JavaScript
  • 无身份验证 --公共接入,发展和专用网络的理想选择

开始使用

npm install
npm run dev

服务器运行于 http://localhost:8788

  • 主页: http://localhost:8788/
  • MCP端点: http://localhost:8788/mcp

可用工具

存储(SQL)

工具 参数 描述
sql_query query, params? 执行SELECT/PRAGMA/EXPLAIN查询。以JSON格式返回行。
sql_exec query, params? 执行DDL/DML(创建表、插入、更新、删除)。
sql_exec_batch statements 在一次调用中执行多个DDL/DML语句。比打电话快得多 sql_exec 在一个循环中。

代理可以创建自己的表、索引,并完全通过SQL管理数据。参数化查询可防止注入。 sql_exec 和 sql_exec_batch 为安全起见,应阻断连接、拆卸和载荷释放。

计算(代码模式)

工具 参数 描述
execute_code code 在沙盒V8隔离中执行JavaScript,并通过以下方式访问所有工具 codemode 对象。
get_type_schema (none) 返回所有工具的TypeScript类型定义,以便代理可以编写类型良好的代码。

代码模式如何工作

  1. 客服电话 get_type_schema 获取所有可用工具的TypeScript定义
  2. 代理编写JavaScript代码 以这些类型为指导
  3. 客服电话 execute_code 使用代码字符串
  4. 代码在沙盒V8隔离中运行 带着一个 codemode 代理对象
  5. 隔离中的工具调用 (例如。, codemode.sql_query(...))路由回MCP服务器
  6. 结果返回 给代理人

示例流程

Agent → get_type_schema()
Agent ← TypeScript definitions

Agent → execute_code({
  code: `
    await codemode.sql_exec({
      query: "CREATE TABLE IF NOT EXISTS notes (id INTEGER PRIMARY KEY, title TEXT, body TEXT)"
    });
    await codemode.sql_exec({
      query: "INSERT INTO notes (title, body) VALUES (?, ?)",
      params: ["Hello", "World"]
    });
    const notes = await codemode.sql_query({ query: "SELECT * FROM notes" });
    return notes;
  `
})
Agent ← [{ id: 1, title: "Hello", body: "World" }]

注: Worker Loader API可能需要Cloudflare测试版访问。这 execute_code 如果LOADER绑定不可用,该工具将优雅地出错。所有其他工具都独立于代码模式工作。

与MCP检查员联系

npx @modelcontextprotocol/inspector

进入 http://localhost:8788/mcp 作为MCP服务器URL。

与克劳德桌面连接

添加到您的Claude桌面配置(Settings > Developer > Edit Config):

{
  "mcpServers": {
    "codemode": {
      "command": "npx",
      "args": ["mcp-remote", "http://localhost:8788/mcp"]
    }
  }
}

部署到Cloudflare

npm run deploy

然后更新Claude Desktop配置以使用部署的URL:

https://remote-mcp-server-authless.<your-account>.workers.dev/mcp

建筑

┌─────────────────────────────────────────────────────────────────┐
│  MCP Client (Claude Desktop, Inspector, etc.)                   │
└──────────────────────────┬──────────────────────────────────────┘
                           │ Streamable HTTP (/mcp)
                           ▼
┌─────────────────────────────────────────────────────────────────┐
│  Cloudflare Worker (HTTP Router)                                │
│  src/index.ts                                                   │
└──────────────────────────┬──────────────────────────────────────┘
                           │ Routes to Durable Object
                           ▼
┌─────────────────────────────────────────────────────────────────┐
│  MyMCP (Durable Object)                                         │
│  src/mcp-shared/agent.ts                                        │
│                                                                 │
│  ┌───────────────────────────────────────────────────────────┐  │
│  │  ToolRegistry                                             │  │
│  │  Registers tools, routes isolate calls, generates types   │  │
│  └──────┬──────────────────────────────────┬─────────────────┘  │
│         │                                  │                    │
│         ▼                                  ▼                    │
│  ┌──────────────┐                   ┌──────────────────────┐   │
│  │  SQLite-in-DO │ ◄── Extension 1  │  Code Mode           │   │
│  │              │                   │                      │   │
│  │  sql_query   │                   │  execute_code        │   │
│  │  sql_exec    │                   │  get_type_schema     │   │
│  │  sql_exec_   │                   └──────────┬───────────┘   │
│  │    batch     │                              │               │
│  │              │                              │ Worker Loader  │
│  │  Embedded    │                              ▼               │
│  │  SQLite DB   │                   ┌──────────────────────┐   │
│  │  (up to 10GB)│                   │  V8 Isolate          │   │
│  │              │                   │  (sandboxed)         │   │
│  │  this.sql    │                   │                      │   │
│  │  tagged      │                   │  User code runs here │   │
│  │  template    │                   │  with `codemode`     │   │
│  │              │                   │  proxy object        │   │
│  └──────────────┘                   └──────────┬───────────┘   │
│         ▲                                      │               │
│         │              ┌───────────────────┐   │               │
│         │              │  CodeModeProxy    │◄──┘               │
│         │              │  (service binding)│  RPC call         │
│         │              └────────┬──────────┘                   │
│         │                       │ Routes back to DO            │
│         │                       ▼                              │
│         └───── registry.handleIsolateCall() ───────────────────│
│                (tool call completes, result returns to isolate) │
└─────────────────────────────────────────────────────────────────┘

这些碎片是如何组合在一起的

  • MCP服务器(核心) --The MyMCP 持久对象扩展了Cloudflare的 McpAgent 类。它承载MCP协议,管理会话,并拥有 ToolRegistry 所有工具都已注册。

  • 扩展1:DO中的SQLite --每个DO实例都有一个嵌入式SQLite数据库,可通过以下方式访问 this.sql (标记的模板文字)。SQL工具(sql_query, sql_exec, sql_exec_batch)通过语句验证提供安全、参数化的访问。

  • 扩展2:代码模式 -通过Cloudflare的Worker Loader API执行沙盒JavaScript。用户代码在临时V8隔离中运行 codemode 代理对象。隔离内部的工具调用(例如。, codemode.sql_query(...))路线通过 CodeModeProxy (自引用服务绑定)返回DO ToolRegistry,它会分派给适当的工具处理程序。结果返回到隔离区。

  • 自包含模板 --在中包含共享运行时的供应商副本 src/mcp-shared/ 因此Deploy to Workers可以直接从仓库构建

定制

工具定义见 src/mcp-shared/tools/。要添加新工具,请执行以下操作:

  1. 在中创建新文件 src/mcp-shared/tools/
  2. 出口A ToolEntry[] 数组(参见 src/mcp-shared/tools/sql.ts 图案)
  3. 在中注册工具 src/mcp-shared/agent.ts 在 init() 方法via this.registry.add(...yourTools)

注册表自动处理MCP注册、隔离呼叫路由和类型生成,无需手动 callTool() 案件需要。类型生成的工具定义来自 registry.getDefinitions().