Labsco
MCP SERVER

MCP Proxy Server

by ptbsare

Put every one of your MCP servers behind one endpoint, then use a web UI to turn individual tools off and rename the ones with unhelpful descriptions.

MCP Plumbing: Proxies, Registries & Inspectors
Summary
Aggregation plus an editing layer over other people's tools.

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.

What it is

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.

What you get
  • 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
Requirements

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.

Setup effort

One command — docker pull ghcr.io/ptbsare/mcp-proxy-server/mcp-proxy-server:latest