Announcing CIMD support for MCP Client registration
Learn more
MCP authentication
Dec 17, 2025

CIMD vs DCR: How to Choose the Right Model for Your MCP Deployment

Diagram comparing DCR, where each MCP client registers and gets a stored client record, with CIMD, where one hosted metadata URL serves every client

CIMD (Client ID Metadata Document) and DCR (Dynamic Client Registration) are two ways an MCP client gets a client ID from an authorization server, and the current MCP spec, version 2026-07-28, recommends CIMD and deprecates DCR. With DCR (RFC 7591), the client posts its metadata to a registration endpoint and receives a new ID. With CIMD, the client ID is an HTTPS URL to a JSON document the client hosts, which the authorization server fetches. DCR stays available as a fallback for authorization servers that do not support CIMD yet. For most MCP servers, that means CIMD for clients you do not know in advance, pre-registration for clients you do, and DCR kept on only for compatibility.

TL;DR

  • DCR creates a new registration on the authorization server every time a client registers. CIMD has no registration step: the client ID is a URL, the authorization server reads the metadata from it, and every installation of the client shares that one ID.
  • The MCP spec tells clients to prefer pre-registered credentials, then CIMD, then DCR. DCR is deprecated as of 2026-07-28 and stays in the spec until at least the first revision released on or after 2027-07-28.
  • Use CIMD for public servers, IDEs, CLIs and agents acting for users. Use pre-registration for internal, partner and regulated deployments, and for agents that act without a user. Keep DCR on for clients that have not added CIMD yet.

What the MCP spec says about CIMD and DCR now

The MCP client registration page lists three mechanisms and a priority order for clients that support all of them:

  1. Use pre-registered client information for that server, if the client has it.
  2. Use a Client ID Metadata Document if the authorization server advertises client_id_metadata_document_supported in its metadata.
  3. Use Dynamic Client Registration as a fallback if the authorization server advertises a registration_endpoint.
  4. Ask the user to enter client details if nothing else is available.

The spec moved in three steps. The 2025-06-18 version said clients and authorization servers SHOULD support DCR. The 2025-11-25 version added CIMD as the recommended mechanism and lowered DCR to MAY. The 2026-07-28 version marks DCR as deprecated. Under the new feature lifecycle policy, a deprecated feature stays in the spec for at least twelve months before it can be removed, and the deprecated features registry lists DCR's earliest removal as the first spec revision released on or after 2027-07-28.

Two other 2026-07-28 changes matter for registration. Clients that still use DCR MUST send an application_type: native for desktop apps, CLIs and localhost apps, and web for remote browser apps. Clients MUST also key any pre-registered or DCR credentials to the issuer of the authorization server that created them and register again when the server changes. CIMD client IDs are exempt, because the URL works with any authorization server. For the rest of the flow, from the 401 challenge to token validation, see the MCP authorization guide, and for everything else in the release, the July 2026 spec update.

How Dynamic Client Registration (DCR) works in an MCP deployment

MCP first adopted DCR to solve a problem that is common in MCP: clients and servers usually have no prior relationship. A user pastes a server URL into Claude, Cursor or an agent, and the client needs a client ID at an authorization server it has never seen. With DCR, the client reads registration_endpoint from the authorization server metadata and sends its metadata in a POST:

{ "client_name": "Example MCP Client", "redirect_uris": ["http://127.0.0.1:33418/callback"], "grant_types": ["authorization_code", "refresh_token"], "response_types": ["code"], "token_endpoint_auth_method": "none", "application_type": "native" }

The authorization server stores the metadata, assigns a client ID, and may return a client secret. The client then runs the authorization code flow with PKCE using that ID. For the request and response fields, the registration access token and the management protocol in RFC 7592, see how Dynamic Client Registration works in OAuth 2.0.

DCR works, and Claude, Claude Code, ChatGPT and Cursor all support it, but three properties make it a poor default for MCP:

  • Every registration creates a record. Clients that cannot keep long-term storage register again and again. RFC 7591 notes this risk of dead client identifiers and lets servers expire old registrations. Anthropic's connector authentication docs say Claude registers a new client on every fresh DCR connection, which can leave very large numbers of client records on your authorization server.
  • Metadata is self-asserted. RFC 7591 requires the authorization server to treat all client metadata as self-asserted unless it arrives in a signed software statement. A rogue client can register with the name and logo of a well-known one.
  • The endpoint is open. To support clients it has never met, an MCP authorization server has to accept registrations with no initial access token. RFC 7591 allows that open registration and lets servers rate-limit it to prevent denial-of-service attacks.

How Client ID Metadata Documents (CIMD) work, and why MCP moved to them

CIMD, defined in the IETF draft OAuth Client ID Metadata Document (draft-02, July 2026), removes the registration call. The client publishes one JSON document at a stable HTTPS URL and uses that URL as its client_id. VS Code publishes its document at vscode.dev/oauth/client-metadata.json. These are its contents in October 2026, with the fields reordered for reading:

{ "client_id": "https://vscode.dev/oauth/client-metadata.json", "client_name": "Visual Studio Code", "client_uri": "https://vscode.dev/product", "logo_uri": "https://code.visualstudio.com/assets/branding/code-stable.png", "application_type": "native", "grant_types": [ "authorization_code", "refresh_token", "urn:ietf:params:oauth:grant-type:device_code" ], "response_types": ["code"], "token_endpoint_auth_method": "none", "redirect_uris": [ "http://127.0.0.1:33418/", "https://vscode.dev/redirect" ] }

When an authorization request arrives with a URL as the client ID, the authorization server fetches the document, checks that its client_id matches the URL exactly, checks that the request's redirect URI is listed in redirect_uris, and caches the result according to HTTP cache headers. The MCP spec requires the document to include at least client_id, client_name and redirect_uris, and the URL must use https and contain a path. Every installation of the client shares that one URL, so a thousand copies of VS Code are one client to your authorization server.

This fits the way MCP clients behave. IDE extensions, CLIs and agent runtimes run on users' machines, have no place to keep a secret, and connect to servers their developers have never heard of. CIMD also ties the client's identity to a domain the client controls. The draft tells the authorization server to show the client ID's hostname on the consent screen, so that a user can see vscode.dev rather than only a name the client chose for itself. For a fuller explanation of the document and its fields, read what a Client ID Metadata Document is. For a request traced end to end against a real MCP server, follow the step-by-step CIMD registration walkthrough.

To see which mechanisms an authorization server offers, read its metadata. This command checks Linear's hosted MCP server, which advertises both:

curl -s https://mcp.linear.app/.well-known/oauth-authorization-server \ | jq '{client_id_metadata_document_supported, registration_endpoint, token_endpoint_auth_methods_supported}'

A server that supports CIMD returns true for the first field. A server that supports DCR returns a URL for the second. CIMD clients such as Claude and VS Code authenticate as public clients, so the third list should include none. Claude uses CIMD only when both the flag and none are present, and otherwise falls back to DCR.

CIMD vs DCR side by side

Question
DCR (RFC 7591)
CIMD
What is the client ID?
A value the authorization server generates
An HTTPS URL the client controls
Where does metadata live?
In a record on the authorization server
In a JSON document the client hosts; the server caches it
Registrations created
One per registration call, often one per connection
None; one URL covers every installation
Client authentication
Public client, or a client secret issued at registration
Public client, or private_key_jwt with keys in jwks or jwks_uri; shared secrets are not allowed
What proves identity
Nothing beyond self-asserted metadata, unless a signed software statement is used
Control of the domain that serves the document
Changing authorization servers
Credentials are bound to one issuer; the client registers again
The same URL works everywhere
Main risks
Record sprawl, abuse of an open endpoint, impersonation by name
SSRF on the server's fetch, document availability, localhost redirect impersonation
Status in MCP 2026-07-28
Deprecated; MAY be supported for compatibility
Recommended; clients and servers SHOULD support it

Which registration model fits which deployment

The choice depends on whether you know your clients in advance and whether they act for a user. Pre-registration belongs in the comparison, because the spec ranks it first when a relationship already exists.

Deployment
Use
Why
Public SaaS MCP server with unknown clients
CIMD, with DCR on as a fallback
Clients you have never seen identify themselves by URL, with no registrations to clean up; DCR covers clients that have not added CIMD
Internal MCP server with controlled clients
Pre-registration
The spec names pre-registration for clients with an existing relationship, and clients use pre-registered credentials before any other mechanism
Regulated enterprise
Pre-registration, or pre-registered CIMD URLs where the authorization server supports them
Every client is approved before use; the CIMD draft expects enterprises that onboard clients explicitly to pre-register client URLs, which can also carry private_key_jwt client authentication
Partner integrations
Pre-registration
You know the partner in advance, which is the case the spec names for pre-registration; if the partner publishes a CIMD document, an authorization server with domain allowlists can trust the partner's domain instead
IDE plugins and CLIs
CIMD
Many installations, loopback redirects and no safe place for a secret
Ephemeral agents and CI jobs acting for a user
CIMD
Every run reuses one URL, so short-lived workers leave no registrations behind
Agents acting with no user
Pre-registered client with the client credentials grant
A confidential client with its own credentials; there is no user to consent and no redirect

Pre-registered CIMD URLs and domain allowlists are optional authorization server features described in the CIMD draft, so check that your authorization server offers them before you plan around them.

Problems teams hit with each model

With DCR

  • Client tables fill up. Reconnects, reinstalls and short-lived workers each register again. Plan an expiry policy for unused registrations, or prefer CIMD for clients that support it.
  • Registration fails on OpenID Connect servers. Without application_type, OIDC treats the client as web, which can reject localhost redirect URIs. The 2026-07-28 spec now requires clients to send it.
  • Names and logos cannot be trusted. Since metadata is self-asserted, show the redirect URI on the consent screen and do not rely on the client name.

With CIMD

  • The document becomes part of sign-in. If the URL fails to return the document with a 200, the authorization server should abort the request, and the draft forbids following redirects. Host it on reliable infrastructure, and avoid URL shorteners and moving the file.
  • Changing the URL creates a new client. Authorization servers treat a new URL as an unrelated client, so earlier consent may not carry over. Keep the URL stable and keep control of the domain.
  • The authorization server fetches URLs chosen by clients. The draft forbids fetching special-use IP addresses, recommends reading no more than 5 kilobytes, and says not to cache errors or invalid documents.
  • Localhost redirects can be impersonated. CIMD cannot stop another app on the user's machine from listening on a loopback port. The MCP security considerations ask authorization servers to show the redirect hostname, warn on localhost-only redirect URIs and optionally require attestation.
  • Not every client supports it. Cursor's documentation describes DCR or a static client ID and secret, so keep DCR available while your users' clients catch up.

A decision path for choosing between CIMD and DCR

  1. If a client acts without a user, pre-register it and use the client credentials grant.
  2. If you know every client in advance and want an approved list, pre-register them. If your authorization server supports it, you can pre-register the CIMD URLs of clients that publish one instead of issuing new IDs.
  3. If clients you do not know will connect, support CIMD and advertise client_id_metadata_document_supported. Accept none as a token endpoint auth method for public clients.
  4. Keep DCR enabled as a fallback for clients that do not use CIMD yet. If you run your own authorization server, rate-limit the registration endpoint and expire unused registrations, as RFC 7591 allows.
  5. Revisit the DCR fallback before the first spec revision released on or after 2027-07-28, which is the earliest point it can be removed.

Which MCP clients use which

Client behavior follows the spec's preference order where vendors document it. Claude on the web, desktop and mobile uses CIMD when the authorization server advertises both client_id_metadata_document_supported and none, and otherwise uses DCR; Claude Code uses its own CIMD document with a loopback redirect, as covered in how Claude Code handles MCP OAuth. OpenAI's ChatGPT and Codex docs list CIMD, DCR and predefined OAuth clients. VS Code serves the CIMD document shown above. Cursor's MCP docs describe DCR, or a static client ID and secret set in the auth object of mcp.json. The MCP authorization guide keeps a fuller table of client support.

Running CIMD and DCR on Scalekit

Scalekit acts as the authorization server for your MCP server, so registration happens in Scalekit, and your server publishes its resource metadata and validates tokens. When you register an MCP server in the dashboard, you turn on DCR, CIMD or both. The MCP auth quickstart recommends keeping both enabled for servers used by public clients such as Claude, Cursor and VS Code: clients that support CIMD use it, and the rest fall back to DCR. Restart your MCP server after changing either setting, since some frameworks, FastMCP among them, cache the authorization server details. Scalekit's CIMD support announcement describes the CIMD option when it launched.

For clients you know in advance, create them in the Clients section of the MCP server. Leave the redirect URI empty for a machine client that uses the client credentials flow, or add redirect URIs for a client that acts for users with the authorization code flow. Either way you receive a client ID and secret for that client. The Clients tab lists every client with its registration type. A CIMD client keeps its document URL as its client ID, and Scalekit also issues it an m2m_ identifier that the dashboard and Scalekit APIs use to refer to it.

Scalekit dashboard Clients tab listing MCP clients labeled CIMD, Static and Dynamic

From a client's Consents tab you can see which users have authorized it and revoke a user's consent. Clients that register through DCR or CIMD are public clients with no secret, so revoke their access from the Consents tab rather than through the token revocation endpoint. Revoking consent stops new tokens; tokens already issued stay valid until they expire, so set the server's access token lifetime with that in mind (the docs recommend 300 to 3,600 seconds). Managing MCP clients covers each step. If your MCP server also calls third-party apps for each user, that is a separate set of tokens, covered in the guide to MCP integrations.

FAQs

What is the difference between CIMD and DCR?

With DCR, the client sends its metadata to the authorization server's registration endpoint and receives a new client ID, so the server keeps a record per registration. With CIMD, the client ID is an HTTPS URL to a JSON document the client hosts, and the authorization server fetches and caches that document, so there is no registration call and every installation shares one client ID.

Does the MCP spec still allow DCR?

Yes. The 2026-07-28 spec deprecates DCR in favor of CIMD, but clients and authorization servers MAY still support it for backwards compatibility. The deprecated features registry lists its earliest removal as the first spec revision released on or after 2027-07-28.

Should I turn off DCR on my MCP authorization server?

Not yet, if public clients connect to your server. Some clients, Cursor among them, document DCR or static credentials rather than CIMD, and Claude falls back to DCR when CIMD is not fully advertised. Keep DCR on as a fallback, rate-limit it, and turn on CIMD so that clients that support it stop creating new registrations.

Is CIMD secure if anyone can publish a metadata document?

CIMD ties a client's identity to a domain the client controls, and the draft says the authorization server should show that hostname on the consent screen. The authorization server must validate the document and redirect URIs, must not fetch special-use IP addresses, and may apply domain allowlists or extra warnings for unfamiliar domains.

Can a CIMD client use a client secret?

No. The CIMD draft forbids client_secret and every authentication method based on a shared secret. A client that can protect a private key can publish its public key through jwks or jwks_uri and authenticate with private_key_jwt, which makes it a confidential client.

When is pre-registration better than CIMD or DCR?

Pre-registration is better when you already know the client, such as internal tools, approved partner apps, regulated deployments, and agents that use the client credentials grant with no user. The MCP spec tells clients to use pre-registered credentials first whenever they have them.

Details checked October 2026.

No items found.
Agent
Auth Quickstart
On this page
Share this article
Scalekit
Connect Agents & Apps

Acquire enterprise customers with
‍zero upfront cost.

Every feature unlocked. No hidden fees.