返回市场
MCP服务器服务

MCP服务器服务

作者:rgarcia2 星标更新:2025-01-08

项目介绍

mcp-server-server

此仓库是一个概念验证的MCP服务器,它通过websocket暴露另一个标准I/O MCP服务器。

但是……为什么?

使用MCP服务器很困难。

MCP服务器的主要传输机制是标准I/O,即在你的MCP客户端程序中,你需要为想要使用的MCP服务器启动一个新的进程。 这有以下缺点:

  1. 它很麻烦——现在每个MCP客户端都需要成为一个进程管理器。配置Claude Desktop以使用MCP服务器的方式很好地说明了这一点——它需要一个要运行的进程列表。
  2. 它会引发基础设施问题:如果你有很多用户,所有这些用户都需要不同的MCP服务器配置(例如,他们都有不同的凭证来访问底层的MCP服务器,如GitHub、Google Drive等),那么你现在就有大量的进程需要操作并路由客户端请求。
  3. 它很慢:启动MCP服务器的默认方式是npx ...uvx ...,这些工具都伴随着它们的启动延迟(2-3秒的启动时间是正常的)。

更好的方法

如果MCP服务器实际上是……服务器呢?也就是说,与它们的通信是通过网络而不是标准I/O进行的。 这样,你可以更轻松地编程使用它们。

第一步:将标准I/O 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

第二步:无需管理进程即可编程地与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.map((t) => t.name)
);
await client.close();
bun run mcp-server-wrapper-client
$ bun run src/mcp-server-wrapper/example-client/example-client.ts
工具: [ "puppeteer_navigate", "puppeteer_screenshot", "puppeteer_click", "puppeteer_fill",
  "puppeteer_evaluate"
]

第三步:构建Docker镜像

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

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

我们希望将其构建为一个暴露websocket的Docker镜像,可以在任何地方运行。 此仓库包含一个脚本,该脚本将为给定的MCP服务器配置输出一个Dockerfile: