MCP服务器包装器

将标准输入输出的MCP服务器转换为基于WebSocket的服务器,简化程序化交互和进程管理。

  • by rgarcia
  • TypeScript
  • 本地部署
  • 2 星标
  • 更新于
在 GitHub 查看 rgarcia/mcp-server-server

使用说明

mcp服务器

此仓库是一个概念验证MCP服务器,通过websocket公开另一个stdio MCP服务器。

但是。…为什么?

MCP服务器很难使用。

MCP服务器的主要传输机制是stdio,即在MCP客户端程序中,您需要为要使用的MCP服务器生成一个新进程。 这有缺点:

  1. 这很麻烦——现在每个MCP客户端都需要成为流程管理器。你的方式 配置克劳德桌面 使用MCP服务器就是一个很好的例子——它需要一个要运行的进程列表。
  2. 它造成了一个基础设施问题:如果你有很多用户,所有用户都需要不同的MCP服务器配置(例如,他们对底层MCP服务器(如Github、Google Drive等)都有不同的凭据),那么你现在有大量的进程要操作和路由客户端请求。
  3. 它很慢:启动MCP服务器的默认方式是 npx ... 或 uvx ... 这伴随着这些工具的所有缓慢(2-3s的启动时间是正常的)。

更好的方式

如果MCP服务器真的是。..服务器?也就是说,与他们的通信是通过网络而不是stdio进行的。 然后,您可以更轻松地以编程方式使用它们。

步骤1:将stdio MCP服务器转换为websocket MCP服务器

此仓库包含一个包装程序,该程序将接受现有的MCP服务器(这里 这是一个官方列表,但它们现在都结束了),并通过websocket公开:

bun run mcp-server-wrapper -p 3001 -- npx -y @modelcontextprotocol/server-puppeteer@latest

为了加快启动时间,请安装它并使用以下命令调用它 node 直接:

pnpm install -g @modelcontextprotocol/server-puppeteer@latest
bun run mcp-server-wrapper -p 3001 -- node ~/Library/pnpm/global/5/node_modules/@modelcontextprotocol/server-puppeteer/dist/index.js

步骤2:以编程方式与MCP服务器交互,无需管理进程

import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { WebSocketClientTransport } from "@modelcontextprotocol/sdk/client/websocket.js";

const transport = new WebSocketClientTransport(new URL("ws://localhost:3001"));

const client = new Client(
  {
    name: "example-client",
    version: "1.0.0",
  },
  {
    capabilities: {},
  }
);
await client.connect(transport);
const tools = await client.listTools();
console.log(
  "Tools:",
  tools.tools.map((t) => t.name)
);
await client.close();
bun run mcp-server-wrapper-client
$ bun run src/mcp-server-wrapper/example-client/example-client.ts
Tools: [ "puppeteer_navigate", "puppeteer_screenshot", "puppeteer_click", "puppeteer_fill",
  "puppeteer_evaluate"
]

步骤3:将其构建为docker镜像

对于给定的MCP服务器配置,例如。

{
  "mcpServers": {
    "fetch": {
      "command": "uvx",
      "args": ["mcp-server-fetch"]
    }
  }
}

我们想把它构建成一个docker镜像,它公开了一个websocket,我们可以在任何地方运行。 此仓库包含一个脚本,该脚本将为给定的MCP服务器配置输出一个Dockerfile: