computer-use MCP returns "permission(s) not yet granted" on macOS 26.5 despite comprehensive TCC grants — orphaned per-version helper at ~/Library/Application Support/Claude/claude-code/<ver>/
Summary
Built-in computer-use MCP returns "macOS Accessibility and Screen Recording permission(s) not yet granted" from request_access and list_granted_applications on macOS 26.5 (Tahoe) with CLI v2.1.114, even when every plausible TCC principal is granted in both panes. The failure persists across CLI restarts. Evidence strongly suggests the gate is not macOS TCC state — it is an internal per-CLI-version helper-bundle / .verified sentinel under ~/Library/Application Support/Claude/claude-code/<VERSION>/, which auto-update did not re-provision.
Likely a variant of / related to #41538, #42404, #31647.
Environment
- macOS: 26.5 (Darwin 25.5.0), ARM64
- Claude Code CLI: v2.1.114 (installed under
~/.local/share/claude/versions/) - Terminal: Warp 0.2025.x (auto-updates via staged binary under
~/Library/Application Support/dev.warp.Warp-Stable/old) - Plan: Max 5x, authenticated via claude.ai
- CLI identity:
codesign -d -r-on~/.local/share/claude/versions/2.1.114: Identifier=com.anthropic.claude-codeTeamIdentifier=Q6L2SF6YDW- Designated requirement is identifier-based (not cdhash)
Reproduction
- CLI v2.1.111 installed and computer-use enabled on 2026-04-16; helper bundle auto-provisioned at
~/Library/Application Support/Claude/claude-code/2.1.111/. - CLI auto-updated 2.1.111 → 2.1.112 → 2.1.113 → 2.1.114 over subsequent days.
- Invoking
mcp__computer-use__request_accessormcp__computer-use__list_granted_applicationsin v2.1.114 returns the "permission(s) not yet granted" error, even though:
- CLI binary
com.anthropic.claude-codeON in both Accessibility and Screen Recording panes. - Claude Desktop app
com.anthropic.claudefordesktopON in both panes. - Warp (
dev.warp.Warp-Stable) ON in both panes. - Bash, axorc, tmux, python3.14, uv, AEServer all ON in Accessibility.
Diagnostic observations
~/Library/Application Support/Claude/claude-code/contains only2.1.111/— no 2.1.112/.113/.114 directories. Despite v2.1.114 being the running CLI for multiple days.- The 2.1.111 directory contains a zero-byte
.verifiedsentinel and a fullclaude.app/bundle (Contents/{Info.plist,MacOS/claude,_CodeSignature/CodeResources}). Info.plist hasCFBundleIdentifier=com.anthropic.claude-code,CFBundleVersion=2.1.111,LSBackgroundOnly=true. - Strings of the flat CLI binary show
libComputerUseSwift.dylib,runComputerUseMcpServer,createComputerUseMcpServerForCli,AppBundleResolver.swift, and build artifacts frompackages/desktop/claude-swift/Sources/ComputerUseSwift/— the Swift extraction pipeline is linked in. - Literal
.verifiedis NOT a string constant in the flat CLI — path is runtime-constructed.
Hypothesis
The CLI's computer-use gate first-checks for a per-version support directory with .verified + valid claude.app/ bundle. If absent, request_access short-circuits to "not granted" regardless of actual macOS TCC state. Auto-update did not re-run the provisioning code path that originally minted 2.1.111/, leaving the directory orphaned at 2.1.111 while the running CLI is 2.1.114. This is consistent with the "helper missing" pattern in #31647 and the macOS-26-specific failure mode in #41538 / #42404.
What does not fix it
- Granting CLI binary + Desktop app + Warp (both
/Applicationsand stagedold) in both panes. - Two
/quit+ freshclaude+/resumecycles. - Waiting 90s for TCC propagation quirk.
What might fix it (not yet tried, to avoid further local mutation)
/mcp disable computer-usefollowed by/mcp enable computer-use— to re-trigger the SwiftAppBundleResolverextraction code path that originally created2.1.111/. Risk: if the gate is ".verifiedexists for ANY version", the 2.1.111/ sentinel short-circuits this into a no-op.- Moving/deleting
2.1.111/to force re-extraction on re-enable. - Fresh CLI reinstall via the canonical installer.
These were designed as a fix ladder but not executed pending upstream guidance — manual re-bundling ran into the identifier com.anthropic.claude-code + Team Q6L2SF6YDW Developer-ID requirement, which is not locally reproducible.
Requests
- Document the per-CLI-version support-dir mechanism at
~/Library/Application Support/Claude/claude-code/<VERSION>/— whether.verifiedis sufficient or the fullclaude.appis required, how it is provisioned, and what regenerates it. - Fix the auto-update path to re-provision the support dir for the new version (or migrate it forward in place).
- Surface a clearer error than "permission(s) not yet granted" when the internal gate (not macOS TCC) is the blocker. Current message sends users on a long, fruitless TCC diagnosis.
- Provide a
claude doctor-style diagnostic or documented recovery command (e.g.,claude computer-use --reinit) so users can force re-provisioning without a full reinstall.
Happy to provide
- Full
codesign -dvvv,codesign -d -r-, and Info.plist dumps of both the flat CLI and the 2.1.111 helper. ls -laof the support dir tree.stringsgrep output for the relevant symbols.- Full plan/investigation file if helpful (3 rounds of adversarial-council review led us to this hypothesis).
Related
- #41538 — Built-in computer-use MCP: checkAccessibility undefined on macOS Tahoe
- #42404 — computer-use MCP fails on macOS Tahoe 26
- #31647 — Cowork runtime missing from macOS app bundle
9 Comments
Found 3 possible duplicate issues:
This issue will be automatically closed as a duplicate in 3 days.
🤖 Generated with Claude Code
This is a good diagnosis. The evidence points away from raw macOS TCC state and toward Claude Code's own per-version helper provisioning as the actual gate.
The strongest clues are:
~/Library/Application Support/Claude/claude-code/<VERSION>/That pattern fits a versioned helper/sentinel model much better than a genuine permission denial. macOS thinks the app is allowed, but Claude Code is checking for a per-version helper bundle or
.verifiedmarker that was never re-created after update.In other words, the user-facing error says "permission(s) not yet granted," but the real failure is likely "internal version-specific helper state missing or stale."
That is important because it sends users to the wrong place to debug. They keep toggling TCC permissions when the actual fix is probably re-provisioning the helper for the current version.
The robustness rule here should be: auto-update must either
computer-useinvocation for the new versionNever require manual permission surgery when the OS permissions are already correct.
This also matches a broader theme this week: version-specific hidden state (helpers, locks, model IDs, plugin manifests) drifting out of sync with the visible runtime state. The misleading permission error is a symptom of that same control-plane consistency problem.
hit this exact pattern shipping our macOS agent. the tell is that TCC state is correct but an app-side sentinel is stale, which is why toggling Accessibility and Screen Recording in System Settings does nothing. anything that caches a .verified marker under ~/Library/Application Support/<app>/<version>/ breaks on auto-update unless the updater explicitly migrates or lazily re-provisions.
the other trap is designated requirement drift. if the CLI is identifier-based (not cdhash) TCC will persist across versions, so the OS side looks fine, but internal gates that verify bundle layout fail because the extracted claude.app/ under 2.1.111/ doesn't match 2.1.114 strings. blowing away the whole claude-code/ dir and letting /mcp enable re-extract has been the only reliable fix for us. the real bug is that request_access short-circuits on missing helper rather than actually calling AXIsProcessTrustedWithOptions and reporting the true TCC state.
Confirming this bug — additional data point from CLI v2.1.118, macOS 15.x (Sequoia).
Same root pattern as reported. Support dir frozen at an old version:
Installed 2.1.101 on 2026-04-16, auto-updated through multiple versions to 2.1.118 over the following week. No
2.1.118/directory was ever provisioned. Only the original install version has the.verifiedsentinel +claude.app/helper bundle.Additional symptom variant
Slightly different surface from the OP: in my setup, computer-use works right after each cold CLI launch, then breaks mid-session — sometimes after macOS sleep/wake, sometimes without an obvious trigger. Full
/exit+clauderecovers temporarily until the next mid-session failure. Host terminal (Ghostty 1.3.1,com.mitchellh.ghostty) remains granted in both Accessibility and Screen Recording panes throughout.That points to at least two failure modes under the same root cause:
request_accessshort-circuits from first invocation (OP's case).verifiedwas never writtenBoth converge on the per-version support-dir provisioning that auto-update doesn't re-run.
Environment
~/.npm-global/lib/node_modules/@anthropic-ai/claude-code/)com.mitchellh.ghostty, TeamID 24VZTF6M5V)node_modules/@anthropic-ai/claude-code-darwin-arm64/claudecomputer-usev0.1.3 (from MCP connection log:{"name":"computer-use","version":"0.1.3"})Error surface
From
mcp__computer-use__list_granted_applicationsandrequest_access:CLI dialog:
Try againdoes not recover.request_accessfollowup after apparent system settings toggles does not recover. Only full CLI restart does — and only until the next mid-session failure.+1 on OP's asks
Especially:
Happy to test any supported recovery sequence (
/mcp disable computer-use, stale-version-dir removal, targeted reinstall) and report back results on this CLI version.Same - also experienced this bug despite having checked both are granted. Killed Claude, rebooted laptop, nothing works.
I'm on MacOS Sonoma 14 and CLI 2.1.104
Accessibility: ✘ not granted
Screen Recording: ✔ granted
Closing for now — inactive for too long. Please open a new issue if this is still relevant.
Hit the same error string with a different root cause — worth noting for people landing here:
The built-in computer-use MCP runs inside the CLI process, so TCC needs the CLI binary itself, not the terminal app:
readlink -f $(which claude)— resolves to…/@anthropic-ai/claude-code/bin/claude.exe(yes, it is really named.exeon macOS — build artifact, it works; don't double-click it, macOS hands.exeto The Unarchiver)open -R "$(readlink -f $(which claude))"— Spotlight doesn't index/opt/homebrew, so the permission dialog's search field will never find itclaude.exefrom Finder into both Accessibility and Screen & System Audio Recording, enable the togglesclaude --resumekeeps your session contextTerminal/Claude.app grants are not enough — the cruel part is that shell
screencapturecan work through the terminal's grant while the MCP stays blocked, so quick sanity checks look fine.If all of that is correct and it still loops, check the orphaned per-version helper described in this thread (
~/Library/Application Support/Claude/claude-code/<VERSION>/) — same error string, distinct cause. For what it's worth: on my machine a helper dir three versions behind the CLI works fine once the TCC side is fixed, so a version mismatch alone isn't proof.Same symptom on macOS 26 / CLI 2.1.263 (native install), with what I believe is the actual root cause after tracing it.
Symptom:
computer-useMCPrequest_accessreturns "macOS Screen Recording permission(s) are still not granted" although Screen Recording and Accessibility are granted to Claude.app, iTerm and the browser, and the Claude desktop app's own Computer use (Settings → Computer use) shows both as "Granted" and works.Root cause: the per-version helper store
~/Library/Application Support/Claude/claude-code/<version>/(.verified+claude.app, bundle idcom.anthropic.claude-code) is written by the desktop app, not by the CLI. The provisioning code lives in the desktop app'sapp.asar(findInstalledBinaryPath(storageDir, version, ".verified"), a hashing writer for.verified, a "[CCD] Binary preflight: .verified marker missing but binary exists …" log line), and the app bundles a fixed runtime version — Claude.app 1.46388.4 carriesclaude-code/0.3.260, i.e. CLI 2.1.260. The native CLI auto-updates independently (2.1.260 → 2.1.261 → 2.1.263 within 48 h on this machine), and the CLI's computer-use gate looks for a helper matching the running CLI version. So every CLI auto-update that outruns the app's bundled runtime breaks computer-use for terminal-launched sessions until the next desktop release catches up — and then it reopens on the next CLI release. On this machine the store contains only2.1.260/(created 2026-09-04 07:00, hours after the CLI installed 2.1.260 — i.e. when the app provisioned it), nothing for 2.1.261 or 2.1.263.Things that do NOT provision a helper for the running CLI version (all tried):
/mcp disable computer-use+/mcp enable computer-use(with and without the stale dir present),claude install, a fresh interactiveclaudestart, aclaude -p …run, toggling "Enable computer use" off/on in the desktop app, relaunching the desktop app. Copying the 2.1.260claude.app+.verifiedinto a2.1.263/directory is rejected by the gate (the.verifiedhash is version-specific), so it can't be worked around locally.claude doctorreports no issues.Suggested fix: either (a) have the CLI's computer-use gate accept the app-managed helper regardless of the CLI's own version (the helper is the app's runtime and works fine), or (b) have the CLI provision its own helper on update, or (c) at minimum surface "helper bundle missing for <version>" instead of a misleading TCC error.
Workaround for anyone hitting this: run the session on the app-bundled CLI version, e.g.
~/.local/share/claude/versions/2.1.260 --resume <session-id>, or launch the session from the desktop app's Claude Code view (which spawns the bundled runtime).This issue was incorrectly closed by the github-actions, despite originally having reproduction steps and Claude version. This bot behavior is tracked in https://github.com/anthropics/claude-code/issues/87647. Consider upvoting that issue for visibilty, maybe the bot behavior gets fixed.