v1.60.0
[1.60.0] - 2026-08-04
Boundary hardening for the MCP proxy. Closes the two gaps between what the
proxy does and what its audit trail says, both found by review rather than by
tests.
Added
- The Streamable HTTP transport takes an API key (
--api-key, or
VAARA_PROXY_API_KEY). When set, every/mcprequest must carry
Authorization: Bearer <key>or it is rejected with 401. The check runs
before any route handler, soX-Vaara-TenantandX-Vaara-Upstreamare
never read from an unauthenticated caller. Keys are compared in constant
time.GET /healthstays open so load balancers keep working. --allow-unauthenticatedfor operators whose bind is protected by other
means, such as mTLS or a private network segment.
Fixed
vaara-mcp-proxy --transport httpnow refuses to bind a non-loopback host
when no API key is configured.X-Vaara-Tenantselects the tenant a call is
attributed to andX-Vaara-Upstreamselects the upstream, and therefore the
policy, that governs it. Read from an unauthenticated caller on a reachable
bind, those headers allow tenant spoofing and weakest-policy shopping. This
mirrors the guardvaara servealready applies. Loopback binds are
unaffected and still need no key.- A credential-gateway denial is now recorded as a blocked outcome against the
sameaction_idas the policy decision. For a constrained tool the policy
decision can beallowwhile the gateway then refuses, most often because
runtime arguments no longer match the digest the grant was minted for. The
trail previously kept theallowand carried nothing showing the call never
executed, so the record and the behaviour disagreed. A failure to write the
outcome is logged and never masks the denial.
Upgrading
Operators running vaara-mcp-proxy --transport http on a non-loopback host
without an API key will see the process refuse to start. Set --api-key or
VAARA_PROXY_API_KEY, or pass --allow-unauthenticated if the port is
protected another way.