[claude-in-chrome] MCP server connects (20 tools) but every tool call returns "Browser extension is not connected"

Resolved 💬 3 comments Opened May 13, 2026 by jonatasaguiar Closed Jul 13, 2026

Summary

The built-in claude-in-chrome MCP server reports ✔ connected · 20 tools in /mcp, but every tool call (e.g. mcp__claude-in-chrome__tabs_context_mcp) returns:

Browser extension is not connected. Please ensure the Claude browser extension is installed and running, and that you are logged into claude.ai with the same account as Claude Code.

All visible pieces of the chain are healthy. The failure happens in an internal handshake layer between the native host and the Chrome extension that does not emit log entries even with --debug enabled.

Environment

| Component | Value |
|---|---|
| OS | Windows 11 Home 10.0.26200 |
| Shell | PowerShell 5.1 |
| Claude Code | 2.1.139 |
| Claude for Chrome extension | v1.0.70 (fcoeoabgfenejglbffodgkkbkcdhcgfn) |
| Chrome profile | Default (Google account A), claude.ai logged in as account B |
| claude.ai account | same email as Claude Code — chat in the side panel works fine |

State at the time of failure

  • Native host process running: claude.exe --chrome-native-host
  • Named pipe present: \\.\pipe\claude-mcp-browser-bridge-<user>
  • Native messaging manifest at %APPDATA%\Claude Code\ChromeNativeHost\com.anthropic.claude_code_browser_extension.json with correct path, type: "stdio", and allowed_origins matching the extension ID
  • Registry key HKCU:\Software\Google\Chrome\NativeMessagingHosts\com.anthropic.claude_code_browser_extension points to the manifest
  • Only one Claude Code session running; Claude Desktop closed
  • Extension permissions: "On all sites"
  • claude.ai/settings/account confirms the same account as Claude Code; chat through the extension's side panel works normally

Steps that did NOT fix it

  1. Killed orphan native-host processes
  2. Cleared the named pipe (it gets recreated on next MCP call, then silently drops)
  3. Disable/enable extension toggle in chrome://extensions/
  4. Full Chrome close (verified 0 Chrome processes) and reopen
  5. Multiple /mcp reconnect runs (always reports Reconnected to claude-in-chrome.)
  6. Logout / login on claude.ai
  7. Uninstall + reinstall the extension from the Chrome Web Store (extension ID came back the same, so the existing native messaging manifest remained valid)
  8. Disabled an unrelated extension (Cookie Guardian) that was clearing claude.ai cookies on tab close

Debug-log observations

Running a non-interactive sub-session with claude -p --debug-file <path> --debug "..." captures startup logs. The logs show MCP servers from .claude.json (playwright, claude.ai Google Drive) starting up, but the built-in claude-in-chrome server never appears in any "Starting connection" or "Connection established" log line, suggesting its initialization path is embedded and emits nothing under --debug.

No log entries match any of: chrome, native, extension, bridge, browser, pipe, disconnect around the failing call.

Extension service worker

chrome://extensions/?id=fcoeoabgfenejglbffodgkkbkcdhcgfn → Inspect service worker → Console shows no errors related to native messaging. The error log lists only:

  • CSP inline-script violations from the sidepanel HTML (apparently intentional)
  • Datadog Browser SDK loaded twice
  • Segment/Amplitude script blocked by CSP
  • Unchecked runtime.lastError: Debugger is not attached to the tab with id: <id>.

The asset list includes a PairingPrompt-*.js, suggesting a pairing UI exists, but it never surfaces — the side panel only shows the normal chat.

Expected behavior

mcp__claude-in-chrome__tabs_context_mcp returns tab info instead of the "not connected" error.

Workaround

None found.

Suggestions for the team

  • Either expose what claude-in-chrome's "is extension connected" check actually verifies, or emit a [DEBUG] log line when the check fails with the specific reason (no extension hello received, account mismatch, pipe write timed out, etc.).
  • If pairing requires a UI confirmation (PairingPrompt-*.js), surface a way to retrigger it when state is stuck.

View original on GitHub ↗

This issue has 3 comments on GitHub. Read the full discussion on GitHub ↗