[BUG] Chrome native host and Claude Code compete for same named pipe (EADDRINUSE on Windows)

Resolved 💬 2 comments Opened Jan 29, 2026 by goonydev Closed Feb 28, 2026

Disclaimer: Ths report was written by Claude code after several hours of attempting to fix my issue: Claude Code in the terminal of my VS Code cannot access to my Claude Chrome Extension.

Description

On Windows, the Chrome native host and Claude Code's built-in claude-in-chrome MCP both attempt to create a named
pipe server on \\.\pipe\claude-mcp-browser-bridge-{username}. This causes an EADDRINUSE conflict - whichever starts
second crashes immediately.

The /mcp command shows claude-in-chrome · ✔ connected, but all MCP tool calls fail with "Browser extension is not
connected" because Chrome's native host cannot create the pipe.

Environment

  • OS: Windows 11
  • Claude Code version: 2.1.23
  • Node.js version: 24.11.0
  • Chrome extension version: Installed from chrome://extensions
  • Claude Desktop: Was installed (uninstalled during troubleshooting)

Steps to Reproduce

  1. Install Claude Code and Chrome extension
  2. Launch Claude Code: claude
  3. Type /chrome to enable Chrome integration
  4. Check /mcp - shows claude-in-chrome · ✔ connected
  5. Any MCP tool call returns: "Browser extension is not connected"

Diagnostic Evidence

Native host test while Claude Code is running:
C:\Users\Acer>"C:\Users\Acer\.claude\chrome\chrome-native-host.bat"
[Claude Chrome Native Host] Initializing...
[Claude Chrome Native Host] Creating socket listener: \\.\pipe\claude-mcp-browser-bridge-Acer
[Claude Chrome Native Host] Socket server error: Error: listen EADDRINUSE: address already in use
\\.\pipe\claude-mcp-browser-bridge-Acer

Native host test with Claude Code NOT running:
[Claude Chrome Native Host] Initializing...
[Claude Chrome Native Host] Creating socket listener: \\.\pipe\claude-mcp-browser-bridge-Acer
[Claude Chrome Native Host] Socket server listening for connections

Chrome extension service worker console:
chrome.runtime.connectNative('com.anthropic.claude_browser_extension')
// Result: Unchecked runtime.lastError: Native host has exited.

Root Cause Analysis

Both components try to be the server on the same named pipe:

  1. /chrome command in Claude Code creates a pipe server
  2. Chrome extension triggers native host via connectNative()
  3. Native host tries to create the same pipe server
  4. EADDRINUSE → native host crashes → "Browser extension is not connected"

The architecture should have one component as server and the other as client, not both as servers.

Workarounds Attempted (all failed)

  • ✅ Redirected Claude Desktop's native host manifest to Claude Code's batch file
  • ✅ Removed Claude Desktop registry entry
  • ✅ Killed all conflicting node processes
  • ✅ Various restart sequences (Chrome first, Claude Code first, etc.)
  • ✅ Launched without --chrome flag, then used /chrome
  • ✅ Disabled/re-enabled Chrome extension
  • ✅ Added Windows Defender exclusions
  • ❌ None resolved the fundamental pipe conflict

Related Issues

  • #20862 - MCP tools fail with "Browser extension is not connected" despite showing Connected
  • #20943 - Claude Code and Claude.app conflict over Chrome extension native messaging host
  • #15463 - Chrome native host enters zombie state without socket
  • #21300 - Chrome extension not connecting on Windows despite MCP server showing "connected"

Expected Behavior

Chrome native host and Claude Code should use a client/server architecture where one creates the pipe and the other
connects to it, avoiding EADDRINUSE conflicts.

Suggested Fix

Either:

  1. Native host creates pipe server, Claude Code connects as client
  2. Claude Code creates pipe server, native host connects as client
  3. Implement pipe detection - if pipe exists, connect as client instead of failing

View original on GitHub ↗

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