[BUG] Cowork macOS: all claude.ai-hosted MCP connectors fail — desktop OAuth token requested without `user:mcp_servers` scope
Symptom
In every Cowork session on macOS, the claude.ai-hosted MCP connectors (Gmail, Google Drive, Google Calendar, web search) expose zero tools and any call to them is rejected. The same account, on the same machine, works fine in:
- Claude Code CLI (Gmail, web search, etc. all functional)
- Claude.app web chat (Gmail, web search, etc. all functional)
So this is not a network/firewall issue, not an account-level connector authorization issue, and not a tenant policy issue. Network reachability to the per-connector endpoints (mcp.figma.com, mcp.slack.com, mcp.linear.app, etc.) succeeds at the TLS layer; the failure is purely at the OAuth scope check.
First observed approximately 2026-05-21. Persists across multiple Claude.app updates and across sign-out / sign-in.
Smoking-gun evidence — wrong OAuth scope set
The Cowork session's SDK debug log contains this line (from ~/Library/Application Support/Claude/local-agent-mode-sessions/<...>/outputs/sdk-debug.txt):
2026-05-26T16:24:42.742Z [DEBUG] [claudeai-mcp] Missing user:mcp_servers scope (scopes=user:inference)
Cross-referenced with ~/Library/Logs/Claude/main.log, every Cowork OAuth exchange requests this scope set:
[oauth] looking up token for orgId=<...>, cacheKey=<...>:https://api.anthropic.com:user:inference user:file_upload user:profile
Claude Code CLI requests a slightly different set on the same machine:
[oauth] looking up token ... :user:inference user:profile user:sessions:claude_code
Neither set includes user:mcp_servers. Because the scope list is part of the OAuth request's cache key (not loaded from a cached token), no amount of token flushing, sign-out, or reinstall changes what scope set the app's code asks for. This points to a fix needed in the Cowork OAuth request code path — it should be requesting user:mcp_servers (or whatever the current name of the scope that authorizes the claudeai-mcp gateway is).
Downstream effects observed in the SDK log
Once the master scope is missing, the inline Cowork plugins that rely on the claude.ai gateway fail with invalid MCP url:
[ERROR] Plugin MCP server error - mcp-config-invalid: MCP server gmail invalid: Plugin design has an invalid MCP url
[ERROR] Plugin MCP server error - mcp-config-invalid: MCP server google calendar invalid: Plugin design has an invalid MCP url
[ERROR] Plugin MCP server error - mcp-config-invalid: MCP server snowflake invalid: Plugin data has an invalid MCP url
[ERROR] Plugin MCP server error - mcp-config-invalid: MCP server databricks invalid: Plugin data has an invalid MCP url
The non-gateway connectors (Slack, Linear, Notion, Figma, Atlassian, etc.) reach their endpoints successfully and then fail with Unauthorized at the per-connector OAuth handshake — also explainable by the same root cause if those flows depend on the gateway-issued token.
Repro
- Sign in to Claude.app on macOS.
- Open Cowork → new session.
- Ask "search the web for X" or "show me my latest gmail thread."
- Observe that the relevant tools are absent or that any call fails.
- Inspect
~/Library/Application Support/Claude/local-agent-mode-sessions/<org>/<session>/outputs/sdk-debug.txt— grep forMissing user:mcp_servers scope.
Environment
- Claude.app: 1.1.381 (Electron 37.10.3 / Chrome 138 / Node 22.21.1)
- macOS: 25.5.0 (Darwin 25.2.0, Apple Silicon — M3 Pro, 36 GB)
- Plan: Max
- First observed: ~2026-05-21
Troubleshooting attempted (none fixed it)
- Multiple app auto-updates during the failure window — bug persists
- Quit and relaunch
- Sign out and sign back in (forces fresh OAuth — token re-minted with same scope set, still missing
user:mcp_servers) - Rebuilt the Cowork bundle via the Help menu
- Flushed cache via Help menu options
- Verified that the same account works in Claude Code CLI and claude.ai web on the same machine
- Verified network reachability to mcp.* endpoints (TLS handshakes succeed in the log)
Why this is not the same bug as adjacent open issues
- #62548 (Gmail/Calendar "caller does not have permission" for one account) — that's account/tenant-scoped, Drive works for them; mine has all claude.ai-hosted connectors broken with no Drive exception, and the failure has explicit
Missing user:mcp_servers scopelog evidence. - #48130 / #55634 (Cowork Windows Gmail connector auth state issues) — different platform, no scope-missing log line, framed as auth-state churn rather than a never-requested scope.
- #59854 (GitHub OAuth DCR) — DCR is the per-connector flow; this report is about the upstream claude.ai gateway scope.
What I think is needed
A change in the Claude desktop app's Cowork OAuth request code path to include user:mcp_servers (or the currently-correct gateway scope name) in the scope list it sends. After that, a normal sign-in on an existing install should mint a working token with no user-side state changes needed.
Logs available
sdk-debug.txt (852 lines) and ~/Library/Logs/Claude/main.log excerpts available on request. Happy to attach to the GitHub issue or send via in-app feedback if that gets them to a specific engineer faster.
Showing cached comments. Read the full discussion on GitHub ↗
12 Comments
Found 3 possible duplicate issues:
This issue will be automatically closed as a duplicate in 3 days.
🤖 Generated with Claude Code
Thanks for the triage hits. Quick assessment:
user:mcp_serverslog evidence, different connectors-affected pattern (see "Why this is not the same bug as adjacent open issues" in the original report).[claudeai-mcp] Missing user:mcp_servers scopelog line, same macOS platform, same headless-agent-embedded-in-Claude.app shape.That said, I'd push back on closing this as a duplicate of #32000, because the two reports cover different surfaces with different scope sets and likely require fixes in different code paths:
| | #32000 (scheduled tasks) | #62556 (Cowork) |
|---|---|---|
| Surface |
ccdScheduledTasksEnabledrunner | Cowork session SDK || Requested scope set |
user:inferenceonly |user:inference user:file_upload user:profile|| Missing scope |
user:mcp_servers|user:mcp_servers|| User impact | Niche (scheduled tasks) | Broad (every Cowork session) |
Fixing the scope list in the scheduled-tasks OAuth code path will not automatically fix the Cowork OAuth code path — they're separate sites that each need to include
user:mcp_servers.I'd suggest:
Happy to defer to maintainer judgment, but flagging that #32000 has been open since March 8 with no Anthropic response, so silent consolidation risks both reports dying together. The Cowork surface is materially higher-impact for Max-tier users than scheduled tasks.
Confirmed still an issue in Claude 1.9255.0 (a22af1) 2026-05-26T04:57:41.000Z
Adding some history on this defect class for whoever picks this up, since the prior reports may not all surface via the duplicate-detection heuristic:
NOT_PLANNEDon 2026-05-02. Different surface (Desktop Extension MCPs not passed to Cowork VM) but related shape.Missing user:mcp_servers scopelog line on the scheduled-tasks surface. Still open.So this report joins a chain of related observations across surfaces (Cowork sessions, scheduled tasks, Code Web) all keyed on the same
user:mcp_serversscope check at the claudeai-mcp gateway. The cross-surface pattern suggests the OAuth scope list is set independently in each embedded-agent code path, which is why a fix on one surface may not transfer to the others — flagging in case that's useful context for the audit.In the meantime, confirmed workaround for users hitting this: connector-needing tasks work in Claude Code CLI and claude.ai web chat on the same account; only Cowork is affected.
Confirmed still an issue in Claude 1.9255.2 (1dc8f7) 2026-05-27T01:57:20.000Z
Confirmed still not working in Claude 1.9659.2 (390d6c) 2026-05-28T21:50:01.000Z
Root cause narrowed to a single 34-byte plugin file
After incremental restore from backup, the trigger is one specific file in one specific third-party plugin:
settings.jsonat the plugin root of Ibrahim-3d/nano-banana-claude-plugin, containing exactly:Removing only this 34-byte file (keeping every other file in the plugin, including the agent definition at
agents/gemini-image-gen.md) restoresuser:mcp_serversin the OAuth scope set and brings every claude.ai-hosted MCP connector back. Adding it back drops the scope again, reproducibly.Bisect path (full reproducer)
~/Library/Application Support/Claude/→ fresh sign-in → Gmail / web search work.hooks/hooks.jsonschema violation → bug still presentcommands/genimage.md↔skills/genimage/name collision → bug still presentsettings.json→ bug goneSo contrary to my initial hypothesis, the malformed
hooks.jsonwas not the OAuth trigger — it's a real schema bug but independent of this regression. The actual trigger is the plugin-rootsettings.jsondeclaring a top-levelagentfield.OAuth scope evidence in the latest launch
From
~/Library/Logs/Claude/main.logduring a session with the unmodified plugin installed:— scope set lacks
user:mcp_servers, leading to the[claudeai-mcp] Missing user:mcp_servers scopefailure that surfaces as "no Gmail connector," "no web search," etc.After removing only
settings.json:(or a scope set that includes
user:mcp_servers— same effect: connectors come back).Plugin author fix
Submitted upstream:
settings.json(plus fixes the hooks.json schema and the command/skill collision while we're here, since they're also real bugs)Once that lands and propagates to anyone with the plugin installed, this trigger is removed at the source for nano-banana users.
Anthropic-side defense-in-depth
The plugin author's fix removes one trigger from the wild, but the underlying host bug remains: any third-party plugin shipping a
settings.jsonwith an unexpected/unsupported field will silently regress global Cowork OAuth scopes for the entire session. The host should fail closed in the plugin scope (load the plugin partially or reject it entirely) without contaminating the global MCP/OAuth handshake.Concrete suggested investigation targets in the desktop app:
settings.jsonat the plugin root — what does it do with anagentfield? If it's an unsupported/undocumented field, why does its presence affect the OAuth scope decision rather than being ignored?user:mcp_serverswhenever any claude.ai-hosted connectors are configured for the account, regardless of any plugin's settings or load state.user:mcp_serversunder conditions that shouldn't matter.Workaround for users who can't wait for the plugin fix
Quit Claude, then:
(Find the right ULID via
grep -l nano-banana <user-uuid>/<org-uuid>/rpm/plugin_*/.claude-plugin/plugin.json.) Launch Claude. Connectors come back; nano-banana keeps working.Or just uninstall nano-banana via the Cowork UI.
Hi @SmartCarrion,
First of all, thank you for the really thorough detective work here. It helped us find and fix the same problem on our side very quickly, so I wanted to give something back and confirm we are hit by this too.
Same symptom for us: all claude.ai connectors (Gmail, Google Calendar, Notion, Drive) returned 403 in Claude Code / Cowork on macOS, while the exact same connectors kept working perfectly in the Claude desktop chat.
Same evidence in our logs:
[claudeai-mcp] Missing user:mcp_servers scope (scopes=user:inference)
What is interesting is that our trigger was not nano-banana. For us it was a different plugin: the official "Product management" Cowork plugin (Marketplace "Anthropic & Partners", author Anthropic, version 1.2.0), which had been updated about 3 days before the connectors broke. So this seems to confirm your hypothesis that any plugin shipping a settings.json can silently drop the global OAuth scope, even a first-party one.
One extra thing worth flagging: disabling the plugin was not enough. After disabling it, it quietly re-enabled itself again later on its own. Only after fully uninstalling it (and restarting) did user:mcp_servers come back in the scope set, and all connectors started working again.
So for anyone landing here: check your recently updated Cowork plugins, and if you find the culprit, uninstall it completely instead of just disabling it.
Thanks again for the great write-up.
Thank you @faisj I spent a lot more time on it than I thought i would, and it broke a lot of trust I had in the value of Cowork! I'm really glad to see I helped someone, and it is very interesting to see the broader issue. Thanks for the details.
the per-connector Unauthorized is downstream: Slack/Linear exchange off the gateway token, which never got the scope to mint them.
@SmartCarrion thanks for the detailed scope-drop analysis. Adding a data point from a different variant in case it helps the audit.
My account (Cowork on macOS, Max plan, Google Workspace tenant overcast.com) has had the Gmail and Google Calendar connectors returning "The caller does not have permission" on every call since April 20, 2026. The difference from your report: Drive on the same account works normally, and other users on the same Workspace tenant run Gmail and Calendar without issue. So mine presents as partial, account-scoped breakage rather than all-connectors-down.
I checked my installed Cowork plugins and none ship a settings.json with a top-level agent field, so the plugin trigger you bisected does not appear to be my cause. But the shared symptom (Gmail and Calendar failing at the OAuth scope check while Drive survives) suggests the same user:mcp_servers gateway scope path may be involved, reached by a different route.
Root-cause discussion is in anthropics/claude-ai-mcp#229. My own report is anthropics/claude-code#62548 (closed as duplicate). Support ticket 215474011486857 has been open 40+ days with no substantive human reply.
Happy to provide request_ids and exact timestamps for failing Gmail and Calendar calls through any secure channel. Flagging in case a maintainer with token-state access can diff my account against a working user on the same tenant.
Adding an account-scoped variant of this defect, in case it helps bound the root cause.
My account (Cowork on macOS, Google Workspace tenant overcast.com) has had Gmail and Calendar returning "The caller does not have permission" on every call since April 20, with one difference from the all-connectors-down reports here: Drive on the same account works normally, and other users on the same tenant run Gmail and Calendar without issue. So mine presents as partial and account-scoped rather than global.
I ruled out the plugin trigger that @SmartCarrion bisected: no installed plugin on my account ships a settings.json with a top-level agent field, and the all-connectors-down pattern does not fit (Drive survives). So if this is the same underlying user:mcp_servers gateway scope path, it is being reached by a different route than the plugin settings.json one.
What seems consistent across the reports here: the failing layer is the gateway-issued token, and restricted scopes (Gmail, Calendar) get dropped while a sensitive scope (Drive) survives. The corroboration from @faisj that a first-party Anthropic plugin can also trigger the scope drop suggests the scope construction is fragile independent of any one plugin.
One ask for whoever picks up the gateway fix: alongside correcting the scope list construction, it would help to have a way to clear or re-mint stuck per-account gateway token state. Client-side re-auth does not fix my case because it re-attaches to the same token lineage. I am happy to provide my account email, request_ids, and exact timestamps as a test case for that path through any channel a maintainer prefers.