Mcp Orchestrator

io.github.rupinder2Published by GitHub account rupinder2v0.1.2Updated Oct 25, 2026

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

VerifiedSTDIODesktop onlyKnowledge & MemoryDeveloper Tools

Overview

AI-generated overview

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

What you can do
Search indexed tools across all registered downstream servers with BM25 relevance ranking or regex patterns, with deferred loading to keep context small. Discover and index the tools of a registered downstream server. Call a downstream tool by its namespaced name, optionally overriding the configured auth header. Register downstream servers through a JSON config file, with stdio or HTTP transport and in-memory or Redis caching of tool definitions.
When to use it
Useful when you connect to many MCP servers and want one entry point whose tool list stays small, with search used to pull in only the tools a task needs. Also handy for routing calls to several downstream servers from a single configuration file.
Requirements
Python package installed locally (pip install mcp-orchestrator) and run as a stdio or HTTP process. A server_config.json listing downstream servers, located via SERVER_CONFIG_PATH. Optional Redis via REDIS_URL when STORAGE_BACKEND=redis; ORCHESTRATOR_PORT for HTTP transport. Network access to the downstream servers.
Before you install
The config file can hold static auth headers, including bearer tokens, for downstream servers, so protect it. The orchestrator can call any tool on connected servers, 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, so restrict exposure.

Installation

In SourceWeft

  1. Open Mcp Orchestrator 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.2LatestSep 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