一种类型安全、双向且简单的解决方案,用于远程MCP通信,允许远程访问和集中管理模型上下文。
%%{init: {"flowchart": {"htmlLabels": false}} }%%
graph TD
%% 现代、明亮的颜色样式,白色文本
classDef client fill:#22c55e,stroke:#059669,stroke-width:2px,color:#ffffff
classDef gateway fill:#06b6d4,stroke:#0891b2,stroke-width:2px,color:#ffffff
classDef backend fill:#f97316,stroke:#ea580c,stroke-width:2px,color:#ffffff
classDef resource fill:#8b5cf6,stroke:#7c3aed,stroke-width:2px,color:#ffffff
classDef server fill:#06b6d4,stroke:#0891b2,stroke-width:2px,color:#ffffff
linkStyle default stroke:#64748b,stroke-width:1.5px,stroke-dasharray: 5 5
%% 当前MCP设置(多个本地服务器)
subgraph Current["当前设置(本地)"]
direction LR
subgraph ClientGroup["客户端"]
A[客户端]:::client
end
subgraph Servers["本地MCP服务器"]
direction TB
B1["本地MCP服务器(数据库)"]:::server -->|"数据库访问"| C1[数据库]:::resource
B2["本地MCP服务器(API 1)"]:::server -->|"API访问"| C2["Web API 1"]:::resource
B3["本地MCP服务器(API 2)"]:::server -->|"API访问"| C3["Web API 2"]:::resource
end
A -->|"MCP协议"| B1
A -->|"MCP协议"| B2
A -->|"MCP协议"| B3
end
%% 垂直分隔符
Current --> Proposed
%% 提议的MCP架构(解耦)
subgraph Proposed["提议的架构(远程)"]
direction LR
D[客户端/主机]:::client -->|"MCP协议"| E["本地MCP服务器(@remote-mcp/client)"]:::server
E <-->|"tRPC(HTTP)"| F["远程MCP服务器(@remote-mcp/server)"]:::backend
%% 分离的资源
F -->|"数据库访问"| G1[数据库]:::resource
F -->|"API访问"| G2["Web API 1"]:::resource
F -->|"API访问"| G3["Web API 2"]:::resource
end
是的,我知道官方的MCP路线图在2025年第一季度包括了远程MCP支持。然而,对于我来说,远程访问的需求是立即需要的,并且很可能对许多人也是如此。这个库是为了填补这一空白而创建的,提供了一种从本地MCP客户端连接到远程MCP服务器的方法,无需等待未来的官方实现。
注意:我不希望这成为一个复杂或过于复杂的项目。这种方式现在就有效。
注意:此项目目前处于积极开发阶段,并被视为实验性。请预期会有破坏性变更和潜在问题。
只需在您的MCP客户端设置中放入以下代码,在这里我以Claude为例:
{
"mcpServers": {
"remote-mcp": {
"command": "npx",
"args": ["-y", "@remote-mcp/client"],
"env": {
"REMOTE_MCP_URL": "http://localhost:9512",
"HTTP_HEADER_Authorization": "Bearer <token>"
}
}
}
}
安装需求:
$ npm install @remote-mcp/client @trpc/client@next zod
然后编写您自己的代码,如下所示:
import { RemoteMCPClient } from "@remote-mcp/client";
const client = new RemoteMCPClient({
remoteUrl: "http://localhost:9512",
onError: (method, error) => console.error(`在${method}中发生错误:`, error)
});
void client.start();
您可以在examples目录中看到一些示例。
在npm install @remote-mcp/server之后,您可以编写自己的远程MCP服务器,如下所示:
import { MCPRouter, LogLevel } from "@remote-mcp/server";
import { createHTTPServer } from '@trpc/server/adapters/standalone';
import { z } from "zod";
// 创建路由器实例
const mcpRouter = new MCPRouter({
logLevel: LogLevel.DEBUG,
name: "example-server",
version: "1.0.0",
capabilities: {
logging: {},
},
});
// 添加示例工具
mcpRouter.addTool(
"计算器",
{
description:
"执行基本计算。加、减、乘、除。每次需要进行计算时调用此工具。",
schema: z.object({
operation: z.enum(["add", "subtract", "multiply", "divide"]),
a: z.string(),
b: z.string(),
}),
},
async (args) => {
const a = Number(args.a);
const b = Number(args.b);
let result: number;
switch (args.operation) {
case "add":
result = Number(a) + b;
break;
case "subtract":
result = a - b;
break;
case "multiply":
result = a * b;
break;
case "divide":
if (b === 0) throw new Error("除以零");
result = a / b;
break;
}
return {
content: [{ type: "text", text: `${result}` }],
};
},
);
const appRouter = mcpRouter.createTRPCRouter();
void createHTTPServer({
router: appRouter,
createContext: () => ({}),
}).listen(Number(process.env.PORT || 9512));
然后您可以在您的MCP客户端中看到如下内容:
<img src="https://gips2.baidu.com/it/u=311927455,774844462&fm=3081&app=3081&f=PNG?w=940&h=428" width="450">此仓库包含:
@remote-mcp/client: 作为本地MCP服务器运行的客户端库,连接到远程实现。@remote-mcp/server: 用于创建可远程访问的MCP服务的服务器库(用作远程实现)。@remote-mcp/nestjs)欢迎贡献。详情请参阅CONTRIBUTING.md。
此库是一个补充扩展,不属于官方MCP规范,基于现有的MCP概念构建。
此项目根据MIT许可证发布。详情请参阅LICENSE文件。