Environment
- OS: macOS (Darwin 25.3.0)
- Chrome extension: Claude for Chrome (Beta) v1.0.68, ID
fcoeoabgfenejglbffodgkkbkcdhcgfn
- Claude Code CLI: v2.1.109 at
/Users/philsmith/.local/share/claude/versions/2.1.109
- Claude Desktop: installed and functional (connects to the extension successfully)
Summary
On a machine where Claude Desktop is installed, the Claude Code CLI's claude-in-chrome MCP bridge reports the extension as not connected, even though:
/mcp shows claude-in-chrome as ✔ connected
- The Chrome extension is installed, enabled, signed in, and the side panel is open
- Claude Desktop successfully connects to the same extension on the same machine
Every call to mcp__claude-in-chrome__tabs_context_mcp (and any other browser automation tool) returns:
Browser extension is not connected. Please ensure the Claude browser extension is installed and running…
Root cause (as far as I can diagnose)
Two native messaging host registrations exist and both list the same extension ID in allowed_origins:
~/Library/Application Support/Google/Chrome/NativeMessagingHosts/com.anthropic.claude_browser_extension.json (Desktop's):
{
"name": "com.anthropic.claude_browser_extension",
"path": "/Applications/Claude.app/Contents/Helpers/chrome-native-host",
"type": "stdio",
"allowed_origins": [
"chrome-extension://dihbgbndebgnbjfmelmegjepbnkhlgni/",
"chrome-extension://fcoeoabgfenejglbffodgkkbkcdhcgfn/",
"chrome-extension://dngcpimnedloihjnnfngkgjoidhnaolf/"
]
}
~/Library/Application Support/Google/Chrome/NativeMessagingHosts/com.anthropic.claude_code_browser_extension.json (CLI's):
{
"name": "com.anthropic.claude_code_browser_extension",
"path": "/Users/philsmith/.claude/chrome/chrome-native-host",
"type": "stdio",
"allowed_origins": [
"chrome-extension://fcoeoabgfenejglbffodgkkbkcdhcgfn/"
]
}
ps aux shows the extension launched Desktop's binary:
philsmith 96669 /Applications/Claude.app/Contents/Helpers/chrome-native-host chrome-extension://fcoeoabgfenejglbffodgkkbkcdhcgfn/
The bridge socket exists and is owned by that Desktop-host PID:
/tmp/claude-mcp-browser-bridge-philsmith/96669.sock
The CLI's host binary (~/.claude/chrome/chrome-native-host) is never invoked by the extension — it runs fine when launched manually and creates its own socket, but the extension never connects to it.
This strongly suggests the extension only calls chrome.runtime.connectNative("com.anthropic.claude_browser_extension") (Desktop's host name), and has no knowledge of the CLI's host name com.anthropic.claude_code_browser_extension. The CLI-installed host registration is therefore orphaned, and the CLI's MCP bridge cannot reach the extension.
Steps to reproduce
- Install Claude Desktop (registers
com.anthropic.claude_browser_extension)
- Install Claude Code CLI and enable the Chrome extension integration (registers
com.anthropic.claude_code_browser_extension)
- Install the Claude Chrome extension
fcoeoabgfenejglbffodgkkbkcdhcgfn, sign in, open side panel
- In Claude Code, confirm
/mcp shows claude-in-chrome: ✔ connected
- Attempt any
mcp__claude-in-chrome__* tool call
Expected: extension responds, tab context / navigation tools work.
Actual: Every call returns "Browser extension is not connected."
Things I tried
- Quit Claude Desktop (⌘Q), verified no UI process remains. The Desktop-bundled
chrome-native-host helper (PID 96669) stays alive because Chrome keeps the extension's native-messaging pipe open; the CLI still cannot connect.
- Reconnecting
/mcp → Reconnected to claude-in-chrome but tool calls still fail.
- Toggling the extension off/on in
chrome://extensions/.
- Reloading the side panel.
- Verified native host binary works standalone:
/Users/philsmith/.claude/chrome/chrome-native-host starts cleanly and creates its own socket at /tmp/claude-mcp-browser-bridge-philsmith/<pid>.sock.
- Verified
allowed_origins in both JSONs contains the correct extension ID.
- Checked
chrome://extensions/ → Claude → Inspect views:
- service worker console: empty (other than an unrelated async-listener warning)
- offscreen.html console: only
[Offscreen] Document loaded and ready — no native-host connection attempt logged
- sidepanel.html console:
Uncaught (in promise) Error: Could not establish connection. Receiving end does not exist. (plus unrelated CSP / Datadog / Segment warnings)
What I think needs to happen
Either:
- The extension should also support
com.anthropic.claude_code_browser_extension as a native host name (e.g., try CLI's host name first, or in addition to Desktop's), so Claude Code CLI users without Claude Desktop — and users with both — can connect; or
- The Desktop native host should multiplex, so the CLI's MCP bridge can share Desktop's socket at
/tmp/claude-mcp-browser-bridge-philsmith/<pid>.sock instead of expecting its own host to be invoked; or
- Documentation needs to explicitly state that on machines with Desktop installed, the CLI integration won't work (or requires uninstalling Desktop's host JSON).
Happy to provide further logs or test a patch.
Environment
fcoeoabgfenejglbffodgkkbkcdhcgfn/Users/philsmith/.local/share/claude/versions/2.1.109Summary
On a machine where Claude Desktop is installed, the Claude Code CLI's
claude-in-chromeMCP bridge reports the extension as not connected, even though:/mcpshowsclaude-in-chromeas✔ connectedEvery call to
mcp__claude-in-chrome__tabs_context_mcp(and any other browser automation tool) returns:Root cause (as far as I can diagnose)
Two native messaging host registrations exist and both list the same extension ID in
allowed_origins:~/Library/Application Support/Google/Chrome/NativeMessagingHosts/com.anthropic.claude_browser_extension.json(Desktop's):{ "name": "com.anthropic.claude_browser_extension", "path": "/Applications/Claude.app/Contents/Helpers/chrome-native-host", "type": "stdio", "allowed_origins": [ "chrome-extension://dihbgbndebgnbjfmelmegjepbnkhlgni/", "chrome-extension://fcoeoabgfenejglbffodgkkbkcdhcgfn/", "chrome-extension://dngcpimnedloihjnnfngkgjoidhnaolf/" ] }~/Library/Application Support/Google/Chrome/NativeMessagingHosts/com.anthropic.claude_code_browser_extension.json(CLI's):{ "name": "com.anthropic.claude_code_browser_extension", "path": "/Users/philsmith/.claude/chrome/chrome-native-host", "type": "stdio", "allowed_origins": [ "chrome-extension://fcoeoabgfenejglbffodgkkbkcdhcgfn/" ] }ps auxshows the extension launched Desktop's binary:The bridge socket exists and is owned by that Desktop-host PID:
The CLI's host binary (
~/.claude/chrome/chrome-native-host) is never invoked by the extension — it runs fine when launched manually and creates its own socket, but the extension never connects to it.This strongly suggests the extension only calls
chrome.runtime.connectNative("com.anthropic.claude_browser_extension")(Desktop's host name), and has no knowledge of the CLI's host namecom.anthropic.claude_code_browser_extension. The CLI-installed host registration is therefore orphaned, and the CLI's MCP bridge cannot reach the extension.Steps to reproduce
com.anthropic.claude_browser_extension)com.anthropic.claude_code_browser_extension)fcoeoabgfenejglbffodgkkbkcdhcgfn, sign in, open side panel/mcpshowsclaude-in-chrome: ✔ connectedmcp__claude-in-chrome__*tool callExpected: extension responds, tab context / navigation tools work.
Actual: Every call returns "Browser extension is not connected."
Things I tried
chrome-native-hosthelper (PID 96669) stays alive because Chrome keeps the extension's native-messaging pipe open; the CLI still cannot connect./mcp→Reconnected to claude-in-chromebut tool calls still fail.chrome://extensions/./Users/philsmith/.claude/chrome/chrome-native-hoststarts cleanly and creates its own socket at/tmp/claude-mcp-browser-bridge-philsmith/<pid>.sock.allowed_originsin both JSONs contains the correct extension ID.chrome://extensions/→ Claude → Inspect views:[Offscreen] Document loaded and ready— no native-host connection attempt loggedUncaught (in promise) Error: Could not establish connection. Receiving end does not exist.(plus unrelated CSP / Datadog / Segment warnings)What I think needs to happen
Either:
com.anthropic.claude_code_browser_extensionas a native host name (e.g., try CLI's host name first, or in addition to Desktop's), so Claude Code CLI users without Claude Desktop — and users with both — can connect; or/tmp/claude-mcp-browser-bridge-philsmith/<pid>.sockinstead of expecting its own host to be invoked; orHappy to provide further logs or test a patch.