claude-in-chrome: CLI never connects to native-host bridge socket (extension + native host both healthy)
Summary
On macOS, Claude Code's claude-in-chrome browser tools always return "Browser extension is not connected" even though every layer of the bridge is verifiably healthy. The in-process "Claude in Chrome" MCP server never connects to the native-host bridge socket — confirmed by direct socket monitoring.
Environment
- macOS 15 (Darwin 25.4.0), arm64
- Claude Code 2.1.145 (CLI, launched from a standalone terminal — Ghostty)
- Google Chrome 148.0.7778.178
- Claude browser extension
fcoeoabgfenejglbffodgkkbkcdhcgfnv1.0.72 (installed, enabled, logged into claude.ai with the same account as Claude Code) - Claude desktop app also installed (its native-messaging manifest was disabled during debugging — see below)
What is healthy (verified)
- Extension installed, enabled, no
disable_reasons, service worker running. - Extension service worker DevTools console shows no errors.
- Extension spawns Claude Code's native host:
claude --chrome-native-host(via~/.claude/chrome/chrome-native-host→com.anthropic.claude_code_browser_extension). - Native host process is alive, has live stdio pipes to Chrome, and is listening on its unix socket:
/tmp/claude-mcp-browser-bridge-<user>/<pid>.sock. - Native host, all running
claudesessions, and the host wrapper all use the same binary (~/.local/share/claude/versions/2.1.145) — no version mismatch.
The bug
No claude session — including a fresh one started with claude --chrome — ever connects to the native host's bridge socket.
lsof on the native-host PID, sampled at ~22 ms resolution for 80 samples while calling list_connected_browsers and tabs_context_mcp, shows the socket FD count never rises above 1 (the listener). The in-process MCP server returns "extension is not connected" without ever opening the socket. Tool calls return in a suspiciously constant ~407 ms.
The per-project MCP debug log (mcp-logs-claude-in-chrome) shows the stdio MCP server connecting fine and tools "completed successfully", but never logs anything about the native-host/bridge layer.
Steps already tried (none fixed it)
- Restarted Chrome.
- Restarted the Claude Code session; also started a fresh
claude --chromesession. /chrome(multiple times) and/mcpreconnect.- Quit the Claude desktop app and disabled its native-messaging manifest (
com.anthropic.claude_browser_extension.json) so the extension would bind to Claude Code's host instead of the desktop app's — this part worked (the extension now spawnsclaude --chrome-native-host), but the bridge still never connects. - Reloaded the extension service worker.
Expected vs actual
- Expected: the in-process MCP server discovers and connects to the native host's listening socket, so
list_connected_browsersreturns the connected browser(s). - Actual: the MCP server never connects to the socket and always reports the extension as not connected.
Notes
- Historical native-host logs on this machine going back to April never show a client connecting to the bridge socket —
claude-in-chromemay have never successfully connected here. - Related: #20887, #24539 (extension favoring the desktop app), but this issue persists after that conflict is removed.
This issue has 4 comments on GitHub. Read the full discussion on GitHub ↗