thumbs

Guides

Remote vs local MCP servers: how OAuth sign-in works

By Jorge García González, maker of thumbs · 27 October 2026

Disclosure: I make thumbs, one of the options below. I'll say where each option fits, including where mine doesn't.

Adding an MCP server to Claude Code, Cursor or the Claude app takes one line. What happens next, when a browser window opens and asks you to sign in, is OAuth. This guide explains what is actually going on, in terms of what the MCP specification says, and then shows how thumbs, a remote server, fits into it. If you only want the iOS side of things, see iOS Simulator MCP: local or remote.

Local versus remote MCP servers

MCP has two standard transports (transports in the spec): stdio, where the client starts the server as a subprocess on your computer, and Streamable HTTP, where the server lives at a URL.

What the spec asks for

In short, as the current spec text puts it:

The flow, step by step

  1. The client sends a request with no token. The server answers 401 with a WWW-Authenticate header that includes resource_metadata.
  2. The client fetches the protected resource metadata and learns the authorization server.
  3. It fetches the authorization server's metadata.
  4. It registers (dynamic registration: a POST to the /register endpoint) and gets a client ID.
  5. It creates a PKCE verifier and challenge, and opens your browser at the authorize URL, with the challenge and the resource.
  6. You approve and sign in on the provider's page. The browser returns to the client with an authorization code.
  7. The client exchanges the code, with the verifier, for an access token, and uses it from then on.

How thumbs does it

thumbs is a remote server at https://mcp.usethumbs.com/mcp. You can see the first steps yourself, no account needed:

curl -i -X POST https://mcp.usethumbs.com/mcp \
  -H 'content-type: application/json' -d '{}'

When I ran that on 27 October 2026 it returned 401 with a WWW-Authenticate header carrying a resource_metadata URL, as step 1 describes. Fetching that URL, and then the authorization server metadata at https://mcp.usethumbs.com/.well-known/oauth-authorization-server, shows:

On sign-in, the page you see names the agent asking, shows where the browser will return to, and has a button labelled "Approve and sign in with Google". You sign in with a Google account; only accounts let in from the waitlist get a phone. If your account isn't on the list yet, you see a "Not on the list yet" page instead, with a link to join the waitlist.

In Claude Code the whole thing is:

claude mcp add --transport http thumbs https://mcp.usethumbs.com/mcp

followed by /mcp to sign in. In Cursor, add the URL to ~/.cursor/mcp.json; in the Claude app, add it as a custom connector.

What to check when sign-in fails

Limits and honesty notes

FAQ

What is the difference between a local and a remote MCP server? A local (stdio) server runs as a subprocess on your computer and normally takes credentials from its environment. A remote server lives at a URL over Streamable HTTP and can use OAuth sign-in, so there is nothing to install.

What OAuth version does MCP use? The MCP specification builds on OAuth 2.1, with protected resource metadata (RFC 9728), authorization server metadata (RFC 8414), PKCE and resource indicators (RFC 8707). Authorization is optional, but HTTP servers that support it should follow the specification.

Is dynamic client registration still used? It is supported for backwards compatibility. The current MCP specification marks it deprecated and recommends Client ID Metadata Documents for new implementations. thumbs still advertises a registration endpoint.

How does thumbs sign me in? With Google, through the OAuth flow your MCP client starts: a consent page, then Google sign-in. Only accounts let in from the waitlist get a phone.

Keep reading