Mcp Gateway

io.github.rupinder2Published by GitHub account rupinder2v0.1.1Updated Oct 24, 2026

Aggregates tools from multiple MCP servers with unified BM25/regex search and deferred loading.

VerifiedSTDIODesktop onlyDeveloper ToolsAI & ML

Overview

AI-generated overview

A local MCP gateway that connects to several downstream MCP servers, indexes their tools, and lets an assistant search and call them through one endpoint.

What you can do
  • Search across all registered downstream servers' tools with BM25 natural-language ranking or regex patterns
  • Discover and index the tools exposed by a registered downstream server
  • Call a namespaced downstream tool (server_name__tool_name) with arguments, optionally overriding its auth header
  • Register downstream servers via a JSON config file, using stdio or HTTP transports
  • Cache tool definitions in memory or Redis to keep context usage low
When to use it
Useful when you run many MCP servers and want one connection instead of adding each separately, or when the combined tool list would otherwise crowd the assistant's context window. It suits setups that need deferred tool loading and a single searchable index over several servers.
Requirements
Runs locally as a Python package (pip install mcp-orchestrator) over stdio, or over HTTP with ORCHESTRATOR_TRANSPORT and ORCHESTRATOR_PORT. Needs a server_config.json listing downstream servers, given by SERVER_CONFIG_PATH. STORAGE_BACKEND selects memory or redis; REDIS_URL is required only for the redis backend. Downstream servers may need their own tokens or commands.
Before you install
The config file can hold static auth headers such as bearer tokens for downstream servers, so keep it out of version control. The assistant can invoke any tool on every registered downstream server, including ones that write, send or delete data, and call_remote_tool accepts an auth header override. HTTP transport defaults to host 0.0.0.0 with CORS enabled, which may expose the gateway beyond localhost.

Installation

In SourceWeft

  1. Open Mcp Gateway in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.

Other MCP clients

Follow the launch instructions in the repository.

README

MCP Orchestrator

[PyPI Version] [Python Version] [License: MIT] [Tests] [Contributions Welcome]

A central hub that connects to multiple downstream MCP servers, aggregates their tools, and provides unified access with powerful tool search capabilities.

Built around deferred tool loading — search across all your servers without blowing Claude's context window.

Features

  • Config-based Server Registration: Add downstream MCP servers via JSON config file
  • Tool Namespacing: Automatic server_name__tool_name format
  • Tool Search: Unified BM25/regex search with deferred loading support
  • Flexible Authentication: Static saved headers or token forwarding
  • Multiple Transports: stdio or HTTP
  • Tool Definition Caching: Cached definitions, raw result passthrough
  • Storage Backends: In-memory (development) or Redis (production)

Quick Start

Installation

bash
pip install mcp-orchestrator

Running the MCP Server

bash
# Run as stdio MCP server (for Claude Desktop, Cursor, etc.)mcp-orchestrator
# Or run with Python directlypython -m mcp_orchestrator.main

HTTP Transport:

bash
ORCHESTRATOR_TRANSPORT=http ORCHESTRATOR_PORT=8080 python -m mcp_orchestrator.main

This starts the server on http://localhost:8080/mcp with CORS enabled.

Configuring Servers

Add downstream MCP servers in server_config.json:

json
{  "servers": [    {      "name": "my-server",      "url": "http://localhost:8080/mcp",      "transport": "http",      "auth_type": "static",      "auth_headers": {        "Authorization": "Bearer my-token"      }    },    {      "name": "my-stdio-server",      "url": "server.py",      "transport": "stdio",      "command": "uv",      "args": ["run", "python", "server.py"]    }  ]}

Searching for Tools

The orchestrator provides unified tool search (BM25 by default, regex optional):

python
# BM25 search (default - natural language)results = await mcp_client.call_tool("tool_search", {    "query": "get weather information",    "max_results": 3})
# Regex search (set use_regex=true)results = await mcp_client.call_tool("tool_search", {    "query": "weather|forecast",    "use_regex": true,    "max_results": 3})

Architecture

┌─────────────────────────────────────────────────────┐│                  MCP Orchestrator                    ││                                                      ││  ┌──────────────────────────────────────────────┐   ││  │              FastMCP Server                   │   ││  │  ┌─────────────┐  ┌──────────────────┐   │   ││  │  │ tool_search │  │ call_remote_tool  │   │   ││  │  └─────────────┘  └──────────────────┘   │   ││  └──────────────────────────────────────────────┘   ││                                                      ││  ┌──────────┐  ┌──────────┐  ┌──────────────┐      ││  │  Server  │  │   Tool   │  │   Storage    │      ││  │ Registry │  │  Search  │  │(Memory/Redis)│      ││  └──────────┘  └──────────┘  └──────────────┘      │└─────────────────────────────────────────────────────┘                           │        ┌───────────────────┼───────────────────┐        ▼                   ▼                   ▼   ┌─────────┐        ┌─────────┐        ┌─────────┐   │ MCP Svr │        │ MCP Svr │        │ MCP Svr │   │   #1    │        │   #2    │        │   #N    │   └─────────┘        └─────────┘        └─────────┘

Configuration

Environment Variables

VariableDefaultDescription
STORAGE_BACKENDmemoryStorage backend (memory or redis)
REDIS_URLredis://localhost:6379/0Redis connection URL
MCP_ORCHESTRATOR_TOOL_CACHE_TTL300Tool schema cache TTL in seconds
MCP_ORCHESTRATOR_DEFAULT_CONNECTION_MODEstatelessDefault connection mode
MCP_ORCHESTRATOR_CONNECTION_TIMEOUT30.0Connection timeout in seconds
MCP_ORCHESTRATOR_MAX_RETRIES3Maximum retry attempts
ORCHESTRATOR_TRANSPORTstdioMCP transport (stdio or http)
ORCHESTRATOR_PORT8080Port for HTTP transport
ORCHESTRATOR_HOST0.0.0.0Host for HTTP transport
ORCHESTRATOR_LOG_LEVELINFOLogging level
SERVER_CONFIG_PATHserver_config.jsonPath to server configuration file

Claude Desktop Integration

Add to your Claude Desktop config (~/Library/Application Support/Claude/claude_desktop_config.json):

json
{  "mcpServers": {    "mcp-orchestrator": {      "command": "mcp-orchestrator",      "env": {        "STORAGE_BACKEND": "memory",        "ORCHESTRATOR_LOG_LEVEL": "INFO"      }    }  }}

MCP Tools

tool_search

Search for tools using BM25 relevance ranking or regex pattern matching.

python
@mcp.tool()async def tool_search(    query: str,    max_results: int = 3,    use_regex: bool = False,) -> dict:    """Search for tools using BM25 or regex.
    By default uses BM25 natural language search. Set use_regex=True    to search using Python regex patterns instead.    """

discover_tools

Discover tools from a registered downstream server.

python
@mcp.tool()async def discover_tools(    server_name: str,) -> dict:    """Discover tools from a registered server and index them for search.
    Returns the list of discovered tools with their schemas.    """

call_remote_tool

Call a tool directly on a downstream MCP server.

python
@mcp.tool()async def call_remote_tool(    tool_name: str,    arguments: Optional[dict] = None,    auth_header: Optional[str] = None,) -> Any:    """Call a tool on a downstream server.
    Args:        tool_name: Namespaced tool name (server_name__tool_name)        arguments: Tool arguments        auth_header: Optional auth header to override server's configured auth    """

Tool Search Results

The search tools return results in the format expected by Claude's tool search system:

json
{  "success": true,  "tool_references": [    {      "type": "tool_reference",      "tool_name": "server_name__tool_name"    }  ],  "total_matches": 5,  "query": "weather"}

Testing

Run the test suite:

bash
uv run pytest

Run with coverage:

bash
uv run pytest --cov=mcp_orchestrator

Project Structure

mcp-orchestrator/├── src/mcp_orchestrator/│   ├── __init__.py│   ├── main.py              # Entry point│   ├── models.py            # Pydantic models│   ├── mcp_server.py        # FastMCP server│   ├── config_loader.py     # Config file loader│   ├── server/│   │   └── registry.py      # Server registry│   ├── tools/│   │   ├── router.py       # Tool router│   │   └── search.py       # Tool search service│   └── storage/│       ├── base.py          # Storage interface│       ├── memory.py        # In-memory backend│       └── redis.py         # Redis backend├── tests/│   ├── test_registry.py│   ├── test_search.py│   ├── test_storage.py│   ├── test_models.py│   └── test_integration.py├── server_config.json       # Pre-configured downstream servers├── pyproject.toml├── README.md└── .env                    # Environment variables (not committed)

License

MIT License

Contributing

Contributions are welcome! Please see CONTRIBUTING.md for guidelines.

Source: README.md at commit b44912b

Tools

0
SourceWeft has not started this package in its sandbox yet, so its tools are not known.

Version history

1
  1. v0.1.1LatestSep 16, 2026

Score

50% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 days25 pts

    Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.

  • Auth declared10 pts

    Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.

  • Tools listed15 pts

    Answer tools/list without a credential, or ship a package that starts in a sandbox without one.

  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts