Claude Desktopを使うとClaude in ChromeとClaude Codeが正常に接続できなくなる問題について原因調査及び解消するスクリプトを作ってみた

Claude Desktopを使うとClaude in ChromeとClaude Codeが正常に接続できなくなる問題について原因調査及び解消するスクリプトを作ってみた

Claude CodeからClaude in Chromeへの接続が正常に動作しない問題に遭遇しました。claude.aiでのセッション再設定等色々試しましたが、最終的に実装上の都合ということが分かりました。対策手段としてスクリプトを作成してみました。
2026.02.28

Claude Codeをインストールしている環境でClaude in Chrome拡張を使おうとした際にClaude CodeからClaude in Chromeへの接続が正常に動作しない問題に遭遇しました。テスト絡みでChrome上の情報取得をClaude Codeに任せるケースも多々あったので頭を抱える状況に。遭遇した過程を考えると、怪しいのはClaude Desktopのインストールでした。

Claude Codeと共に原因を特定しようとしたところ中々糸口が掴めず、Claude Codeからは見切りをつけるようにと何度も告げられましたが、根気よく確認した結果原因がわかり、対処方法として作成した切り替えスクリプトによる解決策を紹介します。

前提環境

項目 バージョン
macOS Tahoe 26.2
Claude Code 2.1.44
Claude Desktop 1.1.4498
Claude in Chrome 拡張 v1.0.56
Google Chrome 145.0.7632.117

症状

Claude Codeで /chrome を実行した後、Claude in Chromeを実行するようにClaude Codeへ促した際に、何度試しても以下のエラーが返されます。

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

Chrome拡張自体は正常にインストールされており、Chrome上でClaude Desktopとの連携は問題なく動作しています。つまり拡張は動いているのに、Claude Codeからは認識されないという状況です。

原因

複合していることと、人の目では要因に辿り着きにくい箇所があった点で、Claude Codeによる調査が主になっています。

Chromeネイティブメッセージングの優先順位

Claude in ChromeはChromeのネイティブメッセージング機能を使ってアプリケーション、今回の場合はClaude CodeやClaude Desktopと通信します。この仕組みでは、ChromeのNativeMessagingHostsディレクトリに配置されたJSON設定ファイルが、拡張IDとアプリケーションとのマッピングを定義します。

macOS の場合、設定ファイルは以下に配置されます。

~/Library/Application Support/Google/Chrome/NativeMessagingHosts/

Claude DesktopとClaude Codeをそれぞれインストールすると、このディレクトリにネイティブメッセージング用の2つの設定ファイルが作成されます。

Claude Desktop用: com.anthropic.claude_browser_extension.json

{
  "name": "com.anthropic.claude_browser_extension",
  "description": "Claude Browser Extension Native Host",
  "path": "/Applications/Claude.app/Contents/Helpers/chrome-native-host",
  "type": "stdio",
  "allowed_origins": [
    "chrome-extension://dihbgbndebgnbjfmelmegjepbnkhlgni/",
    "chrome-extension://fcoeoabgfenejglbffodgkkbkcdhcgfn/",
    "chrome-extension://dngcpimnedloihjnnfngkgjoidhnaolf/"
  ]
}

Claude Code用: com.anthropic.claude_code_browser_extension.json

{
  "name": "com.anthropic.claude_code_browser_extension",
  "description": "Claude Code Browser Extension Native Host",
  "path": "/Users/<user>/.claude/chrome/chrome-native-host",
  "type": "stdio",
  "allowed_origins": [
    "chrome-extension://fcoeoabgfenejglbffodgkkbkcdhcgfn/"
  ]
}

Chrome Web Storeで公開されているClaude in Chromeの拡張IDfcoeoabgfenejglbffodgkkbkcdhcgfn両方の設定ファイルのallowed_originsに含まれているのが確認できます。

そして注目すべきは、Claude in Chrome拡張のservice-worker.tsのソースコードでした。確認したところ、接続先ホストの試行順序が以下のようにハードコードされていたようです。

const s = [
  { name: "com.anthropic.claude_browser_extension", label: "Desktop" },
  { name: "com.anthropic.claude_code_browser_extension", label: "Claude Code" }
];
for (const n of s) try { /* connectNative(n.name) */ }

なお、該当拡張のソースコードは公開されておらず、ローカルの以下パスにminifiedされていたコードをClaude Codeが読み取ったものとなります。Claude Desktopのコードは公開されていないため、手がかりがありそうなのはClaude in Chromeの実装のみとなり、「なんとか調べて」と期待せずに無茶なプロンプトを投げたところ見つけ出してくれました。

~/Library/Application\ Support/Google/Chrome/Profile\ 1/Extensions/fcoeoabgfenejglbffodgkkbkcdhcgfn/1.0.56_0/assets/service-worker.ts-8lxIEjKA.js

先頭にClaude Desktop(com.anthropic.claude_browser_extension)が定義されており、for ループで先頭から順に chrome.runtime.connectNative() を試行します。Claude Desktop側設定ファイルのallowed_origins にClaude in Chromeの拡張IDが含まれていれば、その時点で接続が成立し、2番目のClaude Codeには到達しません。

つまり、Claude Desktopが優先される理由はChromeの仕様ではなく、拡張自体がClaude Desktop → Claude Codeの順で接続する設計になっているためです。この仕様により、両方がインストールされた環境では常にDesktopが選択されます。

解決策

手動での切り替え

ハードコートされている時点で察する人もいるかと思われますが、現状では自動切り替えが困難です。

実施する場合は、Claude Desktop側の設定ファイルから、競合する拡張IDを除外します。

# 設定ファイルを編集
vi ~/Library/Application\ Support/Google/Chrome/NativeMessagingHosts/com.anthropic.claude_browser_extension.json

allowed_originsからchrome-extension://fcoeoabgfenejglbffodgkkbkcdhcgfn/ の行を削除します。

{
  "name": "com.anthropic.claude_browser_extension",
  "description": "Claude Browser Extension Native Host",
  "path": "/Applications/Claude.app/Contents/Helpers/chrome-native-host",
  "type": "stdio",
  "allowed_origins": [
    "chrome-extension://dihbgbndebgnbjfmelmegjepbnkhlgni/",
    "chrome-extension://dngcpimnedloihjnnfngkgjoidhnaolf/"
  ]
}

編集後、Chromeを再起動し、Claude Codeで /chrome を実行すれば接続されます。

Claude Desktopに戻したい場合は、削除した行を再度追加してChromeを再起動します。

ただ、正直運用として現実的ではありません。

切り替えスクリプト

そこでClaude Codeへの指示の元、切り替えスクリプトを作成しました。

#!/bin/bash
#
# Claude in Chrome 拡張の接続先を切り替えるスクリプト
# Claude Code ⇔ Claude Desktopの切り替え
#

EXTENSION_ID="fcoeoabgfenejglbffodgkkbkcdhcgfn"
DESKTOP_CONFIG="$HOME/Library/Application Support/Google/Chrome/NativeMessagingHosts/com.anthropic.claude_browser_extension.json"

# 現在の状態を判定
get_current_mode() {
  if [ ! -f "$DESKTOP_CONFIG" ]; then
    echo "unknown"
    return
  fi
  if grep -q "$EXTENSION_ID" "$DESKTOP_CONFIG" 2>/dev/null; then
    echo "desktop"
  else
    echo "cli"
  fi
}

# 状態表示
show_status() {
  local mode
  mode=$(get_current_mode)

  echo "=== Claude in Chrome 接続先 ==="
  case "$mode" in
    cli)     echo "現在: Claude Code CLI" ;;
    desktop) echo "現在: Claude Desktop App" ;;
    *)       echo "現在: 不明" ;;
  esac

  # プロセス状態
  local native_host
  native_host=$(ps aux 2>/dev/null | grep "chrome-native-host" | grep -v grep | head -1)
  if [ -n "$native_host" ]; then
    if echo "$native_host" | grep -q "Claude.app"; then
      echo "実行中のネイティブホスト: Claude Desktop App"
    else
      echo "実行中のネイティブホスト: Claude Code CLI"
    fi
  else
    echo "ネイティブホストプロセス: 未起動"
  fi
}

# CLI モードに切り替え
switch_to_cli() {
  if [ "$(get_current_mode)" = "cli" ]; then
    echo "既に Claude Code CLI モードです"
    return 0
  fi
  python3 -c "
import json
with open('$DESKTOP_CONFIG', 'r') as f:
    config = json.load(f)
origins = config.get('allowed_origins', [])
target = 'chrome-extension://$EXTENSION_ID/'
if target in origins:
    origins.remove(target)
    config['allowed_origins'] = origins
    with open('$DESKTOP_CONFIG', 'w') as f:
        json.dump(config, f, indent=2)
    print('Desktop 設定から拡張 ID を除外しました')
"
  echo "切り替え完了: Claude Code CLI"
  echo "※ Chrome を再起動し、Claude Code で /chrome を実行してください"
}

# Desktop モードに切り替え
switch_to_desktop() {
  if [ "$(get_current_mode)" = "desktop" ]; then
    echo "既に Claude Desktop App モードです"
    return 0
  fi
  python3 -c "
import json
with open('$DESKTOP_CONFIG', 'r') as f:
    config = json.load(f)
origins = config.get('allowed_origins', [])
target = 'chrome-extension://$EXTENSION_ID/'
if target not in origins:
    origins.append(target)
    config['allowed_origins'] = origins
    with open('$DESKTOP_CONFIG', 'w') as f:
        json.dump(config, f, indent=2)
    print('Desktop 設定に拡張 ID を追加しました')
"
  echo "切り替え完了: Claude Desktop App"
  echo "※ Chrome を再起動してください"
}

# メイン処理
case "${1:-}" in
  cli)     switch_to_cli ;;
  desktop) switch_to_desktop ;;
  "")
    show_status
    echo ""
    echo "使用方法:"
    echo "  $0 cli       Claude Code CLI に切り替え"
    echo "  $0 desktop   Claude Desktop App に切り替え"
    ;;
  *)
    echo "Error: 不明な引数 '$1'"
    echo "使用方法: $0 [cli|desktop]"
    exit 1
    ;;
esac

使い方

# 現在の接続先を確認
./switch-chrome-extension.sh

# Claude Codeに切り替え
./switch-chrome-extension.sh cli

# Claude Desktopに切り替え
./switch-chrome-extension.sh desktop

実行例です。

$ ./switch-chrome-extension.sh
=== Claude in Chrome 接続先 ===
現在: Claude Code CLI
実行中のネイティブホスト: Claude Code CLI

使用方法:
  ./switch-chrome-extension.sh cli       Claude Code CLI に切り替え
  ./switch-chrome-extension.sh desktop   Claude Desktop App に切り替え

切り替え後は必ずChromeの再起動が必要です。Chromeは接続先アプリケーションの設定を起動時に読み込むため、設定変更だけでは反映されません。

残存プロセスの問題

設定ファイルを切り替えてChromeを再起動しても、接続できない場合があります。確認しているのは古いClaude CodeセッションでClaude in ChromeのMCPプロセスが残存しているケースです。

# 残存プロセスの確認
ps aux | grep "chrome-native" | grep -v grep

別のターミナルで起動していたClaude Codeセッション(--claude-in-chrome-mcp プロセス)が残っていると接続がそちらに吸い込まれます。不要なセッションを終了するか、該当プロセスを kill してから再試行してください。探すのが手間なら、Claude Codeに「不要なセッション切って」と指示すると大体やってくれます。

GitHub Issuesの状況

この競合問題はGitHub上で報告されていますが、2026年2月時点でOpenのままです。

#20887 - Chrome MCP: Extension connects to Claude Desktop instead of Claude Code when both are installed

Issue本文で「The Chrome extension appears to request com.anthropic.claude_browser_extension (Desktop's name)」と推測されていますが、今回の拡張ソースコード調査でそれがハードコードされた配列順序によるものと確認できました。

また同Issueのコメントでは、Windowsにおいてはアプリケーション間で接続する際の名前も重複している(claude-mcp-browser-bridge-{username} が Desktop/Code で同一)という問題も報告されています。macOSではこれに該当するパスが異なるためこの問題は発生しませんが、Windowsは設定の競合を解消しても接続時の名前衝突が残る可能性はあります。

故に、公式での対処手順は「Claude Desktopを完全に終了してChromeを再起動」ですが、これだけでは不十分なケースがあります。

あとがき

普段はGoogleにて根気強く検索していましたが、今回はClaude CodeとGeminiの双方にプロンプトにて調査を行いました。Geminiは動作への対処療法、Claude Codeはソースコード設計を辿っていくため、比較することでGoogle検索とはまた異なった視点を垣間見られた感覚があります。

今回提示した切り替えスクリプトで運用負荷を下げることが可能です。将来的にAnthropic側で拡張IDに関する問題の解決、あるいは接続先を選択できるUIが実装されることを期待したいところです。

この記事をシェアする

FacebookHatena blogX

関連記事