The OAuth rabbit hole
The MCP specification mandates OAuth 2.1 with Dynamic Client Registration (DCR) (RFC 7591). We use Auth0. Auth0 doesn't currently support DCR in its standard offering. Neither does Google, GitHub, or Azure. As the Fabi.ai team put it:
TL;DR: Don't use Auth0 for MCP unless you enjoy debugging OAuth flows at 2 a.m.
Since we missed the DCR support from our native Auth provider, we built an OAuth proxy that bridges the gap. The proxy implements the DCR endpoints which MCP clients expect while proxying actual authentication through to Auth0.
The MCP spec uses two metadata documents to coordinate this:
From the MCP client's perspective, it's talking to a fully DCR-compliant auth server. From Auth0's perspective, it's handling requests from our first-party application. The LLM clients (Claude, Cursor, etc.) are third-parties to us, but go through our proxy rather than directly to Auth0.
How the subsequent Auth flow works:
Before diving in, here's the full OAuth flow of our Remote MCP:

The client discovers our proxy, registers via the DCR layer to get a client_id, then goes through standard OAuth - but through our proxy, which also validates redirect URIs per RFC 8252. In the authorization step, we verify whether the redirect URI matches what was registered, and also set prompt=consent - per MCP Security Best Practices proxy servers using static client IDs must obtain user consent for each dynamically registered client. After token exchange, the client receives an audience-specific Access Token which is stored client-side. On subsequent calls, the MCP client provides this Access Token as Authentication Bearer Header. We validate it, exchange it for a user-specific short-lived MotherDuck token server-side, and establish a connection to MotherDuck in read-only mode on the user’s behalf.
If you're ever implementing MCP auth, pay close attention to the MCP Authorization Specification and Security Best Practices - they have been a very valuable resource for us - just like the MCP Inspector tool and rigorous testing with different real-world clients.