Proposals · SEP-1932 · Draft

DPoP Profile for MCP

Standards Track · Created 2025-12-05 · Source

Note: This SEP defines an optional security extension for MCP that enables sender-constrained access tokens through DPoP (RFC 9449: Demonstrating Proof of Possession).

Imported from upstream. Proposed as modelcontextprotocol#1932 by @PieterKas on 2025-12-05, where it was still open on 2026-09-25. Accepted into omcp on its technical merit. The text is the author's; only the status, the sponsor field, and documentation links were changed on import.

Reviewed 2026-09-25 — not yet accepted. Held as a draft because no prototype a reviewer can run is cited. Acceptance needs a prototype a reviewer can run, with its setup and the data to run it; Final also needs conformance tests and the reference documentation chapter.

Abstract

This SEP defines DPoP (Demonstrating Proof of Possession) as an optional extension for the Model Context Protocol to support sender-constrained access tokens. The extension binds OAuth 2.0 access tokens to cryptographic key pairs controlled by MCP clients, requiring clients to demonstrate possession of the corresponding private key with each request. The proposal uses OAuth 2.0 Demonstrating Proof-of-Possession (DPoP) (RFC 9449).

Motivation

MCP’s current authorization model uses bearer tokens, which can be reused by an unauthorized party if the token is leaked, intercepted or exfiltrated. If an access token is intercepted, through network eavesdropping, compromised logs, or other means, an attacker use the token from a MCP client under its control to access protected MCP servers until the token expires.

DPoP addresses this by making tokens "sender-constrained" so that even if an attacker obtains an access token, they cannot use it without also possessing or controlling the correspondiong client's private key. This significantly raises the bar for attackers.

This extension is particularly valuable for:

Specification

This extension requries OAuth 2.0 Demonstrating Proof-of-Possession at the Application Layer (DPoP) (RFC 9449) for use in the Model Context Protocol. This proposal does not define extensions to (RFC 9449) to maximise interoperability, simplify implementation and accelerate deployment while preserving the security properties to minimise the risks that arise from token exfiltration and replay required for MCP clients and servers. It does not preclude the use of the extension mechanisms defined in RFC 9449.

Stateless DPoP Proof Replay Protection

RFC 9449 Section 11.1 provides specific guidance on replay protection mechanisms that adress the risks of a DPoP Proofs being replayed.

MCP servers that is not capable of keeping state or perform global jti tracking provides DPoP proof replay protection by enforcing short iat acceptance windows of +/- 5 minutes and standard RFC 9449 claim validation. A stateless MCP server may provide additional replay protection by using a server supplied nonce as defined in RFC 9449 (e.g. by using an encrypted timestamp as the nonce value which can be decrypted, parsed and verified to be within an acceptable time window when returned in DPoP Proof) (e.g. by encrypting a timestamp using an Authenticated Encryption with Associated Data (AEAD) scheme which can be decrypted, parsed and verified to be within an acceptable time window when returned in DPoP Proof).

Rationale

The purpose of this extension is to define a mechanism to sender constrain OAuth Access Tokens in MCP deployments using OAuth 2.0 Demonstrating Proof-of-Possession at the Application Layer (DPoP) (RFC 9449).

This SEP intentionally adopts DPoP as defined in RFC 9449, without introducing MCP-specific claims, request body digests, or additional proof material. This design choice reflects a deliberate trade-off in favor of interoperability, deployability, and alignment with existing OAuth 2.0 security models.

RFC 9449 already provides the core security properties for sender constraining OAuth Access Tokens. When combined with TLS transport-layer security and appropriate token and proof lifetimes, these mechanisms are sufficient to significantly reduce the risks associated with token exfiltration and replay in MCP deployments, even if the MCP server is not capable of maintaining global state.

Backward Compatibility

This is an optional extension with no backward compatibility concerns. Existing MCP implementations continue to work unchanged. RFC 9449 is designed for graceful coexistence with existing bearer token deployments. Implementations adopting DPoP can do so incrementally:

Security Implications

This extension protects against:

DPoP does not protect against:

Reference Implementation

A reference implementation will be provided demonstrating:

Links will be added when implementations are available.

Performance Implications

DPoP introduces modest performance overhead:

These costs are generally negligible compared to overall request processing time.

Testing Plan

Implementations should cover:

  1. Proof generation: Correct formatting of all required claims including content digest.
  2. Content digest calculation: Accurate SHA-256 hashing and base64 encoding.
  3. Validation logic: All validation steps per specification.
  4. Error handling: Appropriate HTTP 401 responses with error details.
  5. Time window: Correct handling of iat claims at boundaries.
  6. Algorithm support: All declared algorithms work correctly.

Test vectors will be provided in the reference implementation.

Alternatives Considered

HTTP Message Signatures

We considered RFC 9421 (HTTP Message Signatures) as an alternative. However, the use of HTTP Message signatures for sender constraining tokens have not been standardised by the OAuth community.

Custom content signing extension

An earlier draft of this SEP proposed a custom extension using the mechanisms defined in RFC 9449 that cryptographically bound the request body to the DPoP proof. This approach was not selected because it significantly increased implementation and operational complexity without providing sufficient additional security benefit. The final design therefore adopts DPoP as defined in RFC 9449 to maximize interoperability, simplicity, and deployability.

Open Questions

  1. Algorithm recommendations: Should future revisions mandate specific algorithms (e.g., ES256 minimum)?
  2. Validity window tuning: Should different validity windows be allowed for different security contexts?

Acknowledgments

This specification builds upon the OAuth 2.0 Demonstrating Proof-of-Possession at the Application Layer (DPoP) (RFC 9449) and was refined based on input from Brian Campbell, one of the authors of (RFC 9449).

Additional details

A more detailed proposal can be viewed here: https://github.com/modelcontextprotocol/ext-auth/blob/pieterkas-dpop-extension/specification/draft/dpop-extension.mdx