Run with a local config file mounted into the container:
docker run -d \
-p 9090:9090 \
-v /path/to/config.json:/config/config.json \
ghcr.io/tbxark/mcp-proxy:latestOr reference a remote config URL:
docker run -d -p 9090:9090 \
ghcr.io/tbxark/mcp-proxy:latest \
--config https://example.com/config.jsonThe image supports launching MCP servers via npx and uvx out of the box.
Minimal compose file:
services:
app:
image: ghcr.io/tbxark/mcp-proxy:latest
pull_policy: always
volumes:
- ./config.json:/config/config.json
ports:
- "9090:9090"
restart: alwaysServing the config via an internal file server (no host mount into app):
services:
caddy:
image: caddy:latest
pull_policy: always
expose:
- "80"
volumes:
- ./config.json:/config/config.json
command: ["caddy", "file-server", "--root", "/config"]
app:
image: ghcr.io/tbxark/mcp-proxy:latest
pull_policy: always
ports:
- "9090:9090"
restart: always
depends_on:
- caddy
command: ["--config", "http://caddy/config.json"]- Prefer
authTokensper downstream server; only use themcpProxydefault when appropriate. - If a downstream server cannot set headers, you can embed a token in the route key (e.g.
fetch/<token>) and route via that path. - Set
options.panicIfInvalid: truefor critical servers to fail fast on misconfiguration.