🔒 Rotate your API key if anyone else can read your mcpproxy logs
Earlier releases wrote the admin API key to the log files in plain text. It appeared in the access log whenever the key arrived as ?apikey=, which is how the Web UI and the tray open the /events stream and the /ui/ page, and in main.log when the key was auto-generated. This release redacts it on the access, authentication and startup log lines that carried it (SEC-01).
What to do: if your logs have been shared, collected by a log shipper, attached to an issue, or can be read by other users, treat the key as exposed.
- Set a new value for
api_keyin~/.mcpproxy/mcp_config.json, or remove the field and one will be generated. - Restart mcpproxy.
- Update every client, script and scraper that sends the old key. For clients set up with the Web UI's Connect dialog, click Disconnect and then Connect for each one, so its config gets the new key.
- Delete the old log files:
~/Library/Logs/mcpproxy/on macOS,~/.local/state/mcpproxy/logs/on Linux (or$XDG_STATE_HOME/mcpproxy/logs/, and/var/log/mcpproxy/when run as root),%LOCALAPPDATA%\mcpproxy\logs\on Windows.
The Web UI also stopped printing the key to the browser console.
/metrics now requires the API key
If you enabled the Prometheus exporter (observability.metrics.enabled, off by default), /metrics now returns 401 without credentials. Agent tokens get 403, because the endpoint exposes fleet-wide data. Send the admin key as Authorization: Bearer <key> (Prometheus authorization.credentials) or as X-API-Key. The health probes (/healthz, /livez, /health, /readyz, /ready) stay unauthenticated. See Observability.
The REST API no longer allows any origin (CORS)
/api/v1/* and /events used to send Access-Control-Allow-Origin: *. They now allow loopback origins and the hosts listed in trusted_hosts only. The bundled Web UI and non-browser clients are unaffected. If a separate web app calls the REST API from another domain, add that domain to trusted_hosts. MCPPROXY_TRUSTED_HOSTS replaces the list rather than adding to it, and the same list also governs Host validation on the MCP endpoint.
Tray self-update on Windows and on macOS tarball installs
The tray's built-in updater now checks every download against the release's checksums.txt and refuses to install on any mismatch. It also installs the tray binary. Earlier versions put the core binary in its place, so after a "successful" update the tray app turned into a headless core. If your tray stopped showing its menu after an earlier self-update, reinstall it from this release. DMG app bundles (Sparkle) and Homebrew installs were never affected.
Also in this release
config.db, which holds OAuth tokens, is now created owner-only (0600). Existing databases are tightened automatically on startup.- The admin API key is compared in constant time.
This release focuses on critical security hardening and bug fixes across authentication, data protection, and system stability.
Security Fixes
- API Key Protection: Admin API keys are now redacted from all log files and compared in constant time to prevent timing attacks
- Metrics Endpoint:
/metricsnow requires admin authentication (previously unauthenticated) - CORS Policy: Removed permissive
Access-Control-Allow-Origin: *headers from REST API and/eventsendpoints - Request Path Redaction: MCP and OAuth callback URLs are now redacted in logs to prevent sensitive data exposure
- Database Security:
config.dbis now created with owner-only permissions and database backups are properly secured - Artifact Verification: Tray self-updates now verify artifacts against release checksums (Personal edition)
Bug Fixes
- TOCTOU Vulnerabilities: Closed time-of-check-to-time-of-use race conditions in connect/disconnect operations for JSONC comment guards and precondition tokens
- Signal Handling: Improved graceful shutdown by continuing to honor signals after force-quit window and adding hard shutdown deadline
- Self-Update: Fixed tray edition to install the correct tray binary instead of core during self-update (Personal edition)
- HTTP API: Restored build after typed controller refactor and added fail-closed behavior when config is missing
- Frontend Fixes:
- Improved Dashboard contrast and empty-fleet checks in web UI
- Fixed Connect modal state refresh after connection
- Added rendering for exfiltration and unknown threat types in scan reports
- Fixed Auth Type and Agent filters by exposing caller identity in activity logs
- Config Validation: Now refuses writes when a client's servers section is not a valid object
New Features
- Added ZCode as a supported Connect client
Download Installers
| Platform | Download | Notes |
|---|---|---|
| macOS (Apple Silicon) | Download DMG | Signed & Notarized - Recommended for M1/M2/M3/M4 |
| macOS (Intel) | Download DMG | Signed & Notarized |
| Windows (64-bit) | Download Setup | Setup wizard |
| Windows (ARM64) | Download Setup | For ARM Windows devices |
| Linux Debian/Ubuntu (AMD64) | Download .deb | sudo apt install ./mcpproxy_*.deb |
| Linux Debian/Ubuntu (ARM64) | Download .deb | For ARM64 (Raspberry Pi etc.) |
| Linux Fedora/RHEL (AMD64) | Download .rpm | sudo dnf install ./mcpproxy-*.rpm |
| Linux Fedora/RHEL (ARM64) | Download .rpm | For ARM64 |
| Linux (AMD64) — tarball | Download tar.gz | Binary only |
| Linux (ARM64) — tarball | Download tar.gz | Binary only |
Homebrew (macOS/Linux):
brew install smart-mcp-proxy/mcpproxy/mcpproxy