LABSCO SUMMARY
Tool Groups are the reason to bother — one endpoint per client, carrying only the tools that client should see.
A gateway that merges everything creates the problem it was meant to solve: hundreds of tools in one list, and a model that picks badly among them. Groups fix that by cherry-picking tools or whole servers into a named endpoint, so Claude Desktop and a production agent can share the registry without sharing a tool list. Disabling is the blunter version of the same idea, and it applies everywhere at once.
What it is
A self-hosted MCP gateway. Servers are registered once in MCPJungle, and Claude, Cursor, Codex or your own agents connect to one endpoint instead of each carrying its own configuration.
What you get
- One MCP endpoint fronting every registered server, reachable over Streamable HTTP or through mcp-remote for clients that need a bridge
- Unified discovery: tools, prompts and resources from all registered servers listed in one place, with tool names namespaced by server
- Individual tools disabled and re-enabled, or a whole server switched off — a disabled tool disappears from the proxy and from every group, while staying manageable over the HTTP API
- Tool Groups, each with its own endpoint, built by naming the tools to include, whole servers to include, or servers minus specific exclusions
- Prompts registered alongside tools, listed per server and retrieved with arguments supplied
- Static token authentication for upstream servers — a bearer token per registered server, or arbitrary headers when the Authorization format is not standard
- A dashboard UI, and an enterprise mode with access control for shared deployments
- A CLI for the whole lifecycle: register servers, list what is available, enable and disable, and create groups from JSON configuration
Requirements
Somewhere to run it: the published docker-compose file starts the server locally, and container images are on GHCR. Upstream servers that need credentials take a bearer token or custom headers at registration time; OAuth against upstream servers is not supported yet. Clients point at the gateway's /mcp path — directly if they speak Streamable HTTP, or through mcp-remote with --allow-http for a local deployment. Running it for a team means the enterprise mode, started with --enterprise or SERVER_MODE=enterprise.
Setup effort
Run a container — pull the image and point your client at it
USE CASES
01
Stopping every developer from configuring the same ten servers
Register them once in the gateway and hand out one endpoint.
02
Keeping a client's tool list small enough to be useful
Create a group with only the tools that client needs and point it at the group's own endpoint.
03
Taking one misbehaving tool out of circulation
Disable that tool by name — it vanishes from the proxy and from every group without touching the upstream server.
04
Sharing a SaaS server's API token without pasting it into everyone's config
Register the server with its bearer token in the gateway, and let clients reach it through the endpoint.
BEFORE YOU INSTALL
What to know first
Requires
- Docker and Docker Compose, to run the gateway from the published docker-compose.yaml
- the mcpjungle CLI (brew install mcpjungle/mcpjungle/mcpjungle, or a binary from the Releases page), to register servers
- npx on PATH for Claude Desktop, which reaches the gateway through mcp-remote
INSTALLATION
Connect your client
Server setup
TERMINAL
curl -O https://raw.githubusercontent.com/mcpjungle/MCPJungle/refs/heads/main/docker-compose.yaml
docker compose up -dThis exposes mcpjungle's streamable http mcp server at http://localhost:8080/mcp by default
TERMINAL
brew install mcpjungle/mcpjungle/mcpjungleRegister an MCP server with the CLI, for example context7
TERMINAL
mcpjungle register --name context7 --url https://mcp.context7.com/mcpMCP Clients
Claude Desktop
CLAUDE DESKTOP · JSON
{
"mcpServers": {
"mcpjungle": {
"command": "npx",
"args": [
"mcp-remote",
"http://localhost:8080/mcp",
"--allow-http"
]
}
}
}Cursor
CURSOR · JSON
{
"mcpServers": {
"mcpjungle": {
"url": "http://localhost:8080/mcp"
}
}
}Cursor — client token
Enterprise mode only: create an MCP client for Cursor; MCPJungle prints an access token for it
CURSOR — CLIENT TOKEN · TERMINAL
mcpjungle create mcp-client cursor-local --allow "calculator, github"Send that token in the Authorization: Bearer header — the token in the block below is the README's example output, so put yours in its place
CURSOR — CLIENT TOKEN · JSON
{
"mcpServers": {
"mcpjungle": {
"url": "http://localhost:8080/mcp",
"headers": {
"Authorization": "Bearer 1YHf2LwE1LXtp5lW_vM-gmdYHlPHdqwnILitBhXE4Aw"
}
}
}
}GitHub Copilot
GITHUB COPILOT · JSON
{
"servers": {
"mcpjungle": {
"url": "http://localhost:8080/mcp"
}
}
}Any MCP client — tool group
ANY MCP CLIENT — TOOL GROUP · JSON
{
"mcpServers": {
"mcpjungle": {
"url": "http://127.0.0.1:8080/v0/groups/claude-tools/mcp"
}
}
}