mcpField
C
cdpm

cdpm

ローカル
github.com/IGELHARINEブラウザ自動化31 週間前に更新

cdpm について

CDPMは、複数のClaude Codeセッションやサブエージェントで、番号付きの永続Chromeインスタンスを共有するMCPサーバーです。通常のChromeをCDPで操作し、タブごとのコマンドキューとメッセージ連携で並行作業を支援します。

主な機能

  1. 01複数セッションで番号付きChromeを共有
  2. 02スロットごとに永続プロファイルを保持
  3. 03CDPでChromeを直接操作
  4. 04タブ単位でコマンドをキューイング
  5. 05エージェント間でメッセージを送受信
  6. 06ブラウザのダイアログと権限確認に対応

活用シーン

  1. 01複数エージェントでログイン済みWebアプリを操作
  2. 02番号付きスロットにブラウザー調査を分担
  3. 03スロット間のメッセージで結果を連携
  4. 04クライアント終了後もブラウザーセッションを維持

MCP 対応

CDPMはMCPサーバーとしてブラウザースロットの操作とエージェント連携ツールを提供します。Claude Codeに登録でき、他のMCPクライアントにも設定できます。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"igelharine-cdpm": {
"command": "npx",
"args": [
"-y",
"cdpm-mcp"
]
}
}
}
起動コマンドnpx -y cdpm-mcp

ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
npmcdpm-mcp0.1.9

ツール

36

掲載時のツール一覧 · 2 週間前に更新

パラメーター型必須説明
slotintegerいいえブラウザースロット 1-30。"3"、"slot 3"、"browser 3" → 3。ユーザーが 14052 のようなポート番号を指定した場合は、14049 を引きます。
agentstringいいえ他のエージェントに表示されるあなたの表示名です。サブエージェントは必ず設定してください。デフォルトは "claude-f5a6" です。

詳細

CDPM

npm npm downloads License: MIT CDPM MCP server

한국어 README

CDPM: numbered Chrome slots for Claude Code agents

CDPM は、最大 30 個の Chrome インスタンス(「スロット」)を固定のデバッグポートで維持し、任意の数の Claude Code セッションやサブエージェントから番号で操作できる MCP サーバーです。「スロット 3 を開いて」「スロット 1 でログインしてから、スロット 2 でフォームに入力して」といった指示ができます。各スロットは独自のプロファイルを持つ通常の Chrome なので、ログイン状態は実行間で保持され、手作業で使うブラウザーと同じものを利用できます。

複数の Claude エージェントを、ログイン済みのウェブアプリに同時に接続して実行した経験から生まれました。難しかったのはボタンのクリックではなく、セッション間でブラウザーを共有し、ブラウザーを稼働し続けさせ、Chrome 自体が妨げになったときに気付くことでした。

デモ

スロット 11~19 で 9 つのサブエージェントを実行しています(ヘッドレス)。スロット 11~18 はそれぞれ GitHub リポジトリのページを読み取り、slot_send で数値をスロット 19 に送信します。スロット 19 は slot_inbox で待機し、比較表を作成して開きます。実際の実行を CDP 経由で記録したもので、所要時間は約 45 秒です。9 つのスロットを巡回するたびに 1 フレームを記録しています。

Nine slots working in parallel

他との違い

  • 共有される番号付きブラウザー。 スロット N はポート 14049 + N で待ち受け、専用のフォルダーにプロファイルを保持します。セッションがブラウザーを所有するのではなく、スロットを指定して操作します。2 つのセッションが同じスロット内の別々のタブで作業できます。コマンドはタブごとにキューに入れられるため、2 つのエージェントが同じタブに入力しても内容が混ざりません。この動作は統合テストで検証しており、3 つのセッションが 1 つのスロットを 600 ラウンドにわたって共有しても、メモリ、タブ、ロックファイルが増加しない長時間テストでも確認しています。
  • CDP を使う通常の Chrome。 Playwright も Puppeteer も使いません。クリックとキー入力は Input.dispatch*Event で送信されるため、ページは信頼済みイベントとして受け取ります。Chrome は --enable-automation を付けずに起動するため、navigator.webdriver は false のままです。CDPM は Runtime.enable を呼び出さず、ページの読み取りに実行するすべてのスクリプトは、ページから見えない分離されたワールド内で動作します。スナップショットはシャドウルートにもアクセスします。これにより、一般的な自動化の痕跡を取り除きます。ただし、レート制限や IP の評判を回避できるわけではありません。9 つのスロットから同時に Google を検索すれば、やはり CAPTCHA が表示されます。
  • ありふれた障害から復旧。 スロットは切り離された状態で起動するため、VS Code や Claude Code を閉じても(プロセスツリーを強制終了した場合でも)稼働し続けます。再起動後、CDPM はスロットのポートで応答する Chrome に再接続し、タスクバーのアイコンを操作する前にプロセス ID を再確認します。スロットの実行中に Chrome が自動更新されると(Windows では更新によって chrome.exe が置き換えられ、古いブラウザーはレンダラーを起動できなくなり、新しいタブが真っ白なままになります)、CDPM はそのスロットを新しいバージョンで再起動し、タブを開き直します。
  • エージェント間の連携。 slot_send と slot_inbox を使って、スロット番号とエージェント名を指定したメッセージを送受信できます。メッセージはディスクに保存されるため、Chrome の再起動後も保持され、待機中のエージェントはメッセージが届くとすぐに動作を再開します。
  • ページから見えないブラウザー UI。 JavaScript ダイアログは browser_dialog で通知され、応答できます。Windows では、権限のバブル(「このデバイス上の他のアプリやサービスへのアクセス」、通知、位置情報)を UI Automation で検出し、browser_permission で応答します。エージェントの操作で起動されたファイル選択ダイアログは、OS のウィンドウを開かずに捕捉します。ページが開いた印刷ダイアログはすぐに通知されます(ページ自体は一切変更しません)。

クイックスタート

npm install -g cdpm-mcp
cdpm install

Claude Code を再起動し、「スロット 1 をウィンドウ付きで開いて、github.com に移動して」のように指示します。

他のブラウザー MCP サーバーとの比較

CDPMPlaywright MCPChrome DevTools MCP
ブラウザーすべてのセッションで共有される、番号付きのスロットを最大 30 個サーバープロセスごとに 1 つサーバープロセスごとに 1 つ
1 つのブラウザーを複数のセッションで利用はい:タブごとのキュー、所有権に関する警告設計上の目的ではありません設計上の目的ではありません
実行間でログイン状態を保持はい:スロットごとに 1 つのプロファイルはい:永続プロファイル 1 つ(新規プロファイルには --isolated)はい:永続プロファイル 1 つ(新規プロファイルには --isolated)
操作方式生の CDPPlaywrightPuppeteer
エージェント間のメッセージ組み込みなしなし
スロットごとのタスクバーアイコンWindows のタスクバー、macOS の Dockなしなし
その他のブラウザーChrome のみChromium、Firefox、WebKitChrome のみ

他の 2 つも優れたツールです。Firefox または WebKit が必要な場合は Playwright、パフォーマンストレースや DevTools パネルが必要な場合は Chrome DevTools MCP のほうが適しています。各列の内容は、2026 年 10 月時点のドキュメントに基づいています。

セキュリティ

スロットのポートは 127.0.0.1 のみで待ち受けますが、このマシン上のすべてのプロセスが接続し、そのスロットにログイン済みのセッションを操作できます。実行中のスロットはロック解除されたブラウザーと同じものとして扱ってください。信頼していないソフトウェアを実行している間は、スロットに機密性の高いアカウントでログインしたままにしないでください。閉じたスロットのプロファイルはディスク上に保持されます(cdpm purge N で削除できます)。

詳細

  • 純粋な CDP。 Playwright、Puppeteer、ステルスパッチは使用しません。デバッグポートを開いた通常の Chrome を、実際の入力イベントで操作します。
  • 番号付きスロット。 スロット N は CDP ポート 14049 + N(スロット 1 = 14050 … スロット 30 = 14079)と専用のプロファイルフォルダーを使用します。この範囲はよく使われるデフォルトの 9222 を避けています。ほかの用途でこれらのポートが使われている場合は、CDPM_PORT_BASE を設定して範囲を変更してください。この範囲外のポートは管理対象外です。
  • 要求されたときだけ起動します。 browser_launch 以外のツールが、閉じているスロットを起動することはありません。番号を指定しない場合は、最も小さい空きスロットが使われます。
  • 呼び出し元が終了してもスロットは存続します。 CDPM、Claude Code、または VS Code を終了しても(プロセスツリー全体が終了させられた場合も)、スロットの Chrome は終了しません。スロットが終了するのは、browser_close/cdpm close を実行したとき、またはその Chrome を自分で閉じたときだけです。
  • スロットごとにタスクバーのボタンが 1 つ表示されます。スロットの色と番号を使ったブラウザーウィンドウアイコンは、タスクバー上でピクセル単位できれいに表示されるよう事前に調整されています(システムフォントを GDI+ で描画するため、リポジトリにフォントファイルは含まれません)。ウィンドウタイトルには Chrome 独自のウィンドウ名機能を使って「3번」と表示されます(ページからは参照できません)。
  • 多くのエージェントでの利用を想定して設計されています。 すべてのツールで slot を明示的に指定し、各タブを開いた人と最後に操作した人を記録します。ほかの人が直前に使ったタブを操作すると警告しますが、ブロックはしません。同じタブへの同時コマンドは順番に処理されます。
  • エージェント間で通信できます。 slot_send/slot_inbox を使えます。未読メッセージは、各結果の先頭にも表示されます。
  • ステータス行。 cdpm statusline は、実行中のスロットをスロットの色で表示された番号として出力します。各スロットには、最後に操作したタブのタイトルが表示されます(エージェント名は表示されません。空白または新規タブだけの場合は番号のみです)。例:CDPM 1 NAVER 2 Daum。端末の幅に収まるように表示されます(ccstatusline に基づきます)。まずタイトルが短縮され、次に番号のみになり、残りは +N で表示されます。一時停止中のスロット(slot_pause/cdpm pause)の番号は、スロットの色ではなく薄いグレーで表示されます。スロットが実行されていない場合は、薄いグレーで CDPM - と表示されます。Chrome を自分で終了すると(Windows では最後のウィンドウを閉じる、macOS では Cmd+Q)、スロットはすぐに表示から消え、タイトルはリアルタイムで読み取られます。
  • AI 向けの英語。 トークン節約のため、サーバーの指示、ツールの説明、ツールの結果は英語です。Claude にはユーザーの言語で回答するよう指示されています。CLI の出力は韓国語です。
  • ユーザーの PC に影響を与えません。 ウィンドウ、ビューポート、ズームは変更せず、OS のウィンドウをポップアップ表示する操作は拒否されます(以下を参照)。

Windows 11 と macOS で動作します。スロットごとのアイコンは、Windows ではタスクバー、macOS では Dock に表示されます(以下の「macOS」を参照)。 Linux は実験的なサポートです。コードパス(Chrome の検索、データフォルダー)はありますが、Linux マシンではテストされておらず、スロットごとのアイコンもありません。

要件

  • Node.js 22+
  • Google Chrome(自動検出されます。Windows:レジストリの App Paths、次に標準のインストールフォルダー。macOS:/Applications、~/Applications、次に Spotlight。Linux:/usr/bin/google-chrome、google-chrome-stable、/opt/google/chrome/chrome)

インストール

インストールを依頼されましたか?(Claude/AI エージェント向け) 以下の手順を順番に実行してください。

  1. Node.js 22+ と Google Chrome がインストールされていることを確認してください。インストールされていない場合はユーザーに伝え、終了してください。
  2. npm install -g cdpm-mcp@latest を実行してください(すでにインストールされている場合も実行してください。更新されます)。
  3. cdpm install を実行してください(cdpm が見つからない場合:node "$(npm root -g)/cdpm-mcp/dist/cli.js" install)。CDPM を Claude Code に登録し、ステータス行、ルール、サブエージェント、権限を設定します。以前の git クローンからの登録は、新しい場所に切り替わります。
  4. Chrome スロットを起動したり、質問したり、内部の仕組みを説明したりしないでください。成功した場合は、ユーザーの言語で次のように 1 行だけ正確に返信してください。「CDPM installed. Restart Claude Code to use it.」(version:cdpm --version)。手順に失敗した場合は、どの手順がなぜ失敗したかだけを伝えてください。
npm install -g cdpm-mcp
cdpm install

cdpm install は、CDPM を Claude Code に登録し、ステータス行、並列作業ルール、cdpm-browser サブエージェント、権限許可リストを一括で設定します。その後、Claude Code を再起動してください。

その他の MCP クライアント(Cursor、Claude Desktop、...)

cdpm install では Claude Code にのみ登録されます。他のクライアントでは、mcpServers 設定に追加してください(パスは npm root -g で確認できます)。

{
  "mcpServers": {
    "cdpm": {
      "command": "C:\\Program Files\\nodejs\\node.exe",
      "args": ["C:\\Users\\<you>\\AppData\\Roaming\\npm\\node_modules\\cdpm-mcp\\dist\\cli.js"]
    }
  }
}

macOS の場合:"command": "/opt/homebrew/opt/node/bin/node"、"args": ["/opt/homebrew/lib/node_modules/cdpm-mcp/dist/cli.js"]。

  • ツールはどのクライアントでも同じです。
  • CDPM は接続しているクライアントの名前に基づいて指示を選びます。claude-code のみが Claude Code 専用のガイダンス(Agent ツールを使ったサブエージェントの起動、cdpm-browser)を受け取ります。他のクライアントには一般的なルールが適用されます。クライアントにサブエージェント機能がある場合はスロットごとに専用のサブエージェントを割り当て、ない場合はスロットごとに異なる agent 名を使ってください。
  • 自動セットアップ(ステータス行、CLAUDE.md ルール、cdpm-browser、権限)は ~/.claude を変更するため、Claude Code の接続時にのみ実行されます。別のクライアントから CDPM を起動しても、Claude Code の設定には触れません。
クローンからの実行(開発)
git clone https://github.com/IGELHARINE/CDPM.git
cd CDPM
npm install
node dist/cli.js install
更新
npm install -g cdpm-mcp@latest

その後、Claude Code を再起動してください。クローンからの場合は、git fetch origin && git reset --hard origin/main と npm install を実行してください。MCP の登録とステータス行の設定はそのまま維持されます。node dist/cli.js --version でバージョンを確認できます。変更内容は CHANGELOG.md に記載されています。

または、Claude に「CDPM を更新して」と頼むだけです。

自動で行われること

MCP サーバーの初回起動時に、CDPM は追加の手順なしで次の設定を一度だけ行います(元のファイルは .before-cdpm としてバックアップされます)。

  • Claude Code のステータス行にスロット表示を追加します(3 秒ごとに再描画されます)。
  • ユーザーの CLAUDE.md にルールを追加します。複数のスロットに異なる作業を割り当てる場合は、スロットごとにサブエージェントを並列で実行し、それぞれに出力の一部を個別に書かせます(Claude は MCP のガイダンスよりユーザーの指示に従う傾向が高いためです)。
  • CDPM 専用のサブエージェント cdpm-browser を ~/.claude/agents/ に追加します。CDPM ツールとファイル書き込みのみを使い、CLAUDE.md は含まないため、より速く起動します(3 スロットの並列ジョブで計測したところ、中央値は 28.7 秒から 20.6 秒に短縮し、使用量は約 37% 削減されました)。メインエージェントと同じモデルと推論レベルを使います。CDPM の登録に使われている名前が適用されます。
  • Claude Code の権限許可リスト(settings.json の permissions.allow)に CDPM ツール(mcp__cdpm)を追加し、自動モードの分類器が作業途中の入力やフォーム入力をブロックしないようにします。これにより、Claude は毎回確認を求めずに CDPM の入力やクリック(メールの送信、投稿など)を実行します。
  • サブエージェントは一度に最大 20 個まで実行されます。そのため、スロットが 20 個を超える場合、Claude はサブエージェントを複数のバッチに分けて起動します(CLAUDE_CODE_MAX_CONCURRENT_SUBAGENTS で上限を引き上げられます)。

cdpm unsetup で取り消せます。完全にスキップするには CDPM_NO_AUTO_SETUP=1 を設定してください。更新によって自動セットアップの内容が変更された場合、項目ごとにもう一度実行されます。引き続き存在する項目は更新され、削除した項目(cdpm unsetup で削除したものを含みます)は再追加されません。cdpm setup を実行すると、すべて再追加されます。

ステータス行のみ

cdpm install(およびサーバーの初回起動)で、すでに有効になります。ステータス行のみを再設定するには、cdpm statusline-setup を実行してください。ステータス行がない場合は Claude の設定に追加されます。ccstatusline を使っている場合はウィジェットが追加されます。それ以外のステータス行の場合は変更せず、追記するコマンドが表示されます。元のファイルは .before-cdpm としてバックアップされます。

動作の仕組み

各結果はヘッダーから始まります。スロットのタブ(> =現在操作中、·앞 =ウィンドウ内で手前にあるタブ)、警告、新しいメッセージ(その場で既読としてマークされます)が表示されます。

タブのルール: タブが1つならそのタブを使います。エージェントが最後に使用した(または新しく開いた)タブがあれば、そのタブを使います。初回の使用では、閲覧ツールは手前のタブを使い、操作ツールにはtabが必要です。タブ番号は初めて認識された順に割り当てられ、t7のようなIDは、そのタブが開いている間は変わりません。

1つのスロットの共有: 複数のエージェント(別々のClaudeセッションの場合も含む)が、同じスロットでそれぞれ別のタブを使い、同時に作業できます。コマンドはタブごとにキューに入るため、エージェントAがタブ1に入力している間に、エージェントBがタブ2をクリックできます。同じタブ上のコマンドだけが、Claudeセッションをまたいで互いに待機します(タブごとのロックファイルを使用)。そのため、2つのセッションが1つのタブに入力しても、操作が混ざることはありません。プロセスが停止した後も保持されているロックはすぐに解放され、2分を超えて保持されているロックは、待機せずに報告されます。スロットの開始と終了にもスロットごとのロックが使われるため、2つのセッションが同時に同じスロットを開始しても、Chromeが起動するのは1回だけです(もう一方は既存のインスタンスに接続します)。1つのスロットは1つのChromeプロファイルを使うため、あるタブでログインしたサイトには新しいタブからもログインできます(タブごとに認証するサイトを除く)。browser_tab_newはバックグラウンドでタブを開くため、ユーザーの表示も別のエージェントのタブも変わらず、開いたエージェントは自分のタブを使い続けます。各セッションにはそれぞれ別の名前(claude-a3f1。サブエージェントは独自の名前)が割り当てられ、ヘッダーには各タブを開いた人と最後に使用した人が表示されます。他の人が直前に使用したタブを操作すると、そのことがブロックされずに報告されます。1つのエージェントが操作できるスロットは1つです。1分以内に2つ目のスロットを操作しようとすると拒否され、そのスロット用にサブエージェントを開始するよう案内されます(比較する場合はmultiSlot: true)。他のスロットの読み取りは常に許可されます。スロットは「slot 3」のように番号で指定してください。「browser B」のような名前では、Claudeが推測することになります。

バックグラウンドタブは、タブを切り替えずに読み取り、操作、キャプチャできます。非表示のタブを操作する間、CDPMは一時的にEmulation.setFocusEmulationEnabledを有効にしてChromeに描画させ、その後無効にします。ユーザーの表示は変わりませんが、その間、ページからはそのタブがフォーカスされているように見えるため(document.hasFocus()など)、サイトに気づかれる可能性があります。

長いページ: browser_snapshotは、ヘッダーに「1/8 · 次: page=2」と表示して、最初のページ(約12k文字)を返します。後続のページには祖先のコンテキストが含まれ、参照はページをまたいでも同じです。findは空白を無視して行を検索し、祖先とその次の2行を表示します。refは1つのサブツリーを表示します。同じ要素の参照は、ページ遷移が起きるまで変わりません。また、新しい参照はタブをまたいでエージェントごとに一意になるため、別のタブの参照や古いページの参照は常に拒否されます。

ツール

すべてのツールでslot(1~30)とagent(表示名)を指定します。操作ツールでは、tab、summary、readも指定します。read: "text" | "snapshot" | "changes"を指定すると、操作後のページが同じ結果に添付されるため、別途読み取りを呼び出す必要はありません。changesには、エージェントがそのページの前回のスナップショットを取得してから追加または削除された行だけが表示されます。クリックによる変化を確認する最短の方法です。

ツール機能
browser_statusスロット、タブ、起動元、直近の操作、概要、ダイアログのリアルタイム情報
browser_launchスロットを起動します。ユーザーから依頼された場合に限ります。slot を指定しない場合は、空いているスロットのうち番号が最小のものを使用します。slots(リスト)または count を指定すると、番号の小さいものから複数のスロットを一度に起動します。url / urls を指定すると、起動直後にスタートページを開きます。ウィンドウ表示かヘッドレスかはユーザーが選択します。指定がない場合は、Claude が先に確認します(headless を指定しない場合、閉じているスロットは起動しません)。headless: true を指定すると、--headless のみが追加されます。proxy / proxies(プロキシをユーザーから依頼された場合のみ):host:port、http://user:pass@host:port、socks5://...、host:port:user:pass。指定がない場合、プロキシフラグは一切追加されません。ユーザー名とパスワードを含むプロキシは、認証情報を追加して Chrome と同時に終了する、スロットごとの小さなローカルリレーを経由します
browser_close正常に閉じます(プロファイルは保持されます)
browser_tabs / browser_tab_new / browser_tab_close / browser_tab_select一覧表示 / バックグラウンドで開く(ID を返します) / 閉じる / 前面に表示する(ユーザーが希望した場合のみ)
browser_snapshot参照 ID 付きのアクセシビリティテキスト。page、find、ref
browser_text読みやすいテキスト(メインまたは記事を優先、あるいは 1 つの ref)。ページ分割されます
browser_screenshot表示領域を PNG で取得します。バックグラウンドタブも含みます。ページ全体のキャプチャには対応していません
browser_navigate / browser_back読み込みが完了するまで待機します。応答の遅いサーバーはエラーではなく「読み込み中」として報告されます
browser_clickマウスで実際にクリックします。クリックを覆う要素、新しいタブ、フォームの入力検証エラーを報告します
browser_type文字ごとに実際のキーイベントを送ります(clear、submit、fast)。値を検証し、入力値が異なる場合(サイトが入力を拒否または書き換えた場合)、submit で Enter キーを押しません。日付/時刻の入力欄は、書式の検証後に設定されます
browser_fill1 ページ内の複数の入力欄に順番に入力し、必要に応じて submit(「Enter」またはボタンの参照 ID)を実行します。最初の失敗、ページの変更、ダイアログ、または入力した値と異なる値が表示された入力欄で停止します(その場合、送信は行われません)
browser_dialog表示中の alert/confirm/prompt/beforeunload を承認または閉じます(prompt には text を指定)。メッセージに基づいて Claude が判断します
browser_permissionChrome の権限ポップアップ(「このサイトがこのデバイス上の他のアプリやサービスへのアクセスを要求しています」、通知、位置情報など)を一覧表示するか、ボタン名を正確に指定して応答します。ウィンドウ表示のスロットで使用します
browser_forward / browser_reload進む/再読み込みします(Chrome 独自の再読み込み、ignore_cache)
browser_hover要素の上に実際にマウスを移動します(ホバー時のみ表示されるメニュー向け)
browser_dragマウスで実際にドラッグします。ドラッグ&ドロップ、スライダー、並べ替えに対応します。to(参照 ID)、to_text(テキスト)、または dx/dy でドロップ先を指定します。HTML5 のドラッグは OS のドラッグを使わずに処理されます。draggable 要素には参照 ID が割り当てられます
browser_download_waitダウンロードの完了を待ち、保存されたファイルパスを返します(Chrome のダウンロードフォルダー設定は保持されます)
browser_pdfページを PDF として保存します(既定:Downloads フォルダー。タイトルをファイル名に使用)
browser_uploadファイルをアップロードします。参照 ID を指定してファイル入力欄にアップロードするか、参照 ID を指定せずに「添付」ボタンをクリックしてアップロードします(CDPM が OS のファイルダイアログをインターセプトするため、ダイアログは表示されません)
browser_select<select>:フォーカスしてキーを送信します(Windows では矢印キー、macOS ではオプションの先頭文字を入力。信頼されたイベントを使用し、ポップアップは表示されません)
browser_press_keyEnter、Tab、Control+A(macOS では Meta+A)など(クリップボード関連のキーは拒否されます)
browser_scroll参照 ID の位置まで、または正確に dy ピクセル分スクロールします(位置の変化を A → B として報告します)
browser_wait本文またはタイトル内のテキスト/gone(テキストが消える)/url の変更/enabled(ボタンまたは入力欄が無効状態でなくなる)/response(URL が一致するネットワーク応答が完了。本文を返します。たとえば、SPA リストの背後にある JSON など。クリック中に到着した応答も捕捉します。追加のリクエストは送信しません)/network_idle/秒数
browser_eval分離されたワールドで JavaScript を実行します(DOM は参照できますが、ページのグローバル変数は参照できません)
browser_network / browser_network_detailリクエスト(直近 500 件、30 分間)/ヘッダー、POST データ、本文
browser_blockタブの URL パターンをブロック/ブロック解除します。クロスサイトの iframe も対象です(すでに開いているもの、または後から作成されるものを、最初のリクエストより前にブロックします)。セッション中有効で、他のエージェントからも確認できます
slot_send / slot_inboxエージェントにメッセージを送信します(受信側のスロット番号を使用。スロット間で機能します)/受信します(wait はメッセージ受信後約 0.1 秒以内に返り、最大 600 秒待機します)。メッセージを受信すると browser_wait も直ちに中断されます
slot_pause / slot_resumeユーザーの指示に従ってスロットを一時停止します(「スロット 3 を停止して」)。すべての操作が直ちに拒否され、実行中の操作は次のキー入力またはマウスイベントの前に停止し、待機処理も戻ります。画面の読み取りは引き続き可能です。再開すると、メッセージでエージェントにページを読み直して続行するよう通知します。すべての Claude セッションに適用されます
サブエージェントは親の MCP プロセスを共有します。それぞれに独自の agent 名を割り当ててください。複数のスロットに異なる仕事(「open 3: Naver, Daum, Google News」)を割り当てると、Claude はデフォルトでそれらを並列に実行します。順番に実行するのではなく、スロットごとに 1 つのサブエージェントを起動します。

ステータスライン

cdpm statusline は約 0.1 秒で終了します(ローカルレジストリを参照し、稼働中の各スロットのポートでタブをすばやく確認します)。セットアップすると、Claude Code が 3 秒ごとにステータスラインを再描画します。cdpm install で有効になります。再設定するには cdpm statusline-setup を実行します。手動で設定する場合は、ccstatusline に Custom Command ウィジェットを追加し、"C:\Program Files\nodejs\node.exe" "C:\path\to\CDPM\dist\cli.js" statusline を指定します(色を保持してください)。それ以外の場合は、statusLine.command に同じコマンドを指定してください。

CLI

cdpm                               run the MCP server (stdio)
cdpm install                       register with Claude Code and run the automatic setup (once after installing)
cdpm setup                         add the status line, CLAUDE.md rule, cdpm-browser subagent and permission allow list, including ones you removed (also done automatically on first server start)
cdpm unsetup                       remove what CDPM added
cdpm --version                     print the version
cdpm launch [slot...]              start slots (ascending order; no number = lowest free)
cdpm launch --headless [slot...]   start without a window
cdpm close <slot...> | --all       close gracefully
cdpm pause <slot...> | --all       pause: stop all agent actions on the slot immediately
cdpm resume <slot...> | --all      resume: wake the waiting agents
cdpm purge <slot>                  delete a closed slot's profile
cdpm status | statusline
cdpm statusline-setup              turn on the slot display in Claude Code's status line (backs up settings)

データは、Windows では %LOCALAPPDATA%\cdpm\、macOS では ~/Library/Application Support/cdpm/、Linux では ~/.cdpm/ に保存されます(CDPM_HOME で上書きできます)。保存されるファイルは、registry.json、messages\<slot>.jsonl(1000 行を超えると最新の 500 行を保持)、messages\<slot>.cursors.json(エージェントごとの読み取り位置を最新 200 件まで保持)、locks\(タブごとおよびスロットごとのロックファイル。Claude のセッションが同時に同じタブを操作したり、同じスロットを起動・終了したりするのを防ぎます。アクション終了時に削除され、終了したプロセスの残存ファイルは毎分クリーンアップされます)、profiles\<slot>\、icons\、auto-setup.json(実行したセットアップのバージョンと CDPM が追加した項目を記録し、削除された項目が再追加されないようにします)、任意の config.json(chromePath、extraArgs)です。

macOS

  • 起動、操作、ネットワークツール、エージェント間のメッセージング、ステータスラインは Windows と同様に機能します。
  • 各スロットの Dock アイコンには、Chrome 独自の CDP コマンド Browser.setDockTile を使って、Windows と同じスロット色の番号付きアイコンが設定されます(アプリのコピーや再署名は不要です)。CDPM の外部で Chrome が再起動すると通常の Chrome アイコンに戻ります。CDPM の起動時または接続時に再設定されます。このコードは macOS でのみ実行されます。
  • Mac の慣習に従い、スロットのウィンドウを閉じても(赤いボタン、Cmd+W)スロットは維持され、ステータスラインには最後に使用したタブのタイトルが表示されます。Cmd+Q で Chrome を終了するとスロットも終了し、削除されます。(Windows では最後のウィンドウを閉じるとスロットが終了します。)
  • macOS の Chrome では、キーイベントだけでは編集用ショートカットが機能しないため、Meta+A(すべて選択)、Meta+Z(元に戻す)、Meta+←/→、Option+←/→ などでは、同じキーイベントとともに対応する Chrome の編集コマンドも送信します。これは、ユーザーがキーを押したときと同じ動作です。
  • <select> で矢印キーを押すと macOS のポップアップメニューが開くため、browser_select は代わりにオプションのテキストの先頭を入力します。先行するオプションが同じ接頭辞を持つ場合は、値を直接設定してその旨を通知します。

CDPM が行わないこと/拒否すること

  • ユーザーエージェントやフィンガープリントの変更、デバイスのエミュレーション、Chrome のパッチ適用、ページスクリプトの変更は行いません。
  • ユーザー自身がクリックするものは、通常どおり開きます。エージェントの操作中に限り、CDPM は OS ウィンドウが表示されないようにします。
    • ファイルピッカーは、操作によってどのように開かれても(クリック、ファイル入力での Enter、フォーム送信)、横取りして browser_upload を使うよう案内します。
    • window.print() は印刷プレビューを開き、閉じるまでそのタブは入力に応答しなくなります。CDPM はページの print を上書きせず(上書きはページ側から検知される可能性があります)、プレビューも閉じません。操作中に印刷プレビューが開くと、操作はその旨を示すメモとともにすぐに返され、プレビューが開いている間はヘッダーにタブ名が表示されるため、エージェントはユーザーに伝えられます。browser_wait はプレビューが表示されると停止します。PDF には browser_pdf を使ってください。
    • 日付、時刻、色の入力欄はクリックしません(ピッカーが開くためです)。browser_type はその値を設定します(色の場合は #ff0000)。
    • CDP 経由で送信された Ctrl+S/Ctrl+O/Ctrl+P などのブラウザーショートカットでは、Chrome の保存/開く/印刷ウィンドウは起動しません。
  • 既知の制限:JavaScript によって外部プログラム用スキーム(mailto: など)へ移動するボタンは事前に検出できません(リンクは検出できます)。エージェントは HTTP 認証プロンプトに入力できません。
  • 起動フラグは --remote-debugging-port、--user-data-dir、--no-first-run、--no-default-browser-check、--window-name のみです(要求があった場合の --headless、およびユーザーがプロキシを要求した場合に限る --proxy-server と --force-webrtc-ip-handling-policy=disable_non_proxied_udp を除きます。ヘッドレス Chrome でも HeadlessChrome と報告されます)。
  • ウィンドウのサイズ/位置/状態、ビューポート、ズームは変更しません。クリックによってページが全画面表示になった場合は、直ちに解除します。
  • Runtime.enable は使用しません。ヘルパースクリプトは分離されたワールドで実行されます。
  • スロットの実行中に Chrome が自動更新された場合(Windows で chrome.exe が置き換わる場合)、古いブラウザーではレンダラーを起動できなくなるため、新しいタブは空白のまま応答しなくなります。CDPM は実行中のバージョンとインストール済みバージョンを比較し(接続時、および chrome.exe ファイルの変更を検知したときに確認します。確認はファイル情報のみを使って 10 秒ごとに行います)、そのスロットを新しいバージョンで再起動し、タブを順番に開き直します(ログイン状態は保持されます。プロキシ用スロットは報告のみ行います)。
  • Chrome の権限バブルはブラウザー UI のため、スナップショットにもスクリーンショットにも表示されず、ページツールからクリックできません。その間、ページは処理を待ちます。Windows では CDPM がこれを検知し(スロットの Chrome が所有する小さなウィンドウで、タイトルにタブのホスト名が含まれるものです。翻訳やパスワードのバブルは無視され、Chrome の言語にも左右されません)、結果ヘッダーで警告し、表示された時点で browser_wait を停止します。また、Claude が browser_permission(UI Automation。ウィンドウが最小化またはほかのウィンドウに覆われていても動作します)でボタンを押せるようにします。ユーザーが求めていないカメラ、マイク、位置情報の使用を許可する前に、Claude は確認します。
  • ダイアログ(alert/confirm/prompt/beforeunload)は報告されますが、自動では処理されません。Claude はメッセージを読み取り、browser_dialog(許可または閉じる)で自ら処理します。ユーザーが求めていない取り消し不能な操作(支払いや削除)を確定するダイアログの場合に限り、ユーザーに確認します。
  • 次の操作は拒否します。クリック、ナビゲーション、起動時のスタートページ、新しいタブでの mailto:/tel:/アプリスキームのリンクやアドレス(ほかのプログラムが起動するため)、<select> のクリック(ポップアップが開くため)、Ctrl+C/X/V/Shift+Insert(ユーザーのクリップボードを使うため)。ナビゲーションによって開始されたダウンロードは、ファイル名とともに報告します。

検証

62 件のユニットテストと 42 件の統合テスト(npm test、npm run test:integration、テスト用ポート 29222 以上で実際の Chrome を使用)。長時間実行するチェック(npm run test:long、約 20 分)では、毎ラウンドで新しいエージェント名を使い、DOM を置き換える SPA 上で 4,000 ラウンドを実行しました。CDPM サーバーのヒープは一定の範囲(26~39 MB、増加傾向なし)に収まり、ページの DOM ノード数は 1,421、JS ヒープは 0.8 MB でした。1 つのスロットを共有する 3 つのセッションで、それぞれ 600 ラウンドを実行した場合(合計 1,800 個のタブを開閉し、スロットを 3 回再起動)、各セッションのヒープは約 20 MB に保たれ、ロックファイルやタブが残ることもありませんでした。15 個のサブエージェント、30 個のスロットによる同時実行では、30 個すべてのウィンドウの位置・サイズ・状態と、52 個すべてのタブのビューポート(innerWidth×innerHeight)およびズームが変更されていないことを確認しました。

ライセンス

MIT

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。