io.github.smart-mcp-proxy/mcpproxy-go MCP Proxy Server
Local-first MCP proxy that provides BM25 tool discovery, security scanning, and quarantine, with reported ~99% token savings. It routes tools for Model Context Protocol (MCP) servers and supports developer workflows using a CLI and (as indicated) a web UI.
π οΈ Key Features
Local-first MCP proxy
BM25 tool discovery
Security scanning
Quarantine
Tool routing
Token savings (~99%)
π Use Cases
Fronting an MCP server setup with a single safe endpoint
Managing and discovering tools for AI agents via BM25
Running security scanning and quarantine before tool usage
β‘ Developer Benefits
Reduced context usage via ~99% token savings
Developer tooling support (CLI) and a web UI (per README excerpt)
Focused MCP proxying and tool routing under Model Context Protocol
β οΈ Limitations
Specific implementation details beyond the provided description (e.g., supported transports, configuration options) are not included in the provided source material.
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).
Β Β Β Β
macOS menuβbar app Β Β Β·Β Β Activity log & audit in the macOS app
Why MCPProxy?
Scale beyond API limits β Federate hundreds of MCP servers while bypassing Cursor's 40-tool limit and OpenAI's 128-function cap.
Save tokens & accelerate responses β Agents load just one retrieve_tools function instead of hundreds of schemas. Research shows ~99 % token reduction with 43 % accuracy improvement.
Advanced security protection β Automatic quarantine blocks Tool Poisoning Attacks until you manually approve new servers.
Pluggable security scanners β Run Snyk, Semgrep, Trivy, Cisco, and other Docker-based scanners against quarantined servers before you approve them; findings are normalized to SARIF with a composite risk score. See Security scanner plugins.
Works offline & cross-platform β A single core binary for macOS (Intel & Apple Silicon), Windows (x64 & ARM64), and Linux (x64 & ARM64), with the web UI embedded. macOS additionally ships an optional menu-bar app.
Quick Start
1. Install
macOS (Recommended - DMG Installer):
Download the latest DMG installer for your architecture:
Apple Silicon (M1/M2):Download DMG β mcpproxy-*-darwin-arm64.dmg
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.
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.
1. Discover β spend one query, not your context window
The agent asks for what it needs in plain keywords via retrieve_tools:
json
{"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:
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.
2. Call β with declared intent
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:
json
{"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.
3. Audit β every call is on the record
Every call lands in the local Activity Log with a request ID, so you can reconstruct exactly what an agent did:
bash
mcpproxy activity list # everything, newest first
mcpproxy activity list --request-id <id> # one workflow, correlated
Gate automations before they burn tokens
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):
bash
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 misconfiguredesac
See Required-Tools Preflight for the full reason taxonomy, REST endpoint, and GitHub Actions / n8n recipes.
π Optional HTTPS Setup
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.
Quick HTTPS Setup
1. Enable HTTPS (choose one method):
bash
# Method 1: Environment variableexport 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):
bash
mcpproxy trust-cert
3. Use HTTPS URLs:
MCP endpoint: https://localhost:8080/mcp
Web UI: https://localhost:8080/ui/
Claude Desktop Integration
For Claude Desktop, add this to your claude_desktop_config.json: