Skip to content

[BUG] Embedded claude-code.app lacks NSCameraUsageDescription, causing silent TCC denial for subprocesses requesting camera access #82543

Description

@truebit

Environment

  • Claude Desktop: 1.24012.9
  • Embedded Claude Code: 2.1.219 (~/Library/Application Support/Claude/claude-code/2.1.219/claude.app)
  • macOS: 15.7.7 (24G720)

Description

When a subprocess spawned from Claude Code running inside Claude Desktop requests macOS camera authorization (e.g. AVCaptureDevice.requestAccess), the request is silently denied and the authorization status stays notDetermined forever — no system permission dialog ever appears.

Root cause

TCC attributes the camera request to the nearest signed ancestor process with its own bundle identity. For subprocesses launched from Claude Code inside Claude Desktop, that's the embedded app itself:

/Applications/Claude.app (com.anthropic.claudefordesktop)   -- HAS NSCameraUsageDescription
  └─ Contents/Helpers/disclaimer
      └─ claude-code/<version>/claude.app (com.anthropic.claude-code)  -- MISSING NSCameraUsageDescription
          └─ shell → subprocess requesting camera access

~/Library/Application Support/Claude/claude-code/2.1.219/claude.app/Contents/Info.plist has no NSCameraUsageDescription key, while the top-level /Applications/Claude.app/Contents/Info.plist does. Because the responsible process (com.anthropic.claude-code) lacks the usage description, macOS refuses to show the authorization prompt at all and returns notDetermined/granted=NO immediately. This is standard macOS TCC behavior for apps missing a required usage-description key.

tccutil reset Camera com.anthropic.claude-code, quitting/relaunching, and toggling System Settings → Privacy & Security → Camera all have no effect, since there is no dialog to grant in the first place.

Impact

Any tool or subprocess invoked from within Claude Code (running inside Claude Desktop) that needs camera-class access — e.g. tools that stream an iOS device's screen via idb_companion, which macOS treats as a camera capture device — cannot ever obtain authorization. The same command run from a terminal app that does declare NSCameraUsageDescription (e.g. kitty) works correctly, confirming the embedded app's Info.plist is the blocker.

Expected behavior

The embedded claude-code.app's Info.plist should include NSCameraUsageDescription (and ideally the same usage-description keys as the top-level app) so that subprocesses it spawns can trigger a normal camera authorization prompt.

Reproduction

  1. Run Claude Code inside Claude Desktop (not a standalone terminal).
  2. From it, run any subprocess that calls the camera authorization API (e.g. via a tool that streams an iOS device screen).
  3. Observe the request resolves to notDetermined/granted=NO with no system dialog, indefinitely.
  4. Run the identical command from a terminal app with NSCameraUsageDescription declared (e.g. kitty) — the system prompt appears normally.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions