Changelog
Pomerium's MCP gateway now handles more of the OAuth complexity that real-world MCP servers require. This update adds upstream OAuth support with token caching and injection, Dynamic Client Registration as a fallback for clients that don't yet support Client ID Metadata Documents, auto-discovery for MCP connect flows, and the first MCP-facing configuration APIs. The result is less manual upstream OAuth configuration, more reliable session handling, and a cleaner experience in the routes portal.
Highlights:
Upstream OAuth for MCP routes – Pomerium can now discover upstream OAuth metadata, complete upstream authorization flows, cache client and token state, and inject upstream access tokens into MCP traffic when the target server requires them.
Dynamic Client Registration fallback – Pomerium now supports DCR for upstream OAuth flows, providing a practical path for tools like MCP Inspector while Client ID Metadata Document support matures across the ecosystem.
Issuer metadata in authorization flows – Pomerium now includes the recommended iss parameter in MCP authorization flows, aligning with the upcoming 2026-07-28 MCP spec. Pomerium's host is returned as the issuer, keeping authorization flows spec-compliant as the standard evolves.
Auto-discovery for MCP connect flows – MCP connect, disconnect, and authorize endpoints now support auto-discovery, reducing the static upstream OAuth configuration needed for compatible servers.
Safer metadata fetching – MCP metadata discovery uses SSRF-safe HTTP fetching and stricter protected-resource metadata handling, including path-prefix validation.
Better routes portal experience – MCP routes now show server indicators and connect/disconnect controls in the routes portal, making MCP-enabled routes easier to identify and manage.
More reliable upstream auth recovery – Pomerium refreshes expired upstream tokens before forcing reauthentication, recovers upstream auth after late config delivery, and surfaces clearer errors when upstream tokens can't be resolved.
Config API as MCP tools – A new pkg/mcp/configapi library exposes Pomerium's ConfigService as MCP tools, with generated schemas, sensitive-field handling, and update-safety checks — early building blocks for MCP-driven configuration workflows.
See the MCP support docs to learn how Pomerium secures MCP routes and manages upstream OAuth on behalf of clients.
Pairing with native SSH access, Pomerium Enterprise can now record and play back SSH sessions. Every keystroke and terminal output for a privileged SSH connection can be captured, stored, and reviewed later from the Console — giving security and compliance teams a full audit trail of what actually happened on a host, not just who connected.
Highlights:
Full session capture & playback – Record interactive SSH sessions and replay them later, terminal output and all, directly from the Enterprise Console.
Flexible storage – Point recordings at a local on-disk directory or any S3-compatible bucket, configured per cluster. In Pomerium Zero, recordings are stored in your organization's managed cloud bucket.
Guided storage setup in the Console – A new blob-URI builder in the Enterprise Console lets admins configure the recording storage location without hand-writing a connection string for each provider — it exposes the relevant Go CDK driver options, with a free-form field for advanced parameters.
Recordings UI – Browse, sort, and filter recordings in the Console by metadata such as the Pomerium route, the SSH user, the target host, duration, and size — then open one to play it back.
Open, portable format – Recordings are captured in an asciinema-style (.asciicast) format, so they're easy to store, parse, and replay.
Enterprise-gated – Native SSH access remains available in open source, while session recording is an Enterprise/Zero capability enabled for licensed customers.
See the Session Recording and Native SSH Access docs to get started.
Beyond the v0.32.0 feature release, the v0.32 line received a steady stream of patch releases focused on security and stability. Most notably, Envoy was updated several times to address CVEs, and a handful of session and configuration fixes landed. If you're on v0.32, staying current on patches is the easiest way to pick these up.
Highlights:
Envoy security updates – v0.32.3 moved to Envoy v1.36.5 to address five CVEs (CVE-2026-26308 through CVE-2026-26311 and CVE-2026-26330), and v0.32.9 moved to Envoy v1.36.8 to address CVE-2026-47774.
Additional security fixes – v0.32.8 includes a fix for advisory GHSA-ggw3-5987-rx77, and v0.32.2 shipped the MCP message-smuggling fix (MCP Go SDK v1.3.1).
Session & header handling – v0.32.6 removed exp and nbf from core sessions, and v0.32.9 increased Envoy header size limits to better handle large headers.
Reliability fixes – v0.32.2 limited the sync cache batch size to 128MB (avoiding Pebble's 4GB batch limit), v0.32.4 made autocert detect use_proxy_protocol changes on the HTTP redirect server, and v0.32.3 added a Databroker VersionedConfig proto and syncer.
Toolchain & dependency upkeep – Go was bumped through 1.25.9 (v0.32.5) and 1.25.10 (v0.32.7), alongside routine dependency updates across the 0.32 branch.
Revoking a session in the Enterprise Console now does what admins expect. Previously, revoking a session could appear ineffective: the user's browser would silently re-authenticate through SSO (a 302 redirect) and get a fresh session almost immediately. The Console now offers a "Revoke and block future authentication" option that stops that loop.
Highlights:
Revoke and block – The session revocation dialog adds a secondary option to block the user from re-authenticating, not just to end the current session.
No more silent re-auth – Blocking prevents the SSO re-authentication loop, so a revoked user stays out instead of bouncing back in through the IdP.
Policy-backed enforcement – Blocked users are added to a deny/revocation list so the block is enforced on subsequent requests.
This was a direct response to enterprise customer feedback and closes a real gap in incident response, where "revoke" needs to mean the user is actually out.
See the Enterprise Console docs for session management.
Pomerium's Native SSH Access takes a major step forward in v0.32.0. SSH logins now use the standard OAuth Authorization Code flow instead of the Device Code flow, the login experience is smoother end to end, and a new set of capabilities — reverse tunneling, jump-host mode, an interactive routes portal, and per-key session revocation — make identity-aware SSH practical to run at scale.
Highlights:
Authorization Code OAuth flow – SSH authentication now uses the Authorization Code grant rather than Device Code. The result is a faster, more familiar browser login, with telemetry signals throughout the flow so you can observe and debug it. (Note: upstream IdPs must have the Authorization Code grant enabled; v0.31.x and earlier used Device Code.)
Reverse tunneling – Reach SSH servers that can't accept inbound connections. Upstream hosts dial out to Pomerium and register themselves, and Pomerium routes authorized sessions back over that tunnel — ideal for edge devices, NAT'd networks, and isolated environments. Enabled with the ssh_upstream_tunnel runtime flag.
Jump-host (ProxyJump) mode – Let clients connect straight through Pomerium to the upstream while Pomerium still enforces policy on the connection. Upstream servers don't need to trust Pomerium's User CA in this mode. Enabled with the ssh_allow_direct_tcpip runtime flag.
Interactive routes portal – SSH to Pomerium without naming a route and get an interactive picker of the destinations you're allowed to reach, then connect with one selection. Enabled with the ssh_routes_portal runtime flag.
Per-key session management & revocation – Each SSH key is bound to an OAuth user, and bindings can be listed and revoked from the Pomerium UI at any time. Cached credentials honor your session lifetime, and policy is still evaluated on every connection.
SSH upstream policy support – Apply Pomerium policy to upstream SSH tunnels, with fixes for several edge cases uncovered along the way.
See the Native SSH Access and Reverse Tunneling docs to get started.
Pomerium v0.32.0 adds DNS configuration options, giving you direct control over how Pomerium resolves upstream hostnames. Instead of relying solely on the host system's resolver, you can now point Pomerium at specific DNS servers and tune how often it refreshes records — useful for split-horizon DNS, service discovery, and environments where upstream IPs change frequently.
Highlights:
Custom resolvers – Specify the DNS servers Pomerium should use to resolve upstream routes, independent of the underlying host configuration.
Tunable refresh behavior – Configure DNS refresh rates so Pomerium picks up record changes on a schedule that matches your environment, rather than caching stale addresses.
Consistent upstream resolution – Predictable, centrally configured name resolution across all Pomerium components, which matters most in dynamic and clustered deployments.
See the Pomerium configuration reference for the new DNS options.
Building on Pomerium's experimental Model Context Protocol (MCP) support, the v0.32 line hardens the MCP gateway for real-world AI workflows. Sessions now survive longer thanks to OAuth refresh tokens, clients can register themselves dynamically, error pages are clearer, and a security fix in the underlying SDK closes a message-smuggling vulnerability.
Highlights:
OAuth refresh token support – Pomerium now issues and honors refresh tokens for MCP sessions, so long-running agents and clients can stay connected without forcing repeated interactive logins.
Dynamic client registration – Support for client ID metadata documents lets MCP clients register with Pomerium automatically, removing manual setup steps when onboarding new clients.
Customizable, friendlier error pages – The MCP 401 page can be customized, and unauthorized client domains now get a clear, user-friendly error instead of a cryptic failure. Allowed client domains are also optional, simplifying configuration.
Security hardening – The MCP Go SDK was updated to v1.3.1 to fix a message-smuggling vulnerability caused by case-insensitive JSON unmarshalling, and Pomerium now sets a proper WWW-Authenticate header on unauthorized responses.
See the MCP documentation for configuration details.
Pomerium v0.32.0 includes a round of data-plane and storage improvements aimed at large deployments. Route changes now propagate incrementally instead of triggering full reloads, and the Databroker gains a real query and indexing layer — querying records by field, richer filter operators, ordering, and a faster in-memory store. The payoff is quicker configuration updates and better behavior as the number of routes, sessions, and records grows.
Highlights:
Incremental config diffing for routes – When routes change, Pomerium now computes and applies just the difference rather than rebuilding the whole configuration, reducing churn and speeding up updates on large route sets.
Databroker indexing & query support – Records can be indexed and queried by field, with a new GetOptions API and support for additional filter operators and order by. This makes targeted lookups far more efficient than scanning.
Faster in-memory storage – The in-memory store now uses Pebble, improving performance and bringing it in line with the persistent backend, with a sensible default path for the file backend.
Sturdier sync – Sync now supports a "latest stream" option, safely aborts calls with invalid record versions, and no longer panics on unknown sync message types — a more resilient databroker overall.
See the Pomerium architecture documentation for background on the Databroker.
Pomerium v0.32.0 introduces a new hosted identity provider type. This lets Pomerium use a Pomerium-managed identity provider for authentication, lowering the setup barrier for teams that don't want to stand up and maintain their own OIDC provider before getting started.
Highlights:
New hosted provider type – Select a Pomerium-hosted IdP as your identity source, an alternative to wiring up an external OIDC provider yourself.
Refresh handling built in – The hosted provider authenticates refresh requests and correctly handles hashing of the derived IdP configuration, so sessions refresh cleanly.
Faster path to first login – A simpler on-ramp for evaluations and smaller deployments, while keeping the door open to bring your own IdP later.
See the Pomerium authentication documentation for identity provider options.
Embrace Seamless Resource Access, Robust Zero Trust Integration, and Streamlined Compliance with Our App.