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.
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.
- 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
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.
One command — curl -fsSL https://raw.githubusercontent.com/nazar256/combine-mcp/main/install.sh | bash
