Skip to main content
Glama
moaaz01

MCP Multi-Server Gateway

by moaaz01
README.md
# 🌐 MCP Multi-Server Gateway

> **Aggregate, route, and orchestrate multiple MCP backend servers** behind a single MCP endpoint. Connect one gateway to Claude Desktop/Cursor and access all your MCP servers β€” weather, database, file system, and more.

[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
[![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/)

---

## ✨ Why a Gateway?

Instead of configuring each MCP server individually in your client:

```json
// ❌ Without Gateway: 3 entries in claude_desktop_config.json
{
  "weather": { "command": "...", "args": ["weather_server.py"] },
  "sqlite": { "command": "...", "args": ["sqlite_server.py", "--db-path", "..."] },
  "filesystem": { "command": "...", "args": ["filesystem_server.py", "--sandbox", "..."] }
}

// βœ… With Gateway: 1 entry β€” register/unregister servers at runtime
{
  "gateway": { "command": "python", "args": ["gateway.py"] }
}
```

---

## ✨ Features

- **πŸ”§ 5 Tools**: `register_server`, `remove_server`, `list_servers`, `call_backend`, `route_pipeline`
- **⏱️ Async Routing**: Concurrent tool execution across backends via `asyncio`
- **πŸ“‹ Pipeline Support**: Pre-configured multi-step workflows (weather-analysis, database-report)
- **πŸ“ Auto-Registration**: Load backend config from JSON file on startup
- **πŸ”Œ Runtime Dynamic**: Register/unregister servers without restarting
- **⏲️ Timeout Handling**: 10-second per-backend timeout prevents hangs
- **πŸ–₯️ Dual Transport**: stdio and Streamable HTTP

---

## πŸš€ Quick Start

```bash
# 1. Setup
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt

# 2. Start the gateway
python gateway.py

# 3. Register backend servers (from MCP client)
register_server(name="weather", command="python", args="weather_server.py", description="Weather alerts")
register_server(name="sqlite", command="python", args="sqlite_server.py --db-path /tmp/sample.db", description="Database queries")
```

### With auto-registration:

```bash
python gateway.py --auto-register gateway-config.json
```

---

## πŸ› οΈ Tools Reference

### `register_server(name, command, args, description) -> str`
Register a new backend MCP server at runtime.

### `remove_server(name) -> str`
Remove a registered server.

### `list_servers() -> str`
List all registered backends with status and tool counts.

### `call_backend(server, tool, params) -> str`
Execute a tool on a specific backend. `params` is a JSON string.

### `route_pipeline(scenario) -> str`
Execute a pre-configured multi-step pipeline:
- `"weather-analysis"` β€” alerts + forecast
- `"database-report"` β€” schema inspection + query
- `"custom"` β€” compose your own workflow

---

## πŸ”Œ Connecting to Clients

### Claude Desktop

```json
{
  "mcpServers": {
    "gateway": {
      "command": "python",
      "args": ["/ABSOLUTE/PATH/mcp-multi-server-gateway/gateway.py"]
    }
  }
}
```

### Streamable HTTP Mode

```bash
python gateway.py --transport streamable-http --port 8003
```

---

## πŸ“ Project Structure

```
mcp-multi-server-gateway/
β”œβ”€β”€ gateway.py              # Main gateway server (FastMCP + asyncio)
β”œβ”€β”€ gateway-config.json     # Example auto-registration config
β”œβ”€β”€ requirements.txt
β”œβ”€β”€ setup.sh
β”œβ”€β”€ README.md
└── .gitignore
```

---

## πŸ—οΈ Architecture

```
         β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
         β”‚       MCP Client (Claude, etc)       β”‚
         β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                        β”‚  single MCP connection
         β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
         β”‚     MCP Multi-Server Gateway         β”‚
         β”‚     (gateway.py on :8003)            β”‚
         β”‚                                      β”‚
         β”‚  register / call_backend / pipeline  β”‚
         β””β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
            β”‚          β”‚          β”‚
     β”Œβ”€β”€β”€β”€β”€β”€β–Όβ”€β”€β” β”Œβ”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β” β”Œβ”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”
     β”‚ Weather  β”‚ β”‚  SQLite  β”‚ β”‚ FileSystemβ”‚
     β”‚ Server   β”‚ β”‚  Server  β”‚ β”‚  Server   β”‚
     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
```

---

## πŸ’‘ Use Cases

| Scenario | Tools Involved | Example |
|----------|---------------|---------|
| **DevOps Debugging** | sqlite.query + filesystem.read_file | "Check DB schema, then read config file" |
| **Data Analysis** | sqlite.list_tables + sqlite.query | "What tables exist? Give me top 10 customers" |
| **Multi-weather check** | weather.get_alerts Γ— 2 | "Alerts for CA and TX simultaneously" |
| **Automated report** | All servers in sequence | "Get weather data β†’ query DB β†’ write report" |

---

## πŸ“œ License

MIT