Back to blog
AI & MCP

CIMD vs DCR for MCP OAuth: what's the difference?

Sagar Batchu

Sagar Batchu

September 17, 2026 · 18 min read

CIMD vs DCR for MCP OAuth: what's the difference?

TL;DR

Dynamic Client Registration (DCR, RFC 7591) and Client ID Metadata Documents (CIMD) are the two ways an MCP authorization server can accept an OAuth client it has never seen. With DCR, the client POSTs its own name and redirect URIs to a registration endpoint and receives a freshly minted client ID. With CIMD, the client ID is an HTTPS URL on the client vendor's domain, and the authorization server fetches the client's name and redirect URIs from that URL. The current MCP specification says servers and clients SHOULD support CIMD and MAY support DCR, which it marks as deprecated but keeps for backward compatibility. The practical difference is that a CIMD identity is the same on every install, so it can be allowlisted, audited, and revoked. A DCR identity is not.

Both mechanisms solve the same problem. An MCP client ships before your server exists, the user has no way to hand it a client ID, and the OAuth flow still needs one. The debate about which mechanism to use is usually framed as spec hygiene: DCR is stateful and CIMD is stateless, DCR fills a database and CIMD fills a cache. That framing undersells the change. The difference that matters is who asserts the client's identity. Under DCR the client asserts it and the server prints it. Under CIMD the vendor's domain asserts it. Every governance question an enterprise asks about MCP (which AI applications may reach this server, who connected last Tuesday, how do we cut one of them off) depends on an identity that survives the next install, and only one of the two mechanisms provides that.

Our position is that if you're putting OAuth in front of an MCP server that an organization will ever need to allowlist or audit, you should build CIMD first and keep DCR as a fallback rather than as the plan. Auth0 and WorkOS have both published explainers that cover the mechanics well, and we don't disagree with either. What follows is the argument for why those mechanics change the governance picture, including the places where DCR's defenders are right and the places CIMD does not help.

What is Dynamic Client Registration (DCR)?

DCR is RFC 7591. A client with no prior relationship to an authorization server POSTs its own metadata, including a client name, redirect URIs, and grant types, to a registration endpoint, and receives a client_id (and sometimes a client_secret) it can use immediately. The authorization server stores that record and trusts it from then on.

MCP leaned on DCR because it had no better option. The protocol defined no standard way for a user to supply a client ID for a server the client had never seen, and pre-registration would have required every client vendor to coordinate with every server operator before either shipped. Stripe and Asana added DCR to their OAuth stacks to make their MCP servers self-serve, and our own guide to securing an MCP server with OAuth still describes DCR as the piece most companies have to build before MCP clients can connect. That guide describes what shipped in 2025, and the distance between it and the current specification is a measure of how recently the ground moved.

The same guide carries an operational detail that matters for the comparison. A client that registers through DCR keeps the client_id it was issued for as long as you let it, so a server has to persist every registration it ever minted. Under DCR the registration table is part of your security state.

What is a Client ID Metadata Document (CIMD)?

CIMD turns the direction of trust around. The client_id is an HTTPS URL on the vendor's own domain, and that URL serves a JSON document describing the client. When an authorization server sees a URL-shaped client ID, it fetches the document, checks that the client_id inside matches the URL it was fetched from, checks that the requested redirect URI appears in the document's redirect_uris, and caches the result according to the document's HTTP cache headers. The name on the consent screen and the redirect URIs the server will honor both come from a file that only the vendor can change.

The underlying specification is the OAuth working group's Client ID Metadata Document draft, by Aaron Parecki and Emelia Smith. As of July 2026 it is at revision 02 and is an active Internet-Draft, not an RFC. SEP-991, by Paul Carleton and Aaron Parecki, brought it into MCP, and the 2026-07-28 revision of the MCP authorization specification says clients and authorization servers SHOULD support CIMD, MAY support DCR, and treats DCR as deprecated but retained for backward compatibility. Clients that support every option are told to try pre-registered credentials first, then CIMD, then DCR, and only then prompt the user.

The requirements are short. The client_id must use the https scheme and contain a path component. The document must be valid JSON and carry at least client_id, client_name, and redirect_uris. The authorization server advertises support with client_id_metadata_document_supported: true in its OAuth metadata, so a client can detect it and fall back to DCR when it is absent. SEP-991 recommends caching the document for no more than 24 hours. A complete document for a public client looks like this:

{
  "client_id": "https://app.example.com/oauth/client-metadata.json",
  "client_name": "Example MCP Client",
  "client_uri": "https://app.example.com",
  "logo_uri": "https://app.example.com/logo.png",
  "redirect_uris": [
    "http://127.0.0.1:3000/callback",
    "http://localhost:3000/callback"
  ],
  "grant_types": ["authorization_code"],
  "response_types": ["code"],
  "token_endpoint_auth_method": "none"
}

One consequence the specification calls out is portability. Because the client ID is a URL the authorization server resolves on demand, the same client ID works against every authorization server that supports CIMD, and nothing has to be re-registered when a server changes which authorization server it trusts. A DCR client ID is bound to the authorization server that issued it.

Isn't DCR good enough?

The case for staying on DCR is better than CIMD advocates usually admit.

DCR is a ratified RFC with more than a decade of implementations behind it. CIMD is a draft that has changed name once already (SEP-991 cites draft-parecki-oauth-client-id-metadata-document-03, before the working group adopted it) and may change again before it is done. Nearly every MCP client that does OAuth already speaks DCR, while CIMD support in clients is still filling in, which is why the MCP specification keeps DCR as the fallback. For a public MCP server whose operator has no intention of restricting which clients connect, the costs of DCR are a registration table and some rate limiting, and neither is a security problem. SEP-991 itself says pre-registration remains the right answer where a relationship already exists, and that open servers may accept any client.

The sharpest version of the objection is that CIMD does not authenticate the client either. A public client with a loopback redirect can be impersonated under CIMD just as it can under DCR: an attacker presents the legitimate vendor's metadata URL, binds the same local port, and collects the authorization code. The server sees the right document and the user sees the right name. If the pitch for CIMD is "verified clients," that pitch is stronger than the mechanism.

All of that is true, and none of it touches the governance question. DCR gives you no stable subject to write a policy about. The question a security team asks, "which AI applications are allowed to connect to this server?", would have to be answered in terms of an identifier that is different on every install, or in terms of a client_name string the client chose for itself. Nobody lets a user type their own name into the SSO screen and trusts what they typed. Agents' client software should not get a different rule. As for impersonation, CIMD names the client software and binds its redirect URIs to a domain. It does not attest which process is running on the laptop, and it does not claim to. Naming is the prerequisite for allowlisting; attestation is a separate problem that neither mechanism solves.

Why does durable client identity matter for enterprise MCP authentication and authorization?

Two groups of people feel the difference, and they describe it in different words.

Platform engineers describe it as tickets that stop arriving. Under CIMD, Claude, Cursor, or ChatGPT can complete OAuth against an organization's MCP server without anyone filing a per-client registration request, because the client's identity is a URL the authorization server already knows how to resolve. The consent screen shows a name that the vendor's domain vouched for rather than a string from an anonymous POST body. The registration table stops growing every time someone reinstalls a client the server has already seen, which in our experience is what most DCR registrations are.

Security and identity teams describe it as questions that get answers. Which clients may hit /authorize becomes a list of URLs. Searching the audit log for everything one client did becomes a search on one identifier instead of a join across every client_id that client ever minted. Revoking a client means removing a URL from the list, and the removal holds on the next install because the next install presents the same URL. These are the operations an access review is made of, and under DCR each of them produces a shrug.

The nearest analogy is why enterprises federate login to an identity provider instead of letting each application keep its own user table: a relying party can only write policy about identities issued by someone it can name. CIMD does for client software what federation does for users, with one limit the analogy should carry. An identity provider authenticates the person. CIMD identifies the software and its redirect URIs, and stops there.

CIMD vs DCR side by side

CIMD vs DCR for MCP OAuth

Dimension
Who asserts the client identity
DCR (RFC 7591)
The client, in a POST body the server stores and trusts
CIMD (SEP-991)
The vendor's domain, through a document only it can change
Identifier stability
DCR (RFC 7591)
A new client ID per install, bound to the issuing authorization server
CIMD (SEP-991)
One HTTPS URL per client, the same on every install and portable across authorization servers
What the server exposes
DCR (RFC 7591)
An unauthenticated write endpoint and a registration table that must be persisted
CIMD (SEP-991)
An outbound fetch of a client-supplied URL, which must be contained against SSRF
Allowlisting and audit
DCR (RFC 7591)
No durable identifier to allowlist, search for, or revoke
CIMD (SEP-991)
Allowlist by URL, search the audit log by URL, revoke by removing the URL
Client burden
DCR (RFC 7591)
None beyond the registration call
CIMD (SEP-991)
Host a static JSON document behind HTTPS
Standing in the MCP specification
DCR (RFC 7591)
MAY; deprecated, retained for backward compatibility
CIMD (SEP-991)
SHOULD; the default when client and server have no prior relationship
Standing in the IETF
DCR (RFC 7591)
RFC 7591, published 2015
CIMD (SEP-991)
Active Internet-Draft (draft-ietf-oauth-client-id-metadata-document-02, July 2026)

What does CIMD not fix?

A security review will find each of these.

  • Loopback impersonation. Covered above, and SEP-991 states plainly that fully mitigating it is out of scope and that the exposure matches DCR in the same scenario. The specification recommends that servers show extra warnings for clients whose only redirect URIs are on localhost. Platform attestation or short-lived vendor-signed tokens can raise the cost of the attack; they do not remove it.
  • Server-side request forgery. The authorization server now fetches a URL that an unknown party chose. SEP-991 lists the mitigations: validate the URL and the IP addresses it resolves to before fetching, cap the response size, time out the request, rate limit outbound fetches, and fetch client metadata only after the user has authenticated. Every one of those is a control that did not exist on a DCR server and has to be built and tested.
  • Hosting. A client that used to be a desktop binary now needs a static JSON file on an HTTPS domain. The burden is low, and it is not zero, and it is a dependency on infrastructure the client did not need before.
  • Draft status. The IETF document expires in January 2027 unless revised, and it will be revised. Implementations should expect to track changes, and SEP-991 says MCP intends to follow the draft as it evolves while minimizing breakage.
  • A third path. MCP authorization now has pre-registration, CIMD, and DCR. SEP-991 names fragmentation as a risk and bets that CIMD is enough simpler for server implementers that it becomes the path most people take. That bet looks right so far, and it is still a bet.

Should you build CIMD or DCR first?

Build CIMD first if the server will ever be used inside an organization that needs to say which clients may connect, or if you're standing up a new authorization server now. The specification says SHOULD, clients that support both will try CIMD before DCR, and the work is a fetch path with SSRF containment plus a cache, not a new database.

Keep DCR running if you already have it and clients depend on it. Deprecated is not removed, and the specification kept DCR for a reason. Turn it off when your own logs show no DCR registrations arriving, not when a blog post tells you to.

Pre-register if the client and server already know each other. SEP-991 is explicit that CIMD targets the no-prior-relationship case and that pre-registration remains the right tool where a relationship exists.

If you run a public MCP server for external developers and have no wish to restrict clients, either mechanism works. CIMD still saves you the registration table and the unauthenticated write endpoint.

The bet is asymmetric. The cost of building CIMD is a bounded amount of server-side work. The cost of not having a durable client identity when a security team asks which AI applications can reach your systems is that you cannot answer, and by then the DCR table has years of anonymous rows in it.

A note on Speakeasy

The Speakeasy AI Control Plane runs an OAuth authorization server in front of the MCP servers it hosts and the third-party servers it proxies, and that server accepts both CIMD and DCR. CIMD support landed in release 1.1.0, so clients that present a URL-shaped client ID, including Claude Code and VS Code, complete the flow without registering first, loopback redirects included. Clients that still speak DCR register the way they always have.

Because the platform sits in the path as the authorization server, the client-identity question above becomes a setting on each issuer rather than a project. An issuer can admit any spec-valid CIMD document, admit a preset of verified clients that Speakeasy maintains along with any document URLs you add yourself, or have CIMD switched off so clients fall back to DCR cleanly. The same setting is readable and writable over the Platform MCP, so an agent can report or change which clients a server accepts. Client metadata documents are cached with revalidation rather than refetched on every authorization. The 1.5.0 and 1.9.0 release notes cover the details.

The default admission mode is open, and we made that explicit in release 1.18.0 rather than leaving it as an internal state nothing displayed. Turning an allowlist on by default would have stopped clients that authenticate today, so enforcement is something an operator opts into. An issuer nobody has configured isn't allowlisting anything, and a team that wants the CISO's answer has to go and choose it. For how client identity fits with the rest of agent governance, the MCP gateway and AI Control Plane guides carry the wider argument.

Frequently asked questions
What is CIMD?
CIMD stands for Client ID Metadata Document. Instead of registering with an authorization server, an OAuth client uses an HTTPS URL on its own domain as its client ID, and that URL serves a JSON document containing the client name, redirect URIs, and token endpoint authentication method. The authorization server fetches the document, checks that the client ID inside it matches the URL it was fetched from, validates the requested redirect URI against the list, and caches the result. MCP adopted the approach through SEP-991, on top of the IETF OAuth Client ID Metadata Document draft, and servers advertise support with client_id_metadata_document_supported in their OAuth metadata.
What is DCR?
DCR stands for Dynamic Client Registration, specified in RFC 7591. A client with no prior relationship to an authorization server POSTs its own metadata to a registration endpoint and receives a client ID it can then use in the OAuth flow. MCP clients relied on it because the protocol defined no standard way for a user to supply a client ID for a server the client had never seen. The trade-offs are that the metadata is self-asserted, the registration endpoint accepts unauthenticated writes, and each install produces a different client ID.
What is the difference between CIMD and DCR?
Both give an OAuth client credentials for an MCP server it has never met, and they differ in who asserts the client identity and whether that identity is durable. With DCR the client POSTs its own name and redirect URIs and the server mints a new client ID for every install, so the metadata is self-asserted and the identifier is disposable. With CIMD the client ID is an HTTPS URL on the vendor's domain, the server fetches the metadata from that URL, and the same identifier appears on every install, so it can be allowlisted, searched for in an audit log, and revoked. CIMD also removes the unauthenticated registration endpoint. The current MCP specification says servers and clients SHOULD support CIMD and MAY support DCR.
Is DCR deprecated in MCP?
Yes, but it is not removed. The 2026-07-28 revision of the MCP authorization specification marks Dynamic Client Registration as deprecated, says new implementations should use Client ID Metadata Documents instead, and keeps DCR as a MAY for backward compatibility with authorization servers that do not support CIMD. Clients that support every option are told to try pre-registered credentials first, then CIMD, then DCR, and only then prompt the user for client details.
Why did MCP move from DCR toward CIMD?
SEP-991 gives three reasons. DCR requires authorization servers to manage an unbounded registration database, handle expiry, and trust metadata the client asserted about itself. CIMD gives each client a stable, auditable identifier in the form of a URL, binds the client's redirect URIs to its domain over HTTPS so they are attested rather than self-asserted, and lets servers decide their own trust policy, from accepting any HTTPS client ID to restricting to specific domains, without any pre-coordination with client vendors. The specification change made CIMD a SHOULD and reduced DCR to a MAY.
Does CIMD prevent client impersonation?
Not for loopback clients. An attacker can present a legitimate client's metadata URL as the client ID, bind the same localhost port the real client uses, and intercept the authorization code, and the authorization server sees the correct document while the user sees the correct client name. SEP-991 states that fully mitigating this is out of scope and that the risk matches DCR in the same scenario, and it recommends extra warnings for localhost-only clients. CIMD identifies the client software and attests its redirect URIs; it does not attest which process is running.
Is CIMD an IETF standard?
Not yet. The OAuth Client ID Metadata Document specification is an active Internet-Draft in the IETF OAuth working group, draft-ietf-oauth-client-id-metadata-document, at revision 02 as of July 2026. It has not been published as an RFC and may change before it is. MCP adopted it through SEP-991 with the stated intention of tracking later drafts and any final standard while minimizing breakage for existing implementations.
How does an MCP authorization server advertise CIMD support?
It includes client_id_metadata_document_supported set to true in its OAuth Authorization Server Metadata. MCP clients are expected to check for that property and, if it is absent, fall back to Dynamic Client Registration when the server advertises a registration endpoint, or to pre-registered credentials.
Should I build CIMD or DCR first for an MCP server?
Build CIMD first if the server will be used inside an organization that needs to control which clients may connect, or if you are standing up a new authorization server, because the MCP specification says SHOULD and clients that support both will try CIMD before DCR. Keep DCR running if existing clients depend on it, and turn it off when your logs show no DCR registrations arriving. Use pre-registration when the client and server already have a relationship. For a public server with no intention of restricting clients, either mechanism works, and CIMD still removes the registration table and the unauthenticated registration endpoint.
Does Speakeasy support both CIMD and DCR?
Yes. The authorization server in the Speakeasy AI Control Plane accepts both Client ID Metadata Documents and Dynamic Client Registration in front of hosted and proxied MCP servers. Each issuer can admit any spec-valid CIMD document, admit a preset of verified clients maintained by Speakeasy plus document URLs the organization adds, or have CIMD switched off so clients fall back to DCR. The default mode is open, so enforcing an allowlist is a choice an operator makes.

If you're deciding whether to own an authorization server for your MCP servers, or you've inherited a DCR table you'd rather not, we'd like to hear how you're approaching it. Talk to our team.

Last updated on

AI everywhere.

Control here.