内容
# MCP Catie - 上下文感知流量入口引擎
一款轻量级、可配置的反向代理,用于根据请求内容将MCP(模型上下文协议)请求路由和负载均衡到适当的后端服务。
有关详细文档,请访问 [Catie MCP 文档](https://www.catiemcp.com/docs/)。
## 功能特点
- 根据工具调用动态路由MCP JSON-RPC请求
- 拼接来自多个不同MCP服务器的工具,以便客户端获得所有工具的统一视图,而无需用户安装多个服务器。
- 会话感知路由,以维护客户端与同一后端的连接
- 支持带有SSE(服务器发送事件)的流式HTTP传输
- 工具名称映射和命名空间,以解决不同后端之间的命名冲突
- Prometheus指标集成,用于可观察性
- 使用Docker进行容器化部署
- 用于监视UI的基本身份验证
## 架构
应用程序分为几个包:
- `cmd/main.go` - 应用程序入口点,带有服务器设置
- `pkg/config` - 配置加载和管理
- `pkg/router` - 请求路由和代理逻辑
- `pkg/session` - 会话管理,用于维护客户端连接
- `pkg/logger` - 结构化日志系统
- `pkg/ui` - 简单的Web UI,用于监视
## 配置
路由器使用YAML文件(`router_config.yaml`)进行配置。以下是一个示例配置:
```yaml
resources:
"^weather/.*": "http://weather-service:8080/mcp"
"^database/.*": "http://database-service:8080/mcp"
tools:
"^calculator$": "http://calculator-service:8080/mcp"
"^translator$": "http://translator-service:8080/mcp"
toolMappings:
- originalName: "weather"
targetName: "getWeather"
target: "http://weather-service:8080/mcp"
- originalName: "search"
targetName: "googleSearch"
target: "http://search-service:8080/mcp"
default: "http://default-service:8080/mcp"
ui:
username: "admin"
password: "your_secure_password"
```
配置包括:
- `resources`:资源URI的正则表达式模式及其目标端点
- `tools`:工具名称的正则表达式模式及其目标端点
- `toolMappings`:工具名称转换的映射,以解决命名冲突
- `default`:未匹配任何模式的请求的备用端点
- `ui`:监视UI的身份验证凭据
当检测到更改时,配置文件将自动重新加载。
## 工具名称映射
工具名称映射功能允许您向客户端呈现统一的工具接口,同时处理不同后端MCP服务器之间的名称差异。这在以下情况下很有用:
- 不同的后端使用相似功能的不同名称
- 您希望向客户端呈现简化的或标准化的命名方案
- 您需要避免来自不同后端的工具之间的命名冲突
对于每个工具映射,请指定:
- `originalName`:向客户端呈现的名称
- `targetName`:后端服务器期望的实际名称
- `target`:目标后端服务器的URL
当客户端使用原始名称调用工具时,MCProute会在将请求转发到适当后端之前自动将其转换为目标名称。
## 安装
### 先决条件
- Go 1.18或更高版本
- Docker(可选,用于容器化部署)
### 从源代码构建
1. 克隆仓库:
```bash
git clone https://github.com/mclenhard/mcp-router-proxy.git
cd mcp-router-proxy
```
2. 构建应用程序:
```bash
go build -o mcp-router-proxy ./cmd/main.go
```
3. 编辑`router_config.yaml`以匹配您的环境
4. 运行应用程序:
```bash
./mcp-router-proxy
```
### 使用Docker
1. 构建Docker镜像:
```bash
docker build -t mcp-router-proxy .
```
2. 运行容器:
```bash
docker run -p 80:80 -v $(pwd)/router_config.yaml:/root/router_config.yaml mcp-router-proxy
```
## 用法
代理监听 `/mcp` 端点上的MCP请求。根据方法和参数路由请求:
- `resources/read` 请求根据 `uri` 参数路由
- `tools/call` 请求根据 `name` 参数路由
- 其他请求发送到默认端点
代理支持根据MCP流式HTTP传输规范的GET和POST方法:
- POST请求用于向服务器发送JSON-RPC消息
- GET请求用于建立客户端与服务器通信的SSE流
### 会话管理
代理通过跟踪 `Mcp-Session-Id` 头部来维护会话状态。当客户端通过代理与MCP服务器建立会话时,具有相同会话ID的后续请求被路由到同一个后端服务器。
### 健康检查
健康检查端点在 `/health` 处可用,当服务运行时返回200 OK响应。
### 监控
一个简单的监控UI在 `/stats` 处可用,显示请求统计信息和路由信息。该接口使用配置文件中指定的凭据通过基本身份验证进行保护。
<img src="ui.png" />
### Prometheus集成
服务在 `/metrics` 端点暴露Prometheus兼容的指标。这些指标包括:
- `mcp_router_requests_total`:处理的请求总数
- `mcp_router_errors_total`:请求错误总数
- `mcp_router_requests_by_method`:按方法划分的请求数量
- `mcp_router_requests_by_endpoint`:按目标端点划分的请求数量
- `mcp_router_response_time_ms`:按方法划分的平均响应时间(毫秒)
- `mcp_router_uptime_seconds`:路由器启动后的时间(秒)
您可以通过在Prometheus配置中添加以下内容来配置Prometheus抓取这些指标:
```yaml
scrape_configs:
- job_name: 'mcp-router'
scrape_interval: 15s
static_configs:
- targets: ['your-router-host:80']
```
此端点也受与stats UI相同的基本身份验证保护。
## 开发
### 项目结构
```
mcp-router-proxy/
├── cmd/
│ └── main.go
├── pkg/
│ ├── config/
│ │ └── config.go
│ ├── router/
│ │ └── router.go
│ ├── session/
│ │ └── store.go
│ ├── logger/
│ │ └── logger.go
│ └── ui/
│ └── ui.go
├── Dockerfile
├── go.mod
├── go.sum
├── README.md
└── router_config.yaml
```
### 添加新功能
1. Fork仓库
2. 创建一个功能分支
3. 添加更改
4. 提交拉取请求
## 路线图
计划在未来版本中添加以下功能:
- ~~**添加SSE支持**:向代理添加对SSE(服务器发送事件)的支持~~
- **完整消息转发**:确保所有MCP消息类型(包括根和采样)都被正确转发而不会干扰
- **智能缓存**:具有可配置TTL、缓存失效和支持内存和Redis后端的响应缓存
- **速率限制**:具有多个策略、响应头和分布式速率限制支持的可配置速率限制
- **电路中断**:自动检测后端故障并具有备用响应
- **请求转换**:在转发到后端之前修改请求
- **响应转换**:在返回给客户端之前转换后端响应
开发优先级基于社区反馈。请打开一个问题来请求功能或为路线图讨论做出贡献。
## 许可证
[MIT License](LICENSE)
## 贡献
欢迎贡献!请随时提交拉取请求。
## 支持
如需支持,请在GitHub仓库中打开一个问题,或通过 [mclenhard@gmail.com](mailto:mclenhard@gmail.com) 联系我。