/ Directory / Playground / MetaMCP
● Community metatool-ai ⚡ Instant

MetaMCP

by metatool-ai · metatool-ai/metamcp

Stop juggling 15 MCP entries in every client config — MetaMCP is a self-hosted gateway that aggregates servers behind one namespaced endpoint.

MetaMCP is a Dockerized MCP aggregator, orchestrator, and gateway. You register N upstream MCP servers in its admin UI; it exposes them as a single SSE/Streamable-HTTP endpoint that your clients (Claude Desktop, Cursor, etc.) connect to. Tool names are namespaced so you can safely run two filesystem MCPs pointed at different roots. OAuth 2.1, per-endpoint API keys, per-user rate limits, and a built-in inspector for debugging are all included. Ideal for teams and anyone with 5+ MCPs installed.

Why use it

Key features

Live Demo

What it looks like in practice

metamcp.replay ▶ ready
0/0

Install

Pick your client

~/Library/Application Support/Claude/claude_desktop_config.json  · Windows: %APPDATA%\Claude\claude_desktop_config.json
{
  "mcpServers": {
    "metamcp": {
      "command": "uvx",
      "args": [
        "mcp-proxy",
        "http://localhost:12008/metamcp/default/sse"
      ],
      "env": {
        "API_ACCESS_TOKEN": "mm_..."
      }
    }
  }
}

Open Claude Desktop → Settings → Developer → Edit Config. Restart after saving.

~/.cursor/mcp.json · .cursor/mcp.json
{
  "mcpServers": {
    "metamcp": {
      "command": "uvx",
      "args": [
        "mcp-proxy",
        "http://localhost:12008/metamcp/default/sse"
      ],
      "env": {
        "API_ACCESS_TOKEN": "mm_..."
      }
    }
  }
}

Cursor uses the same mcpServers schema as Claude Desktop. Project config wins over global.

VS Code → Cline → MCP Servers → Edit
{
  "mcpServers": {
    "metamcp": {
      "command": "uvx",
      "args": [
        "mcp-proxy",
        "http://localhost:12008/metamcp/default/sse"
      ],
      "env": {
        "API_ACCESS_TOKEN": "mm_..."
      }
    }
  }
}

Click the MCP Servers icon in the Cline sidebar, then "Edit Configuration".

~/.codeium/windsurf/mcp_config.json
{
  "mcpServers": {
    "metamcp": {
      "command": "uvx",
      "args": [
        "mcp-proxy",
        "http://localhost:12008/metamcp/default/sse"
      ],
      "env": {
        "API_ACCESS_TOKEN": "mm_..."
      }
    }
  }
}

Same shape as Claude Desktop. Restart Windsurf to pick up changes.

~/.continue/config.json
{
  "mcpServers": [
    {
      "name": "metamcp",
      "command": "uvx",
      "args": [
        "mcp-proxy",
        "http://localhost:12008/metamcp/default/sse"
      ]
    }
  ]
}

Continue uses an array of server objects rather than a map.

~/.config/zed/settings.json
{
  "context_servers": {
    "metamcp": {
      "command": {
        "path": "uvx",
        "args": [
          "mcp-proxy",
          "http://localhost:12008/metamcp/default/sse"
        ]
      }
    }
  }
}

Add to context_servers. Zed hot-reloads on save.

claude mcp add metamcp -- uvx mcp-proxy http://localhost:12008/metamcp/default/sse

One-liner. Verify with claude mcp list. Remove with claude mcp remove.

Use Cases

Real-world ways to use MetaMCP

Give a team one MCP URL instead of 15 per-laptop configs

👤 Platform teams rolling out Claude Desktop / Cursor org-wide ⏱ ~45 min intermediate

When to use: Your team wants filesystem, github, postgres, sentry, slack, notion all available — but you don't want every engineer maintaining 6 tokens in JSON files that leak.

Prerequisites
  • A server that runs Docker — Any Linux box / VM with Docker Compose; ~1 CPU / 1GB RAM is plenty
  • Upstream credentials stored server-side — Put GITHUB_TOKEN, DB_URL, etc. in MetaMCP's .env — they never reach laptops
Flow
  1. Bring up MetaMCP
    git clone github.com/metatool-ai/metamcp && cp example.env .env && docker compose up -d✓ Copied
    → Admin UI reachable at http://host:12008; default login works
  2. Register upstream servers
    In the MetaMCP admin UI, add filesystem, github, postgres, notion as namespaces 'fs', 'gh', 'db', 'notion'.✓ Copied
    → Each appears in the endpoint's tool list with prefix
  3. Give the team one config
    Publish the Claude Desktop config snippet — one mcp-proxy entry pointing at /metamcp/team-default/sse — to internal docs.✓ Copied
    → Every engineer paste-and-goes

Outcome: New hires onboard in 90 seconds; token rotation happens once, server-side.

Pitfalls
  • Claude Desktop can't do SSE natively — Use mcp-proxy (uvx mcp-proxy <sse-url>) on the client side — MetaMCP docs include this snippet
  • Namespaces collide or are ugly — Rename tools in MetaMCP's override UI; e.g. 'fs.read_text_file' → 'repo.read'
Combine with: filesystem · github · postgres

Audit which MCP tools your agents actually call — and throttle the noisy ones

👤 Security / platform engineers ⏱ ~20 min intermediate

When to use: You need to know what tools are invoked, how often, and which user. Per-server rate limits are not enough — you want aggregate visibility.

Flow
  1. Turn on request logs
    In MetaMCP settings, enable per-request logging and endpoint-level rate limits (e.g. 10 req/s per user).✓ Copied
    → Logs appear in the admin UI
  2. Replay a suspicious trace
    Pull the last hour of tool calls for user 'marketing-bot'. Anything hitting the github write tools?✓ Copied
    → Tabular audit; write calls highlighted
  3. Throttle abusive tools
    Set 'notion.create_page' to 1 req/min for the 'marketing-bot' endpoint. Apply now.✓ Copied
    → Rate limit visible in config; takes effect immediately

Outcome: Governance surface without writing custom middleware.

Route dev/staging/prod MCP traffic through one gateway

👤 Teams with environment-specific credentials ⏱ ~30 min advanced

When to use: You want the same Claude Desktop config to hit staging-postgres at work and prod-postgres only with an explicit flag — no editing JSON.

Flow
  1. Create endpoints
    Create 3 MetaMCP endpoints: /dev, /staging, /prod. Wire each to the right upstream credentials.✓ Copied
    → Three endpoint URLs
  2. Per-endpoint auth
    Give prod its own API key and enable OIDC SSO for that endpoint only.✓ Copied
    → dev/staging open with shared key, prod behind SSO
  3. Test via inspector
    Use MetaMCP's inspector UI: call a read-only query through /prod as yourself; confirm auth works.✓ Copied
    → Successful tool call in the inspector

Outcome: Accident-proof environment switching.

Combine with: postgres

Combinations

Pair with other MCPs for X10 leverage

metamcp + filesystem + github + postgres

Hide the per-tool sprawl behind one gateway URL

Configure MetaMCP with fs, gh, db namespaces; point Claude Desktop at the gateway; stop pasting tokens into JSON.✓ Copied
metamcp + claude-desktop

Claude Desktop speaks stdio, MetaMCP speaks SSE — use mcp-proxy as the bridge

In claude_desktop_config.json, wrap MetaMCP's SSE URL with uvx mcp-proxy.✓ Copied
metamcp + sentry

Send MetaMCP request logs/errors into Sentry for alerting

Wire MetaMCP's OpenTelemetry/logs into Sentry; alert on 5xx rate > 1%.✓ Copied

Tools

What this MCP exposes

ToolInputsWhen to callCost
(dynamic) Depends on which MCP servers you've registered — tools are forwarded with a namespace prefix Any time — it's a transparent proxy with auth + rate-limit added free (local gateway + upstream's own cost)

Cost & Limits

What this costs to run

API quota
None — self-hosted
Tokens per call
Same as upstream tools; MetaMCP adds ~1–3ms of proxy latency
Monetary
Free (MIT); you pay for the VM
Tip
One small VPS ($5/mo) runs MetaMCP + a couple upstream servers; no need for Kubernetes until traffic > 100 req/s

Security

Permissions, secrets, blast radius

Credential storage: MetaMCP .env holds all upstream credentials; clients never see them
Data egress: Only to the upstream MCPs you've registered. Nothing phones home.
Never grant: Expose the admin UI to the public internet without SSO or auth proxy

Troubleshooting

Common errors and fixes

Claude Desktop shows 'server failed to start'

Claude Desktop uses stdio, not SSE. Configure with uvx mcp-proxy http://host:12008/metamcp/<endpoint>/sse, not a direct URL.

Verify: Try the same URL in MetaMCP's inspector first — if it works there, the issue is stdio-to-SSE bridging
Tools missing or not namespaced

Check the endpoint config — namespaces are per-endpoint, not global. Re-sync tool discovery after adding an upstream.

Verify: In admin UI, click 'Re-sync tools' on the endpoint
401 at the gateway

API_ACCESS_TOKEN env must match the endpoint's API key; OAuth endpoints need a completed consent flow first.

Verify: curl -H 'Authorization: Bearer $TOKEN' http://host:12008/metamcp/<ep>/mcp
Upstream MCP server keeps restarting

Check the upstream container's logs via docker logs; MetaMCP will mark it unhealthy and surface errors to clients.

Verify: docker compose logs <upstream>

Alternatives

MetaMCP vs others

AlternativeWhen to use it insteadTradeoff
IBM mcp-context-forgeEnterprise deployment with stronger IAM/governance needsHeavier stack; more config surface
mcp-use/mcp-useYou want a framework to build AI agents + servers, not just a proxyMore code; more surface; more power
Direct per-client configsYou run ≤3 MCPs and don't share configs with anyoneNo governance, no auth, tokens on every laptop

More

Resources

📖 Read the official README on GitHub

🐙 Browse open issues

🔍 Browse all 400+ MCP servers and Skills