
This desktop proxy application sits between your AI IDE and multiple MCP servers, letting you federate hundreds of tools while bypassing API limits like Cursor's 40-tool cap. Instead of loading every tool schema upfront, your AI agent gets a single `retrieve_tools` function that dynamically fetches relevant tools based on natural language queries. The proxy includes security quarantine for new servers, works offline across platforms, and significantly reduces token usage. You'd reach for this when managing complex workflows that need access to many different MCP servers simultaneously, or when hitting function limits in tools like Cursor or OpenAI's API.
📺 Watch the full walkthrough · 📚 Read the docs · 🌐 mcpproxy.app
The demo above shows the embedded web UI. The MCPProxy core is a single binary for macOS, Linux, and Windows — the web UI ships inside it, with no extra service to run. On macOS, an optional menu‑bar app adds one‑click convenience (start/stop, server health, quarantine, logs).
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):
# macOS — GUI tray app (recommended):
brew install --cask smart-mcp-proxy/mcpproxy/mcpproxy
# macOS / Linux — headless CLI only:
brew install smart-mcp-proxy/mcpproxy/mcpproxy
The cask installs the menu-bar app (bundles the CLI); the formula is the CLI binary only. Both update via brew upgrade.
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
# Fedora 41+ (dnf5): sudo curl -fsSL https://rpm.mcpproxy.app/mcpproxy.repo -o /etc/yum.repos.d/mcpproxy.repo
sudo dnf install -y mcpproxy
Arch Linux (AUR): mcpproxy-bin
yay -S mcpproxy-bin
# or
git clone https://aur.archlinux.org/mcpproxy-bin.git && cd mcpproxy-bin && makepkg -si
The apt and dnf 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.26+:
go install github.com/smart-mcp-proxy/mcpproxy-go/cmd/mcpproxy@latest
mcpproxy serve # starts HTTP server on :8080 and shows tray
Create or edit ~/.mcpproxy/mcp_config.json:
{
"listen": "127.0.0.1:8080",
"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 }
]
}
See Configuration and Upstream Servers for the full reference.
📖 Complete Setup Guide - Detailed instructions for Cursor, VS Code, Claude Desktop, and Goose
"MCPProxy": {
"type": "http",
"url": "http://localhost:8080/mcp/"
}
Once connected, your agent sees a handful of built-in MCPProxy tools instead of hundreds of upstream schemas. A typical session has three beats — discover, call, audit — plus an optional preflight gate for unattended automations.
The agent asks for what it needs in plain keywords via retrieve_tools:
{ "query": "create github issue", "limit": 5 }
MCPProxy runs a BM25 search across every connected server and returns only the top-ranked matches — each with a call_with hint recommending the right call variant for its annotations:
{
"tools": [
{ "name": "github:create_issue", "score": 0.89, "call_with": "call_tool_write" },
{ "name": "gitlab:create_issue", "score": 0.72, "call_with": "call_tool_write" }
]
}
This is where the token savings come from: the schemas of the hundreds of tools the agent didn't need never enter its context. The agent loads full schemas on demand with describe_tool (batch up to 5 ids) only for the tools it's about to use.
The agent executes the tool through the variant matching its intent (call_tool_read, call_tool_write, or call_tool_destructive), addressing it as server:tool:
{
"name": "github:create_issue",
"args_json": "{\"repo\": \"acme/api\", \"title\": \"Bug report\"}",
"intent": { "operation_type": "write", "reason": "Filing bug per user request" }
}
MCPProxy validates the intent against the tool's annotations (a "read" call can't reach a destructive tool), checks quarantine and approval state, and scans arguments and responses for sensitive data before anything leaves the machine.
Every call lands in the local Activity Log with a request ID, so you can reconstruct exactly what an agent did:
mcpproxy activity list # everything, newest first
mcpproxy activity list --request-id <id> # one workflow, correlated
For recurring headless jobs (cron, CI, n8n), don't let the agent discover a missing tool the expensive way. One preflight command checks that every required tool is ready — without contacting any upstream server — and reports exactly why when it isn't (server quarantined, tool changed since approval, OAuth expired, typo'd id):
mcpproxy tools preflight gh-ops:sync_issues slack:post_message --wait 10s
case $? in
0) run-agent-session ;; # all ready — go
10) exit 75 ;; # transient (server starting) — let the next cron tick retry
11) page-operator ;; # blocked — someone must approve / enable / log in
12) fail-pipeline ;; # unknown tool id — the automation itself is misconfigured
esac
See Required-Tools Preflight for the full reason taxonomy, REST endpoint, and GitHub Actions / n8n recipes.
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