New in the gateway

Now the token is bound to a key,
not just to a bearer

The MCP Agent Gateway now speaks DPoP (RFC 9449, sender-constrained tokens). A stolen token stops being a working token. One environment variable turns it on, and the naive MCP behind the gateway still never learns any of it happened.

RFC 9449 DPoP Proof of Possession Proven live

What we added

Every token in an MCP chain is normally a bearer token: whoever holds it can use it. Short lifetimes and instant revocation shrink the window, but inside that window a copied token works from anywhere. DPoP closes the window entirely. The token is bound at issuance to a private key, and every use of it must carry a short-lived proof signed by that key. Copy the token without the key and it is inert.

It is one setting, TOKEN_BINDING_MODE, and it is off by default so the drop-in promise holds:

Two modes, opt in as far as you want

outbound binds every token the gateway receives from the identity provider to the gateway's own key (invisible to your callers, zero client changes). full goes further: the gateway becomes a DPoP resource server and requires every caller to sign a proof on every request. none is the default and behaves exactly like before.

The layer that completes the model

1

Perimeter

Per-call token exchange and rich authorization. Every action is checked by policy before it runs.

2

Revoke

Continuous evaluation. Abuse or a suspicious verdict kills the session tenant-wide, live.

3

Bind

The token is cryptographically tied to a key. Possession, not just presentation, is required.

● new

Proven live, not on a slide

Validated end-to-end against a real IBM Verify tenant with a real user login:

✓ The token is boundA proofed exchange returns token_type: DPoP with cnf.jkt equal to the signing key.
✓ Enforcement is realA proof-less exchange is rejected by the IdP with a hard error. No proof, no token.
✓ Stolen bearer is uselessReplaying a copied token with no proof returns 401 missing_dpop_proof.
✓ Forged proof is caughtA faked DPoP header is rejected by validation, not merely counted as present.

When to turn it on

OUTBOUND

Almost always. It hardens the credentials the gateway issues with no work for your callers and no change to the tool contract. If you want binding with zero friction, this is the switch.

FULL

When callers can sign proofs and the user token is high-value, longer-lived, or crosses networks you do not fully trust. This is the mode that makes a stolen session token worthless.

SKIP FULL

When you need pure drop-in for arbitrary clients that cannot sign proofs yet. Stay on outbound, and move to full when your client fleet is ready. Nothing is lost by staging it.

How this compares

  Typical MCP gateways today This gateway (DPoP on)
Token model Plain bearer. Holder is treated as the user. Sender-constrained. Holder must prove key possession.
A stolen access token Works from anywhere until it expires. Rejected. No key, no proof, no call.
A leaked downstream credential Usable for its full lifetime. Bound to the gateway key via cnf.jkt.
A replayed request Accepted. Caught by the proof replay cache.
Standard behind it Bearer handling (RFC 6750) or proprietary. RFC 9449 DPoP, an open standard.
Cost to your clients None, because nothing is bound. None in outbound; proof signing only in full.
Defense posture Perimeter, sometimes revocation. Perimeter, revocation, and binding.

Most MCP gateways on the market move plain bearer tokens: the managed gateway services from the large cloud and identity vendors, the connector platforms that funnel a thousand-plus integrations through one policy boundary, and the API gateways rebadged for MCP. Short-lived, in many cases. Sender-constrained, in almost none. That is the gap this closes.

RFC 9449 · TOKEN_BINDING_MODE = none / outbound / full · off by default Read the full write-up →