mcp-uni
Version:
A unified gateway for managing multiple MCP servers
441 lines (328 loc) • 9.61 kB
Markdown
[English](./README.md) | 中文
# MCP-UNI
**MCP-UNI** 是一个模型上下文协议(MCP)通用服务器,作为连接和管理多个MCP服务器的统一网关。它提供单一的HTTP端点来动态连接、断开连接并与各种MCP服务器交互,无需静态配置。
## 功能特性
- 🔌 **动态MCP服务器管理**:在运行时连接和断开MCP服务器
- 🌐 **HTTP服务器接口**:支持服务器发送事件(SSE)的RESTful API
- 🔗 **多种传输支持**:支持SSE和stdio传输方式
- 🛠️ **工具聚合**:通过统一接口暴露所有连接的MCP服务器工具
- 📚 **资源管理**:访问来自连接服务器的资源和资源模板
- 💬 **提示管理**:跨多个MCP服务器管理提示
- 🔄 **自动重试**:连接失败的内置重试机制
- 📋 **实时更新**:服务器连接/断开时动态更新工具列表
## 架构
MCP-UNI在客户端和多个MCP服务器之间充当代理/网关:
```
客户端 ──HTTP/SSE──> MCP-UNI ──stdio/SSE──> MCP服务器1
│
├─────stdio/SSE──> MCP服务器2
│
└─────stdio/SSE──> MCP服务器N
```
## 安装
### 使用npx(推荐)
```bash
npx mcp-uni
```
### 从npm安装(即将推出)
```bash
npm install -g mcp-uni
```
### 从源码安装
```bash
git clone https://github.com/yourusername/mcp-uni.git
cd mcp-uni
npm install
npm run build
```
## 快速开始
### 方法1:使用配置文件(推荐)
1. **创建配置文件**(`mcp-uni.config.json`):
```json
{
"mcpServers": {
"everything": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-everything"],
"env": {}
}
}
}
```
2. **启动MCP-UNI服务器**:
```bash
# 使用npx(无需安装)
npx mcp-uni
# 使用自定义端口
npx mcp-uni --port 8000
# 使用自定义配置文件
npx mcp-uni --config /path/to/your-config.json
# 或者如果已全局安装
mcp-uni
mcp-uni --port 8000
```
服务器将在`http://localhost:7200`(或您指定的端口)启动,SSE端点为`/stream`,并自动连接配置文件中定义的MCP服务器。
### 方法2:手动连接
1. **启动MCP-UNI服务器**:
```bash
# 使用npx(无需安装)
npx mcp-uni
# 使用自定义端口
npx mcp-uni --port 8000
# 或者如果已全局安装
mcp-uni
mcp-uni --port 8000
```
服务器将在`http://localhost:7200`(或您指定的端口)启动,SSE端点为`/stream`。
2. **连接MCP服务器**:
```bash
curl -X POST http://localhost:7200/tools/connect_mcp \
-H "Content-Type: application/json" \
-d '{
"name": "my-mcp-server",
"transportConfig": {
"type": "stdio",
"command": "node",
"args": ["./my-mcp-server/index.js"],
"env": {},
"cwd": "/path/to/server"
}
}'
```
3. **列出已连接的服务器**:
```bash
curl -X POST http://localhost:7200/tools/list_mcp \
-H "Content-Type: application/json" \
-d '{}'
```
## 配置
### 配置文件
MCP-UNI支持配置文件(`mcp-uni.config.json`)在启动时自动连接MCP服务器。这允许您预配置MCP服务器,而无需每次都手动连接它们。
#### 配置文件格式
```json
{
"mcpServers": {
"server-name": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-everything"],
"env": {}
}
}
}
```
#### 配置文件位置
- **默认**:当前工作目录中的`mcp-uni.config.json`
- **自定义**:使用`--config`选项指定不同路径
#### 配置文件示例
**多个MCP服务器:**
```json
{
"mcpServers": {
"filesystem": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/tmp"],
"env": {}
},
"everything": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-everything"],
"env": {}
},
"database": {
"type": "stdio",
"command": "python",
"args": ["-m", "database_mcp_server"],
"env": {
"DB_URL": "sqlite:///app.db"
},
"cwd": "/path/to/db/server"
}
}
}
```
**SSE传输配置:**
```json
{
"mcpServers": {
"remote-server": {
"type": "sse",
"url": "http://example.com/sse",
"query": {
"param1": "value1"
},
"headers": {
"Authorization": "Bearer token"
}
}
}
}
```
### 传输配置
MCP-UNI支持两种类型的传输配置:
#### SSE传输
```json
{
"type": "sse",
"url": "http://example.com/sse",
"query": {
"param1": "value1"
},
"headers": {
"Authorization": "Bearer token"
}
}
```
#### Stdio传输
```json
{
"type": "stdio",
"command": "python",
"args": ["-m", "my_mcp_server"],
"env": {
"ENV_VAR": "value"
},
"cwd": "/path/to/working/directory"
}
```
## 命令行选项
```bash
mcp-uni [选项]
选项:
-p, --port <数字> 监听端口(默认:7200)
-s, --stream <路径> 流端点路径(默认:/stream)
-c, --config <路径> 配置文件路径(默认:mcp-uni.config.json)
-h, --help 显示帮助信息
-V, --version 显示版本号
```
### 示例
```bash
# 使用默认端口(7200)和默认配置启动服务器
npx mcp-uni
# 使用自定义端口启动服务器
npx mcp-uni --port 8000
# 使用自定义配置文件启动服务器
npx mcp-uni --config /path/to/my-config.json
# 使用自定义端口和配置启动服务器
npx mcp-uni --port 8000 --config ./configs/production.json
# 使用自定义流端点启动服务器
npx mcp-uni --port 8000 --stream /events
# 显示帮助
npx mcp-uni --help
# 显示版本
npx mcp-uni --version
```
## API参考
### 内置工具
MCP-UNI提供以下管理工具:
#### `connect_mcp`
将新的MCP服务器连接到主机。
**参数:**
- `name`(字符串):MCP服务器的唯一名称
- `transportConfig`(对象):传输配置(见上文)
#### `disconnect_mcp`
从主机断开MCP服务器。
**参数:**
- `name`(字符串):要断开的MCP服务器名称
#### `list_mcp`
列出所有当前连接的MCP服务器。
**参数:** 无
### 动态工具
来自连接MCP服务器的所有工具都会通过MCP-UNI自动暴露,保持其原始名称和模式。
### HTTP端点
- `POST /tools/{tool_name}` - 执行工具
- `GET /stream` - 实时更新的SSE端点
- `GET /health` - 健康检查端点
## 使用示例
### 连接多个服务器
```bash
# 连接文件系统MCP服务器
curl -X POST http://localhost:7200/tools/connect_mcp \
-H "Content-Type: application/json" \
-d '{
"name": "filesystem",
"transportConfig": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/tmp"],
"env": {},
"cwd": "."
}
}'
# 连接数据库MCP服务器
curl -X POST http://localhost:7200/tools/connect_mcp \
-H "Content-Type: application/json" \
-d '{
"name": "database",
"transportConfig": {
"type": "stdio",
"command": "python",
"args": ["-m", "database_mcp_server"],
"env": {"DB_URL": "sqlite:///app.db"},
"cwd": "/path/to/db/server"
}
}'
```
### 使用已连接服务器的工具
服务器连接后,它们的工具将变为可用:
```bash
# 使用文件系统服务器工具
curl -X POST http://localhost:7200/tools/read_file \
-H "Content-Type: application/json" \
-d '{"path": "/tmp/example.txt"}'
# 使用数据库服务器工具
curl -X POST http://localhost:7200/tools/execute_query \
-H "Content-Type: application/json" \
-d '{"query": "SELECT * FROM users LIMIT 10"}'
```
## 开发
### 项目结构
```
src/
├── index.ts # 入口点和HTTP服务器设置
├── server.ts # MCP服务器实现
├── host.ts # 用于管理连接的MCP主机
└── utils/
├── schema-converter.ts # JSON模式到Zod转换工具
└── utils.ts # 工具函数
```
### 构建
```bash
npm run build
```
编译后的JavaScript将输出到`build/`目录。
### 关键组件
- **McpHost**(`host.ts:37`):管理到多个MCP服务器的连接
- **createServer**(`server.ts:15`):创建统一的MCP服务器实例
- **模式转换**(`utils/schema-converter.ts`):将JSON模式转换为Zod模式
- **传输管理**(`host.ts:166`):处理不同的传输类型(SSE/stdio)
## 错误处理
MCP-UNI包含强大的错误处理:
- **连接重试**:连接失败时自动重试和退避(3次重试,2.5秒延迟)
- **工具执行**:从连接服务器正确传播错误
- **优雅清理**:服务器关闭时自动清理连接
## 要求
- Node.js 16+(需要ES模块)
- TypeScript 5+
## 依赖项
- `@modelcontextprotocol/sdk`:用于客户端/服务器实现的MCP SDK
- `mcp-proxy`:MCP协议的HTTP代理服务器
- `zod`:模式验证和类型安全
## 许可证
MIT
## 贡献
1. Fork仓库
2. 创建功能分支
3. 进行更改
4. 如适用,添加测试
5. 提交拉取请求
## 支持
如有问题和疑问:
- 在GitHub上创建问题
- 查看现有文档
- 查看MCP规范
---
**MCP-UNI**通过为您的所有模型上下文协议服务器提供统一的动态网关,简化了MCP服务器管理。