使用说明
MCP继电器
用于模型上下文协议(MCP)的智能代理/路由器,使Claude Desktop和其他MCP客户端能够动态发现和使用来自多个MCP服务器的工具,同时保持单个连接点。该系统通过智能地为每个任务选择最相关的工具来防止上下文膨胀。
🎯 问题
像Claude Desktop这样的MCP客户端必须在启动时加载所有服务器,并且不能在对话期间动态添加服务器。使用多个MCP服务器时:
- Exa服务器:7个搜索工具(网络、研究论文、推特、公司等)
- 操纵者:浏览器自动化工具
- 背景7:文档搜索工具
- 桌面指挥官:18+桌面自动化工具
直接加载所有服务器会导致:
- 🚨 上下文膨胀:100多种工具占用了大部分上下文窗口
- 🔒 静态配置:如果不重新启动Claude,则无法添加服务器
- 💸 成本增加:每次请求消耗的令牌更多
- 🎯 工具选择不当:人工智能难以从太多的选项中做出选择
💡 解决方案
MCP Relay充当智能代理:
- 单个连接:Claude Desktop仅连接到MCP中继
- 后端管理:保持与多个MCP服务器的连接
- 智能发现:使用语义搜索在所有服务器上查找相关工具
- 动态预配置:仅在令牌预算内加载所需的工具
- 透明路由:在适当的后端服务器上执行工具
示例:与其使用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,因此无需外部工具,您始终可以快速查看中继运行状况。
📋 先决条件
- Python 3.12+
- 紫外线 包管理器
🔧 安装
- 克隆存储库:
git clone https://github.com/yourusername/mcp-relay.git
cd mcp-relay
- 创建并激活虚拟环境:
uv venv
source .venv/bin/activate # On Unix/macOS
# .venv\Scripts\activate # On Windows
- 安装依赖项:
uv sync
- 在开发模式下安装软件包:
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服务器:
-
启动服务器:
mcp-relay -
安装mcp代理 (如果尚未安装):
uv tool install mcp-proxy -
添加到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使用您的实际用户名。 -
重新启动克劳德桌面
您将在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
}
}
🔄 运作原理
-
Claude桌面配置:仅配置MCP继电器
{ "mcpServers": { "mcp-relay": { "command": "mcp-proxy", "args": ["http://localhost:8000/mcp"] } } } -
后端服务器连接:MCP中继连接到多个MCP服务器
MCP Relay → puppeteer (browser tools) → exa (search tools) → context7 (documentation) → filesystem (file operations) -
自然语言发现:“我需要搜索研究论文”
Claude → discover_tools → Semantic Search → Returns relevant tools -
实时工具执行:工具按需加载
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
📊 建筑细部
- 工具注册:工具与元数据、标签和令牌估计一起注册
- 语义搜索:使用句子转换器嵌入用户查询
- 相关性评分:工具评分基于:
- 查询与工具嵌入之间的余弦相似性
- 标签匹配(每个匹配标签增加0.2个增益)
- 实时加载:工具在执行过程中按需验证和加载
- 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服务器 -集成新服务器的分步指南
- AI集成指南 -AI助手如何自动添加MCP服务器
- 架构概述 -系统设计和组件交互
📁 项目结构
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编排一起使用
- LLM接收用户查询:“查找有关量子计算的最新论文”
- 编排器查询mcp中继:
POST /api/tools/discover {"query": "find research papers", "limit": 3} - 系统返回相关工具:只有研究工具,没有文件编辑器
- 编排器配置工具:
POST /api/tools/provision {"tool_ids": ["exa_research_paper_search"], "max_tokens": 500} - 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": [...]
}
)
🤝 贡献
- 分叉存储库
- 创建要素分支(
git checkout -b feature/amazing-feature) - 进行更改并添加测试
- 进行质量检查(
black,ruff,mypy,pytest) - 提交您的更改(
git commit -m 'Add amazing feature') - 推到分支(
git push origin feature/amazing-feature) - 打开拉取请求
📄 许可证
此项目根据Apache许可证2.0获得许可-请参阅 许可证 了解详情。
🙏 致谢
- 内置于 快速API
- 语义搜索由 句子转换
- 通过官方渠道集成MCP协议 MCP Python SDK
- 演示UI使用 富有的
