Chrome MCP tools report 'not connected' despite working socket

Resolved 💬 3 comments Opened Mar 16, 2026 by yye00 Closed Mar 20, 2026

Summary

The mcp__claude-in-chrome__tabs_context_mcp tool (and all chrome MCP tools) consistently return "Browser extension is not connected" even though the native host process is running and the unix socket is fully functional.

Environment

  • Claude Code version: 2.1.76
  • Chrome version: 145.0.7632.116
  • OS: Fedora Linux 42 (x86_64)
  • Extension: Claude (fcoeoabgfenejglbffodgkkbkcdhcgfn) v1.0.62

Steps to Reproduce

  1. Launch Claude Code with --chrome flag
  2. Chrome is running with the Claude extension installed and enabled
  3. Native messaging host is running and creates socket at /tmp/claude-mcp-browser-bridge-captain/<pid>.sock
  4. Call mcp__claude-in-chrome__tabs_context_mcp — returns "Browser extension is not connected"
  5. Manually connecting to the socket via Python and sending tool requests works perfectly

Debugging Details

  • The native host process (claude --chrome-native-host) is spawned by Chrome and running
  • The unix socket exists and is connectable
  • Sending JSON tool requests directly to the socket returns correct results (tab lists, tab creation works)
  • The MCP client inside Claude Code never successfully connects to the socket
  • Restarting Chrome, the extension, and Claude Code sessions did not resolve the issue
  • Having multiple claude --chrome sessions running simultaneously may have triggered the initial issue, but killing the extra session and restarting did not fix it
  • Extension service worker was confirmed running (native host spawned), permissions all granted including nativeMessaging

Workaround

Communicating directly with the socket via Python works:

import socket, json, struct
sock_path = '/tmp/claude-mcp-browser-bridge-captain/<pid>.sock'
s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
s.connect(sock_path)
msg = json.dumps({'type': 'tool_request', 'method': 'execute_tool', 'params': {'tool': 'tabs_context_mcp', 'args': {'createIfEmpty': True}}})
encoded = msg.encode()
s.sendall(struct.pack('<I', len(encoded)) + encoded)
data = s.recv(8192)
# Returns correct tab data

🤖 Generated with Claude Code

View original on GitHub ↗

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