OmniMCP Router

OmniMCP Router

A universal MCP gateway that aggregates multiple MCP servers into a single endpoint, providing features like hot-reload, auto-healing, and a hook system for request/response mutation.

Category
Visit Server

README

<div align="center">

OmniMCP Router

The Universal MCP Gateway — One Entry Point to Rule All Your AI Tools

Python 3.10+ MCP Protocol License: MIT Tests Code style: black

Plug any MCP server. Claude sees them all as one.

Features • Quick Start • Configuration • Tests • Client Setup • Contributing

</div>


The Problem

You have 10 MCP servers: GitHub, Reddit, Notion, Stripe, a custom scraper…
Your Claude Desktop config is a mess. Each client can only talk to one server at a time.
Every crash brings everything down. There's no observability. No resilience.

OmniMCP fixes all of that.


Features

Feature Description
Zero Hard-Coded Tools Dynamically discovers tools from every sub-server at startup
Async Non-Blocking Routing Parallel requests routed concurrently via anyio — no bottleneck
Auto-Healing Exponential backoff reconnection when a sub-server crashes
Hot-Reload Detects mcp_router_config.json changes live — no restart needed
Hook System Mutate, intercept, and validate requests/responses in middleware pipelines
Performance Monitoring Real-time profiling with PERF_WARNING for tools exceeding 5s
Isolated Lifecycle Each sub-server has its own AsyncExitStack — one crash ≠ global failure
Safe Namespacing Tools exposed as {server}__{tool}, sanitized to MCP spec ([a-zA-Z0-9_-]{1,64})
Persistent Logging All logs written to mcp_router.log + stderr (captured by Claude)
JSON Schema Validation Strict input validation before forwarding any tool call
Response Truncation Hook Auto-truncates responses >50k chars to protect context windows
Windows + Linux Signal handling for both platforms

Quick Start

# 1. Clone the repo
git clone https://github.com/Simonc44/OmniMCP.git
cd OmniMCP

# 2. Install dependencies (Python 3.10+ required)
pip install -r requirements.txt

# 3. Edit your config
notepad mcp_router_config.json   # Windows
# or: nano mcp_router_config.json

# 4. Run it
python router.py --config mcp_router_config.json

That's it. OmniMCP starts, connects to all your sub-servers, and exposes a single unified MCP stdio interface.


Project Structure

OmniMCP/
├── router.py                  #  Core gateway — routing, healing, hot-reload, hooks
├── mock_server.py             #  Lightweight mock MCP server for testing
├── run_integration_test.py    #  Full integration test suite (async, healing, hot-reload)
├── mcp_router_config.json     #   Production config — your real MCP servers go here
├── test_config.json           #  Test config — uses mock_server.py instances
├── requirements.txt           #  Dependencies: mcp, pydantic, jsonschema, anyio
├── docs/                      #  Architecture diagrams and assets
├── .github/
│   ├── workflows/ci.yml       #  GitHub Actions CI pipeline
│   └── ISSUE_TEMPLATE/        #  Bug report & feature request templates
├── CHANGELOG.md               #  Version history
├── CONTRIBUTING.md            #  Contribution guide
└── LICENSE                    #   MIT License

Configuration

The config file follows the exact same syntax as claude_desktop_config.json — so you can copy-paste your existing Claude Desktop config directly.

{
  "mcpServers": {
    "github": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-github"],
      "env": { "GITHUB_PERSONAL_ACCESS_TOKEN": "ghp_xxxx" }
    },
    "reddit": {
      "command": "python",
      "args": ["C:/path/to/reddit/server.py"],
      "env": {
        "REDDIT_CLIENT_ID": "your_client_id",
        "REDDIT_CLIENT_SECRET": "your_secret",
        "REDDIT_USER_AGENT": "OmniMCP/1.0"
      }
    },
    "trend-mining": {
      "command": "python",
      "args": ["-m", "trend_mining.server"],
      "env": { "PLAYWRIGHT_HEADLESS": "true" }
    }
  }
}

Tools are exposed as {server_name}__{tool_name} — e.g. github__create_issue, reddit__search_posts.

Hot-Reload

OmniMCP watches your config file every 2 seconds. Add, remove, or modify a server — it reconnects live and sends notifications/tools/list_changed to your client. No restart needed.


Tests

The integration test suite validates the full feature set end-to-end:

python run_integration_test.py
# Test What it validates
1 Aggregation All tools from all sub-servers are discovered and exposed
2 Async Parallelism Two 2s calls finish in ~2s total, not 4s
3 Perf Monitoring A 6s call triggers PERF_WARNING in logs
4 Auto-Healing Server crash → automatic reconnect → tool works again
5 Hot-Reload Config change → list_changed notification → updated tool list

Client Setup

Claude Desktop

Replace your entire claude_desktop_config.json with just OmniMCP:

{
  "mcpServers": {
    "omni-mcp": {
      "command": "python",
      "args": [
        "C:/path/to/OmniMCP/router.py",
        "--config",
        "C:/path/to/OmniMCP/mcp_router_config.json"
      ]
    }
  }
}

Cursor

In Cursor MCP settings, add a stdio server:

  • Name: OmniMCP
  • Command: python C:/path/to/OmniMCP/router.py --config C:/path/to/OmniMCP/mcp_router_config.json

Hook System

OmniMCP ships with a middleware pipeline for request/response mutation:

# Register a custom request hook (e.g. inject auth)
@gateway.hook_system.register_request_hook
async def inject_auth(server_name: str, tool_name: str, arguments: dict) -> dict:
    if server_name == "my-api":
        arguments["api_key"] = os.environ["MY_SECRET_KEY"]
    return arguments

# Register a custom response hook (e.g. redact PII)
@gateway.hook_system.register_response_hook
async def redact_pii(server_name, tool_name, result):
    # process result.content here
    return result

Built-in hooks:

  • Response Truncation — auto-truncates responses >50,000 chars with a clear notice

Resilience Architecture

┌──────────────────────────────────────────────────────┐
│              Claude Desktop / Cursor                  │
└──────────────────────┬───────────────────────────────┘
                       │ stdio (single MCP connection)
┌──────────────────────▼───────────────────────────────┐
│                  OmniMCP Router                       │
│  ┌─────────────────────────────────────────────────┐ │
│  │  Hook System │  Schema Validator  │   Profiler   │ │
│  └─────────────────────────────────────────────────┘ │
│  ┌──────────────┐ ┌──────────────┐ ┌────────────┐   │
│  │SubServer A   │ │SubServer B   │ │SubServer C │   │
│  │ connected  │ │ reconnecting│ │ connected│   │
│  │Auto-Healing  │ │Backoff: 4s   │ │            │   │
│  └──────────────┘ └──────────────┘ └────────────┘   │
└──────────────────────────────────────────────────────┘

If Sub-Server B crashes:

  • Its tools are hidden from the tool list
  • A reconnect loop starts with exponential backoff (1s → 2s → 4s → 8s → 16s)
  • On success: tools reappear, client gets notifications/tools/list_changed
  • After 5 failed attempts: marked failed, loop stops
  • Sub-Servers A and C are completely unaffected

Contributing

PRs are welcome! See CONTRIBUTING.md for guidelines.

  1. Fork the repo
  2. Create your branch: git checkout -b feat/my-feature
  3. Run tests: python run_integration_test.py
  4. Open a PR against main

Changelog

See CHANGELOG.md.


License

MIT — see LICENSE.


<div align="center">

Made for the MCP ecosystem If this saved you hours, drop a star

</div>

Recommended Servers

playwright-mcp

playwright-mcp

A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.

Official
Featured
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.

Official
Featured
Local
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.

Official
Featured
Local
TypeScript
VeyraX MCP

VeyraX MCP

Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.

Official
Featured
Local
graphlit-mcp-server

graphlit-mcp-server

The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.

Official
Featured
TypeScript
Kagi MCP Server

Kagi MCP Server

An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.

Official
Featured
Python
E2B

E2B

Using MCP to run code via e2b.

Official
Featured
Neon Database

Neon Database

MCP server for interacting with Neon Management API and databases

Official
Featured
Exa Search

Exa Search

A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.

Official
Featured
Qdrant Server

Qdrant Server

This repository is an example of how to create a MCP server for Qdrant, a vector search engine.

Official
Featured