One MCP server, three connectors: Claude, ChatGPT, Grok
The same OAuth 2.1 server can pass Claude, ChatGPT, and Grok connector validation — if your discovery, registration, and redirect handling account for how each client differs.
multi-client · updated 2026-08-22
Claude, ChatGPT, and Grok all speak MCP and all use OAuth 2.1 with the same discovery machinery: protected-resource metadata (RFC 9728), authorization server metadata (RFC 8414), PKCE, and Streamable HTTP. Build the flow once — the connector checklist and the Auth0 proxy pattern both apply to all three — then handle the per-client differences below.
The differences that actually matter
| Claude (claude.ai) | ChatGPT | Grok (grok.com) | |
|---|---|---|---|
| Where users add it | Customize → Connectors | Settings → Connectors (developer mode) | grok.com/connectors → New Connector → Custom |
| Client identification | Dynamic client registration | CIMD, DCR, or a predefined client | OAuth flow in-app; register via DCR |
| Redirect URI | https://claude.ai/api/mcp/auth_callback and https://claude.com/api/mcp/auth_callback |
https://chatgpt.com/connector_platform_oauth_redirect |
Capture from the DCR request (see below) |
| DCR frequency | Per connector setup | Once per MCP server connection, then the registered client is reused | Per connector setup |
Redirect URIs: allow what registers, don’t hardcode
The single most common cross-client failure is a redirect-URI allowlist
written for one client. Claude’s callback is not ChatGPT’s
(connector_platform_oauth_redirect), and clients occasionally append
callback IDs or paths — the full derived redirect_uri must be honored, not
just the base host.
The pattern for a DCR endpoint that serves all three:
- Accept the registration and store the exact
redirect_uristhe client sends. - Validate the host against a short allowlist of client origins:
claude.ai,claude.com,chatgpt.com,openai.com,grok.com,x.ai. - At
/authorizetime, verify the requestedredirect_uriexactly matches one stored for that client — then let it through.
This also future-proofs you: when a client changes its callback path (it has happened), your server keeps working without a redeploy.
ChatGPT: CIMD is preferred, DCR is the fallback
ChatGPT identifies itself three ways, in order of preference:
- Client ID Metadata Documents (CIMD) — the client presents a URL as
its
client_id; your authorization server fetches that URL for the client’s metadata. Support it if your stack can. - Dynamic client registration — used when you advertise a
registration_endpointand CIMD isn’t available. ChatGPT registers once per connection and reuses the client. - A predefined OAuth client — you paste a client ID/secret into the connector configuration. This is the escape hatch when your identity provider can’t do either of the above.
If you built the thin DCR proxy, option 2 works as-is — just add ChatGPT’s redirect to the allowed origins.
Grok: same flow, younger surface
Grok’s “Bring Your Own MCP” (grok.com/connectors → New Connector → Custom) takes your MCP server URL and runs the OAuth flow inside Grok. The discovery sequence is the standard one; the practical differences:
- Don’t hardcode a Grok callback URL from a blog post (including this one).
Log the
redirect_urisin your DCR endpoint’s requests the first time you connect, and let the allow-what-registers pattern above handle it. - The DNS and TLS pre-flight rules from the failure map apply unchanged: a public hostname and a publicly-trusted certificate, no tunnels with non-public DNS.
One test matrix
For each client, run the same four checks from the checklist — 401 probe, both metadata documents, DCR — then connect for real. Log every request your server sees during the first connection of each client; the logs are the authoritative documentation of what that client actually does, and they’re what you’ll want when one of the three changes behavior.
Next steps
To finish the rollout:
- Run the connector checklist once per client — the same four curls, three times.
- Connect each client for real and keep the first-connection logs.
- If one client fails where the others succeed, debugging connector failures isolates the step.
For the authorization server side, each provider has its own walkthrough: Auth0, Stytch, Supabase, and Hydra. The prompt library has a per-client prompt to paste.
Metadata
- Commit
- b5cb085
- Browser
- —
- Current Time
- —
- Dimensions
- —
- Source
- guides
- Last Updated
- 2026-08-22