/ Directory / Playground / MCPJungle
● Community mcpjungle ⚡ Instant

MCPJungle

by mcpjungle · mcpjungle/MCPJungle

One Go binary, one endpoint — connect Claude / Cursor / any MCP client to all your MCP servers at once. The least-effort MCP aggregator.

MCPJungle is a small, fast Go aggregator: register N upstream MCP servers, get one composite endpoint to point clients at. It namespaces tools by upstream, supports stdio + HTTP transports, and ships as a single static binary or Docker image. Useful when you've outgrown editing 8 different paths in claude_desktop_config.json but don't need an enterprise platform like Archestra.

Why use it

Key features

Live Demo

What it looks like in practice

mcpjungle-mcp.replay ▶ ready
0/0

Install

Pick your client

~/Library/Application Support/Claude/claude_desktop_config.json  · Windows: %APPDATA%\Claude\claude_desktop_config.json
{
  "mcpServers": {
    "mcpjungle-mcp": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "-p",
        "9090:9090",
        "ghcr.io/mcpjungle/mcpjungle:latest"
      ]
    }
  }
}

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

~/.cursor/mcp.json · .cursor/mcp.json
{
  "mcpServers": {
    "mcpjungle-mcp": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "-p",
        "9090:9090",
        "ghcr.io/mcpjungle/mcpjungle:latest"
      ]
    }
  }
}

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

VS Code → Cline → MCP Servers → Edit
{
  "mcpServers": {
    "mcpjungle-mcp": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "-p",
        "9090:9090",
        "ghcr.io/mcpjungle/mcpjungle:latest"
      ]
    }
  }
}

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

~/.codeium/windsurf/mcp_config.json
{
  "mcpServers": {
    "mcpjungle-mcp": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "-p",
        "9090:9090",
        "ghcr.io/mcpjungle/mcpjungle:latest"
      ]
    }
  }
}

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

~/.continue/config.json
{
  "mcpServers": [
    {
      "name": "mcpjungle-mcp",
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "-p",
        "9090:9090",
        "ghcr.io/mcpjungle/mcpjungle:latest"
      ]
    }
  ]
}

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

~/.config/zed/settings.json
{
  "context_servers": {
    "mcpjungle-mcp": {
      "command": {
        "path": "docker",
        "args": [
          "run",
          "--rm",
          "-i",
          "-p",
          "9090:9090",
          "ghcr.io/mcpjungle/mcpjungle:latest"
        ]
      }
    }
  }
}

Add to context_servers. Zed hot-reloads on save.

claude mcp add mcpjungle-mcp -- docker run --rm -i -p 9090:9090 ghcr.io/mcpjungle/mcpjungle:latest

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

Use Cases

Real-world ways to use MCPJungle

How to consolidate 8 MCP entries into one client config line

👤 Power users with many MCPs in Claude Desktop / Cursor ⏱ ~20 min intermediate

When to use: Your claude_desktop_config.json is 200 lines and editing it hurts.

Prerequisites
  • MCPJungle running locallydocker run -p 9090:9090 ghcr.io/mcpjungle/mcpjungle:latest or download a binary
Flow
  1. Register upstreams
    Register github, postgres, filesystem, fetch, and time as upstream MCPs in MCPJungle.✓ Copied
    → 5 upstreams listed; tool_namespaces show them
  2. Switch client
    Replace my 5 entries in claude_desktop_config.json with one entry pointing at MCPJungle on localhost:9090.✓ Copied
    → Single MCP entry; Claude lists all 5 servers' tools through it
  3. Verify routing
    Run a github tool and a postgres tool — confirm both reach their respective upstreams.✓ Copied
    → Both succeed; logs show correct routing

Outcome: Cleaner client config, identical capability, same latency.

Pitfalls
  • Two upstreams expose tools with the same name — MCPJungle prefixes by upstream name automatically — github.search_repositories vs gitlab.search_repositories

Run a shared team MCPJungle so devs share one curated set of MCPs

👤 Small teams (2–10 devs) ⏱ ~60 min advanced

When to use: Everyone keeps installing slightly different MCP versions; one team endpoint stops the drift.

Prerequisites
  • A shared host (small VM or shared dev box) — Run mcpjungle in Docker; expose port 9090 over Tailscale or VPN
Flow
  1. Stand up the shared instance
    Deploy MCPJungle on the team VM via docker compose. Bind to 100.x.x.x:9090 (Tailscale).✓ Copied
    → Service responds at the team URL
  2. Pin upstream versions
    Add github + filesystem + postgres MCPs at specific versions. Save the registration as a YAML file in the team repo.✓ Copied
    → registered.yaml committed; same on everyone's machine

Outcome: Whole team uses the same MCP versions and tools.

Pitfalls
  • Shared MCP shares creds — anyone using the endpoint can use them — Don't put write-capable MCPs in a shared instance unless you accept that
Combine with: github

Add and remove MCPs without restarting Claude

👤 Devs experimenting with new MCP servers ⏱ ~5 min beginner

When to use: You want to try a new MCP without exiting Claude and editing config.

Flow
  1. Hot-add
    Register a new MCP arxiv upstream into MCPJungle without restarting.✓ Copied
    → Tools appear in next Claude session refresh
  2. Hot-remove
    Unregister the slack MCP, since I'm done with that experiment.✓ Copied
    → slack tools no longer in tool list

Outcome: Faster MCP iteration loop.

Pitfalls
  • Some clients cache the tool list — Reload the conversation in Claude Desktop to refresh

Combinations

Pair with other MCPs for X10 leverage

mcpjungle-mcp + github

Manage the registered.yaml as code so the team config is version-controlled

Sync MCPJungle's registered upstreams from /infra/mcp/registered.yaml in the repo.✓ Copied
mcpjungle-mcp + filesystem

Persist boot-time registrations

Save the current upstream list to ./mcpjungle.json on shutdown.✓ Copied

Tools

What this MCP exposes

ToolInputsWhen to callCost
register name, transport: 'stdio'|'http', command_or_url, env Add an upstream MCP free
unregister name Remove an upstream MCP free
list_upstreams (none) See what's registered free
<upstream>.<tool> varies Call any tool from any registered upstream 1 upstream call

Cost & Limits

What this costs to run

API quota
None (proxies upstream)
Tokens per call
Tiny overhead
Monetary
Free (MIT)
Tip
Run on the smallest box that fits your upstreams' memory needs

Security

Permissions, secrets, blast radius

Credential storage: Env vars passed to upstream subprocesses
Data egress: Same as upstream MCPs

Troubleshooting

Common errors and fixes

Upstream registered but no tools shown

MCPJungle proxies tool listing once on register — restart the upstream may be required if it dynamically declared tools after start

Verify: Run the upstream alone with `mcptools list` to confirm it lists tools
Stdio upstream zombie

MCPJungle reaps subprocesses on unregister — if a server is orphaned, restart MCPJungle

Verify: ps aux | grep <server>
Client says 'tool name conflict'

MCPJungle namespaces by upstream — call <upstream>.<tool>, not bare <tool>

Alternatives

MCPJungle vs others

AlternativeWhen to use it insteadTradeoff
ArchestraYou need SSO, audit, and policy on top of aggregationArchestra is enterprise; MCPJungle is dev-weight
samanhappy/mcphubYou want a richer web UIMCPHub has a UI; MCPJungle is purely binary + API

More

Resources

📖 Read the official README on GitHub

🐙 Browse open issues

🔍 Browse all 400+ MCP servers and Skills