Skip to content

SEP-1932: DPoP Profile for MCP#1932

Open
PieterKas wants to merge 31 commits into
modelcontextprotocol:mainfrom
PieterKas:patch-1
Open

SEP-1932: DPoP Profile for MCP#1932
PieterKas wants to merge 31 commits into
modelcontextprotocol:mainfrom
PieterKas:patch-1

Conversation

@PieterKas

@PieterKas PieterKas commented Dec 5, 2025

Copy link
Copy Markdown
Contributor

Motivation and Context

This extension defines DPoP (Demonstrating Proof-of-Possession) support for the Model Context Protocol, enabling sender-constrained access tokens that prevent token replay attacks. This extension builds upon the baseline authorization requirements defined in the main Authorization specification.

DPoP binds access tokens to a cryptographic key pair controlled by the client. When accessing MCP server resources, clients must prove possession of the private key by providing a signed proof with each request. This prevents unauthorized use of tokens even if they are intercepted or leaked.

How Has This Been Tested?

TBD

Breaking Changes

No

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • [ x] New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)
  • Documentation update

Checklist

  • I have read the MCP Documentation
  • My code follows the repository's style guidelines
  • New and existing tests pass locally
  • I have added appropriate error handling
  • I have added or updated documentation as needed

Additional context

For inclusion as an auth extension

@D-McAdams

@PieterKas PieterKas changed the title Create 0000-dpop-extension.md 1932-dpop-extension.md Dec 5, 2025
@PieterKas PieterKas changed the title 1932-dpop-extension.md SEP-1932: DPoP Profile for MCP Dec 5, 2025
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
@D-McAdams D-McAdams self-assigned this Dec 8, 2025
@D-McAdams D-McAdams added auth SEP draft SEP proposal with a sponsor. extension labels Dec 8, 2025
@D-McAdams D-McAdams requested a review from a team December 8, 2025 16:27
Comment thread seps/0000-dpop-extension.md Outdated
Comment thread seps/0000-dpop-extension.md Outdated
Comment thread seps/0000-dpop-extension.md Outdated
Comment thread seps/0000-dpop-extension.md Outdated
PieterKas and others added 4 commits December 9, 2025 18:51
Co-authored-by: Brian Campbell <71398439+bc-pi@users.noreply.github.com>
Co-authored-by: Brian Campbell <71398439+bc-pi@users.noreply.github.com>
Co-authored-by: Brian Campbell <71398439+bc-pi@users.noreply.github.com>
Co-authored-by: Brian Campbell <71398439+bc-pi@users.noreply.github.com>
Comment thread seps/0000-dpop-extension.md Outdated
Comment thread seps/0000-dpop-extension.md Outdated
Comment thread seps/0000-dpop-extension.md Outdated
Comment thread seps/0000-dpop-extension.md Outdated
Comment thread seps/0000-dpop-extension.md Outdated
Comment thread seps/0000-dpop-extension.md Outdated
Comment thread seps/0000-dpop-extension.md Outdated
Comment thread seps/0000-dpop-extension.md Outdated
Comment thread seps/0000-dpop-extension.md Outdated
PieterKas and others added 4 commits January 8, 2026 19:53
Clarified replay protection mechanisms for stateless MCP servers by elaborating on nonce usage and encryption methods using AEAD.
Corrected typos and improved clarity in the DPoP extension specification.
Added a section for additional details with a link to the proposal.
Applied prettier formatting to ensure consistent code style.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

Maintainer Activity Check

Hi @D-McAdams!

You're assigned to this SEP but there hasn't been any activity from you in 39 days.

Please provide an update on:

  • Current status of your review/work
  • Any blockers or concerns
  • Expected timeline for next steps

If you're no longer able to sponsor this SEP, please let us know so we can find another maintainer.


This is an automated message from the SEP lifecycle bot.

@localden

Copy link
Copy Markdown
Contributor

@PieterKas @D-McAdams confirming directly in the SEP - this is ready for review, right?

@PieterKas

Copy link
Copy Markdown
Contributor Author

@PieterKas @D-McAdams confirming directly in the SEP - this is ready for review, right?

Yes, this SEP is ready for review.

@sep-automation-bot

Copy link
Copy Markdown

Maintainer Activity Check

Hi @D-McAdams!

You're assigned to this SEP but there hasn't been any activity from you in 18 days.

Please provide an update on:

  • Current status of your review/work
  • Any blockers or concerns
  • Expected timeline for next steps

If you're no longer able to sponsor this SEP, please let us know so we can find another maintainer.


This is an automated message from the SEP lifecycle bot.

@D-McAdams

Copy link
Copy Markdown

Will connect with Den on next steps. Not sure of the current process for broader review.

@PieterKas PieterKas requested a review from localden February 18, 2026 20:41
@sep-automation-bot

Copy link
Copy Markdown

Maintainer Activity Check

Hi @D-McAdams!

You're assigned to this SEP but there hasn't been any activity from you in 20 days.

Please provide an update on:

  • Current status of your review/work
  • Any blockers or concerns
  • Expected timeline for next steps

If you're no longer able to sponsor this SEP, please let us know so we can find another maintainer.


This is an automated message from the SEP lifecycle bot.

@TakahikoKawasaki

Copy link
Copy Markdown

The DPoP specification was renamed from "OAuth 2.0 Demonstrating Proof-of-Possession at the Application Layer" to "OAuth 2.0 Demonstrating Proof of Possession (DPoP)" when it was published as RFC 9449. (cf. the diff between draft 16 and RFC 9449)

Therefore, occurrences of the old name in this PR should be updated.

@PederHP

PederHP commented Mar 14, 2026

Copy link
Copy Markdown
Member

Is the intent to sign the entire payload? There was some discussion at one point about only signing part of the payload, which I think is a very bad idea. Also, my understanding of DPoP might be flawed, but this only prevents replay attacks for idempotent requests, right? One could replay an intercepted, signed, message and thus perform a tool call with the same payload?

My worry about this is that the semantics of HTTP and MCP are at different levels of abstraction and what is not a replay in HTTP (accessing the same resource) could be a replayed in MCP (calling the same tool with the same parameters). The short life time of tokens creates some protection, but we're already dealing with a compromised HTTPS connection for this to even be possible, right?

I would also suggest not using the verbiage "Accessing MCP server resources". This is a very HTTP-ish way to put it and may cause confusion as an MCP resource is something very specific and unrelated to this SEP. Changing this to reference "MCP requests" instead would be good, I think.

@PieterKas

Copy link
Copy Markdown
Contributor Author

Thanks for the feedbacck @PederHP

Is the intent to sign the entire payload? There was some discussion at one point about only signing part of the payload, which I think is a very bad idea. Also, my understanding of DPoP might be flawed, but this only prevents replay attacks for idempotent requests, right? One could replay an intercepted, signed, message and thus perform a tool call with the same payload?

Under what conditions do you foresee an adversary being able to intercept an access token and a DPoP proof (e.g. for remote MCP servers the MCP client/server traffic is expected to be protected by TLS)?

This proposal uses DPoP as defined in RFC 9449 to maximize compatibility with existing infrastructure and speed deployment. DPoP sender-constrains access tokens so that only the client that obtained a token can use it. If an attacker steals an access token, for example from an MCP server log, they still cannot use it without also being able to generate a valid DPoP proof.

Even if a proof is exposed alongside the token, DPoP proofs are short-lived, which greatly limits replay risk. Deployments that need stronger replay protection can require a fresh proof via the nonce mechanism described in the PR. This can be implemented statelessly and provides a per-request proof without the overhead or retooling of existing infrastructure of signing full messages. Depending on deployment needs, fresh proofs can be required for every call or only when triggered by risk-based policy.

I would also suggest not using the verbiage "Accessing MCP server resources". This is a very HTTP-ish way to put it and may cause confusion as an MCP resource is something very specific and unrelated to this SEP. Changing this to reference "MCP requests" instead would be good, I think.

Thanks for pointing that out, please feel free to suggest alternative text.

@sep-automation-bot

Copy link
Copy Markdown

Maintainer Activity Check

Hi @D-McAdams!

You're assigned to this SEP but there hasn't been any activity from you in 14 days.

Please provide an update on:

  • Current status of your review/work
  • Any blockers or concerns
  • Expected timeline for next steps

If you're no longer able to sponsor this SEP, please let us know so we can find another maintainer.


This is an automated message from the SEP lifecycle bot.

@sep-automation-bot

Copy link
Copy Markdown

Maintainer Activity Check

Hi @D-McAdams!

You're assigned to this SEP but there hasn't been any activity from you in 14 days.

Please provide an update on:

  • Current status of your review/work
  • Any blockers or concerns
  • Expected timeline for next steps

If you're no longer able to sponsor this SEP, please let us know so we can find another maintainer.


This is an automated message from the SEP lifecycle bot.

@dsp-ant dsp-ant added the roadmap/security Roadmap (horizon): Security & Authorization label Apr 15, 2026
@sep-automation-bot

Copy link
Copy Markdown

Maintainer Activity Check

Hi @D-McAdams!

You're assigned to this SEP but there hasn't been any activity from you in 14 days.

Please provide an update on:

  • Current status of your review/work
  • Any blockers or concerns
  • Expected timeline for next steps

If you're no longer able to sponsor this SEP, please let us know so we can find another maintainer.


This is an automated message from the SEP lifecycle bot.

@localden localden moved this from In Review to Draft in SEP Review Pipeline Apr 28, 2026
@sep-automation-bot

Copy link
Copy Markdown

Maintainer Activity Check

Hi @D-McAdams!

You're assigned to this SEP but there hasn't been any activity from you in 14 days.

Please provide an update on:

  • Current status of your review/work
  • Any blockers or concerns
  • Expected timeline for next steps

If you're no longer able to sponsor this SEP, please let us know so we can find another maintainer.


This is an automated message from the SEP lifecycle bot.

1 similar comment
@sep-automation-bot

Copy link
Copy Markdown

Maintainer Activity Check

Hi @D-McAdams!

You're assigned to this SEP but there hasn't been any activity from you in 14 days.

Please provide an update on:

  • Current status of your review/work
  • Any blockers or concerns
  • Expected timeline for next steps

If you're no longer able to sponsor this SEP, please let us know so we can find another maintainer.


This is an automated message from the SEP lifecycle bot.

@sep-automation-bot

Copy link
Copy Markdown

Maintainer Activity Check

Hi @D-McAdams!

You're assigned to this SEP but there hasn't been any activity from you in 14 days.

Please provide an update on:

  • Current status of your review/work
  • Any blockers or concerns
  • Expected timeline for next steps

If you're no longer able to sponsor this SEP, please let us know so we can find another maintainer.


This is an automated message from the SEP lifecycle bot.

@nickcoai

nickcoai commented Jun 5, 2026

Copy link
Copy Markdown
Contributor

Hey @PieterKas looking into this, would you mind adding an optional definition for body-signing for stateless cases that aren't willing to accept time window based replay prevention? ala the earlier suggestion

My proposal would OAuth Protected Resource Metadata can be extended to claim dpop support and also potentially body-signing as a requirement. If absent it can default to the RFC behaviour with no extra cost. In a nutshell offering flexibility.

The use-case is essentially for a multiplexing gateway that is untrusted itself and may permit replay attacks- a client could "trust" this gateway if the onwards MCP required & enforced dpop. Timing is insufficient as the gateway by definition is on the request flow so can seamlessly modify contents.

@sep-automation-bot

Copy link
Copy Markdown

Maintainer Activity Check

Hi @D-McAdams!

You're assigned to this SEP but there hasn't been any activity from you in 14 days.

Please provide an update on:

  • Current status of your review/work
  • Any blockers or concerns
  • Expected timeline for next steps

If you're no longer able to sponsor this SEP, please let us know so we can find another maintainer.


This is an automated message from the SEP lifecycle bot.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

auth draft SEP proposal with a sponsor. extension roadmap/security Roadmap (horizon): Security & Authorization security SEP

Projects

Status: Draft

Development

Successfully merging this pull request may close these issues.

8 participants