MCP网关服务

MCPGate是一个本地无Docker的MCP(Model Context Protocol)网关,提供对多个上游MCP服务器的统一访问,具有请求路由、连接管理和服务器发现功能。

  • by j4ng5y
  • Go
  • 本地部署
  • 更新于
在 GitHub 查看 j4ng5y/mcpgate

使用说明

MCPGate-本地MCP服务器网关

MCPGate是一个本地无坞MCP(模型上下文协议)网关,提供对多个上游MCP服务器的统一访问。它本身充当MCP服务器,聚合到各种MCP服务器的连接,并提供集中的请求路由、连接管理和服务器发现。

特性

  • 多种运输支持:通过stdio(子进程)、HTTP、WebSocket或Unix套接字连接到MCP服务器
  • 服务器注册和发现:自动注册和发现可用的MCP服务器
  • 连接池:通过健康监测实现高效的连接重用和管理
  • 请求路由:将请求智能路由到适当的上游服务器
  • TOML配置:服务器定义的简单、可读的配置格式
  • 多个客户端连接:支持各种客户端连接方法(默认为stdout/stdio)
  • 生产就绪:采用Go构建,性能可靠
  • 优化的二进制文件:使用GoReleaser和UPX压缩来处理较小的工件

安装

来源

git clone https://github.com/j4ng5y/mcpgate.git
cd mcpgate

# Build for development
make dev

# Or build release binaries (requires goreleaser)
make release-snapshot

先决条件

  • 转到1.25.5或更高版本
  • goreleaser(用于UPX压缩的建筑释放)
  • UPX(可选,用于二进制压缩)

配置

MCPGate使用TOML格式进行配置。看 example/config.toml 举一个完整的例子。

基本配置

[gateway]
log_level = "info"

[[server]]
name = "bedrock"
transport = "stdio"
enabled = true
command = "node"
args = ["./server.js"]
timeout = 30

服务器配置

每个上游MCP服务器都可以配置:

  • 名字:服务器的唯一标识符
  • 运输:连接类型(stdio, http, websocket, unix)
  • 启用:是否启动此服务器
  • 命令:(stdio)要执行的命令
  • 参数:(stdio)命令参数
  • 环境:(stdio)环境变量
  • 网址:(http/webocket)远程服务器URL
  • 插座路径:(unix)unix套接字的路径
  • 超时:请求超时(秒)
  • 元数据:自定义元数据(键值对)

运输类型

标准(默认)

生成子流程并与之通信:

[[server]]
name = "local-tool"
transport = "stdio"
command = "python"
args = ["-m", "mcp_server_filesystem"]

[server.env]
PYTHONUNBUFFERED = "1"

超文本传输协议

连接到远程HTTP/JSON-RPC端点:

[[server]]
name = "remote-api"
transport = "http"
url = "http://api.example.com:8000"
timeout = 30

双向通信

实时WebSocket连接:

[[server]]
name = "realtime"
transport = "websocket"
url = "ws://localhost:9000"

UNIX套接字

本地Unix域套接字通信:

[[server]]
name = "local-socket"
transport = "unix"
socket_path = "/tmp/mcp-server.sock"

用法

运行网关

# Using default config
./bin/mcpgate

# Using custom config
./bin/mcpgate -config /path/to/config.toml

# Or with shorthand
./bin/mcpgate -c /path/to/config.toml

网关特定方法

作为MCP服务器,MCPGate提供特殊的网关管理方法:

列出所有服务器

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "gateway/list_servers",
  "params": {}
}

答复:

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": [
    {
      "name": "bedrock",
      "connected": true,
      "initialized": true,
      "transport": "stdio",
      "capabilities": ["tools"]
    }
  ]
}

获取服务器详细信息

{
  "jsonrpc": "2.0",
  "id": 2,
  "method": "gateway/get_server",
  "params": {"name": "bedrock"}
}

检查服务器状态

{
  "jsonrpc": "2.0",
  "id": 3,
  "method": "gateway/server_status",
  "params": {"name": "bedrock"}
}

列出功能

{
  "jsonrpc": "2.0",
  "id": 4,
  "method": "gateway/capabilities",
  "params": {}
}

将请求路由到特定服务器

包含 _server 路由到特定服务器的参数:

{
  "jsonrpc": "2.0",
  "id": 5,
  "method": "tools/list",
  "params": {"_server": "bedrock"}
}

在没有明确的服务器规范的情况下,MCPGate使用智能路由:

  • 尝试基于方法前缀进行路由(例如。, tools/list → 工具能力)
  • 如果没有特定的功能匹配,则回退到第一个可用服务器
  • 如果没有可用的服务器,则返回错误

建筑

开发版本

make dev
# Creates: bin/mcpgate

发布版本(压缩)

make release
# Creates optimized, UPX-compressed binaries in dist/
# Supports: Linux, macOS, Windows (amd64, arm64, arm)

生成快照

make release-snapshot
# Quick build without publishing, for testing

发展

使用示例配置运行

make run

运行测试

make test

格式化代码

make fmt

棉绒

make lint

清洁构建工件

make clean

建筑

组件

┌─────────────────────────────────────────┐
│         MCP Clients                     │
│  (Communicates via stdio/JSON-RPC)      │
└─────────────┬───────────────────────────┘
              │
              ▼
    ┌─────────────────────┐
    │   MCPGate Gateway   │
    │  (Acts as MCP Server)
    │                     │
    ├─ Configuration     │
    ├─ Request Router    │
    ├─ Server Registry   │
    └─────────────────────┘
         │    │    │
    ┌────┘    │    └────┐
    ▼         ▼         ▼
  Upstream  Upstream  Upstream
  Server 1  Server 2  Server 3

关键模块

  • 配置:TOML配置解析
  • 运输:抽象传输层(stdio、HTTP、WebSocket、Unix套接字)
  • 服务器:托管服务器生命周期和注册表
  • 主控程序:MCP协议处理和请求路由
  • 池:连接池和管理

连接管理

网关通过以下方式管理与上游服务器的连接:

  • 自动连接建立:启动时重试连接
  • 健康监测:跟踪连接运行状况和可用性
  • 连接池:高效地重用连接
  • 自动重新连接:检测断开连接并重建连接
  • 超时管理:每台服务器可配置超时

错误处理

MCPGate按照JSON-RPC 2.0规范提供详细的错误响应:

  • -32700:分析错误
  • -32600:无效请求
  • -32601:未找到方法
  • -32602:无效参数
  • -32603:内部错误
  • -32000 到 -32099:服务器错误

性能注意事项

  • 二进制大小:UPX压缩二进制文件通常小60-70%
  • 记忆:连接池减少了开销
  • 并发:针对高并发场景的线程安全设计
  • 超时:所有外部操作都有可配置的超时

故障排除

服务器连接问题

检查日志中的连接错误:

./bin/mcpgate -c config.toml

确保上游服务器可访问:

  • 对于stdio:命令存在并且可执行
  • 对于HTTP:URL是可访问的
  • 对于WebSocket:URL是可访问的
  • 对于Unix套接字:套接字文件存在并且可读

路由问题

如果请求路由不正确:

  1. 检查 gateway/list_servers 查看已连接的服务器
  2. 显式指定 _server 测试参数
  3. 路由器中检查方法前缀匹配

CI/CD管道

MCPGate使用GitHub Actions进行自动化测试、linting和发布:

测试工作流程(.github/workflows/test.yml)

每次推都会跑 main 以及所有拉取请求:

  • 矩阵测试:在Ubuntu、macOS和Windows上对Go 1.25和1.26的测试
  • 单元测试: go test -v -race 有报道
  • 代码检查: golangci-lint 自动检查
  • 构建验证:构建快照以确保创建工件
  • 覆盖上传:向Codecov发送覆盖率报告

在本地运行:

make test      # Run unit tests
make lint      # Run linters
make build     # Build snapshot

发布工作流(.github/workflows/release.yml)

当按下git标签时自动触发(格式: v*):

  • 预发布测试:在构建之前运行所有测试
  • 多平台构建:为Linux、macOS、Windows(amd64、arm64、arm)创建二进制文件
  • 二进制压缩:对较小的伪影使用UPX压缩
  • 校验和:为所有工件生成SHA256校验和
  • GitHub发布:使用工件和自动生成的更改日志创建GitHub版本

创建发布:

git tag v1.0.0
git push origin v1.0.0
# GitHub Actions will automatically build and publish the release

依赖管理

Dependabot自动:

  • 创建Go模块更新的拉取请求(每周)
  • 将GitHub Actions更新到最新版本(每周)
  • 标记PR以便于组织

贡献

欢迎投稿!拜托:

  1. 分叉存储库
  2. 创建要素分支
  3. 进行更改
  4. 如果适用,添加测试
  5. 确保所有检查均已通过:
    • make test -单元测试通过
    • make lint -林廷传球
    • make fmt -代码已格式化
  6. 提交拉取请求(使用PR模板)

许可证

[在此处添加您的许可证]

支持

有关问题、疑问或建议,请在GitHub上打开问题。


MCPGate -统一的MCP服务器管理变得简单