Applicable to: All customers — both SaaS and on-prem — trying to re-initiate authentication for MCP servers that were added to their IDE or desktop app (Cursor, Claude Desktop, Claude Code, OpenCode) before v0.148.0. MCPs that are already connected and working continue to work; only re-authentication with credentials cached before the change fails — those clients must re-register.
What Is Changing
MCP OAuth Dynamic Client Registration (DCR) now enforces strict validation of theclient_id and redirect URL on every authorization request. Previously, a client_id obtained during an earlier registration could be reused across sessions without re-validation.
Starting with v0.148, the control plane will reject any authorization request that presents:
- A
client_idthat does not match an active, in-scope registration, or - A redirect URL that was not registered as part of the original DCR flow.
Why This Change
MCP OAuth now applies stricter security validation of theclient_id and redirect URL on every authorization request, instead of trusting a previously issued client_id indefinitely. This closes credential-reuse gaps and keeps each authorization tightly scoped.
The trade-off is that credentials cached before the upgrade are no longer valid and must be re-registered through a fresh DCR handshake.
Who Is Affected
Some MCP clients may not work after upgrading — specifically those that cache theclient_id from a previous session and reuse it for subsequent authorizations. This includes:
- Cursor (IDE)
- Claude Desktop
- Claude Code (CLI)
- Any other OAuth 2.0 client that persists DCR credentials locally
client_id failing validation at GET /:tenant/:server/authorize:
You may also see
{ "statusCode": 400, "message": "Invalid state" } if a client replays a stale OAuth state blob, but this is a separate, secondary case from the client_id validation above.What You Need to Do
1. Make sure the gateway is using the V2 OAuth flow
The strictclient_id and redirect validation is enforced by the control plane (v0.148+). The gateway plane is what selects whether MCP clients use the older V1 flow or the new V2 flow. The two are versioned and shipped separately.
This is the root of the broken connections: once the control plane is on v0.148 or later, the old V1 OAuth flow no longer works — so the gateway must be switched to the V2 flow. V2 is the default in gateway v0.148.2+, and can be enabled on earlier gateways via an env var. What you need to do depends on your deployment model:
- Fully managed SaaS
- Hybrid (self-hosted gateway)
- Fully self-hosted
TrueFoundry hosts both the control plane and the gateway.No action needed — TrueFoundry keeps the control plane on v0.148+ and the gateway on the V2 flow.
2. Reset cached credentials on each client
This step applies to every affected user across all deployment models, regardless of how the new flow was enabled. After upgrading, every client must drop theclient_id it cached before the upgrade and re-register. The exact steps differ by client — for some, a restart is not enough.
- Cursor (IDE)
- Claude Code & Claude Desktop
- OpenCode (CLI)
- Open the Command Palette (
Cmd+Shift+P/Ctrl+Shift+P) and run MCP: Clear All MCP Tokens to remove the cached OAuth credentials. - Quit Cursor completely and relaunch it (tokens are cached at runtime, so a restart is required for the clear to take effect).
- Re-initiate the MCP connection so the client performs a fresh DCR handshake.
If you continue to experience issues after following the steps for your client, reach out and we’ll be happy to assist.