Most proxies stop at merging tool lists. This one lets you disable the tools you never want the model to see and rewrite names and descriptions that read badly, which is the practical fix when a backend ships a dozen tools and you want three. The retry layer is the other quiet win: an SSE backend that drops mid-call gets reconnected and the call replayed rather than surfacing as a failure.
An aggregating proxy: it connects to a list of backend MCP servers — stdio, SSE or Streamable HTTP — and re-exposes their combined tools and resources as a single server, itself reachable over stdio, SSE (`/sse`) or Streamable HTTP (`/mcp`). An optional browser admin UI manages the server list and the per-tool overrides.
- One connection in your client that fans out to every backend, with requests routed to the right one and each backend's key joined to the original tool name by a separator that defaults to `__`
- Per-tool control: hide a tool from clients entirely, or override its display name and description, written to `config/tool_config.json` and applied without restarting
- Backend definitions that accept a command and args for stdio, or a URL plus `apiKey` / `bearerToken` for SSE and HTTP, with `active` set to `false` to park one without deleting it
- A live config reload that picks up server and tool changes in place
- Retries with exponential backoff and jitter on every transport — a dropped SSE connection is re-established before the call is retried, and a crashed stdio backend is restarted; each is tunable through `RETRY_SSE_TOOL_CALL`, `SSE_TOOL_CALL_MAX_RETRIES` and their HTTP and stdio counterparts
- Backend errors returned to the client as standard JSON-RPC error responses rather than swallowed
- Install commands you can define per stdio backend and trigger from the admin UI, with stdout and stderr streamed live into the browser
Node, or the published container image `ghcr.io/ptbsare/mcp-proxy-server/mcp-proxy-server`. The `package.json` is marked private (version 0.4.1), so this is a clone-and-build or Docker install rather than an npm one. HTTP mode listens on `PORT`, default `3663`. Authentication on `/sse` and `/mcp` is off unless you set `ALLOWED_KEYS` or `ALLOWED_TOKENS`. The admin UI is off unless `ENABLE_ADMIN_UI=true`, and it ships with `ADMIN_USERNAME` defaulting to `admin` and `ADMIN_PASSWORD` to `password` — the README says change it. Two features carry the project's own warnings: the built-in web terminal gives shell access to the host the proxy runs on, and `installCommands` execute arbitrary shell.
One command — docker pull ghcr.io/ptbsare/mcp-proxy-server/mcp-proxy-server:latest
