MCP智能代理路由

MCP Relay是一个智能代理/路由器,用于模型上下文协议(MCP),能够动态发现和使用来自多个MCP服务器的工具,同时保持单一连接点,避免上下文膨胀。

  • by blazejp83
  • Python
  • 本地部署
  • 1 星标
  • 更新于
在 GitHub 查看 blazejp83/mcp-relay

使用说明

MCP继电器

用于模型上下文协议(MCP)的智能代理/路由器,使Claude Desktop和其他MCP客户端能够动态发现和使用来自多个MCP服务器的工具,同时保持单个连接点。该系统通过智能地为每个任务选择最相关的工具来防止上下文膨胀。

🎯 问题

像Claude Desktop这样的MCP客户端必须在启动时加载所有服务器,并且不能在对话期间动态添加服务器。使用多个MCP服务器时:

  • Exa服务器:7个搜索工具(网络、研究论文、推特、公司等)
  • 操纵者:浏览器自动化工具
  • 背景7:文档搜索工具
  • 桌面指挥官:18+桌面自动化工具

直接加载所有服务器会导致:

  • 🚨 上下文膨胀:100多种工具占用了大部分上下文窗口
  • 🔒 静态配置:如果不重新启动Claude,则无法添加服务器
  • 💸 成本增加:每次请求消耗的令牌更多
  • 🎯 工具选择不当:人工智能难以从太多的选项中做出选择

💡 解决方案

MCP Relay充当智能代理:

  1. 单个连接:Claude Desktop仅连接到MCP中继
  2. 后端管理:保持与多个MCP服务器的连接
  3. 智能发现:使用语义搜索在所有服务器上查找相关工具
  4. 动态预配置:仅在令牌预算内加载所需的工具
  5. 透明路由:在适当的后端服务器上执行工具

示例:与其使用100多种工具配置10台MCP服务器,不如只配置MCP中继。然后动态发现并仅使用您需要的2-3个工具。

🚀 特性

核心能力

  • 代理架构:路由到多个后端服务器的单个MCP服务器
  • 动态工具发现:无需手动配置即可在所有服务器上查找工具
  • 语义搜索:通过自然语言查询找到合适的工具
  • 智能配置:仅在代币预算内加载相关工具
  • 透明执行:将工具调用路由到适当的后端服务器
  • 本地MCP服务器:通过mcp代理直接与Claude Desktop集成
  • 跨服务器智能:Puppeteer、Exa、Context7等工具的统一视图。
  • 令牌优化:与加载所有服务器相比,上下文使用率降低了90%以上
  • 零配置:Claude Desktop只需要MCP中继配置

生产特性(v0.3.0)

  • 🔒 DNS重新绑定保护:使用可配置的主机白名单保护MCP端点
  • 🔄 连接池:持续的stdio会话可将性能提高10-100倍
  • 📊 结构化日志记录:带有请求ID和相关性的JSON格式日志
  • ⏱️ 三级超时:工具→ 服务器→ 全局超时层次结构
  • 📝 TOML配置:带有注释的人性化配置格式
  • 🔁 增强的错误处理:使用指数回退自动重试
  • 🏥 健康监测:带自动恢复功能的断路器模式
  • 📈 进度跟踪:长时间运行操作的实时反馈

高级功能(v0.4.0)

  • 💬 MCP提示支持:5个内置的代理感知提示,用于指导工作流
    • discover_and_execute -端到端工具工作流程指南
    • server_capabilities -全面的系统概述
    • semantic_tool_search -使用排名解释进行搜索
    • execute_with_fallback -具有替代方案的弹性执行
    • budget_aware_discovery -令牌/计数约束内的工具
    • 自动后端提示发现和聚合
    • 看 提示文档 详见

管理仪表板(v0.5.0)

  • /admin/dashboard 提供一个只读的HTML仪表板,其中包含实时统计数据:连接的服务器、工具目录、缓存命中率和连接池指标。通过调用以下命令,页面会自动刷新 /api/admin/summary,因此无需外部工具,您始终可以快速查看中继运行状况。

📋 先决条件

🔧 安装

  1. 克隆存储库:
git clone https://github.com/yourusername/mcp-relay.git
cd mcp-relay
  1. 创建并激活虚拟环境:
uv venv
source .venv/bin/activate  # On Unix/macOS
# .venv\Scripts\activate  # On Windows
  1. 安装依赖项:
uv sync
  1. 在开发模式下安装软件包:
uv pip install -e .

🏃 运行服务器

作为HTTP API服务器

# Start the server
mcp-relay

# Or with uvicorn for development
uvicorn mcp_relay.main:app --reload

服务器将在上运行 http://localhost:8000

API文件可在以下网址获取:

  • Swagger用户界面: http://localhost:8000/docs
  • 重新记录: http://localhost:8000/redoc
  • MCP端点: http://localhost:8000/mcp (可流式传输HTTP)

作为MCP服务器(推荐)

MCP Relay现在是一个直接与Claude Desktop配合使用的原生MCP服务器:

  1. 启动服务器:

    mcp-relay
    
  2. 安装mcp代理 (如果尚未安装):

    uv tool install mcp-proxy
    
  3. 添加到Claude桌面版:

    编辑 ~/Library/Application Support/Claude/claude_desktop_config.json:

    {
      "mcpServers": {
        "mcp-relay": {
          "command": "/Users/YOUR_USERNAME/.local/bin/mcp-proxy",
          "args": ["http://localhost:8000/mcp"]
        }
      }
    }
    

    注:更换 YOUR_USERNAME 使用您的实际用户名。

  4. 重新启动克劳德桌面

您将在Claude中看到MCP Relay的工具,包括:

  • discover_tools -根据查询查找相关工具
  • provision_tools -在代币预算内选择工具
  • register_tool -向注册表添加新工具
  • list_mcp_servers -查看已注册的MCP服务器
  • 还有更多!

看 MCP本机使用指南 详细说明。

🔍 API终点

工具发现

POST /api/tools/discover

基于语义搜索发现相关工具。

请求:

{
  "query": "I need to perform calculations",
  "tags": ["math", "calculation"],
  "limit": 5
}

答复:

{
  "tools": [
    {
      "tool_id": "calculator",
      "name": "Calculator",
      "description": "Perform mathematical calculations",
      "score": 0.95,
      "matched_tags": ["math", "calculation"],
      "estimated_tokens": 50
    }
  ],
  "query_id": "uuid",
  "timestamp": "2024-01-01T00:00:00"
}

工具配置

POST /api/tools/provision

选择并格式化用于LLM消费的工具,并强制执行代币预算。

请求:

{
  "tool_ids": ["calculator", "web-search"],
  "max_tools": 3
}

答复:

{
  "tools": [
    {
      "name": "Calculator",
      "description": "Perform mathematical calculations",
      "parameters": { "type": "object", "properties": {...} },
      "token_count": 50
    }
  ],
  "metadata": {
    "total_tokens": 150,
    "gating_applied": true
  }
}

🔄 运作原理

  1. Claude桌面配置:仅配置MCP继电器

    {
      "mcpServers": {
        "mcp-relay": {
          "command": "mcp-proxy",
          "args": ["http://localhost:8000/mcp"]
        }
      }
    }
    
  2. 后端服务器连接:MCP中继连接到多个MCP服务器

    MCP Relay → puppeteer (browser tools)
               → exa (search tools)
               → context7 (documentation)
               → filesystem (file operations)
    
  3. 自然语言发现:“我需要搜索研究论文”

    Claude → discover_tools → Semantic Search → Returns relevant tools
    
  4. 实时工具执行:工具按需加载

    execute_tool("exa_research_paper_search", {...}) → Validates → Loads → Executes
    

    无需配置!工具在使用时会动态加载。

🎯 使用示例

运行演示

# Make sure the server is running first
mcp-relay

# In another terminal, run the interactive demo
python demo.py

手动测试

# Test the server endpoints
python test_server.py

示例:查找数学工具

import httpx
import asyncio

async def find_math_tools():
    async with httpx.AsyncClient() as client:
        response = await client.post(
            "http://localhost:8000/api/tools/discover",
            json={
                "query": "I need to solve equations",
                "tags": ["math"],
                "limit": 3
            }
        )
        tools = response.json()["tools"]
        print(f"Found {len(tools)} relevant tools")
        for tool in tools:
            print(f"- {tool['name']}: {tool['score']:.3f}")

asyncio.run(find_math_tools())

🧪 测试

# Run all tests
pytest

# Run with coverage
pytest --cov=mcp_relay

# Run specific test files
pytest tests/test_discovery_service.py -v

# Run integration tests
pytest tests/test_integration.py -v

📊 建筑细部

  1. 工具注册:工具与元数据、标签和令牌估计一起注册
  2. 语义搜索:使用句子转换器嵌入用户查询
  3. 相关性评分:工具评分基于:
    • 查询与工具嵌入之间的余弦相似性
    • 标签匹配(每个匹配标签增加0.2个增益)
  4. 实时加载:工具在执行过程中按需验证和加载
  5. MCP格式化:所选工具根据MCP协议进行格式化

🔧 配置

系统使用合理的默认值,但可以配置:

  • 最大令牌数:每个请求默认2000个令牌
  • Max工具:默认每个请求10个工具
  • 嵌入模型: all-MiniLM-L6-v2 (384个维度嵌入)

安全配置

DNS重新绑定保护 (v0.3.0+): /mcp 通过验证Host和Origin标头,保护端点免受DNS重新绑定攻击。

  • 默认:仅限本地主机访问(localhost, 127.0.0.1, ::1)
  • 自定义白名单:通过添加受信任的主机/IP ALLOWED_MCP_HOSTS 环境变量
# Allow access from specific LAN IPs
export ALLOWED_MCP_HOSTS="localhost,127.0.0.1,192.168.1.100,192.168.1.101"

# Allow access from custom hostname
export ALLOWED_MCP_HOSTS="localhost,127.0.0.1,myserver.local,app.internal"

# Docker example
docker run -p 8000:8000 \
  -e ALLOWED_MCP_HOSTS="localhost,127.0.0.1,192.168.1.100" \
  mcp-relay

⚠️ 安全说明:只添加您信任的主机。白名单允许完全访问MCP端点和所有连接的后端服务器。

MCP服务器配置文件

  • 所有后端MCP服务器都在中定义 config/mcp-servers.toml.在Docker中运行时,设置 MCP_DATA_DIR (默认值 /data)并挂载单个主机目录;服务器文件自动解析为 $MCP_DATA_DIR/config/mcp-servers.toml.
  • 用覆盖位置 MCP_SERVERS_PATH 仅当您需要非标准布局时才使用环境变量。
  • 使用相同的路径 /api/mcp/add_server 端点和MCP注册表服务,因此当文件位于卷上时,更新会自动持久。
  • 每个条目都可以启动一个本地进程(通过 command/args/env) 或 通过以下方式指向现有的MCP端点 url。对于远程服务器,设置 transport (例如。, "streamable-http")可选 headers:
{
  "docs-http": {
    "url": "http://localhost:8844/mcp",
    "transport": "streamable-http",
    "headers": {
      "Authorization": "Bearer example"
    }
  },
  "legacy-sse": {
    "url": "http://localhost:9000/mcp",
    "transport": "sse"
  }
}

当 url MCP Relay直接连接到该远程MCP服务器(支持流式HTTP和SSE传输),而不是生成本地进程。

🐳 Docker使用

使用Docker来交付带有所有依赖项的代理(Python堆栈加上用于stdio MCP服务器的Node.js/npm,以及可选的启用CUDA的PyTorch轮子),而不会污染主机环境。

# Build the image
docker build -t mcp-relay .

# Prepare persistent data directory (config/logs/storage live here)
mkdir -p data/config data/logs data/storage
cp config/mcp-servers.toml data/config/mcp-servers.toml

# Run on CPU (single bind mount handles config, logs, and storage)
docker run --rm -p 8000:8000 \
  -v $(pwd)/data:/data \
  -e MCP_DATA_DIR=/data \
  mcp-relay

# Enable GPU embeddings (requires NVIDIA Container Toolkit)
docker run --rm -p 8000:8000 --gpus all \
  -v $(pwd)/data:/data \
  -e MCP_DATA_DIR=/data \
  -e MCP_RELAY_ENCODER_DEVICE=cuda:0 \
  mcp-relay

容器在端口上公开FastAPI+MCP 8000.用附加值覆盖任何运行时选项 -e VAR=value 标志(例如。, MCP_RELAY_SKIP_BOOTSTRAP=1 用于烟雾测试)。唯一 -v $(pwd)/data:/data mount将配置、日志和SQLite存储放在一起; /data/config/mcp-servers.toml 当您添加/删除服务器时,会自动更新。

Docker Compose

docker-compose.yml 包装这些默认值,以便您可以使用一个命令启动代理:

# Customize environment (optional)
cat <<'EOF' > .env
MCP_DATA_VOLUME=./data
MCP_DATA_DIR=/data
MCP_RELAY_ENCODER_DEVICE=cpu  # set to cuda:0 after installing NVIDIA toolkit
MCP_RELAY_SKIP_BOOTSTRAP=0
EOF

docker compose --env-file .env up --build

组合服务映射端口 8000 和支架 ${MCP_DATA_VOLUME} 进入 /data,因此配置、日志和存储文件保持在一起。要使用GPU嵌入运行,请安装 NVIDIA容器工具包 并开始作曲 docker compose --env-file .env --build --gpus all up,然后设置 MCP_RELAY_ENCODER_DEVICE=cuda:0 在你的 .env.

📖 文档

📁 项目结构

mcp-relay/
├── src/
│   └── mcp_relay/
│       ├── __init__.py
│       ├── main.py              # FastAPI application
│       ├── api/
│       │   ├── models.py        # Pydantic models
│       │   ├── tools.py         # Tool management endpoints
│       │   └── mcp.py           # MCP server endpoints
│       ├── models/
│       │   └── tool.py          # Domain models
│       └── services/
│           ├── discovery.py     # Semantic search
│           ├── gating.py        # Tool selection logic
│           └── repository.py    # Tool storage
├── tests/
│   ├── test_*.py               # Test files
│   └── test_integration.py     # Integration tests
├── demo.py                     # Interactive demo
├── test_server.py              # Manual testing script
└── pyproject.toml              # Project configuration

🔌 与MCP服务器集成

从MCP服务器注册工具

# 1. Clear existing demo tools
DELETE /api/tools/clear

# 2. Register tools from your MCP servers
POST /api/tools/register
{
  "id": "exa_research_paper_search",
  "name": "research_paper_search",
  "description": "Search across 100M+ research papers with full text access",
  "tags": ["search", "research", "academic"],
  "estimated_tokens": 250,
  "server": "exa",
  "parameters": {
    "type": "object",
    "properties": {
      "query": {"type": "string"},
      "numResults": {"type": "number", "default": 5}
    },
    "required": ["query"]
  }
}

与LLM编排一起使用

  1. LLM接收用户查询:“查找有关量子计算的最新论文”
  2. 编排器查询mcp中继:
    POST /api/tools/discover
    {"query": "find research papers", "limit": 3}
    
  3. 系统返回相关工具:只有研究工具,没有文件编辑器
  4. 编排器配置工具:
    POST /api/tools/provision
    {"tool_ids": ["exa_research_paper_search"], "max_tokens": 500}
    
  5. LLM直接与MCP服务器执行:使用配置的工具定义

人工智能辅助服务器注册

AI助手可以自动添加新的MCP服务器:

# User: "Add this Slack MCP server to mcp relay"
# AI: Connects to server, discovers tools, and registers everything

POST /api/mcp/ai/register-server
{
  "server_name": "slack",
  "config": {
    "command": "npx",
    "args": ["@slack/mcp-server"],
    "env": {"SLACK_TOKEN": "xoxb-..."}
  },
  "tools": [
    // AI provides all discovered tools with metadata
  ]
}

# Result: Slack server + all tools registered and ready for use

🧑‍💻 发展

代码质量

# Format code
black .

# Run linter
ruff check . --fix

# Type checking
mypy .

# Run all checks
black . && ruff check . --fix && mypy . && pytest

添加新工具

工具可以添加到存储库中 services/repository.py:

Tool(
    id="my-tool",
    name="My Tool",
    description="Description for semantic search",
    tags=["category", "function"],
    estimated_tokens=100,
    parameters={
        "type": "object",
        "properties": {...},
        "required": [...]
    }
)

🤝 贡献

  1. 分叉存储库
  2. 创建要素分支(git checkout -b feature/amazing-feature)
  3. 进行更改并添加测试
  4. 进行质量检查(black, ruff, mypy, pytest)
  5. 提交您的更改(git commit -m 'Add amazing feature')
  6. 推到分支(git push origin feature/amazing-feature)
  7. 打开拉取请求

📄 许可证

此项目根据Apache许可证2.0获得许可-请参阅 许可证 了解详情。

🙏 致谢