This MCP router aggregates and routes requests to multiple MCP backend servers with advanced routing, health monitoring, and management capabilities. It can also function as a simple MCP server exposing testing tools.
Core Routing Features:
Multi-backend aggregation: Route requests across multiple MCP servers simultaneously
Three routing strategies: Path-based (glob patterns), capability-based (query backend capabilities), and priority/fallback chains
Namespace prefixing: Prevent naming conflicts with
backend.tool_namesyntaxHealth monitoring: Active probes and passive monitoring with circuit breaker patterns (CLOSED, OPEN, HALF_OPEN states)
Retry logic: Exponential backoff for transient failures
Management tools:
list_backends()andget_backend_health()for monitoring routing decisions
Configuration & Deployment:
YAML configuration with environment variable overrides
HTTP/SSE transport for web deployment
UBI9 rootless container for enterprise deployments
Claude Desktop and Claude Code integration
Testing Tools:
meta.testing.greet- Generate personalized greetingsmeta.testing.calculate_sum- Sum a list of integersmeta.testing.reverse_string- Reverse text strings
These tools demonstrate MCP integration, validate routing functionality, and enable basic string manipulation and arithmetic operations.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@MCP Server Templateshow me how to add a new tool to the server"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
MCP Router
A production MCP router that aggregates multiple backend servers into a single endpoint with intelligent routing, health checking, and automatic failover. Route requests across backends using path-based, capability-based, or fallback strategies ā with circuit breakers and namespace prefixing to keep everything isolated.
Quick Install: pip install git+https://github.com/amp-rh/mcp.git
Features
Multi-Backend Aggregation: Route requests across multiple MCP servers
Three Routing Strategies:
Path-based routing (glob patterns)
Capability-based routing (query backend capabilities)
Priority/fallback chains
Namespace Prefixing: Prevent naming conflicts with
backend.tool_namesyntaxHealth Checking: Active probes + passive monitoring with circuit breaker pattern
Retry Logic: Exponential backoff for transient failures
Router Management Tools: Monitor backend health and routing decisions
YAML Configuration: Simple backend definitions with environment variable overrides
FastMCP: High-level Python framework for MCP servers
HTTP/SSE Transport: Ready for web deployment
Container Support: UBI9 rootless container for enterprise deployments
Modern Python Tooling: uv, pytest, ruff
Quick Start
For Claude Code Users
š Install directly from GitHub (no clone needed):
claude mcp add --transport stdio mcp-server \
-- uv run --with "git+https://github.com/amp-rh/mcp.git" mcp-serverOr clone for local development:
git clone https://github.com/amp-rh/mcp.git && cd mcp && ./install-to-claude.shVerify and use:
# Check installation
claude mcp list
# In Claude Code, test the tools
/mcpNext steps:
Type
/mcpin Claude Code to see available toolsFor customization, clone the repo and edit
src/mcp_server/tools/See CLAUDE_CODE_SETUP.md for detailed installation options
For Claude Desktop Users
Add to Claude Desktop configuration:
{
"mcpServers": {
"mcp-router": {
"command": "uv",
"args": [
"run",
"--with",
"git+https://github.com/amp-rh/mcp.git",
"mcp-router"
]
}
}
}Restart Claude Desktop
Done! The router tools are now available in Claude Desktop
For Local Development
# Install uv if not already installed
curl -LsSf https://astral.sh/uv/install.sh | sh
# Clone and setup
git clone https://github.com/amp-rh/mcp.git
cd mcp
uv sync --all-extras
# Copy example configuration
cp config/backends.yaml.example config/backends.yaml
# Run tests (50+ tests covering all routing functionality)
make test
# Run the router server locally
make runThe router will be available at http://localhost:8000 and expose all backend tools with namespace prefixes.
Installation
Method 1: Install from GitHub (Recommended)
pip install git+https://github.com/amp-rh/mcp.gitAfter installation, you can run:
# Template mode (simple MCP server)
mcp-server
# Router mode (multi-backend aggregation)
mcp-routerMethod 2: Install with uv
uv pip install git+https://github.com/amp-rh/mcp.gitMethod 3: Development Installation
git clone https://github.com/amp-rh/mcp.git
cd mcp
uv sync --all-extrasClaude Desktop Integration
To use this MCP router with Claude Desktop, add to your MCP settings:
Option 1: Using uv (Recommended)
Add to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%/Claude/claude_desktop_config.json (Windows):
{
"mcpServers": {
"mcp-router": {
"command": "uv",
"args": [
"run",
"--with",
"git+https://github.com/amp-rh/mcp.git",
"mcp-router"
],
"env": {
"MCP_BACKENDS_CONFIG": "/path/to/your/config/backends.yaml"
}
}
}
}Option 2: Using Installed Package
If you've installed via pip:
{
"mcpServers": {
"mcp-router": {
"command": "mcp-router",
"env": {
"MCP_BACKENDS_CONFIG": "/path/to/your/config/backends.yaml"
}
}
}
}Option 3: Using FastMCP CLI
# Install the router
pip install git+https://github.com/amp-rh/mcp.git
# Configure for Claude Desktop
fastmcp install claude-desktop mcp_server.server:mcp --name mcp-routerOption 4: Template Mode (No Routing)
For simple template mode without routing:
{
"mcpServers": {
"mcp-template": {
"command": "mcp-server"
}
}
}Note: After updating configuration, restart Claude Desktop for changes to take effect.
Configuration for Claude Desktop
Step 1: Create Backend Configuration
Create or edit config/backends.yaml:
backends:
- name: my-backend
url: http://localhost:8001
namespace: backend
priority: 10
routes:
- pattern: "*"
strategy: capability
health_check:
enabled: true
interval_seconds: 30
circuit_breaker:
failure_threshold: 5
timeout_seconds: 60Step 2: Set Environment Variable
Point Claude Desktop to your config file:
{
"mcpServers": {
"mcp-router": {
"command": "mcp-router",
"env": {
"MCP_BACKENDS_CONFIG": "/absolute/path/to/config/backends.yaml"
}
}
}
}Step 3: Restart Claude Desktop
Restart Claude Desktop to load the MCP server.
Troubleshooting
Server not appearing:
Check Claude Desktop logs at
~/Library/Logs/Claude/mcp*.log(macOS)Verify backend config file path is absolute
Ensure backend MCP servers are running
Connection errors:
Verify backend URLs are correct
Check backend servers are accessible
Review health check settings in config
Tool conflicts:
Enable namespace prefixing to avoid naming conflicts
Use unique namespaces for each backend
Routing Configuration
Step 1: Create Backend Configuration
Create config/backends.yaml from the example:
backends:
- name: database
url: http://localhost:8001
namespace: db
priority: 10
routes:
- pattern: "*_user"
strategy: path
health_check:
enabled: true
interval_seconds: 30
circuit_breaker:
failure_threshold: 5
timeout_seconds: 60Step 2: Run Backend MCP Servers
# Terminal 1: Backend 1
uv run fastmcp run path/to/backend1:mcp --transport sse --port 8001
# Terminal 2: Backend 2
uv run fastmcp run path/to/backend2:mcp --transport sse --port 8002Step 3: Start the Router
make run
# Router starts on http://localhost:8000Routing Strategies
The router supports three routing strategies per backend:
Path-Based Routing
routes:
- pattern: "fetch_*"
strategy: path
- pattern: "*_user"
strategy: pathRoutes tools based on glob patterns matching the tool name.
Capability-Based Routing
routes:
- pattern: "*"
strategy: capabilityQueries backend capabilities and routes to backends that have the tool.
Fallback Chains
routes:
- pattern: "analyze_*"
strategy: fallback
fallback_to: analytics-secondaryTries primary backend first, falls back to secondary if circuit is open.
Namespace Prefixing
When namespace prefixing is enabled (default), tools from different backends are exposed with prefixes:
Tool on 'db' backend: fetch_user ā db.fetch_user
Tool on 'api' backend: fetch_user ā api.fetch_user
Tool on 'analytics' backend: analyze ā analytics.analyzeThis prevents naming conflicts when aggregating tools from multiple backends.
Health Checking & Circuit Breaker
The router monitors backend health with:
Active Probing: Periodic health checks to
/healthendpointPassive Monitoring: Tracks errors from actual requests
Circuit Breaker States:
CLOSED: Normal operation (requests flow through)OPEN: Backend unhealthy (requests rejected immediately)HALF_OPEN: Testing recovery (allows limited requests)
Configure per backend:
circuit_breaker:
failure_threshold: 5 # Failures before opening circuit
timeout_seconds: 60 # Wait time before HALF_OPEN test
half_open_attempts: 3 # Attempts in HALF_OPEN stateRouter Management Tools
The router exposes three management tools:
list_backends()
Lists all configured backends with health status:
{
"name": "database",
"url": "http://localhost:8001",
"namespace": "db",
"priority": 10,
"healthy": true,
"circuit_state": "CLOSED",
"error_count": 0
}get_backend_health(backend_name)
Gets detailed health information for a specific backend:
{
"name": "database",
"healthy": true,
"circuit_state": "CLOSED",
"error_count": 0,
"last_error": null
}Environment Variables
For dynamic configuration override:
Variable | Default | Description |
|
| Router server name |
|
| Host to bind to |
|
| Port to listen on |
|
| Backend config file path |
|
| Default routing strategy |
|
| Enable namespace prefixing |
|
| Capability cache TTL (seconds) |
|
| Backend request timeout (seconds) |
|
| Health check interval (seconds) |
|
| Health check timeout (seconds) |
|
| Max retry attempts |
|
| Exponential backoff multiplier |
|
| Max backoff time (seconds) |
Project Structure
āāā config/
ā āāā backends.yaml # Router backend configuration
ā āāā backends.yaml.example # Example configuration
āāā src/mcp_server/
ā āāā server.py # Server factory & router
ā āāā config.py # Server & router config
ā āāā routing/ # Routing module
ā ā āāā client.py # HTTP client for backends
ā ā āāā backends.py # Backend manager
ā ā āāā engine.py # Routing engine (strategies)
ā ā āāā health.py # Health checker & circuit breaker
ā ā āāā models.py # Data models
ā ā āāā config_loader.py # YAML config parsing
ā ā āāā exceptions.py # Routing exceptions
ā āāā tools/ # Tool implementations
ā āāā resources/ # Resource implementations
ā āāā prompts/ # Prompt implementations
āāā tests/
ā āāā test_routing/ # Routing tests (50+)
ā ā āāā test_models.py # Data model tests
ā ā āāā test_config_loader.py # Config parsing tests
ā ā āāā test_client.py # HTTP client tests
ā ā āāā test_engine.py # Routing strategy tests
ā ā āāā test_health.py # Circuit breaker tests
ā āāā fixtures/
ā āāā test_backends.yaml # Test configuration
āāā Containerfile # UBI9 container (podman)
āāā Makefile # Build targets
āāā pyproject.toml # Project configuration
āāā README.md # This fileRunning the Router
Local Development
# Run with auto-reload
make run-dev
# Run production mode
make runContainer Deployment
# Build container
make build
# Run container
make run-container
# Or manually:
podman build -t mcp-router:latest .
podman run --rm -p 8000:8000 -v $(pwd)/config:/app/config mcp-router:latestTesting
The project includes comprehensive tests covering all routing functionality:
# Run all tests
make test
# Run with coverage report
make test-cov
# Run specific test file
uv run pytest tests/test_routing/test_engine.py -v
# Run routing tests only
uv run pytest tests/test_routing/ -vTest Coverage:
50+ tests across all routing components
Config parsing (valid/invalid scenarios)
Circuit breaker state transitions
Routing strategies (path, capability, fallback)
Retry logic and exponential backoff
Error handling and edge cases
Health checking and recovery
Backend management and capability discovery
Make Targets
make help # Show all targets
make install # Install dependencies
make dev # Install with dev dependencies
make test # Run tests
make test-cov # Run tests with coverage
make lint # Run linting
make format # Format code
make run # Run server locally
make run-dev # Run with auto-reload
make build # Build container image
make run-container # Run container
make clean # Clean build artifactsFor AI Agents
This project uses AGENTS.md files as indexes. Before making changes:
Read the
AGENTS.mdin the directory you're working inFollow linked documentation in
.agents/docs/Update docs when patterns are learned or decisions made
See AGENTS.md for the root index.
Testing
# Run all tests
make test
# Run with coverage
make test-cov
# Run specific test file
uv run pytest tests/test_tools.py -vContributing
See .agents/docs/workflows/contributing.md for guidelines.
License
Apache License 2.0
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.