[Feature Request] Add user:design OAuth scopes to Claude Code authentication
Status Open
Reported on v2.1.162
Maintainer reply None cached
Activity 3 comments · opened Jun 19, 2026
Bug Description
▎ DesignSync (claude.ai/design) returns "design scopes not granted"
▎ even after a fresh /logout + /login. My OAuth token has no
▎ user:design:* scope (only user:file_upload, user:inference,
▎ user:mcp_servers, user:profile, user:sessions:claude_code). Please
▎ enable design-system OAuth scopes (user:design:read /
▎ user:design:write) for my account: dlwlsgml573@gmail.com.
Environment Info
- Platform: darwin
- Terminal: Apple_Terminal
- Version: 2.1.162
- Feedback ID: a071b0f1-bbd2-49c2-98db-25f844e3abd8
Errors
[{"error":"Error: DesignSync needs a claude.ai login. Could not add design scopes to the token. Run /login and retry. (refresh succeeded but design scopes not granted)\n at call (/$bunfs/root/src/entrypoints/cli.js:4794:542)\n at processTicksAndRejections (native:7:39)","timestamp":"2026-06-19T05:04:36.566Z"},{"error":"Error: DesignSync needs a claude.ai login. Could not add design scopes to the token. Run /login and retry. (refresh succeeded but design scopes not granted)\n at call (/$bunfs/root/src/entrypoints/cli.js:4794:542)\n at processTicksAndRejections (native:7:39)","timestamp":"2026-06-19T05:11:33.541Z"},{"error":"Error: DesignSync needs a claude.ai login. Could not add design scopes to the token. Run /login and retry. (refresh succeeded but design scopes not granted)\n at call (/$bunfs/root/src/entrypoints/cli.js:4794:542)\n at processTicksAndRejections (native:7:39)","timestamp":"2026-06-19T05:13:53.841Z"}]
3 Comments
Still reproducible on Claude Code 2.1.172 (macOS, personal Max plan, Denmark).
Repro:
/loginsucceeds. Token scopes afterwards:user:file_upload,user:inference,user:mcp_servers,user:profile,user:sessions:claude_code— nouser:design:*.DesignSynccall (e.g.list_projects) fails with:> DesignSync needs a claude.ai login. Could not add design scopes to the token. Run /login and retry. (Request failed with status code 400)
/logindoes not change the granted scopes, so the retry loop never converges.So the on-the-fly scope-upgrade endpoint 400s for accounts that should have Claude Design access (browser access to claude.ai/design works fine on this account). Would be great to get
user:design:read/user:design:writeincluded in the Claude Code OAuth grant or the upgrade endpoint fixed.Possibly related: the
claude_designMCP server's OAuth flow is also broken for a different reason —https://api.anthropic.com/.well-known/oauth-authorization-servercurrently advertises"issuer": "https://api.anthropic.com/mcp/gdrive"(the decommissioned Google Drive server), so its authorize URLs land on the "Server Turned Down" HTTP 410 page. Filing that separately.Also reproducible for me on Claude Code 2.1.170 (macOS, Team plan Premium seat, Ukraine).
Repro:
/loginsucceeds ("Login successful"). Token scopes afterwards:user:file_upload,user:inference,user:mcp_servers,user:profile,user:sessions:claude_code— nouser:design:*.DesignSynccall (e.g.list_projects) fails with:``
``DesignSync needs a claude.ai login. Could not add design scopes to the token. Run /login and retry. (Request failed with status code 400)
/loginand fully restarting the CLI both make no difference — the granted scope set is identical after every login, so the suggested retry never converges.Browser access to claude.ai/design works fine on this account (created several design projects with it the same day), so the account is eligible — the failure is on the Claude Code OAuth grant / scope-upgrade side. Would be great to get
user:design:read/user:design:writeadded to the Claude Code OAuth grant, or the upgrade endpoint fixed.Confirming this on Windows with a Max plan and Claude Code 2.1.251 (newer than the 2.1.162 in the report). My token carries the exact same five scopes, in the same order:
While debugging I think I found the mechanism, so adding it here rather than opening another issue.
The protected-resource metadata is not where the client looks for it
RFC 9728 puts the document at the origin root, path-suffixed. Measured just now:
| URL | Status |
|---|---|
|
api.anthropic.com/.well-known/oauth-protected-resource/v1/design/mcp| 404 ||
api.anthropic.com/.well-known/oauth-protected-resource/v1/design| 404 ||
api.anthropic.com/.well-known/oauth-protected-resource| 404 ||
api.anthropic.com/v1/design/.well-known/oauth-protected-resource| 200 ||
mcp.linear.app/.well-known/oauth-protected-resource/mcp(working server, for contrast) | 200 |The Design document sits inside the path rather than at the origin root. The
WWW-Authenticateheader on a 401 does advertise the correct location:but discovery does not appear to follow it.
What that leaves in
.credentials.jsonWorking servers store a resolved metadata URL.
claude_designstores a failure:No
resourceMetadataUrlat all, and it falls back to the origin root as the authorization server. The client then buildshttps://api.anthropic.com/authorize?..., which serves the "Sign-in endpoint retired" page — the same decommissioned endpoint reported in #77620. So the browser flow can never complete, the token never gainsuser:design:*, and every request comes back:The correct chain, if discovery reached it, is:
/v1/design/.well-known/oauth-protected-resource→claude.ai/v1/design/mcp→authorization_endpoint: https://claude.ai/oauth/authorize.Deleting the cached entry does not help
I removed the
claude_designentry frommcpOAuthand retried. It is rebuilt with a freshclient_idand callback port and the sameoauthMetadataFound: false. This is a repeatable discovery failure, not a poisoned cache.Two smaller things that make this hard to self-diagnose
claude mcp get claude_designsay "Run /design-login". That command is not registered in 2.1.251 — typing it does nothing./design loginreaches the bundled design-canvas skill, which replies that Claude Design account commands are not handled in this preview. So the advertised fix is unreachable by either spelling.claude.ai/v1/design/mcp/.well-known/openid-configurationreturned 200 on 11 of 12 requests and acf-mitigated: challenge403 on one, from a plain non-browser client. Minor next to the path issue, but it would make any retry flaky.Ask
Either serve the protected-resource document at the RFC 9728 location, or have discovery honour the
resource_metadatavalue fromWWW-Authenticate. Fixing the remediation string to name a command that exists would help separately.Happy to supply request IDs or the full discovery trace if useful.