[{"data":1,"prerenderedAt":429},["ShallowReactive",2],{"content-/chrome-devtools-mcp-zombie-port-recovery":3,"all-pages-for-dir":427,"og-image-/chrome-devtools-mcp-zombie-port-recovery":428},{"id":4,"title":5,"body":6,"category":410,"description":411,"extension":412,"meta":413,"navigation":212,"ogImage":414,"path":415,"project_name":416,"published":417,"publishedAt":418,"seo":419,"stem":420,"tags":421,"todo":414,"unpublished":417,"updatedAt":414,"__hash__":426},"pages/2026-05/2026-05-27/chrome-devtools-mcp-zombie-port-recovery.md","Chrome DevTools MCP が \"still connecting\" で固まる真因は『残骸9222リスナーの居座り』だった",{"type":7,"value":8,"toc":401},"minimark",[9,22,27,34,37,41,44,77,101,104,108,118,158,165,172,175,178,181,239,253,265,268,272,275,278,281,295,298,301,304,330,337,344,347,397],[10,11,12,13,17,18,21],"p",{},"数日前から、Claude Code を立ち上げるたびに画面の上端で ",[14,15,16],"code",{},"chrome-devtools"," MCP が \"still connecting\" の文字を点滅させたまま止まっていた。",[14,19,20],{},"mcp__chrome-devtools__*"," のツールは一つもロードされず、記事のスクショを撮ろうとして呼び出すたびに空振りする。最初は「ああ、また Chrome 136+ のあれか」と決めつけて放置していた。今日その思い込みを一枚ずつ剥がしていったら、まったく別の犯人にたどり着いた。",[23,24,26],"h2",{"id":25},"思い込み-136-のデフォルトプロファイル制約だろう","思い込み: 「136+ のデフォルトプロファイル制約だろう」",[10,28,29,30,33],{},"過去に同じ症状で詰まったとき、原因は Chrome 136 以降のデフォルトプロファイル制約だと突き止めていた。デフォルトの User Data ディレクトリでは ",[14,31,32],{},"--remote-debugging-port"," が無効化される、というやつだ。issue にも「方法3（chrome://inspect の許可フロー）で解決済み」とメモしていた。",[10,35,36],{},"だから今回も同じだと思い込んだ。「解決済みとメモしたのに、なぜまた繋がらないのか」と首をひねりながら、半ば諦めて数日を過ごしていた。これが最初の一枚目だった。",[23,38,40],{"id":39},"一枚目を剥がす-ポートは生きているのに-devtools-が死んでいた","一枚目を剥がす: ポートは生きているのに DevTools が死んでいた",[10,42,43],{},"腰を据えて原因を調べさせた。まず 9222 の状態を確認する。",[45,46,51],"pre",{"className":47,"code":48,"language":49,"meta":50,"style":50},"language-bash shiki shiki-themes vitesse-light vitesse-light","curl -s --max-time 5 http://localhost:9222/json/version\n","bash","",[14,52,53],{"__ignoreMap":50},[54,55,58,62,66,69,73],"span",{"class":56,"line":57},"line",1,[54,59,61],{"class":60},"senZ8","curl",[54,63,65],{"class":64},"snbK4"," -s",[54,67,68],{"class":64}," --max-time",[54,70,72],{"class":71},"sM54T"," 5",[54,74,76],{"class":75},"sdGka"," http://localhost:9222/json/version\n",[10,78,79,80,83,84,87,88,92,93,96,97,100],{},"正常なら ",[14,81,82],{},"Chrome/xxx"," とバージョン情報、そして ",[14,85,86],{},"webSocketDebuggerUrl"," の入った JSON が返ってくる。ところが返ってきたのは ",[89,90,91],"strong",{},"HTTP 404 と空応答","だった。",[14,94,95],{},"netstat"," で見ると 9222 では確かに ",[14,98,99],{},"chrome.exe"," が LISTENING している。",[10,102,103],{},"ポートは listen しているのに、DevTools エンドポイントとしては機能していない。「ポートだけ生きていて中身が死んでいる」ゾンビ状態だ。ここで「136+ の制約とは別物だ」と気づいた。制約の話ならそもそもポートが開かない。開いているのに 404 を返すのは、別のレイヤーの問題だ。",[23,105,107],{"id":106},"二枚目を剥がす-残骸の9222リスナーが居座っていた","二枚目を剥がす: 残骸の9222リスナーが居座っていた",[10,109,110,111,113,114,117],{},"決定的な証拠は次の確認で出た。",[14,112,32],{}," を付けて起動中の Chrome を数えさせたら、",[89,115,116],{},"1つも無かった","。",[45,119,121],{"className":47,"code":120,"language":49,"meta":50,"style":50},"powershell -Command \"Get-CimInstance Win32_Process -Filter \\\"Name='chrome.exe'\\\" | Where-Object { $_.CommandLine -like '*remote-debugging-port*' }\"\n",[14,122,123],{"__ignoreMap":50},[54,124,125,128,131,135,138,141,144,146,149,152,155],{"class":56,"line":57},[54,126,127],{"class":60},"powershell",[54,129,130],{"class":64}," -Command",[54,132,134],{"class":133},"sMJiu"," \"",[54,136,137],{"class":75},"Get-CimInstance Win32_Process -Filter ",[54,139,140],{"class":64},"\\\"",[54,142,143],{"class":75},"Name='chrome.exe'",[54,145,140],{"class":64},[54,147,148],{"class":75}," | Where-Object { ",[54,150,151],{"class":64},"$_",[54,153,154],{"class":75},".CommandLine -like '*remote-debugging-port*' }",[54,156,157],{"class":133},"\"\n",[10,159,160,161,164],{},"正規のデバッグ Chrome は一つも動いていない。なのに 9222 だけが壊れた状態で開いている。つまり、",[89,162,163],{},"前にデバッグ用に起動した Chrome を閉じ損ねて残った「壊れた残骸の9222リスナー」が居座っていた","のだ。",[10,166,167,168,171],{},"これが真因だった。",[14,169,170],{},"--autoConnect"," の設定が悪いわけでも、Chrome のバージョンが悪いわけでもない。起動時に MCP サーバーがこの壊れた 9222 を掴みに行って、繋がらないまま \"still connecting\" で固まる。設定ファイルを一文字も触る必要はなかった。",[10,173,174],{},"二日間、見当違いの方向を疑っていたことになる。違和感の正体は「設定」ではなく「ゴミの居座り」だった。",[23,176,177],{"id":177},"クリーンな9222を立て直す",[10,179,180],{},"真因が分かれば手順は素直だ。Claude Code は Chrome に依存していないので、全 Chrome を落としてもエディタは生き残る。",[45,182,184],{"className":47,"code":183,"language":49,"meta":50,"style":50},"# 全Chromeを終了して9222を解放\ntaskkill //IM chrome.exe //F\n\n# temp profile + 9222 でクリーンなデバッグChromeを起動（136+ の制約に当たらない）\nchrome.exe --remote-debugging-port=9222 --user-data-dir=\"C:/Users/numbe/AppData/Local/Temp/chrome-claude-profile\"\n",[14,185,186,192,207,214,220],{"__ignoreMap":50},[54,187,188],{"class":56,"line":57},[54,189,191],{"class":190},"sxvE3","# 全Chromeを終了して9222を解放\n",[54,193,195,198,201,204],{"class":56,"line":194},2,[54,196,197],{"class":60},"taskkill",[54,199,200],{"class":75}," //IM",[54,202,203],{"class":75}," chrome.exe",[54,205,206],{"class":75}," //F\n",[54,208,210],{"class":56,"line":209},3,[54,211,213],{"emptyLinePlaceholder":212},true,"\n",[54,215,217],{"class":56,"line":216},4,[54,218,219],{"class":190},"# temp profile + 9222 でクリーンなデバッグChromeを起動（136+ の制約に当たらない）\n",[54,221,223,225,228,231,234,237],{"class":56,"line":222},5,[54,224,99],{"class":60},[54,226,227],{"class":64}," --remote-debugging-port=9222",[54,229,230],{"class":64}," --user-data-dir=",[54,232,233],{"class":133},"\"",[54,235,236],{"class":75},"C:/Users/numbe/AppData/Local/Temp/chrome-claude-profile",[54,238,157],{"class":133},[10,240,241,242,245,246,249,250,252],{},"再度 ",[14,243,244],{},"curl http://localhost:9222/json/version"," を叩くと、今度は ",[14,247,248],{},"Chrome/148.0.7778.179"," と ",[14,251,86],{}," 入りの JSON が返ってきた。9222 が正常な CDP エンドポイントとして蘇った。ユーザーの普段のタブは別インスタンスで復元させた。",[45,254,256],{"className":47,"code":255,"language":49,"meta":50,"style":50},"chrome.exe --restore-last-session\n",[14,257,258],{"__ignoreMap":50},[54,259,260,262],{"class":56,"line":57},[54,261,99],{"class":60},[54,263,264],{"class":64}," --restore-last-session\n",[10,266,267],{},"temp profile のデバッグ Chrome と通常 Chrome は別インスタンスなので、9222 を奪い合わずに共存する。",[23,269,271],{"id":270},"三枚目を剥がす-全体再起動が必須も思い込みだった","三枚目を剥がす: 「全体再起動が必須」も思い込みだった",[10,273,274],{},"ここで正直に立ち止まった。この時点で直ったのは「9222 が正常になった」ことだけで、固着していた MCP サーバーが実際に復活するかは未検証だった。だから「9222 はクリーンにしたが、MCP が直るかはまだ確認できていない」とそのまま伝えた。分かったふりをして断定するのが一番危ない。",[10,276,277],{},"検証していくと、MCP サーバーの挙動が見えてきた。サーバーはセッション起動時に一度だけ Chrome に繋ぎに行く。古いセッションは「9222 がまだ壊れていた時刻に起動」したので失敗し、そのまま固着して再試行していなかった。この観測から「だから Claude Code 全体の再起動が必須だ」と issue に書いた。",[10,279,280],{},"これがまた断定しすぎだった。",[10,282,283,284,287,288,291,292,294],{},"実際に試したら、",[14,285,286],{},"/mcp"," メニューで chrome-devtools を ",[89,289,290],{},"reconnect するだけ","で ",[14,293,20],{}," が復活した。全体再起動は要らなかった。クリーンな 9222 を用意してから reconnect すれば、その場で正常な 9222 を掴み直す。固着していた古いセッション側でも reconnect 一発で蘇った。",[10,296,297],{},"復活したツールで、実際に統合日記ページを開いてスクショまで撮れた。ここまで通って完全実証になった。「起動時にしか繋ぎ直さない」という観測は、reconnect という明示操作には当てはまらなかったわけだ。",[23,299,300],{"id":300},"後始末とナレッジ化",[10,302,303],{},"再発したときに迷わないよう、痕跡を残した。",[305,306,307,315,321,327],"ul",{},[308,309,310,311,314],"li",{},"issue メモ ",[14,312,313],{},".claude/issues/2026-05-26-chrome-devtools-mcp-connect.md"," の冒頭に「別セッションに渡せばそれだけ読んで復旧をテストできる」自己完結したクイックスタート手順を整備した。",[308,316,317,320],{},[14,318,319],{},"apps/web/CLAUDE.md"," に「### 5」として最頻の詰まりを追記した。",[308,322,323,326],{},[14,324,325],{},"~/.claude/rules/windows.md"," にも同じ学びを足した。",[308,328,329],{},"issue はクローズ済みにした。",[10,331,332,333,336],{},"念のため issue メモを codex（gpt-5.5）にレビューさせたら、「因果を断定しすぎ」という妥当な指摘が2点出てきた。「autoConnect が壊れた 9222 を掴んだ」は直接ログを取っていないので有力仮説どまりだし、",[14,334,335],{},"--browserUrl"," に切り替えても壊れた 9222 には繋がってしまうので「誤接続を防ぐ効果はない」という指摘だった。どちらももっともだったので、観測事実と仮説を分けて書き直した。AI のレビューに自分の断定を削らせた格好だ。",[10,338,339,340,343],{},"恒久対策はシンプルに落ち着いた。",[89,341,342],{},"デバッグ Chrome（temp profile / 9222）は使い終わったら必ず閉じる","。残骸を残さなければ固着の連鎖は始まらない。最後に temp profile のデバッグ Chrome だけを狙って終了して 9222 を解放し、通常 Chrome のタブはそのまま残した。",[23,345,346],{"id":346},"学びメモ",[305,348,349,355,370,379,385,391],{},[308,350,351,354],{},[89,352,353],{},"思い込んだ制約と実際の真因は別物だった","。「136+ のデフォルトプロファイル制約」だと決めつけて二日放置したが、真因は「閉じ損ねた残骸の9222リスナーが居座っていた」こと。過去に解決済みとメモした件と症状が似ていても、別レイヤーで詰まっていることがある。",[308,356,357,117,360,362,363,366,367,369],{},[89,358,359],{},"ポートが listen していても endpoint が生きているとは限らない",[14,361,95],{}," の LISTENING だけ見ても判定できない。",[14,364,365],{},"curl /json/version"," が ",[14,368,86],{}," 入りの JSON を返すかまで確認して初めて「生きている」と言える。404・空応答ならゾンビ。",[308,371,372,375,376,378],{},[89,373,374],{},"断定しすぎず、実証する","。「全体再起動が必須」と書いたが、実際は ",[14,377,286],{}," の reconnect だけで足りた。未検証のものは「確認できていない」と正直に言い、手を動かして実証してから言い切る。",[308,380,381,384],{},[89,382,383],{},"観測事実と仮説を分けて書く","。codex に「因果を断定しすぎ」と指摘されて初めて、自分が観測（9222 が 404）と推定（autoConnect が掴んだ）を混ぜて「確定」と書いていたことに気づいた。",[308,386,387,390],{},[89,388,389],{},"人間は違和感を拾う係、AI は実行する係","。「また固まっている」という違和感と「9222 が 404 なのは別物だ」という判断は自分が拾い、調査・クリーン化・検証・ナレッジ化の手順は AI に回させた。役割を分けると詰まりが早く解けた。",[308,392,393,396],{},[89,394,395],{},"残骸を残さないのが恒久対策","。デバッグ用に開いた Chrome は使い終わったら必ず閉じる。これさえ守れば、そもそもこの固着は起きない。",[398,399,400],"style",{},"html pre.shiki code .senZ8, html code.shiki .senZ8{--shiki-default:#59873A;--shiki-dark:#59873A}html pre.shiki code .snbK4, html code.shiki .snbK4{--shiki-default:#A65E2B;--shiki-dark:#A65E2B}html pre.shiki code .sM54T, html code.shiki .sM54T{--shiki-default:#2F798A;--shiki-dark:#2F798A}html pre.shiki code .sdGka, html code.shiki .sdGka{--shiki-default:#B56959;--shiki-dark:#B56959}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sMJiu, html code.shiki .sMJiu{--shiki-default:#B5695977;--shiki-dark:#B5695977}html pre.shiki code .sxvE3, html code.shiki .sxvE3{--shiki-default:#A0ADA0;--shiki-dark:#A0ADA0}",{"title":50,"searchDepth":194,"depth":194,"links":402},[403,404,405,406,407,408,409],{"id":25,"depth":194,"text":26},{"id":39,"depth":194,"text":40},{"id":106,"depth":194,"text":107},{"id":177,"depth":194,"text":177},{"id":270,"depth":194,"text":271},{"id":300,"depth":194,"text":300},{"id":346,"depth":194,"text":346},"dev","Chrome DevTools MCP が起動時に固まってツールが一切ロードされない事象を調べたら、Chromeのバージョン制約ではなく『壊れた残骸の9222リスナーが居座っていた』のが真因だった。/mcp の reconnect だけで復活すると実証した記録。","md",{},null,"/chrome-devtools-mcp-zombie-port-recovery","claude-code-tools",false,"2026-05-27T00:00:00.000Z",{"title":5,"description":411},"2026-05/2026-05-27/chrome-devtools-mcp-zombie-port-recovery",[422,423,424,425],"Chrome DevTools MCP","Claude Code","デバッグ","Windows","r-kFMWCWKELsp7myxMhkQq0jBUFU-BkskhwIINyM_ZI",[],"https://log.eurekapu.com/og/blog/chrome-devtools-mcp-zombie-port-recovery.png?v=2026-05-27T00%3A00%3A00.000Z&title=Chrome%20DevTools%20MCP%20%E3%81%8C%20%22still%20connecting%22%20%E3%81%A7%E5%9B%BA%E3%81%BE%E3%82%8B%E7%9C%9F%E5%9B%A0%E3%81%AF%E3%80%8E%E6%AE%8B%E9%AA%B89222%E3%83%AA%E3%82%B9%E3%83%8A%E3%83%BC%E3%81%AE%E5%B1%85%E5%BA%A7%E3%82%8A%E3%80%8F%E3%81%A0%E3%81%A3%E3%81%9F&author=Kei%20Komatsu&sig=c5f4955d8a7fc1d6",1782528842577]