Claude Code app bundle missing NSLocalNetworkUsageDescription — silent LAN connection failures on macOS Sequoia
Summary
On macOS Sequoia (and macOS 26.x), the Claude Code app bundle at /Users/<user>/Library/Application Support/Claude/claude-code/<version>/claude.app is missing the NSLocalNetworkUsageDescription key in its Info.plist. As a consequence, all socket connections from Claude Code (and its child processes — Bash tool, MCP servers) to private/RFC1918 LAN destinations other than the default gateway fail silently with instant kernel-level rejects (HTTP=000 in ~0.001s, "No route to host" / EHOSTUNREACH).
The same connections succeed from any normal terminal (Alacritty, Terminal.app) on the same machine, same Wi-Fi/LAN, because those terminals are not subject to Apple's Local Network privacy gate (or were granted permission via prompt earlier).
Reproduction
# From inside Claude Code's Bash tool:
curl -sk --max-time 5 https://10.10.0.20:5001 -o /dev/null -w "%{http_code} %{time_total}\n"
# → 000 0.001 (silent kernel deny)
# From the same machine's Terminal.app at the same time:
curl -sk --max-time 5 https://10.10.0.20:5001 -o /dev/null -w "%{http_code} %{time_total}\n"
# → 200 0.16
Pattern matches Apple's Local Network privacy denial signature exactly:
- Default gateway: works (router has special handling)
- Internet (1.1.1.1, 8.8.8.8): works
- Other LAN hosts: instant 0.001s reject (no SYN sent)
- ICMP to LAN hosts: 100% loss
Root cause
$ codesign -d --verbose=2 /Applications/Claude.app # parent
Identifier=com.anthropic.claudefordesktop # bundle ID A
$ codesign -d --verbose=2 ".../claude-code/2.1.119/claude.app" # CLI bundle
Identifier=com.anthropic.claude-code # bundle ID B (different!)
$ plutil -p ".../claude-code/2.1.119/claude.app/Contents/Info.plist" \
| grep -i UsageDescription
"NSMicrophoneUsageDescription" => "Claude Code uses the microphone for voice dictation."
# → Note: NO NSLocalNetworkUsageDescription
macOS TCC tracks Local Network permission per bundle ID. The Claude Desktop parent (com.anthropic.claudefordesktop) is listed in System Settings → Privacy & Security → Local Network and its grant doesn't propagate to the child com.anthropic.claude-code bundle. And without NSLocalNetworkUsageDescription in the child bundle's Info.plist, macOS never prompts the user for consent — and the bundle never appears in the Local Network list, so the user has no UI path to grant access.
Verification of root cause
I patched the Info.plist locally (added NSLocalNetworkUsageDescription, ad-hoc re-signed). The bundle still didn't get prompted because:
- Apple's Local Network prompt fires on
nw_connection_*(Network framework) calls - It does NOT fire on POSIX
connect()calls used by curl/node/most CLI tools - So even with the description in place, curl-style child processes silently fail
The fix has to come from the official Claude Code bundle: ship NSLocalNetworkUsageDescription in the Info.plist by default, AND trigger one Network-framework discovery early in claude binary startup so macOS surfaces the prompt and adds the bundle to the Local Network list. Once granted, all child processes (curl, node MCP servers, etc.) inherit reach via the granted bundle ID.
Suggested fix
Add to claude.app/Contents/Info.plist:
<key>NSLocalNetworkUsageDescription</key>
<string>Claude Code accesses local network hosts (LAN-only services such as private servers, internal databases, and MCP servers on RFC1918 addresses).</string>
Optionally also include NSBonjourServices if mDNS service discovery is in scope.
Then ensure the claude binary makes one nw_path_monitor/nw_connection_* call early in startup (or on first LAN-targeted request) so the prompt is presented and the bundle is registered with TCC.
Impact
- Affects every Claude Code user on macOS Sequoia / macOS 26 trying to reach LAN-only services.
- Common workflows broken: connecting to internal NAS, on-prem databases, MCP servers on private IPs, lab environments.
- Workaround today is to route LAN traffic through a VPN tunnel (Tailscale + manual
sudo route add), which is fragile across network changes.
Environment
- macOS 26.3 (build 25D5087f)
- Claude Code 2.1.119
- Claude Desktop wrapper from Anthropic PBC (Q6L2SF6YDW)
- Bundle ID:
com.anthropic.claude-code(noNSLocalNetworkUsageDescription)
References
- Apple docs: https://developer.apple.com/documentation/network/preventing-insecure-network-connections#Add-an-Exception-for-Local-Network-Access
- TCC reference for Local Network:
kTCCServiceLocalNetwork
This issue has 3 comments on GitHub. Read the full discussion on GitHub ↗