loading…
Search for a command to run...
loading…
Local-first MCP proxy with BM25 tool discovery, quarantine security, Docker isolation, OAuth support, activity logging, and web UI. Routes multiple upstream MCP
Local-first MCP proxy with BM25 tool discovery, quarantine security, Docker isolation, OAuth support, activity logging, and web UI. Routes multiple upstream MCP servers through a single endpoint.
MCPProxy is an open-source desktop application that super-charges AI agents with intelligent tool discovery, massive token savings, and built-in security quarantine against malicious MCP servers.
retrieve_tools function instead of hundreds of schemas. Research shows ~99 % token reduction with 43 % accuracy improvement.macOS (Recommended - DMG Installer):
Download the latest DMG installer for your architecture:
mcpproxy-*-darwin-arm64.dmgmcpproxy-*-darwin-amd64.dmgWindows (Recommended - Installer):
Download the latest Windows installer for your architecture:
mcpproxy-setup-*-amd64.exemcpproxy-setup-*-arm64.exeThe installer automatically:
mcpproxy.exe (core server) and mcpproxy-tray.exe (system tray app) to Program Files.\mcpproxy-setup.exe /VERYSILENTAlternative install methods:
macOS (Homebrew):
brew install smart-mcp-proxy/mcpproxy/mcpproxy
Linux (Debian/Ubuntu) — apt repository, auto-updates via apt upgrade:
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://apt.mcpproxy.app/mcpproxy.gpg \
| sudo tee /etc/apt/keyrings/mcpproxy.gpg > /dev/null
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/mcpproxy.gpg] https://apt.mcpproxy.app stable main" \
| sudo tee /etc/apt/sources.list.d/mcpproxy.list > /dev/null
sudo apt update && sudo apt install mcpproxy
Linux (Fedora / RHEL / Rocky / AlmaLinux) — dnf repository, auto-updates via dnf upgrade:
sudo dnf config-manager --add-repo https://rpm.mcpproxy.app/mcpproxy.repo
sudo dnf install -y mcpproxy
Both packages ship a hardened systemd unit and start the service automatically. Repository signing key fingerprint: 3B6F A1AD 5D53 59DA 51F1 8DDC E1B5 9B9B A1CB 8A3B.
For one-off .deb / .rpm downloads (air-gapped installs), grab them from the latest release.
Manual download (all platforms):
Prerelease Builds (Latest Features):
Want to try the newest features? Download prerelease builds from the next branch:
dmg-darwin-arm64 (Apple Silicon Macs)dmg-darwin-amd64 (Intel Macs)versioned-linux-amd64, versioned-windows-amd64 (other platforms)Note: Prerelease builds are signed and notarized for macOS but contain cutting-edge features that may be unstable.
Anywhere with Go 1.22+:
go install github.com/smart-mcp-proxy/mcpproxy-go/cmd/mcpproxy@latest
mcpproxy serve # starts HTTP server on :8080 and shows tray
Edit mcp_config.json (see below). Or ask LLM to add servers (see doc).
📖 Complete Setup Guide - Detailed instructions for Cursor, VS Code, Claude Desktop, and Goose
"MCPProxy": {
"type": "http",
"url": "http://localhost:8080/mcp/"
}
~/.mcpproxy/mcp_config.json){
"listen": "127.0.0.1:8080", // Localhost-only by default for security
"data_dir": "~/.mcpproxy",
"enable_tray": true,
// Search & tool limits
"top_k": 5,
"tools_limit": 15,
"tool_response_limit": 20000,
// Optional HTTPS configuration (disabled by default)
"tls": {
"enabled": false, // Set to true to enable HTTPS
"require_client_cert": false,
"hsts": true
},
"mcpServers": [
{ "name": "local-python", "command": "python", "args": ["-m", "my_server"], "protocol": "stdio", "enabled": true },
{ "name": "remote-http", "url": "http://localhost:3001", "protocol": "http", "enabled": true }
]
}
| Field | Description | Default |
|---|---|---|
listen |
Address the proxy listens on | 127.0.0.1:8080 |
data_dir |
Folder for config, DB & logs | ~/.mcpproxy |
enable_tray |
Show native system-tray UI | true |
top_k |
Tools returned by retrieve_tools |
5 |
tools_limit |
Max tools returned to client | 15 |
tool_response_limit |
Auto-truncate responses above N chars (0 disables) |
20000 |
tls.enabled |
Enable HTTPS with local CA certificates | false |
tls.require_client_cert |
Enable mutual TLS (mTLS) for client authentication | false |
tls.certs_dir |
Custom directory for TLS certificates | {data_dir}/certs |
tls.hsts |
Send HTTP Strict Transport Security headers | true |
docker_isolation |
Docker security isolation settings (see below) | enabled: false |
Main Commands:
mcpproxy serve # Start proxy server with system tray
mcpproxy tools list --server=NAME # Debug tool discovery for specific server
mcpproxy trust-cert # Install CA certificate as trusted (for HTTPS)
Management Commands:
# Single-server operations
mcpproxy upstream list # List all servers with status
mcpproxy upstream restart <name> # Restart specific server
mcpproxy upstream enable <name> # Enable specific server
mcpproxy upstream disable <name> # Disable specific server
mcpproxy upstream logs <name> # View server logs (--tail, --follow)
# Bulk operations (multiple servers)
mcpproxy upstream restart --all # Restart all configured servers
mcpproxy upstream enable --all # Enable all servers
mcpproxy upstream disable --all # Disable all servers
# Health diagnostics
mcpproxy doctor # Run comprehensive health checks
Management Service Architecture:
All management operations (CLI, REST API, and MCP protocol) share a unified service layer that provides:
disable_management and read_only_mode settingsServe Command Flags:
mcpproxy serve --help
-c, --config <file> path to mcp_config.json
-l, --listen <addr> listen address for HTTP mode
-d, --data-dir <dir> custom data directory
--log-level <level> trace|debug|info|warn|error
--log-to-file enable logging to file in standard OS location
--read-only enable read-only mode
--disable-management disable management features
--allow-server-add allow adding new servers (default true)
--allow-server-remove allow removing existing servers (default true)
--enable-prompts enable prompts for user input (default true)
--tool-response-limit <num> tool response limit in characters (0 = disabled)
Tools Command Flags:
mcpproxy tools list --help
-s, --server <name> upstream server name (required)
-l, --log-level <level> trace|debug|info|warn|error (default: info)
-t, --timeout <duration> connection timeout (default: 30s)
-o, --output <format> output format: table|json|yaml (default: table)
-c, --config <file> path to mcp_config.json
Debug Examples:
# List tools with trace logging to see all JSON-RPC frames
mcpproxy tools list --server=github-server --log-level=trace
# List tools with custom timeout for slow servers
mcpproxy tools list --server=slow-server --timeout=60s
# Output tools in JSON format for scripting
mcpproxy tools list --server=weather-api --output=json
MCPProxy provides secure secrets management using your operating system's native keyring to store sensitive information like API keys, tokens, and credentials.
${keyring:secret_name} placeholders in config filesStore a secret:
# Interactive prompt (recommended for sensitive values)
mcpproxy secrets set github_token
# From command line (less secure - visible in shell history)
mcpproxy secrets set github_token "ghp_abcd1234..."
# From environment variable
mcpproxy secrets set github_token --from-env GITHUB_TOKEN
List all secrets:
mcpproxy secrets list
# Output: Found 3 secrets in keyring:
# github_token
# openai_api_key
# database_password
Retrieve a secret:
mcpproxy secrets get github_token
Delete a secret:
mcpproxy secrets delete github_token
Use ${keyring:secret_name} placeholders in your mcp_config.json:
{
"mcpServers": [
{
"name": "github-mcp",
"command": "uvx",
"args": ["mcp-server-github"],
"protocol": "stdio",
"env": {
"GITHUB_TOKEN": "${keyring:github_token}",
"OPENAI_API_KEY": "${keyring:openai_api_key}"
},
"enabled": true
},
{
"name": "database-server",
"command": "python",
"args": ["-m", "my_db_server", "--password", "${keyring:database_password}"],
"protocol": "stdio",
"enabled": true
}
]
}
Placeholder expansion works in:
env field)args field)Storage Location:
/Applications/Utilities/Keychain Access.app)Service Name: All secrets are stored under the service name "mcpproxy"
Global Scope:
--config flag)--data-dir flag)If you use MCPProxy with multiple projects or environments, use descriptive secret names:
# Environment-specific secrets
mcpproxy secrets set prod_database_url
mcpproxy secrets set dev_database_url
mcpproxy secrets set staging_api_key
# Project-specific secrets
mcpproxy secrets set work_github_token
mcpproxy secrets set personal_github_token
mcpproxy secrets set client_a_api_key
Then reference them in your configs:
{
"mcpServers": [
{
"name": "work-github",
"env": {
"GITHUB_TOKEN": "${keyring:work_github_token}"
}
},
{
"name": "personal-github",
"env": {
"GITHUB_TOKEN": "${keyring:personal_github_token}"
}
}
]
}
Secret not found:
# Verify secret exists
mcpproxy secrets list
# Check the exact secret name (case-sensitive)
mcpproxy secrets get your_secret_name
Keyring access denied:
System Preferences > Security & Privacy > Privacy > AccessibilityPlaceholder not resolving:
# Test secret resolution
mcpproxy secrets get your_secret_name
# Check logs for secret resolution errors
mcpproxy serve --log-level=debug
MCPProxy provides Docker isolation for stdio MCP servers to enhance security by running each server in its own isolated container:
Add to your mcp_config.json:
{
"docker_isolation": {
"enabled": true,
"memory_limit": "512m",
"cpu_limit": "1.0",
"timeout": "60s",
"network_mode": "bridge",
"default_images": {
"python": "python:3.11",
"uvx": "python:3.11",
"node": "node:20",
"npx": "node:20",
"go": "golang:1.21-alpine"
}
},
"mcpServers": [
{
"name": "isolated-python-server",
"command": "uvx",
"args": ["some-python-package"],
"env": {
"API_KEY": "your-api-key"
},
"enabled": true
// Docker isolation applied automatically
},
{
"name": "custom-isolation-server",
"command": "python",
"args": ["-m", "my_server"],
"isolation": {
"enabled": true,
"image": "custom-python:latest",
"working_dir": "/app"
},
"enabled": true
}
]
}
| Command | Detected Runtime | Docker Image |
|---|---|---|
uvx |
Python with UV package manager | python:3.11 |
npx |
Node.js with npm | node:20 |
python, python3 |
Python | python:3.11 |
node |
Node.js | node:20 |
go |
Go language | golang:1.21-alpine |
cargo |
Rust | rust:1.75-slim |
# Check which servers are using Docker isolation
mcpproxy serve --log-level=debug --tray=false | grep -i "docker isolation"
# Monitor Docker containers created by MCPProxy
docker ps --format "table {{.Names}}\t{{.Image}}\t{{.Status}}"
# View container logs for a specific server
docker logs <container-id>
MCPProxy includes intelligent Docker recovery that automatically detects and handles Docker engine outages:
MCPProxy shows native system notifications during Docker recovery:
| Event | Notification |
|---|---|
| Recovery Started | "Docker engine detected offline. Reconnecting servers..." |
| Recovery Success | "Successfully reconnected X server(s)" |
| Recovery Failed | "Unable to reconnect servers. Check Docker status." |
| Retry Attempts | "Retry attempt X. Next check in Y" |
Servers don't reconnect after Docker recovery:
# 1. Check Docker is running
docker ps
# 2. Check mcpproxy logs
cat ~/.mcpproxy/logs/main.log | grep -i "docker recovery"
# 3. Verify container labels
docker ps -a --filter label=com.mcpproxy.managed
# 4. Force reconnect via system tray
# System Tray → Force Reconnect All Servers
Containers not cleaned up on shutdown:
# Check for orphaned containers
docker ps -a --filter label=com.mcpproxy.managed=true
# Manual cleanup if needed
docker ps -a --filter label=com.mcpproxy.managed=true -q | xargs docker rm -f
Docker recovery taking too long:
MCPProxy provides seamless OAuth 2.1 authentication for MCP servers that require user authorization (like Cloudflare AutoRAG, Runlayer, GitHub, etc.):
For most OAuth servers (including Runlayer, Cloudflare, etc.), no OAuth configuration is needed. MCPProxy automatically:
resource parameter automatically{
"mcpServers": [
{
"name": "runlayer-slack",
"url": "https://oauth.runlayer.com/api/v1/proxy/YOUR-UUID/mcp"
},
{
"name": "cloudflare_autorag",
"url": "https://autorag.mcp.cloudflare.com/mcp",
"protocol": "streamable-http"
}
]
}
That's it - no oauth block needed. MCPProxy handles everything automatically.
Use explicit configuration when you need to:
{
"mcpServers": [
{
"name": "github-enterprise",
"url": "https://github.example.com/mcp",
"protocol": "http",
"oauth": {
"scopes": ["repo", "user:email", "read:org"],
"pkce_enabled": true,
"client_id": "your-registered-client-id",
"extra_params": {
"resource": "https://api.github.example.com",
"audience": "github-enterprise-api"
}
}
}
]
}
OAuth Configuration Options (all optional):
scopes: OAuth scopes to request (auto-discovered if not specified)pkce_enabled: Enable PKCE for security (default: true, recommended)client_id: Pre-registered client ID (uses Dynamic Client Registration if empty)client_secret: Client secret (optional, for confidential clients)extra_params: Additional OAuth parameters (override auto-detected values)Check OAuth status and auto-detected parameters:
# View OAuth status for a specific server
mcpproxy auth status --server=runlayer-slack
# View all OAuth-enabled servers
mcpproxy auth status --all
# Run health diagnostics including OAuth issues
mcpproxy doctor
Enable debug logging to see the complete OAuth flow:
mcpproxy serve --log-level=debug --tray=false
Check logs for OAuth flow details:
tail -f ~/Library/Logs/mcpproxy/main.log | grep -E "(oauth|OAuth)"
Solve project context issues by specifying working directories for stdio MCP servers:
{
"mcpServers": [
{
"name": "ast-grep-project-a",
"command": "npx",
"args": ["ast-grep-mcp"],
"working_dir": "/home/user/projects/project-a",
"enabled": true
},
{
"name": "git-work-repo",
"command": "npx",
"args": ["@modelcontextprotocol/server-git"],
"working_dir": "/home/user/work/company-repo",
"enabled": true
}
]
}
Benefits:
Tool-based Management:
# Add server with working directory
mcpproxy call tool --tool-name=upstream_servers \
--json_args='{"operation":"add","name":"git-myproject","command":"npx","args_json":"[\"@modelcontextprotocol/server-git\"]","working_dir":"/home/user/projects/myproject","enabled":true}'
# Update existing server working directory
mcpproxy call tool --tool-name=upstream_servers \
--json_args='{"operation":"update","name":"git-myproject","working_dir":"/new/project/path"}'
MCPProxy works with HTTP by default for easy setup. HTTPS is optional and primarily useful for production environments or when stricter security is required.
💡 Note: Most users can stick with HTTP (the default) as it works perfectly with all supported clients including Claude Desktop, Cursor, and VS Code.
1. Enable HTTPS (choose one method):
# Method 1: Environment variable
export MCPPROXY_TLS_ENABLED=true
mcpproxy serve
# Method 2: Config file
# Edit ~/.mcpproxy/mcp_config.json and set "tls.enabled": true
2. Trust the certificate (one-time setup):
mcpproxy trust-cert
3. Use HTTPS URLs:
https://localhost:8080/mcphttps://localhost:8080/ui/For Claude Desktop, add this to your claude_desktop_config.json:
HTTP (Default - Recommended):
{
"mcpServers": {
"mcpproxy": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"http://localhost:8080/mcp"
]
}
}
}
HTTPS (With Certificate Trust):
{
"mcpServers": {
"mcpproxy": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://localhost:8080/mcp"
],
"env": {
"NODE_EXTRA_CA_CERTS": "~/.mcpproxy/certs/ca.pem"
}
}
}
}
localhost, 127.0.0.1, ::1mcpproxy trust-cert to add to system keychain~/.mcpproxy/certs/ (ca.pem, server.pem, server-key.pem)Certificate trust issues:
# Re-trust certificate
mcpproxy trust-cert --force
# Check certificate location
ls ~/.mcpproxy/certs/
# Test HTTPS connection
curl -k https://localhost:8080/api/v1/status
Claude Desktop connection issues:
NODE_EXTRA_CA_CERTS points to the correct ca.pem filemcpproxy serve --log-level=debugWe welcome issues, feature ideas, and PRs!
make dev-setup # Install swag, frontend deps, Playwright
brew install prek # Install pre-commit hook runner (or: uv tool install prek)
prek install # Install pre-commit hooks
prek install --hook-type pre-push # Install pre-push hooks
We use prek to catch issues before they reach CI:
| Hook | Stage | What it does |
|---|---|---|
gofmt |
pre-commit | Auto-formats staged Go files |
trailing-whitespace |
pre-commit | Removes trailing whitespace |
end-of-file-fixer |
pre-commit | Ensures files end with newline |
check-merge-conflict |
pre-commit | Detects merge conflict markers |
swagger-verify |
pre-push | Fails if OpenAPI spec is out of date |
go-build |
pre-push | Verifies the project compiles |
Run hooks manually: prek run --all-files
make build # Build frontend + backend
make swagger # Regenerate OpenAPI spec
make test # Unit tests
make test-e2e # E2E tests
make lint # Run linters
Добавь это в claude_desktop_config.json и перезапусти Claude Desktop.
{
"mcpServers": {
"mcpproxy-go": {
"command": "npx",
"args": []
}
}
}