Claude Desktop update breaks LAN SSH/network access (OPERON_SANDBOXED_NETWORK=1)
Description
After a Claude Desktop update (March 23, 2026), all local network access from Claude Code running inside Claude Desktop is blocked. SSH, SCP, ping, curl to LAN hosts all fail with "No route to host". This was working fine before the update.
Environment
- Claude Desktop on macOS (Darwin 25.3.0, Apple Silicon)
- Claude Code running inside Claude Desktop (
CLAUDE_CODE_ENTRYPOINT=claude-desktop) - LAN subnet:
192.168.10.x - Local IP:
192.168.10.62(en0, correct subnet) - Target host:
192.168.10.216(Mac Mini on same subnet)
Symptoms
ping 192.168.10.216→ "No route to host"ssh hosmera@192.168.10.216→ "No route to host"curl http://192.168.10.216:5050/→ connection refusednc -z 192.168.10.216 22→ fails- Same commands from a regular terminal work fine
- ARP entry exists and is valid
- Route table is correct (
route getshows proper interface)
Root cause
New environment variable OPERON_SANDBOXED_NETWORK=1 is set in Claude Code's process environment when launched from Claude Desktop. This was not present before the update. Unsetting it in the shell doesn't help — the restriction appears to be enforced at the macOS sandbox profile level.
Impact
This breaks any workflow that involves deploying code to local servers, SSHing into local machines, or interacting with LAN services. In our case, we use SSH/SCP to deploy a Flask app to a production Mac Mini on the local network — a workflow that's been working for weeks.
Expected behavior
Claude Code running inside Claude Desktop should be able to reach hosts on the local network, as it did before this update. At minimum, there should be a user-facing setting to allow LAN access.
Workaround
Run Claude Code from the CLI (claude command in terminal) instead of Claude Desktop — the CLI does not have the network sandbox.
Showing cached comments. Read the full discussion on GitHub ↗
12 Comments
I believe I found the same issue — Claude Desktop MCP servers can't reach local network (192.168.x.x)
Ran into this today trying to connect a Home Assistant MCP server to Claude Desktop on Darwin 25.4.0 / MacBook Pro Intel 16,1.
I closed my bug as a duplicate, referenced here for more info/different use case: https://github.com/anthropics/claude-code/issues/44556
Any MCP server subprocess (uvx, Python venv, mcp-proxy) fails immediately with
httpx.ConnectError: All connection attempts failedwhen trying to reach a LAN IP. Same binaries work fine from Terminal with identical env vars.Spent a while ruling things out before finding this issue:
codesign -d --entitlementsshows nocom.apple.security.app-sandboxtccutil reset LocalNetworkfails with exit code 70EHOSTUNREACH/ENETUNREACHat the OS levelThe
OPERON_SANDBOXED_NETWORK=1env var mentioned in this issue explains everything. Subprocesses inherit that env and get network-sandboxed, blocking LAN routing entirely.Workaround that works: HA's native MCP server supports a direct HTTP connection (
"type": "http"in~/.claude/settings.json). Claude Code CLI uses this natively without spawning a subprocess, so it bypasses the sandbox entirely. Claude Desktop has no equivalent — any stdio MCP server is broken on LAN.This is a significant regression for anyone using locally-hosted MCP servers. Would be great to see either an allowlist mechanism for specific LAN subnets, or a way to opt specific MCP servers out of network sandboxing.
Confirmed reproduction on Claude Desktop 1.1062.0 (MCP remote servers on LAN blocked)
Same issue affecting remote MCP servers configured via mcp-remote in claude_desktop_config.json. All connections to local network addresses (192.168.x.x) fail with EHOSTUNREACH when spawned through Claude Desktop, while the same command works fine from a regular terminal.
Reproduction:
Key finding: The disclaimer binary has no bundle ID (kMDItemCFBundleIdentifier = null) and no network entitlements, so macOS cannot grant it local network access through the normal Privacy & Security permissions panel — Claude does not appear in the Local Network list at all.
Impact: Any MCP server running on the local network and configured via mcp-remote is completely unreachable. External HTTPS servers work fine (e.g. Home Assistant via duckdns). Only RFC1918 addresses are blocked.
Environment: macOS, Claude Desktop 1.1062.0, mcp-remote 0.1.38
Additional affected use case: stdio MCP servers for local home automation
I'm hitting this same issue on Claude Desktop 1.3109.0 / macOS 26.4.1 (Build 25E253, x86).
In my case the regression breaks stdio MCP servers entirely — not just Claude Code's bash tool. Specifically:
homeassistant-mcp(Python/pipx) connecting tohttps://192.168.1.26:8123frigate-mcp(Python/venv) connecting tohttp://192.168.1.26:5000Both were working correctly before the update. Both now fail with
Errno 65: No route to host/httpx.ConnectError: All connection attempts failed.Confirmed root cause via direct reproduction
The
disclaimerhelper — which Claude Desktop uses to spawn all stdio MCP server processes — is the vector. It causes the child process to lose the Local Network entitlement.OPERON_SANDBOXED_NETWORKisNOT SETin the environment of the disclaimed process, so this appears to be enforced purely at the macOS sandbox profile level, not via the env var.Setting
OPERON_SANDBOXED_NETWORK=0in the MCP server'senvblock inclaude_desktop_config.jsonhas no effect.Impact
This completely breaks any stdio MCP server that connects to local network resources — home automation, local databases, NAS devices, etc. There is currently no workaround within Claude Desktop's configuration.
Additional affected surface: Claude Desktop's built-in SSH remote workspaces (
/ssh:user@host:/path)Confirming this regression on Claude Desktop 1.3561.0 / macOS also breaks a third surface beyond the ones discussed above (Bash-tool
ssh/ping/curland stdio MCP servers): Claude Desktop's first-party SSH remote workspace feature. Different code path, different enforcement layer, same root cause.Symptom
Any
/ssh:user@host:/pathworkspace pointing at a LAN host fails immediately withEHOSTUNREACH:(
~/Library/Logs/Claude/ssh.log)Different code path than the
disclaimerissueSSH2ConnectionandRemoteServerControllerrun inside Claude Desktop's main process — there is noContents/Helpers/disclaimerinvolved on this path. Network I/O is routed through Chromium's network-service helper:That helper has its own Seatbelt sandbox profile compiled into the build, and it appears to apply the same RFC1918 block.
Confirms env-var workaround is partial
Reproducing what others found re
OPERON_SANDBOXED_NETWORK=0:OPERON_SANDBOXED_NETWORK=0 open -a Claudedoes propagate the override (verified — a Bash tool call in the running session reportsecho $OPERON_SANDBOXED_NETWORK→0).node -e "require('net').createConnection({host:'192.168.50.100',port:22})..."from a Bash subprocess succeeds under the override (so for at least some subprocess paths the env override does help, contrary to what you'd expect from earlier comments — possibly varies by how the subprocess is launched).SSH2Connectionin the main process still fails withEHOSTUNREACH— the network-helper sandbox doesn't read the env var.So there are at least three enforcement layers active, and they don't all respond to the same knobs:
disclaimer-spawned MCP subprocesses → blocked at macOS sandbox profile attached to the disclaimer helper (no env-var opt-out)OPERON_SANDBOXED_NETWORK=0OPERON_*env-var auditI grepped every
OPERON_*symbol inapp.asarlooking for an allow-list / per-host opt-out. Result: only the binaryOPERON_SANDBOXED_NETWORKflag exists. NoOPERON_ALLOWED_HOSTS, no per-CIDR mechanism, no Settings UI toggle.Impact for SSH workspaces specifically
For users with self-hosted dev machines on LAN (workstation, Jetson, Mac Mini server, NAS, etc.), SSH remote workspaces are completely unusable on Claude Desktop until this is addressed. Current workarounds:
claudeCLI (no Operon sandbox).100.xTailscale address slips through.Requested fix (echoing earlier comments)
Either an allow-list mechanism (per-host or per-CIDR, e.g.
OPERON_ALLOWED_HOSTS=192.168.50.0/24) or a Settings toggle to disable the network sandbox entirely, applied consistently across all three enforcement layers above.Update: connection succeeded after no code/config change
Following up on my SSH-workspace report above — without changing anything in Claude Desktop's config, env, or version, SSH workspace connections to the same
192.168.50.100host started succeeding. The only thing I changed in my physical setup around the same time was plugging the MacBook into power; that may well be coincidence rather than causal.Things I did not change between failure and success:
OPERON_SANDBOXED_NETWORKenv (still0from the launch override)Possible explanations worth considering:
Logging this in case anyone else sees intermittent rather than total failure — it may help narrow down which of the three enforcement layers is actually firing in their case.
Additional affected surface: Vite dev proxy → LAN/private QA backend
Hitting this on Claude Desktop's built-in terminal (macOS, Darwin 25.x, Apple Silicon). Same root cause —
OPERON_SANDBOXED_NETWORK=1blocking IPv4 connects to a private subnet — but a different workflow than the MCP / SSH //ssh:ones already reported here. Flagging because it's a very common frontend dev pattern and the failure mode looks like a Vite config bug, which costs hours of debugging.The workflow this breaks
Frontend repo with a Vite dev server that proxies
/api/*to a private-IP QA backend, so the auth cookie is set onlocalhost:5173and survives reload:Symptom
Vite dev server starts fine, but every proxied request dies in the Node proxy process:
The browser sees a hung request / 502; no authentication flow works.
Reproduction — same machine, same user, same minute, same subnet
| Process parent | Command | Result |
| --- | --- | --- |
| Claude Desktop built-in terminal |
npm run dev(Vite 7.1.5, Node 22.13.1) |EHOSTUNREACHon every/api/*request || Claude Desktop built-in terminal |
curl http://192.168.69.21/|HTTP 200✓ (curl isn't affected? or is it, transiently) || Claude Desktop built-in terminal |
node -e "http.request({host:'192.168.69.21',port:80…}).end()"| succeeds from raw Node, fails from http-proxy — suggests the block triggers on specific socket-creation code paths but not others, which matches the "it's non-deterministic" observation in the earlier SSH update above || iTerm2 |
npm run dev(identical repo, identical config) | works instantly, no errors || iTerm2 |
curl, raw-node, everything | works |So the filter is clearly scoped to processes spawned by the Claude Desktop app, not to the user, network, binary, or command.
Why this one deserves a separate call-out
The existing reports on this issue are about things that look obviously network-y (SSH, ping, MCP servers connecting to home-automation hubs). Those are easy to attribute correctly once you know LAN is blocked.
A Vite dev proxy isn't obviously "LAN access" — developers think of it as "my framework's config". The symptom surfaces as:
[vite] http proxy error)curlto the same target works, which makes the user conclude it must be a Node / Vite / http-proxy-3 bugI spent ~2 hours chasing this in the Vite config — trying
autoSelectFamily: false, pinningfamily: 4, customhttp.AgentwithkeepAlive: false, bypass rules — all pointless, because the packet never leaves the sandboxed process. The failure is 100% silent from the user's perspective that anything sandbox-related is happening.Feature requests (ranked by effort-to-value)
EHOSTUNREACHto an RFC 1918 address, show a one-line inline hint: "Private-IP destination blocked by Claude Desktop sandbox. Run in iTerm2/Terminal.app to bypass." This alone would have saved me the two hours.OPERON_SANDBOXED_NETWORKand launches the shell outside the restricted profile. Acknowledge the security tradeoff in the UI.open -a iTerm .(or the user's configured terminal) in the workspace cwd. Not a fix but a reliable escape hatch that's visible instead of tribal knowledge.For now the workaround for anyone else landing here via search:
open -a iTerm .from the Claude terminal spawns iTerm2 as a top-level LaunchServices process (no sandbox inheritance),npm run devthere, and everything works. Note this is necessary even for frontend-only workflows as long as the dev proxy points anywhere that isn't public internet or loopback.crazy that this is still open
Yeah, also when I mount a pc via smb/nfs/sftp, if I work with a project on that computer, if I have connection issues, mac apps such as claude gui app basically freeze until force killed.
I notice the same thing in Claude Code CLI when using sandbox mode. prob a different issue, but still, very annoying that you cant even add allowedDomains * to fix the problem, since it doesnt apply to loopback interfaces.
Confirming this on macOS (Claude desktop app — version Claude 1.8555.2 (a476c3) 2026-05-22T23:04:37.000Z), targeting a Raspberry Pi (Ubuntu 22.04, aarch64) at 192.168.4.226 on the same /24 as the host.
From Terminal, all of the following succeed against the same target:
ping -c 3 192.168.4.226→ 0% loss, ~5 msnc -vz 192.168.4.226 22→ succeededssh user@192.168.4.226→ connects normallyarp -n 192.168.4.226→ resolvesFrom the Claude Code desktop app, attempting to open the same host as a remote workspace fails immediately with
connect EHOSTUNREACH 192.168.4.226.No VPN active. Three active interfaces on the Mac (en0 plus two others). Default route is via 192.168.4.1 on en0, same subnet as the Pi.
Confirming this issue on both Claude Desktop and claude-code cli running in terminal, enabling the terminal under the MacOS local network security did not resolve
For me a work around for one of my internal MCP service was to use the tailscale address of the device hosting the service which is not local RFC1918 addressing and is whats sandboxed. (seems ridiculous to route over tailscale when hosting on local subnet I know!) obviously both devices need to be on the tailnet
I still have the same issue for another MCP service on another host that is not on tailscale
Also confirmed that running a local redirect proxy on localhost also worked as a workaround, however this is not a solution moving forward.
Further to my last comment;
working remotely today and the tailscale fix failed, whil my other remote service (on differnt host) worked. reverting back to my original self-hosted ip address worked (working via tailscale routing), this seems to indicate the local net security issue of MacOS, yet again, everything is enabled, so only workaround is a local proxy service running on localhost that just forwards requests to the remote service until this is resolved