- OAuth. The client opens your browser, you approve on the Doers consent screen, and the client keeps its own access. Nothing to copy, and you can disconnect it from the app. This is the only option for web connectors such as claude.ai and ChatGPT.
- A personal token. A
pc_…token from Settings > API & MCP, sent in anAuthorizationheader. For clients without a browser, scripts and CI.
Use this exact address with OAuth. The authorization server issues tokens for
https://app.doers.sh/mcp. A client configured with another address names that address when it
asks for a token, as the specification requires, and is refused with invalid_target. With a
personal token, https://api.doers.sh/mcp works as well.The MCP server’s address will be aligned with the API host, api.doers.sh. Until then, https://app.doers.sh/mcp is the address that works for every client.- Claude Code
- claude.ai and Claude Desktop
- ChatGPT
- Cursor
- VS Code
- Any client (JSON)
/mcp, choose doers and let it open your browser. Sign in if needed
and approve: Claude Code stores its access on its own.Add --scope user to make it available in every project. Check with claude mcp list.With a token instead:What the sign-in does
- The client calls the server without a token and gets a
401whoseWWW-Authenticateheader points at/.well-known/oauth-protected-resource. - It reads that document, then
/.well-known/oauth-authorization-server. - It registers itself with
POST /oauth/register. There is nothing to set up beforehand. - It opens your browser on the consent screen, with PKCE.
- You approve. It exchanges the code for an access token (1 hour) and a refresh token (60 days, replaced at every use).
Check by hand
npx @modelcontextprotocol/inspector, choose Streamable HTTP and
enter the URL: the Inspector handles OAuth.