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
- Run Claude Code inside Claude Desktop (not a standalone terminal).
- From it, run any subprocess that calls the camera authorization API (e.g. via a tool that streams an iOS device screen).
- Observe the request resolves to
notDetermined/granted=NO with no system dialog, indefinitely.
- Run the identical command from a terminal app with
NSCameraUsageDescription declared (e.g. kitty) — the system prompt appears normally.
Environment
~/Library/Application Support/Claude/claude-code/2.1.219/claude.app)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 staysnotDeterminedforever — 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:
~/Library/Application Support/Claude/claude-code/2.1.219/claude.app/Contents/Info.plisthas noNSCameraUsageDescriptionkey, while the top-level/Applications/Claude.app/Contents/Info.plistdoes. Because the responsible process (com.anthropic.claude-code) lacks the usage description, macOS refuses to show the authorization prompt at all and returnsnotDetermined/granted=NOimmediately. 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 declareNSCameraUsageDescription(e.g. kitty) works correctly, confirming the embedded app'sInfo.plistis the blocker.Expected behavior
The embedded
claude-code.app'sInfo.plistshould includeNSCameraUsageDescription(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
notDetermined/granted=NOwith no system dialog, indefinitely.NSCameraUsageDescriptiondeclared (e.g. kitty) — the system prompt appears normally.