
Claude Desktopを使うとClaude in ChromeとClaude Codeが正常に接続できなくなる問題について原因調査及び解消するスクリプトを作ってみた
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が実装されることを期待したいところです。






