Rightshold™ Sign up

Answers · MCP security

Is Dynamic Client Registration deprecated in MCP? Should my MCP server's authorization server keep an open /register endpoint, or switch to Client ID Metadata Documents, and what do I have to secure if I do?

Last updated

TL;DR: Yes, it's deprecated, so plan to switch, but don't switch off DCR overnight. The 2025-11-25 MCP spec made Client ID Metadata Documents (CIMD) the recommended way for clients and authorization servers with no prior relationship to register (SHOULD support) and downgraded Dynamic Client Registration (RFC 7591) to MAY. The 2026-07-28 spec formally deprecates DCR (PR #2858), keeps it for backwards compatibility with authorization servers that don't support CIMD, and lists it as removable in the first spec revision released on or after July 28, 2027. With CIMD, the client_id is an https URL the client controls, pointing to a JSON document with its name and redirect URIs; your authorization server fetches it at authorization time, so there's no unauthenticated /register endpoint writing to your database and one client ID per app instead of one per install. In exchange, your authorization server now fetches URLs supplied by strangers, so it needs SSRF protection, a response-size limit (the IETF draft recommends 5 KB), strict validation that the document's client_id matches its URL and that redirect URIs match, and clear warnings for localhost-only redirect URIs, which CIMD can't stop being impersonated. Advertise client_id_metadata_document_supported: true in your authorization server metadata, keep DCR running (rate-limited) for clients that haven't caught up, and watch your logs to decide when to retire it.

What should I check, step by step?

1. Read your authorization server metadata (/.well-known/oauth-authorization-server or openid-configuration). Add "client_id_metadata_document_supported": true once you accept URL client IDs, and keep registration_endpoint only while you still support DCR.

  1. When a client_id is an https URL with a path, fetch it, check it's valid JSON with client_id, client_name and redirect_uris, and require the document's client_id to equal the URL exactly (simple string comparison). Reject anything else with invalid_client.
  2. Check the redirect_uri in every authorization request against the document's redirect_uris, exactly as you would for a pre-registered client.
  3. Treat the fetch as untrusted input: allow only https, refuse private, loopback and link-local addresses (including cloud metadata at 169.254.169.254) after DNS resolution, set a short timeout, follow no redirects or re-check each hop, and cap the response size; the draft recommends 5 kilobytes.
  4. Cache documents according to their HTTP cache headers within bounds you set, and never cache an error or an invalid document.
  5. Refuse documents that declare shared-secret client authentication. The draft says token_endpoint_auth_method must not be client_secret_basic, client_secret_post, client_secret_jwt or any other shared-secret method, and client_secret must not appear. Public clients use none with PKCE; clients with a backend can use private_key_jwt with a published JWKS.
  6. Show the client's name, the hostname of its client_id URL and the redirect URI hostname on the consent screen. The spec says authorization servers MUST clearly show the redirect URI hostname and SHOULD warn when a client's redirect URIs are localhost only.
  7. Decide your trust policy: accept any domain with a warning, or allow-list known client domains for sensitive scopes. The spec lets authorization servers apply domain-based trust policies.
  8. If you keep DCR for now, rate-limit /register, require clients to send an application_type (native for desktop, CLI and localhost apps; web for hosted apps), expire unused registrations on a schedule you document, and log registrations so you can see when CIMD has taken over.
  9. If you build an MCP client, follow the spec's order: pre-registered credentials first, then CIMD when the server advertises it, then DCR, then ask the user. Key any stored client credentials by the authorization server's issuer and re-register if it changes.

Is Dynamic Client Registration deprecated in the MCP spec?

The 2025-11-25 revision added CIMD as a recommended registration mechanism (SEP-991) and made DCR optional. The 2026-07-28 revision deprecated DCR in favour of CIMD and lists three mechanisms: CIMD when client and server have no prior relationship (described as the most common case), pre-registration when they do, and DCR for backwards compatibility.

Why did MCP move from Dynamic Client Registration to Client ID Metadata Documents?

In an August 22, 2025 post on the MCP blog, Paul Carleton set out the problems an open /register endpoint creates in MCP, where users paste any server URL into any client. Every install creates a new registration, so the database grows without bound and an admin sees thousands of records for one app. There's no clean way to tell a client its ID has expired without creating an open redirect. And an unauthenticated endpoint that writes to the database invites denial of service, so admins have to rate-limit it.

Does a Client ID Metadata Document stop client impersonation?

CIMD proves that whoever controls a domain published a client's metadata. It doesn't prove that the program on the other end is that client. The spec says plainly that CIMD can't prevent localhost redirect URI impersonation: a malicious local app can use a well-known desktop client's client_id and catch the code on the same localhost port, which is why the spec asks for warnings and a visible redirect hostname, and allows extra attestation.

How do I ask Rightshold about this (free, no key)?

Add the MCP server https://www.rightshold.com/mcp to Claude, Cursor, ChatGPT, Grok or VS Code, then ask: “This request came from a client that identified itself with a CIMD client_id. Before my MCP server lets it place an order, is the agent behind it holding a valid credential for this exact configuration and scope?”

One-click setup

{
  "tool": "verify_agent_credential",
  "arguments": {
    "id": "crd_...",
    "config_hash": "<sha256 the agent presents>",
    "scope": "orders:place"
  }
}

Rightshold verifies agent credentials it issues and reports what it has on record. It isn't an OAuth authorization server and isn't affiliated with the MCP project or the IETF. Spec requirements are quoted from the MCP 2025-11-25 and 2026-07-28 revisions and the IETF draft cited, as checked on November 10, 2026.

What are the sources?

Related

Not legal advice. JSON · Markdown · All answers

Get a free API key in one call

No card and no email needed. 100 free credits; the license and policy checks stay free without a key.

curl -s -X POST https://www.rightshold.com/v1/accounts/signup -H "Content-Type: application/json" -d '{"accept_terms":true}'
export RIGHTSHOLD_API_KEY=rs_...   # the api_key from the reply (shown once)
curl -s https://www.rightshold.com/v1/licenses/check -H "Authorization: Bearer $RIGHTSHOLD_API_KEY" \
  -H "Content-Type: application/json" -d '{"license":"MIT","intended_use":{"commercial_use":true}}'