一个作为IDE与mcpd守护进程之间的代理的MCP(模型上下文协议)服务器,通过统一接口暴露所有由mcpd管理的MCP服务器。
┌─────────────┐ STDIO/JSON-RPC ┌──────────────┐ HTTP/REST ┌──────────┐
│ IDE/编辑器 │ ◄─────────────────► │ mcpd-proxy │ ◄───────────────►│ mcpd │
│ (VS Code, │ MCP协议 │ MCP服务器 │ 使用mcpd SDK │ 守护进程│
│ Cursor) │ │ │ │ │
└─────────────┘ └──────────────┘ └──────────┘
mcpd-proxy将多个由mcpd管理的MCP服务器中的工具、资源和提示聚合到一个单一的MCP接口中,使得IDE可以轻松访问所有功能,而无需管理单独的服务器连接。
mcpd管理的功能server__toolserver__resource,并使用mcpd://URIserver__promptTypeScript构建,确保类型安全Node.js 22.10.0或更高版本(推荐最新22.x版本)mcpd守护进程mcpd SDK(作为依赖项自动安装)# 全局安装
npm install -g @mozilla-ai/mcpd-proxy
# 或直接使用npx
npx @mozilla-ai/mcpd-proxy
# 克隆仓库
git clone https://github.com/mozilla-ai/mcpd-proxy.git
cd mcpd-proxy
# 安装依赖
npm install
# 构建项目
npm run build
mcpd-proxy通过环境变量进行配置:
| 变量 | 描述 | 默认值 |
|---|---|---|
MCPD_ADDR | mcpd守护进程地址 | http://localhost:8090 |
MCPD_API_KEY | 可选的mcpd认证API密钥 | (未设置) |
# 使用npm包(推荐)
npx @mozilla-ai/mcpd-proxy
# 带自定义mcpd地址
MCPD_ADDR=http://localhost:8090 npx @mozilla--ai/mcpd-proxy
# 带API密钥
MCPD_ADDR=http://localhost:8090 MCPD_API_KEY=your-key npx @mozilla-ai/mcpd-proxy
# 从源码构建
node dist/index.mjs
# 从源码带自定义地址
MCPD_ADDR=http://localhost:8090 node dist/index.mjs
添加到你的VS Code MCP设置文件(位置因平台而异):
{
"servers": {
"mcpd": {
"type": "stdio",
"command": "npx",
"args": ["@mozilla-ai/mcpd-proxy"],
"env": {
"MCPD_ADDR": "http://localhost:8090"
}
}
}
}
或者如果从源码构建:
{
"servers": {
"mcpd": {
"type": "stdio",
"command": "node",
"args": ["<path-to-mcpd-proxy>/dist/index.mjs"],
"env": {
"MCPD_ADDR": "http://localhost:8090"
}
}
}
}
替换<path-to-mcpd-proxy>为你安装的绝对路径。
重新加载VS Code:Cmd+Shift+P → "开发者:重新加载窗口"
在MCP面板中验证连接以查看可用工具。
创建或编辑项目目录中的.cursor/mcp.json,或全局配置~/.cursor/mcp.json:
{
"mcpServers": {
"mcpd": {
"command": "npx",
"args": ["@mozilla-ai/mcpd-proxy"],
"env": {
"MCPD_ADDR": "http://localhost:8090"
}
}
}
}
或者如果从源码构建:
{
"mcpServers": {
"mcpd": {
"command": "node",
"args": ["<path-to-mcpd-proxy>/dist/index.mjs"],
"env": {
"MCPD_ADDR": "http://localhost:8090"
}
}
}
}
替换<path-to-mcpd-proxy>为你安装的绝对路径,或使用${workspaceFolder}表示相对路径。
重新加载Cursor以应用配置。
查看examples/文件夹以获取配置示例。
mcpd-proxy/
├── src/
│ ├── index.ts # CLI入口点
│ ├── server.ts # MCP服务器实现
│ ├── config.ts # 配置加载器
│ └── apiPaths.ts # API端点常量
├── tests/
│ └── unit/ # 单元测试文件
│ ├── aggregation.test.ts
│ ├── apiPaths.test.ts
│ ├── config.test.ts
│ ├── parsers.test.ts
│ └── server.test.ts
├── .github/
│ └── workflows/ # GitHub Actions工作流
│ ├── tests.yaml
│ ├── lint.yaml
│ └── release.yaml
├── examples/
│ ├── vscode-config.json # VS Code配置示例
│ └── cursor-config.json # Cursor配置示例
├── dist/ # 构建输出(git忽略)
├── package.json # npm包配置
├── package-lock.json # npm依赖锁定文件
├── tsconfig.json # TypeScript编译配置
├── tsconfig.test.json # TypeScript测试配置
├── vitest.config.ts # Vitest测试配置
├── vite.config.mts # Vite构建配置
├── eslint.config.mts # ESLint配置
├── .prettierignore # Prettier忽略模式
├── .gitignore # Git忽略模式
└── README.md # 本文件
# 安装依赖
npm install
# 构建一次
npm run build
# 监控模式(更改时自动重建)
npm run dev
# 运行测试
npm test
# 在监控模式下运行测试
npm run test:watch
# 不构建的情况下进行类型检查
npm run typecheck
# 校验代码
npm run lint
# 格式化代码
npm run format
直接使用JSON-RPC通过stdio测试MCP协议:
# 测试初始化
echo '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"test","version":"1.0.0"}}}' | node dist/index.mjs
# 测试列出工具
echo '{"jsonrpc":"2.0","id":2,"method":"tools/list","params":{}}' | node dist/index.mjs
工具以以下格式暴露:{server}__{tool_name}
示例:
time__get_current_time - 来自time服务器的get_current_time工具github__create_issue - 来自github服务器的create_issue工具fetch__get_url - 来自fetch服务器的get_url工具这种命名约定防止了不同服务器之间工具名称冲突,并明确指出了每个工具来自哪个服务器。
资源使用自定义URI方案:mcpd://{server}/{resource_uri}
示例:
mcpd://filesystem/documents/file.txtmcpd://database/users/123提示遵循与工具相同的命名约定:{server}__{prompt_name}
McpdClientmcpd-proxy在启动时创建McpdClient的单个实例,并在所有请求中重用它。这对于以下方面至关重要:
TTL)和工具模式缓存(60秒TTL)HTTP连接mcpd守护进程的负载const mcpdClient = new McpdClient({
apiEndpoint: config.mcpdAddr,
apiKey: config.mcpdApiKey,
healthCacheTtl: 10,
serverCacheTtl: 60,
});
代理实现了以下MCP协议处理器:
initialize - 与IDE握手,声明能力tools/list - 聚合所有mcpd服务器中的工具tools/call - 解析工具名称并转发给mcpdresources/list - 聚合所有服务器中的资源resources/read - 转发资源读取请求到mcpdprompts/list - 聚合所有服务器中的提示prompts/get - 转发提示请求到mcpdping - 健康检查端点原因:mcpd守护进程未运行或不可访问
解决方案:
mcpd正在运行:curl http://localhost:8090/api/v1/serversMCPD_ADDR环境变量是否正确原因:请求的服务器不存在于mcpd中
解决方案:
curl http://localhost:8090/api/v1/serversmcpd中配置curl http://localhost:8090/api/v1/health/servers/<server-name>原因:VS Code可能未识别MCP服务器
解决方案:
dist/index.mjs的路径是否正确且为绝对路径(如果从源码构建)Cmd+Shift+P → "开发者:重新加载窗口"mcpd守护进程是否正在运行且可访问原因:服务器可能不健康或工具不存在
解决方案:
mcpdAPI检查服务器健康状况mcpd日志中的错误notifications/tools/list_changed)MCPD_SERVERS环境变量过滤服务器mcpd - 此代理连接的MCP守护进程mcpd-sdk-javascript - TypeScript SDK用于mcpdmcpd-sdk-python - Python SDK用于mcpdApache-2.0
参见主mcpd仓库中的贡献指南。