[BUG] macOS TCC Full Disk Access: Claude Code cannot grant permissions programmatically — blocks MCP server workflows
Resolved 💬 1 comment Opened Mar 31, 2026 by jlacerte Closed Mar 31, 2026
Description
Claude Code on macOS cannot programmatically grant Full Disk Access (TCC kTCCServiceSystemPolicyAllFiles) to binaries. This blocks real-world MCP server workflows where child processes need access to TCC-protected files.
Specific Case
- OpenClaw (AI agent gateway) spawns
imsg(iMessage CLI) which needs to read~/Library/Messages/chat.db - After
brew install imsgreplaced the binary, macOS TCC revoked Full Disk Access for the new binary - The Node.js parent process (
openclaw-gateway) is in the TCC database withauth_value=0(denied) sudo sqlite3on the TCC database fails because SIP is enabled (read-only)tccutil.py(third-party) fails because raw binaries have noInfo.plist/ bundle ID- The only fix is manually toggling a switch in System Settings — no CLI path exists
What We Tried
sudo sqlite3 /Library/Application Support/com.apple.TCC/TCC.db "UPDATE access SET auth_value=2..."→ blocked by SIPsudo python3 tccutil.py -e --full-disk-access -p /path/to/node→ "Could not locate a valid Info.plist"tccutil reset All→ only resets, cannot grant- Launching gateway from Terminal.app (which has FDA) → child processes don't inherit TCC
Expected Behavior
Claude Code (or Computer Use) should be able to help users manage macOS system permissions when needed for MCP server workflows. Currently there is no programmatic path.
Suggestions
- Document this TCC limitation clearly for MCP server developers on macOS
- Consider using Computer Use to navigate System Settings when TCC changes are needed
- Provide a
claude tcc granthelper that guides users through the manual steps
Environment
- macOS Tahoe (Darwin 25.3.0)
- Apple Silicon M4 Pro, 24GB RAM
- Claude Code (Opus 4.6)
- SIP: enabled
- Canada region
Additional Context
Computer Use (research preview) was also inaccessible — the toggle was not visible in Claude Desktop Settings in Canada. This may be a region restriction that isn't documented.
This issue has 1 comment on GitHub. Read the full discussion on GitHub ↗