A Model Context Protocol server that manages, aggregates, and proxies other MCP servers, enabling LLMs to dynamically extend their own capabilities.
Magg is a meta-MCP server that acts as a central hub for managing multiple MCP servers. It provides tools that allow LLMs to:
- Search for new MCP servers and discover setup instructions
- Add and configure MCP servers dynamically
- Enable/disable servers on demand
- Aggregate tools from multiple servers under unified prefixes
- Persist configurations across sessions
Think of Magg as a "package manager for LLM tools" - it lets AI assistants install and manage their own capabilities at runtime.
- Self-Service Tool Management: LLMs can search for and add new MCP servers without human intervention.
- Dynamic Configuration Reloading: Automatically detects and applies config changes without restarting.
- Automatic Tool Proxying: Tools from added servers are automatically exposed with configurable prefixes.
- ProxyMCP Tool: A built-in tool that proxies the MCP protocol to itself, for clients that don't support notifications or dynamic tool updates (which is most of them currently).
- Smart Configuration: Uses MCP sampling to intelligently configure servers from just a URL.
- Persistent Configuration: Maintains server configurations in
.magg/config.json. - Multiple Transport Support: Works with stdio, HTTP, and in-memory transports.
- Bearer Token Authentication: Optional RSA-based JWT authentication for secure HTTP access.
- Docker Support: Pre-built images for production, staging, and development workflows.
- Health Monitoring: Built-in
magg_statusandmagg_checktools for server health checks. - Python 3.12+ Support: Fully compatible with Python 3.12 and 3.13.
- Python 3.12 or higher (3.13+ recommended)
uv(recommended) - Install from astral.sh/uv
The easiest way to install Magg is as a tool using uv:
# Install Magg as a tool
uv tool install magg
# Run with stdio transport (for Claude Desktop, Cline, etc.)
magg serve
# Run with HTTP transport (for system-wide access)
magg serve --httpYou can also run Magg directly from GitHub without installing:
# Run with stdio transport
uvx --from git+https://github.com/sitbon/magg.git magg
# Run with HTTP transport
uvx --from git+https://github.com/sitbon/magg.git magg serve --httpFor development, clone the repository and install in editable mode:
# Clone the repository
git clone https://github.com/sitbon/magg.git
cd magg
# Install in development mode with dev dependencies
uv sync --dev
# Or with poetry
poetry install --with dev
# Run the CLI
magg --helpMagg is available as pre-built Docker images from GitHub Container Registry:
# Run production image (WARNING log level)
docker run -p 8000:8000 ghcr.io/sitbon/magg:latest
# Run with authentication (mount or set private key)
docker run -p 8000:8000 \
-v ~/.ssh/magg:/home/magg/.ssh/magg:ro \
ghcr.io/sitbon/magg:latest
# Or with environment variable
docker run -p 8000:8000 \
-e MAGG_PRIVATE_KEY="$(cat ~/.ssh/magg/magg.key)" \
ghcr.io/sitbon/magg:latest
# Run beta image (INFO log level)
docker run -p 8000:8000 ghcr.io/sitbon/magg:beta
# Run with custom config directory
docker run -p 8000:8000 \
-v /path/to/config:/home/magg/.magg \
ghcr.io/sitbon/magg:latestMagg uses a multi-stage Docker build with three target stages:
pro(Production): Minimal image with WARNING log level, suitable for production deploymentspre(Pre-production): Same as production but with INFO log level for staging/testingdev(Development): Includes development dependencies and DEBUG logging for troubleshooting
Images are automatically published to GitHub Container Registry with the following tags:
- Version tags (from main branch):
latest,1.2.3,1.2,dev,1.2-dev,1.2-dev-py3.12, etc. - Branch tags (from beta branch):
beta,beta-pre,beta-dev - Python-specific dev tags:
beta-dev-py3.12,beta-dev-py3.13, etc.
For easier management, use Docker Compose:
# Clone the repository
git clone https://github.com/sitbon/magg.git
cd magg
# Run production version
docker compose up magg
# Run staging version (on port 8001)
docker compose up magg-beta
# Run development version (on port 8008)
# This uses ./.magg/config.json for configuration
docker compose up magg-dev
# Build and run with custom registry
REGISTRY=my.registry.com docker compose build
REGISTRY=my.registry.com docker compose pushSee compose.yaml and .env.example for configuration options.
Magg can run in two modes:
-
Stdio Mode (default) - For integration with Claude Desktop, Cline, Cursor, etc.:
magg serve
-
HTTP Mode - For system-wide access or web integrations:
magg serve --http --port 8000
Once Magg is running, it exposes the following tools to LLMs:
magg_list_servers- List all configured MCP serversmagg_add_server- Add a new MCP servermagg_remove_server- Remove a servermagg_enable_server/magg_disable_server- Toggle server availabilitymagg_search_servers- Search for MCP servers onlinemagg_list_tools- List all available tools from all serversmagg_smart_configure- Intelligently configure a server from a URLmagg_analyze_servers- Analyze configured servers and suggest improvementsmagg_status- Get server and tool statisticsmagg_check- Health check servers with repair actions (report/remount/unmount/disable)magg_reload_config- Reload configuration from disk and apply changes
Magg supports optional bearer token authentication to secure access:
-
Initialize authentication (creates RSA keypair):
magg auth init
-
Generate a JWT token for clients:
# Generate token (displays on screen) magg auth token # Export as environment variable export MAGG_JWT=$(magg auth token -q)
-
Connect with authentication:
- Using
MaggClient(auto-loads from MAGG_JWT):from magg.client import MaggClient async def main(): async with MaggClient("http://localhost:8000/mcp") as client: tools = await client.list_tools()
- Using FastMCP with explicit token:
from fastmcp import Client from fastmcp.client import BearerAuth jwt_token = "your-jwt-token-here" async with Client("http://localhost:8000/mcp", auth=BearerAuth(jwt_token)) as client: tools = await client.list_tools()
- Using
- Keys are stored in
~/.ssh/magg/by default - Private key can be set via
MAGG_PRIVATE_KEYenvironment variable - To disable auth, remove keys or set non-existent
key_pathin.magg/auth.json
magg auth init- Initialize authentication (generates RSA keypair)magg auth status- Check authentication configurationmagg auth token- Generate JWT tokenmagg auth public-key- Display public key (for verification)magg auth private-key- Display private key (for backup)
See examples/authentication.py for more usage patterns.
Magg stores its configuration in .magg/config.json in your current working directory. This allows for project-specific tool configurations.
Magg supports automatic configuration reloading without requiring a restart:
- Automatic file watching: Detects changes to
config.jsonand reloads automatically (uses watchdog when available) - SIGHUP signal: Send
kill -HUP <pid>to trigger immediate reload (Unix-like systems) - MCP tool: Use
magg_reload_configtool from any MCP client - Smart transitions: Only affected servers are restarted during reload
Configuration reload is enabled by default. You can control it with:
MAGG_AUTO_RELOAD=false- Disable automatic reloadingMAGG_RELOAD_POLL_INTERVAL=5.0- Set polling interval in seconds (when watchdog unavailable)
See Configuration Reload Documentation for detailed information.
Example configuration:
{
"servers": {
"calculator": {
"name": "calculator",
"source": "https://github.com/executeautomation/calculator-mcp",
"command": "npx @executeautomation/calculator-mcp",
"prefix": "calc",
"enabled": true
}
}
}Servers can be added in several ways:
-
Using the LLM (recommended):
"Add the Playwright MCP server" "Search for and add a calculator tool" -
Manual configuration via
magg_add_server:name: playwright url: https://github.com/microsoft/playwright-mcp command: npx @playwright/mcp@latest prefix: pw -
Direct config editing: Edit
.magg/config.jsondirectly
For more documentation, see docs/.