Labsco
MCP SERVER

MCP Aggregator

by nazar256

Put every MCP server behind one connection — prefixed tool names, per-server allowlists, and one config file shared by every client you use.

MCP Plumbing: Proxies, Registries & Inspectors
Summary
Tool filtering is the feature that outlives the Cursor bug it was written for.

Fronting five servers means five tool lists arriving in the model's context, most of which it will never call; the per-server `allowed` array trims that to the handful you actually use. The other durable benefit is the single config: point every client at the same file and the same binary, and secrets stop being copied into four separate client configurations.

What it is

An MCP aggregator written in Go. It is a server to your client and a client to your backend servers: it launches each configured server, collects their tools, prefixes each tool with the server's name, and presents the whole set through one stdio connection. It was built because Cursor breaks when a third MCP server is added, and it doubles as a way to keep one MCP configuration for every client you run.

What you get
  • Several backend MCP servers reachable through a single stdio connection, so a client that struggles past two servers sees only one
  • Tools namespaced by their server — `search_stories` from a `shortcut` server becomes `shortcut_search_stories` — so two servers can expose the same tool name without colliding
  • Dashes rewritten to underscores automatically, because Cursor cannot reliably detect tools with dashes in their names; the aggregator maps the sanitised name back when forwarding
  • Per-server tool filtering: a `tools.allowed` array picks exactly which tools are exposed, which is how you stay under Cursor's limit of 40 tools
  • One configuration file for every client — Cursor, Windsurf, Gemini CLI, Codex, Claude Code, Copilot agents — so backend servers and their secrets are defined once
  • Secrets isolation: API tokens live in the aggregator config rather than being handed to each client
  • Debug logging with configurable levels and an optional log file
Requirements

No account and no key of its own; each backend server keeps whatever credentials it needs, declared in one JSON config. Install with the project's shell script, `go install github.com/nazar256/combine-mcp/cmd/combine-mcp@latest`, or the container image `ghcr.io/nazar256/combine-mcp:latest`. `MCP_CONFIG` is required and points at the configuration file — the format is the familiar `mcpServers` object, so an existing Cursor config can be copied across. `MCP_LOG_LEVEL` takes `error`, `info`, `debug` or `trace` and defaults to `info`, `MCP_LOG_FILE` names a log file, `MCP_PROTOCOL_VERSION` pins a protocol version for compatibility, and `MCP_CURSOR_MODE` turns on Cursor-specific adjustments. The README notes the code is mostly AI-generated.

Setup effort

One command — curl -fsSL https://raw.githubusercontent.com/nazar256/combine-mcp/main/install.sh | bash