Chrome extension reconnect fails intermittently even after fixing native-messaging host conflict (macOS)
Environment
- OS: macOS 26.6.2 (Build 25G83)
- Chrome: 152.0.7977.65
- Claude Code: 2.1.250
- Extension: Claude (Claude in Chrome), version 1.0.85, ID
fcoeoabgfenejglbffodgkkbkcdhcgfn - Both Claude Desktop app and Claude Code CLI are installed.
Summary
/chrome → "Reconnect extension" fails to establish the browser bridge. The reconnect flow opens a window/tab, which closes (or hangs on a blank page) before pairing completes. mcp__claude-in-chrome__* tools never become available.
Root cause #1 (confirmed, matches #20887 / #21582 / #20341)
Both Claude Desktop and Claude Code register native messaging hosts under different host names but the same allowed extension ID:
com.anthropic.claude_browser_extension→/Applications/Claude.app/Contents/Helpers/chrome-native-host(Desktop)com.anthropic.claude_code_browser_extension→~/.claude/chrome/chrome-native-host(Code)
With both installed, Chrome/the extension consistently routed native-messaging connections to the Desktop app's host instead of Code's — confirmed by observing /Applications/Claude.app/Contents/Helpers/chrome-native-host spawn as a child of Chrome every time /chrome reconnect was attempted, even after fully quitting the Desktop app (the extension itself re-triggers the connection, not a lingering process).
Workaround applied (per #20887): edited com.anthropic.claude_browser_extension.json's path to point at Code's native host binary instead, then fully restarted Chrome. After this, ~/.claude/chrome/chrome-native-host (invoked as claude --chrome-native-host) correctly spawns and opens its bridge socket at /tmp/claude-mcp-browser-bridge-<user>/<pid>.sock.
Root cause #2 (still unresolved — new)
Even with the correct native host now spawning and holding a live bridge socket, the CLI still reports the browser as not connected, and behavior of the reconnect popup is inconsistent across attempts:
- Sometimes the popup opens and closes almost immediately (before any native host process spawns at all).
- Sometimes it hangs indefinitely on a blank page at
clau.de/chrome/reconnect. - Sometimes the correct native host process spawns and a bridge socket is created, but
mcp__claude-in-chrome__*tools still never become available in the CLI session.
Ruled out as causes: TLS interception/AV/proxy (checked cert issuers for bridge.claudeusercontent.com and claude.ai, both clean; no proxy configured; no AV/firewall software installed), Gatekeeper/quarantine (native host binary has no com.apple.quarantine attribute and is validly Developer-ID signed), ad-blocker/privacy extensions (disabled, no change), popup blockers (disabled, no change), stale processes/sockets (killed and retried with clean state, no change).
This suggests a second, separate bug in the reconnect handshake itself (possibly a race between the popup page and the native-messaging connectNative call, or the extension not signaling successful pairing back to an already-running CLI session).
Steps to reproduce
- Have both Claude Desktop and Claude Code CLI installed on macOS with the Claude Chrome extension.
- Run
/chromein Claude Code CLI, click "Reconnect extension". - Observe the popup window opening and closing/hanging without completing pairing.
- Apply the manifest workaround from #20887 and fully restart Chrome.
- Retry
/chromereconnect — native host now spawns correctly, but connection still does not register as established in the CLI session.
3 Comments
Additional confirmed detail on the trigger: this was working fine as of yesterday. It broke specifically after updating the Claude Desktop app today — the update re-registered/overwrote
com.anthropic.claude_browser_extension.json(confirmed via file timestamp matching the update time), which is what introduced the native-messaging host conflict described above. So the regression path is:com.anthropic.claude_browser_extension.jsonpointing back at Desktop's own native host binary, re-introducing the extension-ID conflict with Code's manifest.Applying the manifest workaround from #20887 gets the native host spawning correctly again, but the reconnect handshake itself still doesn't complete (see root cause #2 above) — so a Desktop update is a reliable way to reproduce this regression from a previously-working state.
Follow-up: found a working workaround for the stuck-session symptom described above (root cause #2).
We confirmed the native-messaging bridge itself was genuinely healthy — a second Claude Code session, opened in a different project directory around the same time, connected successfully through the exact same native-host process and socket (verified by matching PIDs/socket names, plus a live
tabs_context_mcpcall that returned real tab data). Meanwhile the original session (same machine, same bridge, different project directory) kept failing/chromereconnect attempts indefinitely, with no config or settings differences between the two projects.Workaround: duplicated the stuck project's directory to a new path and opened a fresh Claude Code session there.
/chromeconnected immediately in the new session, no other changes needed.This points to per-session/per-pairing state getting stuck (possibly an exclusive-pairing race when multiple sessions attempt
/chromearound the same time, where the "losing" session's connection attempt is silently dropped and never retries cleanly) rather than anything wrong with the bridge, the extension, or the project's config. A stuck session doesn't seem to recover on its own even after multiple manual/chromereconnect attempts, a full Chrome restart, and a full Claude Code CLI restart in the same directory — only starting fresh in a new directory (and therefore a new session) resolved it.Comment for anthropics/claude-code#90385
Same symptom set on another macOS machine; adding diagnostics that narrow the failure to the CLI-side pairing step. Happy to provide more logs.
Environment
fcoeoabgfenejglbffodgkkbkcdhcgfn~/.local/bin/claude→ Mach-O arm64) — also reproduced identically after downgrading to 2.1.250Symptom
/chrome→ "Reconnect extension": a tab opens on the reconnect page and closes immediately. Status stays Disabled / Extension: Installed./mcpnever lists aclaude-in-chromeserver. Browser MCP tools never become available.What was verified step by step
Initially only the Desktop app's manifest existed (
com.anthropic.claude_browser_extension.json→/Applications/Claude.app/Contents/Helpers/chrome-native-host);~/.claude/chrome/was empty (Claude Code had never installed its host — same as #14894). I created~/.claude/chrome/chrome-native-host(wrapper exec'ingclaude --chrome-native-host) pluscom.anthropic.claude_code_browser_extension.json, and also pointed the Desktop manifest'spathat the Code host per the #20887 workaround. After a full Chrome restart, logging in the wrapper confirms Chrome now spawns the correct (Claude Code) native host.Wrapper log on every Chrome launch / reconnect attempt:
``
`[wrapper] invoked ... args=chrome-extension://fcoeoabgfenejglbffodgkkbkcdhcgfn/
[Claude Chrome Native Host] Initializing...
[Claude Chrome Native Host] Creating socket listener: /tmp/claude-mcp-browser-bridge-n0r41n/<pid>.sock
[Claude Chrome Native Host] Socket server listening for connections
[Claude Chrome Native Host] Handling Chrome message type: ping
[Claude Chrome Native Host] Responding to ping
[Claude Chrome Native Host] Handling Chrome message type: get_status
[Claude Chrome Native Host] Removed empty socket directory
Chrome disconnected (EOF received)So the extension connects, health-checks (ping/get_status) — but no pairing/connect flow ever follows; shortly after, the extension drops the connection (host logs
in~/Library/Logs/Claude/chrome-native-host.log`).While a host instance stayed alive with its socket open (
lsofshowed only the host itself on/tmp/claude-mcp-browser-bridge-n0r41n/<pid>.sock), repeated/chrome→ Reconnect attempts from the running CLI session produced zero new native-host invocations and zero client connections on the socket. The CLI reports "Disabled" without ever attempting the local transport, and/mcpshows noclaude-in-chromeserver at all.DISABLE_GROWTHBOOK=1(to force feature-flag defaults / avoid thetengu_copper_bridgecloud-bridge path — the cached flag istrueand gets re-fetched if edited): no change.Reading
Everything local (manifests, native host, socket, extension health-check) is demonstrably working; the failure is in the CLI-side pairing step, which neither completes via the cloud bridge nor falls back to the live local socket — matching root cause #2 described in this issue.