Chrome DevTools MCPが33個のNodeを起動していた:メモリ2.12GBの内訳
Chrome DevTools MCPが33個のNodeを起動していた:メモリ2.12GBの内訳
タスクマネージャーで node.exe を数えると、47プロセスが並んでいた。Nuxtの開発サーバーだけでは説明がつかない。親子関係と起動引数をたどると、そのうち33プロセスが chrome-devtools-mcp に集まった。
さらに1セットを分解すると、ブラウザを操作するMCP本体だけでなく、npxのパッケージ起動係とGoogle利用統計用watchdogが1個ずつ常駐していた。本記事では、Windows 11上で計測したメモリの内訳と、利用統計を止める方法を記録する。
結論
- Chrome DevTools MCPは、今回の構成では1接続につき3個のNodeプロセスを起動した
- 内訳はMCP本体、
npxpackage runner、利用統計watchdog - 11接続で合計33プロセス、固有RAMは約2.12GBだった
--no-usage-statisticsを付けるとwatchdogを起動せず、今回の構成では約409MBを削減できる- 最大の削減策は、ブラウザ操作を使わないセッションでMCP自体を起動しないこと
対策後のメモリを再計測した
利用統計watchdogとCodex側のChrome DevTools MCPを止めたあと、Windows全体をもう一度計測した。最新のスナップショットでは、搭載31.93GBのうち25.34GBを使用し、空きは6.59GB、使用率は79.4%だった。再計測の間は79〜81%で動き、調査中に最大88%まで上がっていた使用率は一段下がった。
アプリ別のPrivate Working Setは次のとおりだった。共有メモリを含むWorking Setはプロセス間で同じ領域を数えるため、ここでは実際に解放を期待しやすい固有RAMを並べている。
| アプリ | プロセス数 | 固有RAM合計 |
|---|---|---|
| Chrome | 31 | 5,617.6MB(約5.49GB) |
| Node.js | 25 | 3,978.0MB(約3.88GB) |
| Claude Code | 6 | 1,627.5MB(約1.59GB) |
| ChatGPT | 11 | 922.7MB(約0.90GB) |
| Windows Defender | 1 | 520.0MB(約0.51GB) |
| Aqua Voice | 8 | 407.1MB(約0.40GB) |
| SQL Server | 1 | 387.8MB(約0.38GB) |
| Dropbox | 7 | 241.1MB(約0.24GB) |
対策前後でNode.jsは47プロセスから25プロセスへ減った。Chrome DevTools MCPに関係するNodeは33個から10個へ減り、内訳はClaude Codeの5セッションが持つ「MCP本体+npx runner」の5セットだった。利用統計watchdogは11個から0個、Codex配下のMCPも0個になった。VS Codeは終了済みで、Code.exeは残っていなかった。
約25GBを全体で分ける
ChromeとNode.jsだけを足すと約9.4GBになる。それでも使用中の25.34GBには約16GB残るため、全プロセスのPrivate Working SetとWindows側の領域まで分けた。
| 区分 | 実RAM | 使用中メモリに占める割合 |
|---|---|---|
| Chrome | 約5.49GB | 21.7% |
| Node.js | 約3.88GB | 15.3% |
| Claude Code | 約1.59GB | 6.3% |
| ChatGPT | 約0.90GB | 3.6% |
| その他すべてのプロセス | 約4.21GB | 16.6% |
| Windows・共有メモリ・カーネル | 約9.28GB | 36.6% |
| 合計 | 約25.34GB | 100% |
小さいアプリは確かに積み上がっていたが、Chrome、Node.js、Claude Code、ChatGPT以外のプロセスを全部足しても約4.2GBだった。残る約9.3GBは、カーネル、ドライバー、共有DLL、メモリマップ、ページテーブルなど、タスクマネージャーのアプリ欄へそのまま現れない領域だった。
確認できた範囲では、カーネルのページプールと非ページプールが合計約2.4GB、システムキャッシュが約0.8GBを使っていた。一方、スタンバイキャッシュ約4.4GBは空き6.59GBの側に含まれ、アプリが要求すればWindowsが自動で明け渡す。手動で空にしても持続的な削減にはならない。計測時はページファイルへの継続的な読み書きも発生しておらず、使用率79%でもメモリ不足に陥った状態ではなかった。
Node.jsの約97%はNuxtとDevTools MCPだった
25個のNode.jsを用途別に分けると、細かなツールがRAMを食い尽くしていたわけではなかった。
| 用途 | プロセス数 | 固有RAM合計 |
|---|---|---|
| Nuxt/Vite開発サーバー | 4 | 約2.24GB |
| Chrome DevTools MCP本体 | 5 | 約1.55GB |
Chrome DevTools npx runner | 5 | 約15MB |
| 学習クイズサーバー | 10 | 約34MB |
| Codex内部Node | 1 | 約50MB |
Nuxt/ViteとDevTools MCP本体の2種類だけでNode.jsの固有RAMの約97%を占めた。特にNuxtのメインプロセス1個が約2.20GBを保持していたため、ローカル確認を終えて開発サーバーを止めれば約2.2GBを戻せる。
5つのClaude CodeセッションがすべてChrome DevToolsを使うなら、5個のMCP本体が使う約1.55GBは並列作業の必要経費になる。現在のMCP本体は1セッションあたり約313〜328MBだった。5セッションを維持したまま3セッションでMCPを読み込まない構成にできれば、MCP分だけで約0.9GBを減らせる。
Chromeは11タブから24レンダラーへ分かれていた
Chromeにはトップレベルのタブが11枚あり、その下で24個のレンダラープロセスが約5.19GBを保持していた。11枚の内訳はlocalhostの開発ページ7枚、ローカルHTML 2枚、XとClaudeが各1枚だった。同じ図解ページを開いたタブも2枚あった。
Chromeはタブだけでなく、iframe、拡張機能、Service Worker、サイト分離でもレンダラーを増やす。そのため「11タブなのに24プロセス」は異常とは限らない。ただし、確認を終えたローカルページや重複タブを閉じれば、現在の環境では最も大きい約5.5GBへ直接手を入れられる。タブごとの正確な使用量はChromeのタスクマネージャー(Shift + Esc)で確認できる。
5セッション運用で現実的に削れる範囲
5セッションを同時に動かす前提では、正体不明の大きな無駄は残っていなかった。削減候補は次の順になる。
- ローカル確認後にNuxt開発サーバーを止め、約2.2GBを戻す
- Chrome DevToolsを使うClaude Codeセッションを限定し、1セッションあたり約0.3GBを減らす
- Chromeの古いローカルプレビューと重複タブを閉じる
- DB開発をしない時間はSQL Serverを止め、約0.4GBを戻す
- Aqua Voice、Dropbox、LINEなどを使わない時間だけ終了する
Windows Defender、svchost、メモリ圧縮、Windowsのカーネル領域は停止対象にしない。利用統計watchdogとCodex側の不要なMCPはすでに取り除いたため、残るメモリ消費の中心は「5セッションを並列に動かす」「Nuxtを起動する」「Chromeでプレビューを並べる」という作業そのものだった。
計測環境
| 項目 | 値 |
|---|---|
| OS | Windows 11 Pro 25H2 |
| 搭載メモリ | 32GB |
| Node.js | 22.22.2 |
| chrome-devtools-mcp | 1.7.0 |
| 起動方法 | npx chrome-devtools-mcp@latest --autoConnect |
| 同時利用 | Claude Code 5セッション、Codexデスクトップ1タスク |
数値は一時点のスナップショットであり、接続中のページ、MCPの稼働時間、Windowsのメモリ圧縮によって変動する。共有ライブラリを二重計上しないよう、削減効果の判断にはPrivate Working Setを使った。
1接続が3個のNodeへ分かれる
実際のプロセスツリーは次の形だった。
Claude Code / Codex
└─ npx.exe
└─ node.exe npx-cli.js
└─ cmd.exe chrome-devtools-mcp --autoConnect
└─ node.exe chrome-devtools-mcp.js
└─ node.exe telemetry/watchdog/main.js
3個の役割は異なる。
npx-cli.jsはnpmキャッシュから対象パッケージを解決し、MCP本体を起動して終了を待つchrome-devtools-mcp.jsがMCPリクエストを受け、Chrome DevTools Protocol経由でブラウザを操作するtelemetry/watchdog/main.jsが利用統計を別プロセスで送信する
--autoConnect は既存のChromeへ接続する指定であり、3プロセス化の原因ではない。
11接続・33プロセスのメモリ内訳
| 役割 | プロセス数 | 固有RAM合計 | 共有込みRAM合計 | 1個あたり固有RAM |
|---|---|---|---|---|
| MCP本体 | 11 | 1,505.2MB | 1,946.2MB | 136.8MB |
npx package runner | 11 | 205.4MB | 647.3MB | 18.7MB |
| 利用統計watchdog | 11 | 409.1MB | 849.9MB | 37.2MB |
| 合計 | 33 | 2,119.7MB | 3,443.4MB | — |
利用統計watchdogだけで固有RAMを409.1MB保持していた。1個なら37MBでも、会話やセッションごとにMCPサーバーが立ち上がると同じプロセスが横へ並ぶ。
接続元を追うと、Claude Codeの5セッションが1セットずつ、Codexデスクトップ配下が6セットを起動していた。Claude Code側は設定の二重登録ではなく、各セッションが専用のstdio MCPサーバーを持つ構成だった。公式READMEにも、多くのMCPクライアントは会話ごとにサーバーを1つ起動すると記載されている。
→ Chrome DevTools MCP公式:Concurrent sessions
利用統計watchdogは何をしているか
インストール済みパッケージのコードを確認すると、usageStatistics が有効な場合だけ ClearcutLogger を初期化し、そのコンストラクターから WatchdogClient が別のNodeプロセスをspawnしていた。watchdogはMCP本体から標準入力でイベントを受け取り、ツール呼び出しの成否、レイテンシ、環境情報などを送信する。
利用統計はデフォルトで有効だが、ブラウザ操作そのものには必要ない。Chrome本体の利用統計設定とも独立している。
→ Chrome DevTools MCP公式:Usage statistics
利用統計を無効化する
MCPサーバーの引数へ --no-usage-statistics を追加する。
{
"mcpServers": {
"chrome-devtools": {
"command": "npx",
"args": [
"chrome-devtools-mcp@latest",
"--autoConnect",
"--no-usage-statistics"
]
}
}
}
環境変数でも無効化できる。
CHROME_DEVTOOLS_MCP_NO_USAGE_STATISTICS=1
設定は次回起動するMCPサーバーから反映される。すでに動いているwatchdogは自動では消えないため、親のClaude CodeやCodexセッションを閉じるか、コマンドラインでwatchdogと確認できたPIDだけを終了する。node.exeを名前で一括終了すると、Nuxt、Claude Code、MCP、エディタ拡張まで巻き込むので避ける。
今回の環境では、11個のwatchdogをPID指定で停止し、残数が0になったことを確認した。MCP本体は停止せず、Chrome操作機能を維持した。
さらに減らすならMCPを必要時だけ起動する
利用統計を止めても、MCP本体とnpx runnerは残る。今回の固有RAM2.12GBのうち、MCP本体が1.51GBを占めた。メモリを大きく戻すには、ブラウザを操作しないClaude CodeセッションでChrome DevTools MCPを読み込まない運用へ切り替える必要がある。
npx runnerはパッケージの自動取得と最新版追従を担う。chrome-devtools-mcpを固定インストールして実体を直接起動すれば約205MBとWindows上のシェルラッパーを減らせるが、更新を自分で管理することになる。最初に外すべきなのは、機能に影響しない利用統計watchdogと、使っていないセッションのMCP本体だ。
計測してわかったこと
プロセス一覧で node.exe を一括りにすると、Nuxtのメモリ増加とMCPの多重起動が混ざる。起動引数、親PID、Private Working Setを同時に見ると、47個のNodeが「Nuxt 4個」「Chrome DevTools MCP 33個」「その他10個」へ分かれた。
「Nodeが多い」で止めず、どの親が何を何個起動したかまで数える。そうすると、アプリ本体を壊さずに409MBだけ切り離せた。