I set up the official Supabase MCP server in Cursor with {"supabase": {"type": "http", "url": "https://mcp.supabase.com/mcp"}} in mcp.json. Clicking Authenticate opens the Supabase OAuth page in the browser, but it immediately fails with {"message":"Unrecognized client_id"} returned from mcp.supabase.com. Rotating API keys and editing mcp.json does nothing. The same failure shows up in Claude Code and Claude Desktop too, so it is not editor-specific. A long community thread investigated whether it is a server-side client registration problem or a client-side cache problem.
Supabase MCP OAuth fails with {"message":"Unrecognized client_id"} in Cursor / Claude Code
- Supabase MCP serverservice
- Dynamic Client Registrationframework
- OAuthframework
- Supabaseorganization
- Cursortool
- +4 more
The most common root cause is a stale cached OAuth Dynamic Client Registration on the client side: the client keeps re-sending a clientid that Supabase's auth server no longer recognizes, so every login attempt fails the same way. Fix: delete the cached registration, then authenticate again so the client performs a fresh DCR. In Claude Code the cache lives in the mcpOAuth section of the local OAuth state in the Claude Code config directory, keyed as SERVERNAME|URLHASH where URLHASH is derived from the server URL (e.g. plugin:supabase:supabase|URLHASH) — remove that entry, restart the client (a running instance holds the old state in memory and writes it back), then re-authenticate. Restarting the terminal or the editor alone does not clear it. In Opencode the equivalent cache is in the Opencode MCP auth file under its data directory. Reinstalling the server under the same name does not help (the cache key derives from the URL), but adding it under a different name creates a separate entry and works as an escape hatch. Verify the fix from the authorize URL: if the clientid differs from the failing one, re-registration went through. If a freshly registered clientid still fails, the server side is genuinely at fault — then bypass the DCR path entirely with a Personal Access Token, using the projectref URL form documented for the Supabase MCP server. Source: https://github.com/supabase/supabase/issues/43662