cdpilot について
cdpilot は、Puppeteer、Playwright、Selenium を使わずに生の CDP で直接ブラウザを操作する、依存関係のないコマンドラインのブラウザ自動化ツールです。ローカルでブラウザを制御する必要がある AI エージェントや開発者向けです。プロジェクトごとに分離されたプロファイルで動作します。
主な機能
- 01CDP over HTTP による依存関係なしの実装
- 02ナビゲーション、操作、キャプチャなど70以上のコマンド
- 03プロジェクトごとの独立したブラウザインスタンスとポート
- 04iframe 内の要素の指定
- 05拡張機能開発向け Chrome for Testing への対応
活用シーン
- 01コマンドラインからのページ表示とスクリーンショット取得
- 02分離されたブラウザプロファイルでの自動化処理の実行
- 03Claude Code へのブラウザ操作機能の提供
MCP 対応
本プロジェクトは MCP サーバー(npx cdpilot mcp)として提供され、ブラウザ操作コマンドを MCP クライアントに公開して AI エージェントから呼び出せるようにします。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
cdpilot
ターミナルから使えるゼロ依存のブラウザ自動化。1 つのコマンドで、完全な制御を。
クイックスタート
npx cdpilot launch # Start browser with CDP
npx cdpilot go https://example.com
npx cdpilot shot # Take screenshot
設定ファイルは不要です。ボイラープレートもありません。npx だけで始められます。
なぜ cdpilot なのか?
AI エージェントと開発者には、そのまま動くブラウザ制御が必要です:
- 設定不要 —
npx cdpilot launchで分離されたブラウザセッションが起動します - 依存ゼロ — Puppeteer も Playwright も Selenium も不要。HTTP 経由の純粋な CDP のみ
- 70 以上のコマンド — ナビゲート、クリック、入力、スクリーンショット、ネットワーク、コンソール、アクセシビリティ、動画理解、段階的なアンチボット耐性など
- AI エージェントフレンドリー — Claude、GPT、Gemini、およびあらゆる LLM のツール利用ワークフロー向けに設計
- 分離されたセッション — あなたの個人用ブラウザはそのままです。cdpilot は独自のプロファイルで動作します
- 視覚的フィードバック — 緑色のグローオーバーレイ、カーソル表示、クリックの波紋、キーストローク表示により、自動化中も状況を把握できます
- マルチプロジェクトの分離 — 各プロジェクトが自動的に独自のブラウザインスタンスとポートを取得するため、競合しません
- AI 制御の警告 — 自動化の実行中にホバーすると、赤いトースト通知が表示されます
- プライバシー優先 — すべてがローカルで動作します。データがあなたのマシンから出ることはありません
ブラウザの選択 (ワークロードに応じた自動選択)
cdpilot は、あなたが行っている作業に適したブラウザを選びます。auto (デフォルト) は
2 軸のポリシーです — 拡張機能のワークロード × プラットフォームの安定性:
| あなたのワークロード | 自動選択の順序 |
|---|---|
拡張機能が登録されている (ext-install) | vivaldi → brave → edge → chromium → chrome (→ インストールされていれば Chrome for Testing) |
| 拡張機能なし (純粋な自動化) | chrome → vivaldi → edge → chromium → brave |
いつでも上書きできます:
cdpilot browser # show current pick + reason
cdpilot browser vivaldi # pin to Vivaldi
cdpilot browser chrome-for-testing # pin to Chrome for Testing (after installing it, below)
cdpilot browser auto # restore smart default
なぜこの使い分けなのか?
- Chrome 137 以降は、アンパックされた拡張機能に対して
--load-extensionを黙って無視します (エラーも警告もなし) — Google はブランド版 Chrome ビルドからこの機能を削除しました (PSA)。 検証済み —chrome://extensionsには 0 件と表示されます。 - Vivaldi、Brave、Edge、Chromium、Chrome for Testing は
--load-extensionを尊重します (テスト済み)。 - macOS 26 (Tahoe) では、Brave 1.89 が稼働時間約 7 分で確実にクラッシュします (ThreadPoolForegroundWorker での SIGTRAP)。cdpilot は OS を検出し、 修正版の Brave がリリースされるまで Brave を自動的に降格させます。
各ブラウザは独自の分離されたプロファイル (~/.cdpilot/.../profile-vivaldi
など) を取得するため、切り替えても設定が破損することはありません。
拡張機能開発: Chrome for Testing
Chrome 自体を対象に拡張機能を開発する場合は、 Chrome for Testing (CfT) をインストールしてください — これは Chrome チームによる、自動化向けのバージョン固定された自動更新されない Chrome ビルドで、 アンパック済み拡張機能を引き続き読み込めます:
cdpilot browser install chrome-for-testing # latest Stable
cdpilot browser install chrome-for-testing --channel beta # stable | beta | dev | canary
cdpilot browser install chrome-for-testing --version 154 # a milestone, or a full version (154.0.8037.57)
cdpilot ext-install ./my-extension/ # register your unpacked extension
cdpilot browser status # shows the CfT version and path
- ダウンロードはそのコマンドでのみ行われます。 これは一度きりの約 150〜190 MB の zip です (mac-arm64 の
154.0.8037.57 では 191,429,663 バイト)。cdpilot がそれを自動的に取得することはありません。このビルドは公式の
CfT JSON エンドポイント
(
last-known-good-versions-with-downloads.json、バージョン別およびマイルストーン別のファイル) から取得されます。 これらは URL のみを列挙しておりハッシュは含まないため、ダウンロードはサーバーのContent-Lengthとそのx-goog-hashmd5 に対して検証され、zip の SHA-256 が記録されます。 - これは
$CDPILOT_HOME/browsers/chrome-for-testing/<version>/に展開され (macOS では 検疫属性はそのディレクトリのみで解除されます)、installed.jsonに記録されます。 - 拡張機能の作業では自動的に使用されます: 開発用拡張機能が登録されている間は、ブランド版 Chrome の
選択 (
cdpilot browser chrome、または拡張機能対応の唯一の選択肢が Chrome の場合のauto) が Chrome for Testing になり、その旨を示す 1 行が stderr に出力されます。 CfT がインストールされていない場合、Chrome に対するext-installはインストールコマンドを表示し、 代替として Vivaldi/Brave を維持します。cdpilot browser chrome-for-testingは常にこれを選択します。 明示的なCHROME_BINが置き換えられることはありません。 - これは cdpilot の通常のプロジェクトごとの分離プロファイル (
profile-cft) で実行されます。 - これは拡張機能の開発とテスト用であり、ステルスブラウザではありません。 cdpilot はこれについて アンチボットを謳っていません。その用途には通常のブラウザ設定を使用してください。
- Linux (Ubuntu 23.10 以降): AppArmor が非特権ユーザー名前空間をブロックし、CfT には
(ディストリビューションの Chrome パッケージとは異なり) それらを許可するプロファイルがないため、
起動時に終了します。cdpilot はこのヒントを出力します。次のコマンドでそれらを許可してください:
sudo sysctl -w kernel.apparmor_restrict_unprivileged_userns=0。
インストール
# Use directly (no install needed)
npx cdpilot <command>
# Or install globally
npm i -g cdpilot
要件: Node.js 18 以上、Python 3.10 以上、および次のいずれか: Brave Browser、Google Chrome、または Chromium。(Python の websockets モジュールは、初回起動時にプリフライトウィザードによって自動インストールされます。)
初回セットアップ
npx cdpilot setup # Auto-detect browser, create isolated profile
npx cdpilot launch # Start browser with CDP enabled
npx cdpilot status # Check connection
Claude Code プラグインマーケットプレイス
cdpilot の MCP サーバーとそのスキルを Claude Code に直接インストールできます。
.mcp.json を編集する必要はありません:
/plugin marketplace add mehmetnadir/cdpilot
/plugin install cdpilot@cdpilot
これにより、cdpilot MCP サーバー (npx cdpilot mcp) と、Claude Code に cdpilot のコマンドをいつどのように
使うべきかを教える短いスキルが登録されます。
.claude-plugin/marketplace.json と
plugins/cdpilot/ を参照してください。
MCP バンドル (.mcpb)
ワンクリックでのローカルサーバーインストールをサポートする MCP クライアント (Claude
Desktop など) では、最新リリース に添付された
.mcpb ファイルをダウンロードして開くか、ご自身でビルドしてください:
npm run build:mcpb # writes cdpilot.mcpb at the repo root
このバンドルは、それを実行するマシン上で同じランタイムを必要とします: Node.js
18 以上、Python 3.10 以上、および Brave/Chrome/Chromium がインストールされていること。
バンドルの MCP バンドルマニフェストについては
manifest.json を参照してください
(仕様)。
0.4.x → 0.5.0 へのアップグレード — まずこれをお読みください
破壊的変更は 1 つで、残りは追加のみです。
破壊的変更 — 視覚的フィードバックのデフォルトが OFF に反転。 緑色のグロー枠、 アニメーション表示される偽カーソル、クリックのリップル、キーストローク表示によって、 cdpilot はどのページでも素人がタイピングしているような印象を与えていました。これらは 現在オプトインになっています:
cdpilot show on # restore the old visual feedback layer
cdpilot show off # default since 0.5.0
MCP サーバーの常時グロー処理(CDPILOT_MCP_SESSION=1)は変更なしです
— セッション中に可視フィードバックを頼りにする AI エージェントは、これまでどおり
自動的にそれを目にします。違いが生じるのは直接 CLI を使うユーザーだけです。
0.5.0 の新機能(移行は不要):
cdpilot dismiss— LLM チャットのサインアップ壁にある「サインアウトのままにする / 結構です」 ボタンに対するヒューリスティックな自動クリック。cdpilot adaptive on— CAPTCHA で保護されたホストでステルスへ自動エスカレーション。 ホストごとの永続メモリ付き。cdpilot cookies save/load— Cookie を JSON としてエクスポート/インポートし、 実行をまたいで CF/DataDome のクリアランスを再現。cdpilot context create/list/close+CDPILOT_TARGET— 単一ブラウザ内で真の並列 自動化を実現する分離されたブラウザコンテキスト。cdpilot fast/cdpilot show— タイミングと視覚効果のトグルをまとめたもの。- 純粋なパフォーマンス: 読み込み後のスリープ 1500ms → 300ms、
scrollIntoViewを即時化、 WebSocket 接続プール、/jsonの TTL キャッシュ。
根拠付きの完全なリストは CHANGELOG.md をご覧ください。
コマンド
ナビゲーションとコンテンツ
cdpilot go <url> # Navigate to URL (alias: open <url>)
cdpilot content # Get page text content
cdpilot html # Get page HTML
cdpilot shot [file] # Take screenshot (PNG)
cdpilot pdf [file] # Save page as PDF
操作
cdpilot click <selector> # Click element
cdpilot type <selector> <text># Type into input
cdpilot fill <selector> <val> # Set input value (React-compatible)
cdpilot submit <form> # Submit form
cdpilot hover <selector> # Hover element
cdpilot keys <combo> # Keyboard shortcut (ctrl+a, enter, etc.)
cdpilot scroll-to <selector> # Scroll element into view
cdpilot drag <from> <to> # Drag and drop
実際のマウスクリック(フレーム内、または --entropy=on)で、ボタンを押している間に
ターゲットが移動したり覆われたりした場合、スクリプトによる再クリックは行われません:
click は Pressed (released elsewhere, not clicked): … と出力し、exit 3 で終了します
(押下されたものの、離すときにターゲットを外したため、クリックされていない。1 は
引き続き「エラー」)。mousedown でページがターゲットを置き換えたり、そこから
ナビゲートしたりした場合は Pressed (the page replaced or left it, not clicked): … と
出力して exit 0 で終了します。MCP(browser_click、browser_smart_click)は
isError: false を返し、最初の行は {"clicked": false, "reason": "moved"|"gone"|"unknown"}
となります。batch と run はすべてのステップを完了したうえで、あるステップが失敗
していれば exit 1、そうでなくクリックがクリックされていなければ exit 3、それ以外は
exit 0 で終了します。
iframe 内での要素の指定
カード型フォーム(Stripe/iyzico 形式)、埋め込みログインウィジェット、reCAPTCHA の
チェックボックスは <iframe> 内にあります。要素セレクタの前に >>> でフレームチェーンを
指定するか、--frame を渡します:
# Payment-style page: the card fields are inside <iframe id="card" title="Secure card payment">
cdpilot fill "iframe#card >>> input[name=cardnumber]" "4242424242424242"
cdpilot type --frame "#card" "input[name=cvc]" "123"
cdpilot click "iframe[title='Secure card payment'] >>> button#pay-btn"
# Nested frames: outermost first
cdpilot click "iframe.checkout >>> iframe.card >>> button"
# --frame <selector|index|url-substring>, nestable with >>>
cdpilot click --frame 0 "button.submit" # first iframe (same order as `frame list`)
cdpilot fill --frame "url=js.stripe.com" "input[name=cardnumber]" "4242424242424242"
cdpilot frame list --frame "#card" # iframes inside that frame
cdpilot frame eval --frame "#card" "document.title" # runs in the frame's own page context
click、fill、type、submit、hover、dblclick、rightclick、smart-click、smart-fill、smart-select、frame list|eval|shadowで動作します。- フレームホップは、CSS セレクター、0 始まりのインデックス、
name/id、またはurl=<src の部分文字列>です。--frameは裸のsrc部分文字列も受け付けます。 引用符内または[...]内の>>>はリテラルです。iframe を包んでいる要素に マッチするセレクター(Stripe の#card-element)は、その中の iframe に入り、 stderr にその旨を出力します:note: '#card-element' is not an iframe; using the iframe inside it。 - すでに
>>>を含むセレクターやテキストは引き続き動作します。最初の>>>より 前の部分がページ内に iframe を見つけられない場合、またはセグメントが空の場合 (click "Next >>>")、文字列全体がこれまでどおり書かれたまま使用されます。 それも失敗した場合、stderr の 1 行が説明します:note: 'Home' matched no iframe; used the selector as written。--frameは決してフォールバックしません。見つけられないフレームはエラーです (終了コード 1)。 smart-click/smart-fill/smart-selectでは、最初の>>>より前の部分が セレクターのように見える場合(#、.、[を含む、またはiframe/frameタグで始まる)、あるいはurl=…である場合にのみフレームとして扱われます。 単語はテキストのままです。smart-click "Main >>> Settings"は、<main>要素が iframe を保持していても、ページの「Main >>> Settings」リンクをクリックします。 フレームのインデックスや裸の名前には--frameを使用します。- 同一オリジンおよびクロスオリジンのフレームが動作します。out-of-process
iframe(サイトアイソレーション)も含みます。cdpilot は各ホップを CDP 経由で
解決します(
DOM.describeNode→ フレーム ID → そのフレームの実行コンテキスト、 または out-of-process フレームの場合はフラットセッションでのTarget.attachToTarget)。ブラウザーがクロスオリジンでブロックするcontentDocumentは決して使用しません。 - フレーム内では、
clickとsmart-clickは実際のマウス入力です (isTrusted: true)。hover、dblclick、rightclick、--entropy=onの クリックも同様です。ボックスのない要素はスクリプトクリックにフォールバック します。マウス入力はページ座標で送出されます。ページ内の各フレームのオフセット とスケール(transform: scale()、zoom)が自動的に適用されるため、ブラウザーは 正しいフレームに対してヒットテストを行います。押す前に、cdpilot はその地点を 確認します(途中の各ドキュメントでのelementFromPoint)。ターゲットが クッキーバナーなどで覆われている場合、代わりにスクリプトでターゲットを クリックし、stderr の 1 行にその旨を出力します(note: … is covered by div#cookie at the click point; used a script click)。cdpilot 自身の入力ブロッカー(show on、 MCP セッション)は、クリック自体については cdpilot のクリックのみを通過させます。 smart-click/smart-fill/smart-selectはまずページ内を探し、テキストを 空白を折りたたんで比較します( と改行は 1 つのスペースとして数えます)。 テキストまたはラベルがクエリ全体を含む、有効なページ要素が使用されます。 ページ内でそのような要素が無効なものしかない場合、コマンドはこれまでどおり 失敗します(no enabled element matches …)。フレーム内は探しません。 そうでなければ、可視フレームが幅優先でクエリ全体の一致について検索され (最大 20 フレーム、検索のすべての CDP 呼び出しに 2 秒)、一致は stderr に 報告されます:smart-click: matched inside frame iframe#card (https://…)。検索は見るだけで (クリックも入力もしません)、その後コマンドは選択されたフレーム内で 1 回だけ 動作します。フレームの一致がない場合、ページの部分的な(単語の)一致が これまでどおり使用されます。2 秒が経過した場合:smart-click: frame search stopped after 2s (3 of 7 frames)。その時点までに 応答しなかったフレームは触れられていません。smart-fillとsmart-selectは、ページ自身のオリジンのフレームのみを自動的に 検索するため、入力された値が第三者フレーム(広告、チャット、決済ウィジェット) に誤って入ることはありません。クロスオリジンフレームに到達するには>>>または--frameを使用します。smart-clickはすべての可視フレームを検索します。--frameなしのframe listは、これまでと同じリストを出力します。
デバッグ
cdpilot console [url] # Capture console logs
cdpilot network [url] # Monitor network requests
cdpilot debug [url] # Full diagnostic (console+network+perf+shot)
cdpilot perf # Performance metrics
cdpilot eval <js> # Execute JavaScript
cdpilot eval-batch <json> # Run N JS expressions in 1 roundtrip (5-30x faster)
# Example: read 4 DOM values in a single CDP roundtrip instead of 4
cdpilot eval-batch '["document.title","location.href","document.links.length","document.images.length"]'
# → [{"ok":true,"value":"..."}, {"ok":true,"value":"..."}, ...]
パフォーマンス
cdpilot block # Show status
cdpilot block on # Enable (default preset: images+fonts+ads)
cdpilot block off # Disable
cdpilot block preset images,fonts,ads,media # Set patterns from named presets
cdpilot block patterns '*.png' '*.woff2' # Custom URL patterns
cdpilot block clear # Drop all patterns
ステルスに関する注意:
blockはフィンガープリントの表面を変化させます — 実際のブラウザは 画像、フォント、アナリティクスを取得します。Cloudflare クラスのボット検出器はリクエストの 欠落に気づきます。ステルス/アンチボットを対象とする場合はblockを オフ のままにしてください。 溶け込むことよりも速度が重要な、安全とわかっている内部サイトでは オン にしてください。
cdpilot fast # Show status (effective auto-wait ms)
cdpilot fast on # Auto-wait 5s → 2s, less idle padding
cdpilot fast off # Back to defaults
CDPILOT_WAIT_MS=1000 cdpilot click # Per-command override (env wins over fast mode)
cdpilot show # Show status (visual feedback on/off)
cdpilot show on # Re-enable glow border + cursor + ripples + keystrokes
cdpilot show off # Default since 0.4.4 — quiet, professional output
ビジュアルフィードバックのデフォルトは 0.4.4 で変更されました — 以前のアニメーション(緑色の グロー、移動するカーソル、クリックのリップル)は、あらゆる操作を素人が画面を操作しているように 見せていました。これらは
cdpilot show onでオプトインする方式になりました。MCP サーバーの 常時グロー機能(CDPILOT_MCP_SESSION=1)は影響を受けません — セッション中に可視フィードバックに 依存する AI エージェントは、引き続き自動的にそれを目にすることができます。
タブ管理
cdpilot tabs # List open tabs
cdpilot new-tab [url] # Open new tab
cdpilot switch-tab <id> # Switch to tab
cdpilot close-tab [id] # Close tab
cdpilot close # Close active tab
ネットワーク制御
cdpilot throttle slow3g # Simulate slow 3G
cdpilot throttle fast3g # Simulate fast 3G
cdpilot throttle offline # Go offline
cdpilot throttle off # Back to normal
cdpilot proxy <url> # Set proxy (legacy single-URL form)
cdpilot proxy off # Remove proxy
# v0.7.0: named pools (BrightData, IPRoyal, Anchor, etc.)
cdpilot proxy add brd "http://USER:[email protected]:22225" --geo us
cdpilot proxy add ipr "http://USER:[email protected]:12321" --sticky
cdpilot proxy use brd # Activate one pool
cdpilot proxy list # Show pools (credentials redacted)
cdpilot proxy show [<name>] # Active or named pool URL (redacted)
cdpilot proxy remove <name> # Drop a pool
TLS フィンガープリント (v0.8.0)
cdpilot tls-check # Probe JA3/JA4/H2 via tls.peet.ws
cdpilot tls-check --service browserleaks # Alternate echo
cdpilot tls-check --json # Raw JSON
既知の制限: v0.8.0 には プローブ (tls-check) が含まれますが、ツリー内に TLS 修正は
ありません。--remote-debugging-port を公開するスタンドアロンバイナリとして提供される、
Chromium ベースの TLS 修正済みブラウザは存在しません。Camoufox は Firefox+Juggler(CDP なし)です。
Patchright / undetected-chromedriver / nodriver は Python/Playwright ライブラリであり、
スタンドアロンブラウザではありません。cdpilot の CDP 専用アーキテクチャは、プロトコルアダプター
なしではそのいずれとも互換性がありません。追跡: v0.9 ロードマップ(curl-impersonate の
セマンティクスを用いた TLS-MITM プラグイン、または BoringSSL パッチを適用した Chromium フォーク)。
リクエスト傍受
cdpilot intercept block <pattern> # Block requests
cdpilot intercept mock <pattern> <json-file> # Mock responses
cdpilot intercept headers <pattern> <header:value> # Add headers
cdpilot intercept list # List active rules
cdpilot intercept clear # Clear all rules
デバイスエミュレーション
cdpilot emulate iphone # iPhone emulation
cdpilot emulate ipad # iPad emulation
cdpilot emulate android # Android emulation
cdpilot emulate reset # Back to desktop
ジオロケーション
cdpilot geo istanbul # Set location to Istanbul
cdpilot geo london # Set location to London
cdpilot geo 41.01 28.97 # Custom coordinates
cdpilot geo off # Remove override
アクセシビリティ
cdpilot a11y # Full accessibility tree
cdpilot a11y summary # Quick summary
cdpilot a11y find <role> # Find elements by ARIA role
セッション管理
cdpilot session # Current session info
cdpilot sessions # List all sessions
cdpilot session-close [id] # Close session
詳細設定
cdpilot cookies [domain] # List cookies (filter by domain)
cdpilot cookies save <file> [<domain>] # Export cookies as JSON
cdpilot cookies load <file> # Import cookies (replay CF clearance)
cdpilot cookies save --host x.com # Save to per-host cache
cdpilot cookies load --host x.com # Load from per-host cache
cdpilot cookies list # Cached hosts + age + CF clearance flag
cdpilot cookies clear --host x.com # Remove one host
cdpilot cookies clear --all # Wipe entire cache
cdpilot cookies clear --older-than 7d # Remove stale entries
cdpilot cookies auto on # Toggle global auto-save/replay flag (v0.6.1: requires safe-list)
cdpilot cookies auto add <host> # Opt host into auto save/replay (v0.6.1)
cdpilot cookies auto remove <host> # Remove host from safe-list
cdpilot cookies auto list # Enable flag + current safe-list
cdpilot cookies cf-replay <url> # Inject cached CF clearance before nav
cdpilot wipe [--cookies|--storage|--tabs|--keep h1,h2]
# v0.6.2: per-task state hygiene (cross-task contamination)
cdpilot storage # localStorage contents
cdpilot upload <sel> <file> # Upload file to input
cdpilot multi-eval <js> # Execute JS in all tabs
cdpilot headless [on|off] # Toggle headless mode
cdpilot frame list # List iframes (index = --frame <index>)
cdpilot frame eval --frame <f> <js> # Run JS inside an iframe (cross-origin too)
cdpilot dialog auto-accept # Auto-accept dialogs
cdpilot permission grant geo # Grant geolocation
並列コンテキスト
cdpilot context create [url] # Make fresh browser context + tab (prints JSON)
cdpilot context list # Tree of contexts and their tabs
cdpilot context close <ctx> # Destroy a context (refuses 'default')
後続のコマンドで特定のコンテキストのタブを操作するには、環境変数のピンを使用します:
ID=$(cdpilot context create https://example.com | jq -r .target_id)
CDPILOT_TARGET=$ID cdpilot eval 'document.title'
真の分離 — 各コンテキストは独自の Cookie/ストレージジャーを持ちます。履歴を汚染せずに N 件の AI チャットクエリを並列実行したり、複数のブラウザを起動せずにログイン状態と ログアウト状態のフローを A/B テストしたりするために設計されています。
スマートナビゲーション(LLM 対応)
cdpilot dismiss # Click best "Stay signed out / No thanks" button
cdpilot dismiss aggressive # Handle chained modals (cookie banner → signup)
英語 + トルコ語のパターンライブラリを内蔵。破壊的な類似項目(Delete account、Sign out、 Subscribe)は明示的に除外されています — クエリのワークフローに安全に組み込めます。
動画理解
単一のスクリーンショットでは動きを見ることはできません。cdpilot watch は継続的な
スクリーンキャスト(Page.startScreencast)を JPEG フレームのリングバッファに実行するため、
AI エージェントは時間枠を問い合わせて、何が起こったかを実際に 視聴 できます —
アニメーション、マウスカーソルの動き、スクロール、爆発エフェクトなど、1 枚の静止フレームから
推測するのではなく。
cdpilot watch start <url|file://...> # Begin screencast, play the video
cdpilot watch query --at 1:23 --window 5s # Frames around a timestamp
cdpilot watch ask "did the menu animate open?" # Ask about recent frames
cdpilot watch status # Show capture state + buffer size
cdpilot watch stop # Stop the screencast
ローカルファイル(file://...)とオンライン動画(YouTube、Vimeo、Twitter、Facebook、
Instagram)の両方で動作します。依存関係ゼロ — Pillow はオプションで、フレーム間の
モーション検出にのみ使用されます。
DRM の制限: DRM 保護されたプレーヤー(Netflix など)は CDP レイヤーで黒いフレームとして レンダリングされます — cdpilot はそれらをキャプチャできません。DRM 以外はすべて動作します。
MCP はこれを AI エージェント向けの browser_watch_* ツールとして公開します。
動画理解(コマンド)
cdpilot watch start <url|file://> # Start screencast, play video
cdpilot watch query --at 1:23 --window 5s # Frames around a timestamp
cdpilot watch ask "did the modal slide in?" # Ask about recent frames
cdpilot watch status # Capture state + buffer size
cdpilot watch stop # Stop screencast
ステルス & CAPTCHA
依存関係ゼロのアンチフィンガープリントレイヤー — navigator.webdriver、chrome.runtime、
プラグイン(適切な PluginArray 継承)、WebGL の vendor/renderer、パーミッション、ハードウェア
並行性、および Worker コンストラクターにパッチを適用します。ページスクリプトが実行される前に
Page.addScriptToEvaluateOnNewDocument を介して注入されます。デフォルトでは無効で、オプトインです。
起動時に、cdpilot は --disable-blink-features=AutomationControlled も渡します。これは、
Cloudflare や DataDome が自動化ブラウザを検出するためにプローブする Blink ランタイムフラグを
無効にします。
実際のマウスクリック(frames、--entropy=on、click @ref、dblclick、rightclick)は、
人間の押下のようにボタンを 40〜120 ms 保持します。CDPILOT_PRESS_MS=min-max で範囲を変更できます
(0-0 = 即時)。
3段階のステルスモード
cdpilot mode は推奨されるエントリポイントです。cdpilot がどの程度フィンガープリントに触れるかを、最も軽いものから最も重いものまで 1 つのスイッチで設定します。
cdpilot mode # show current tier + what it injects
cdpilot mode regular # no fingerprint patch — cleanest, fastest (default)
cdpilot mode stealth # light patch: webdriver / chrome.runtime / permissions
cdpilot mode undetected # full patch: + plugin array + WebGL + Worker
regular がデフォルトです。これは Stealth Bench V1 で、完全なパッチセット だけ ではスコアが低下することが判明したためです。合成のプラグイン配列自体が手がかりになります。stealth ティアはプラグインの偽装を意図的に省略しています。undetected にエスカレートするのは難しいターゲットに対してのみにしてください。適応レイヤーはホストごとに適切なティアを学習し、CAPTCHA でエスカレートします。効果は次のナビゲーション時に適用されます。環境変数による上書き: CDPILOT_MODE=<tier>。従来の stealth on/off トグルも引き続き機能し、ティアと整合性を保ちます。
cdpilot stealth on # enable fingerprint patches (opt-in)
cdpilot stealth off # disable (default)
cdpilot stealth status # show which patches are applied
cdpilot captcha-check # JSON detection of Turnstile/hCaptcha/reCAPTCHA/
# DataDome/PerimeterX/Arkose/GeeTest. Exit 0/3
cdpilot captcha-wait [sec] # block until user solves (interactive)
# or poll with JSON stream (non-interactive)
cdpilot adaptive [on|off|status]
# Auto-escalate to stealth on hosts that show
# CAPTCHA. Persistent per-host memory.
cdpilot adaptive forget <host>
# Remove a hostname from the stealth list
cdpilot adaptive clear # Drop the stealth host memory entirely
適応モード は「普段は速く走り、見つかったら壁を登る」自動化です。cdpilot はデフォルトでオープンなレーンで実行し、ナビゲーションのたびに CAPTCHA を検出し、検出したときはホストを永続リストに追加し、ステルスを有効にして 1 回だけ再試行します。自動で降格することはありません。設計上、保守的です。
Web Bot Auth (署名付きエージェント)
ステルスの反対です。ステルスはブラウザを人間のように見せかけようとしますが、Web Bot Auth は「これは自動化されたエージェントであり、それがどれであるかの証明はこれだ」と述べます。ブラウザが発行するすべてのリクエストには Ed25519 の HTTP Message Signature (RFC 9421) が付与され、サイト、またはその前段の Cloudflare が、あなたが自身のドメインで公開するキーディレクトリと照合して検証します。フォーマットは draft-meunier-web-bot-auth-architecture と draft-meunier-http-message-signatures-directory に準拠し、Cloudflare のリファレンス実装 (cloudflare/web-bot-auth) の Ed25519 テストベクターを再現します。
オプションの依存関係。 署名には cryptography パッケージが必要です。これは cdpilot が実行される Python 用です (設定している場合は CDPILOT_PYTHON)。
pip install cryptography
これがない場合、bot-auth コマンドと launch --bot-auth はそのヒントを表示して終了コード 2 で終了します。その他のすべてのコマンドはこれまでどおり動作します。
1. 鍵を生成する (一度だけ):
cdpilot bot-auth init --agent-url https://your-domain.com
これは Ed25519 秘密鍵を CDPILOT_HOME/bot-auth/ed25519.key (デフォルトは ~/.cdpilot) に書き込み、モード 0600 で作成します。cdpilot は鍵を出力したりログに記録したりすることはなく、ファイルが他者から読み取り可能な場合は警告します。エージェント URL は https:// オリジン (パスなし) でなければなりません。2 回目の init は、--force を渡さない限り鍵の置き換えを拒否します。新しい鍵は公開したディレクトリと一致しなくなるためです。
2. 自身のドメインでディレクトリをホストし、署名する。 cdpilot bot-auth directory は公開鍵を JWKS として出力します。ここで kid は鍵の RFC 7638 JWK サムプリントです。Cloudflare はディレクトリの レスポンス にも署名を要求するため、--headers はそれとともに提供すべきヘッダーを出力します:
cdpilot bot-auth directory --headers # headers, a blank line, then the JSON body
cdpilot bot-auth directory --headers --json # the same as {"authority", "headers", "body"}
Content-Type: application/http-message-signatures-directory+json
Signature-Input: sig1=("@authority";req);created=…;keyid="<thumbprint>";alg="ed25519";expires=…;nonce="…";tag="http-message-signatures-directory"
Signature: sig1=:<base64 Ed25519 signature>:
{ "keys": [ … ] }
そのボディを、それら 3 つのヘッダーとともに https://your-domain.com/.well-known/http-message-signatures-directory で提供してください。署名は ("@authority";req)、つまりディレクトリが取得されるホストを対象とします。デフォルトではエージェント URL のホスト、または --authority <host> です。ディレクトリ内の鍵ごとに 1 つの署名があります。有効期間は 24 時間 (--ttl <seconds>) であるため、静的ホストでは毎日更新する必要があり、cron または同じ署名を実行するエッジ関数から行います。ヘッダーファイルと Web サーバーが提供するボディを書き換える cron の例:
# m h dom mon dow — every day at 03:17, 48 h validity so one missed run does not break it
17 3 * * * cdpilot bot-auth directory --headers --ttl 172800 --json > /var/www/wba/directory.json.tmp \
&& mv /var/www/wba/directory.json.tmp /var/www/wba/directory.json
あなたのサーバー (またはエッジ関数) はその JSON から headers と body を読み取り、well-known パスで提供します。--content-digest はボディも対象とします (Content-Digest、RFC 9530)。Cloudflare のリファレンスベクターと同様です。その場合、ボディは出力されたとおりバイト単位で提供する必要があります。
3. 署名するブラウザを起動する:
cdpilot launch --bot-auth # or: CDPILOT_BOT_AUTH=1 cdpilot launch
cdpilot status # ... bot-auth: on (keyid <thumbprint>)
cdpilot go https://example.com # this request is signed, and so is everything after it
cdpilot stop # stops the browser and the signer
launch --bot-auth は、ブラウザーの隣で小さなデタッチされた署名者を起動します。これはアイドルクローズ監視役と同じ
セルフフォークを使用し、ブラウザーと同じ期間だけ存続します。1 つの CDP
接続を保持し、すべてのページ、ポップアップ、新しいタブ、プロセス外 iframe、ワーカーに自動アタッチします。これは
Fetch の「Request」ステージで各リクエストに署名します。すべてのリダイレクトホップも含みます。したがって、ページが自ら行うリクエストも
署名されます。タイマー、cdpilot コマンドが戻った後の fetch()、ページが開くタブなどです。
data:、blob:、chrome-extension: のリクエストはブラウザーから出ないため、そのまま通過します。リクエストへの署名が失敗した場合、そのリクエストは署名なしで送信され、1 行が
CDPILOT_HOME/bot-auth/signers/<port>.log に書き込まれ(ホストのみ)、ページが妨げられることはありません。すでに起動しているブラウザーに対して
launch --bot-auth を実行すると、そのブラウザーに署名者が追加されます。
各リクエストには 3 つのヘッダーが付きます。
| ヘッダー | 値 |
|---|---|
Signature-Agent | "https://your-domain.com" |
Signature-Input | sig1=("@authority" "signature-agent");created=…;keyid="<thumbprint>";alg="ed25519";expires=…;nonce="…";tag="web-bot-auth" |
Signature | sig1=:<base64 Ed25519 signature>: |
expires は created + 5 分です。nonce は 64 個のランダムバイトを base64 エンコードしたもので、リクエストごとに新しくなります。
これは レガシー な Signature-Agent 形式(draft-05 A.2.3)であり、デフォルトです。これは
Cloudflare の検証器が受け入れる形式であるためです。Cloudflare は以降のドラフトの辞書形式を拒否します。
代わりに辞書形式(Signature-Agent: sig1="https://your-domain.com"、"signature-agent";key="sig1" としてカバー)を送信するには、
cdpilot bot-auth format dict を実行します(bot-auth format legacy で元に戻り、bot-auth format で表示され、bot-auth init --agent-format dict で
作成時に設定されます)。これは次回の launch --bot-auth から適用されます。
署名されないもの。 WebSocket ハンドシェイクは署名されません。ブラウザーはこれらを CDP の Fetch ドメインに通さないため、
ページが開く wss:// 接続はヘッダーなしで送信されます。サービスワーカー内部のキャッシュヒットと data:/blob: URL はサーバーに到達しません。
署名者が停止またはハングした場合。 実行中、署名者はヘッダーを追加するまでブラウザーのすべてのリクエストを
Fetch ステージで保持します。強制終了された場合、リクエストは署名なしで送信されます。その後、cdpilot status と cdpilot go は、あなたが再度実行するか stop するまで、1 行を stderr に出力します(署名者が実行されていない、リクエストは署名なしで送信される、
cdpilot launch --bot-auth を再度実行してください)。フリーズしている場合(停止したプロセス、デバッガー)、リクエストはハングします。cdpilot stop を実行し、再度 launch --bot-auth を実行してください。
cdpilot は、その署名者状態を、コマンドラインがそのポートの署名者であるプロセスに対してのみ、またアタッチしたブラウザーに対してのみ信頼するため、pid が別のプログラムに再利用された古い状態ファイルは破棄され、シグナルは送信されません。
アイドルクローズ は署名者の実行中も機能します。署名者はすべてのページにアタッチされているため、「ページがアタッチされている」の代わりに、
cdpilot は署名者以外の CDP クライアントをカウントし(ソケットの所有者別:
macOS と Windows では netstat、Linux では ss)、watch デーモンや Playwright セッションはブラウザーを開いたままにします。Linux では、ss -tnp は自分のプロセスのソケットのみを表示するため、別のユーザーとして実行されているクライアントはカウントされず、アイドルクローズがそのクライアントの下でブラウザーを閉じる可能性があります。
ステルスとの競合。 署名は「私はエージェントである」と言い、ステルスは「私はそうではない」と言います。--bot-auth を
--stealth/--undetected と一緒に渡した場合、または cdpilot mode が stealth または
undetected の間に渡した場合、cdpilot は 1 行の警告を出力し、bot-auth を適用します。署名者の実行中は、ステルススクリプトやユーザーエージェントのオーバーライドは注入されず、適応的エスカレーションは
ステルスティアで再試行しません。
Cloudflare に登録します。 ディレクトリが公開されたら、Cloudflare ダッシュボードの Bot Submission Form から、署名付きエージェント(ユーザーのために動作するエージェント)または検証済みボットとして申請します。Cloudflare の
署名付きエージェント と
暗号技術を用いた検証済みボット
の記事を参照してください。Cloudflare の背後にあるサイトは、あなたのリクエストをあなたのエージェントからのものとして認識します。Web Bot Auth を確認しないサイトは、これらのヘッダーを無視します。
フリクションラダー(段階的なアンチボット検出)
実際のサイトは単に CAPTCHA を出すだけではありません — 防御を段階的に積み重ねてきます。
cdpilot friction は現在どの段階が有効かを報告するため、エージェントは推測するのではなく適切に対応できます。6 つのレベルを、低いものから高いものへ示します:
none → rate_limited → soft_captcha → login_wall → otp_sms → hard_block
cdpilot friction # JSON: current rung + recommended response policy
バイリンガル(英語 + トルコ語)の DOM ヒューリスティクス。この検出は読み取り専用です — 何もバイパスしません。 応答ポリシーは意図的に保守的です:
rate_limited→ 自動的な指数バックオフ + 再試行soft_captcha→ captcha ツールに委ねるlogin_wall/otp_sms/hard_block→ 自律的に解決するのではなく、人間への引き継ぎとしてフラグ付け
この最後の行は倫理的な境界であり、欠けている機能ではありません。cdpilot はログイン、OTP/SMS ゲート、あるいは完全なブロックを単独で突破しようとはしません。
MCP はこれを browser_friction として公開します。
長押し(PerimeterX / HUMAN の行動チャレンジ)
PerimeterX の「Press & Hold」は行動チャレンジであり、トークンではありません — 呼び出すべきプロバイダーが存在しません。唯一の解決策は、実際の press → hold → release ジェスチャーであり、cdpilot はこれを CDP Input ドメイン経由で発行します。ボタンが押されている間、ガウス分布でランダム化された約 3〜7 秒のホールドと ±1〜2px の微細なジッターを伴います。
cdpilot press-hold # auto-find the px-captcha target
cdpilot press-hold "#px-captcha button" # explicit selector
captcha-solve は perimeterx チャレンジを検出すると、自動的にここへルーティングします。
MCP はこれを browser_press_hold として公開します。
Captcha ソルバープラグイン(v0.6+)
2captcha、anti-captcha、capmonster とのオプション連携。1 回の解決あたりのコストは約 $0.001〜0.003 です。API キーは ~/.cdpilot/captcha-providers.json(chmod 600)に保存されます — git にコミットしないでください。
# One-time setup
cdpilot captcha config --provider 2captcha --api-key YOUR_KEY
cdpilot captcha config --provider anticaptcha --api-key YOUR_KEY # fallback
# Enable auto-solve (adaptive layer auto-solves on detect)
cdpilot captcha auto on
# Manual solve (debug / scripting)
cdpilot captcha solve --type recaptcha-v2 --site-key SK --url https://example.com
# returns: {"token": "03AGdBq2...", "duration_ms": 12500, "cost": 0.003, "provider": "2captcha"}
cdpilot captcha solve --type hcaptcha --site-key SK --url URL
cdpilot captcha solve --type turnstile --site-key SK --url URL
cdpilot captcha solve --type funcaptcha --site-key SK --url URL
# Status & balance
cdpilot captcha status # {"configured": [...], "preferred": "2captcha", "auto_enabled": true}
cdpilot captcha balance # {"2captcha": 1.23, "anticaptcha": 0.50}
対応タイプ: recaptcha-v2、recaptcha-v3、hcaptcha、turnstile、funcaptcha
トークンは Runtime.evaluate CDP 経由で注入されます — ブラウザー側のライブラリは不要です。
captcha auto on が設定されている場合、適応レイヤーが各ナビゲーション後に自動的に検出して解決します。auto-on でない場合でも検出は機能しますが、解決は手動です。
ベンチマークの予想改善(v0.6): reCaptcha 2/6 → 5+/6、hCaptcha 2/3 → 3/3
画像 CAPTCHA + プロファイルウォーミング
captcha-solve は、上記のトークンソルバーではカバーされない画像ベースのレート制限 CAPTCHA を処理します:
cdpilot captcha-solve # auto-detect + route (incl. press-hold)
cdpilot captcha-solve --provider amazon-local # offline OCR (default)
cdpilot captcha-solve --provider capsolver # BYOK image-to-text
cdpilot captcha-solve --provider 2captcha # BYOK image-to-text
- Amazon のクラシックな画像 CAPTCHA(「表示されている文字を入力してください」ページ)は、オプションの
amazoncaptchaライブラリ(pip install amazoncaptcha— 純粋な Python + Pillow、MIT)を介してオフラインで OCR 処理されます。インストールされていない場合 = コマンドはその旨を報告して正常に終了します。ハード依存関係は追加されません。 - BYOK プロバイダー(
capsolver、2captcha)は、CAPSOLVER_API_KEY/TWOCAPTCHA_API_KEYを介してこれらの画像-to-テキスト API を使用します。
cdpilot profile warm # age the profile for reCAPTCHA v3 score
profile warm は、低リスクのサイト群をブラウズして Cookie や履歴の経過時間を蓄積します。これにより、reCAPTCHA v3 の行動スコアが時間の経過とともに徐々に押し上げられます。設計上低速です — セッションの事前に実行し、インラインでは実行しないでください。
公開されているボット検出パネル、2026-09-27 計測、ヘッドレス Brave(Chrome 154)(手法と生の結果):
mode | bot.sannysoft.com(31 行) | incolumitas intoli | incolumitas fpscanner | incolumitas new-tests |
|---|---|---|---|---|
regular(パッチなし、デフォルト) | 28 合格 / 3 失敗 | 5/6 | 17 ok / 3 失敗 / 1 警告 | すべて ok |
stealth | 31 合格 | 6/6 | 19 ok / 1 失敗 / 1 警告 | すべて ok |
undetected | 31 合格 | 6/6 | 19 ok / 1 失敗 / 1 警告 | すべて ok |
- 残っている fpscanner の失敗は
'webdriver' in navigatorであり、これはすべてのモダンな Chrome で true になります。これを偽装して回避すると、cdpilot だけが異端者になってしまいます。 regularの失敗はすべてHeadlessChromeユーザーエージェントに起因します。stealth/undetectedは、goが開始するページロードのためにこれを書き換えますが、同じページ内の後続の別コマンドでは依然としてHeadlessChromeを読み取ることができます。- new-tests: すべてのキーが ok です。
connectionRTTはすべてのティアで unknown として報告されます。 - nowsecure.nl と areyouheadless は計測できませんでした(固定で常にインタラクティブな Turnstile テストキー、HTTP 502)。
このページの以前の数値(sannysoft 24/24、intoli 6/6)は、2026 年 4 月に v0.4.x で計測されたものです。これらは上記の表に置き換えられます。
信頼性
cdpilot browser [name|auto] # workload-aware browser selection
cdpilot browser install chrome-for-testing # for extension development (see above)
cdpilot health # JSON: alive, port, tabs, browser, today's crashes, idle close
cdpilot health はシェルウォッチドッグ向けに設計されています:
until cdpilot health >/dev/null; do cdpilot launch; sleep 2; done
macOS では ~/Library/Logs/DiagnosticReports/ から本日の Brave クラッシュ件数を表示します — 自動化が静かに停止する前に劣化を察知できます。
自動起動。 ページコマンド(go、content、click、shot、…)がブラウザーが起動していないことを検出すると、cdpilot launch と同じ方法(同じプロファイル、同じヘッドレス/表示設定)で起動してから処理を続行し、stderr に次の 1 行を出力します: cdpilot: browser was not running — launched it (CDPILOT_NO_AUTOLAUNCH=1 to disable)。ライフサイクル、ステータス、設定の各コマンド(launch、stop、close、close-tab、stop-all、project-stop、session-close、status、health、tabs、sessions、projects、headless、proxy、browser、extensions、mcp、serve、…)は決して起動しません。CDPILOT_NO_AUTOLAUNCH=1 を設定すると、以前の「CDP connection error. Is the browser running?」エラーと終了コード 1 に戻ります。
アイドル時の自動クローズ。 ページコマンドが自動起動したブラウザー、または MCP サーバーが起動したブラウザー(browser_launch を含む)は、cdpilot コマンドも表示中のページの変化もないまま 15 分 経過すると自動的に閉じます。これにより、完了したエージェントタスクがメモリを占有したままにならずに済みます。CLI で明示的に実行した cdpilot launch は、(手動でブラウジングしている可能性があるため)次のように指定しない限り開いたままになります: cdpilot launch --idle-close 30 または CDPILOT_IDLE_CLOSE=30。この環境変数は自動起動の遅延時間も設定します(ブラウザーの起動時に読み取られます。小数も使用可能)。0 にするとアイドル時の自動クローズが無効になります。自分で起動したブラウザー、または cdpilot が単にアタッチしただけのブラウザーは決して閉じられません。
何が使用とみなされるか: 読み取り専用のチェック(status、health、projects、version — cdpilot health のウォッチドッグループはブラウザーを生存させ続けません)を除くすべての cdpilot コマンド、MCP ツール呼び出し、serve リクエスト、ページにまだアタッチしている CDP クライアント(長時間実行コマンド、watch、connectOverCDP 経由の Playwright)、および開いているページの URL またはタブの集合の変化(誰かがナビゲートした、タブが開かれた、または閉じられた)です。タイトルの変化はカウントされないため、自身のタイトルを書き換えるページ(時計、未読カウンター)がブラウザーを生存させ続けることはできません。cdpilot status と cdpilot health は idle close in 12m または idle close off を表示します。
仕組み: すべてのコマンドが ~/.cdpilot/projects/<id>/last-activity にタイムスタンプを記録します。起動時に小さなデタッチされたウォッチャー(ポートごとに 1 つ、Windows ではコンソールウィンドウなし)が開始され、30 秒以内ごとにチェックし、cdpilot stop と同様にブラウザーを停止し、レジストリに停止済みとして記録して終了します — また、他の理由でブラウザーが存在しなくなった場合もすぐに終了します。serve --api で起動されたブラウザーはサーバーによって管理され、アイドル時の自動クローズはありません。
タイムアウト。 どのコマンドも --timeout <seconds> をコマンド名の前または後に指定できます。また、CDPILOT_TIMEOUT からデフォルト値を設定できます(フラグが優先されます。0 で無効)。これはコマンド全体の実時間を制限します: 期限切れになると、cdpilot は stderr に cdpilot: timed out after <N>s (<command>) を出力し、起動した子プロセスを強制終了し、終了コード 124 で終了します(GNU timeout と同様)。すでに起動して登録済みのブラウザーは実行したまま残されます。
cdpilot --timeout 10 click "#submit" # before the command...
cdpilot shot page.png --timeout 30 # ...or after it
CDPILOT_TIMEOUT=60 cdpilot run flow.cdp # default for every command (and each script line)
mcp と serve の場合、この値は長時間実行されるサーバー自体には適用されません。実行するすべてのツール呼び出し/リクエストに引き継がれます。
セッションログ
すべてのコマンド(およびすべての MCP ツール呼び出し)は、ローカルのプロジェクトごとのログに 1 行の JSON として追記されます。そのため、ブラウザタスクが完了したとき、何が行われ、何が見つかったかの記録が残ります。マシンの外部には何も送信されません。
cdpilot log # today's commands: time, exit, command, url, result
cdpilot log --md # Markdown report: pages visited, actions, errors, files produced
cdpilot log --json # raw lines (one JSON object per command)
cdpilot log --days 3 # include the last 3 days
cdpilot log --path # where the files are
各行には ts、cmd、args、exit、duration_ms、コマンド実行後のページの url と title(コマンドがそれらをすでに持っていた場合)、その出力の約 200 文字の summary、error 行、および書き出された files(スクリーンショット、PDF)が含まれます。ファイルは ~/.cdpilot/projects/<project-id>/log/<YYYY-MM-DD>.jsonl に保存されます。
マスキングは何かが書き込まれる前に行われます。fill、type、smart-fill、smart-select、assert-value、dialog prompt に渡された値は «redacted:N chars» になり、password/token/key/secret/cookie/auth フラグおよびヘッダーの値、トークン形式の引数、名前に token、key、secret、password、auth、code、session を含む URL のクエリ/フラグメントの値も同様です。cookies と storage の出力は決してログに記録されません。eval のソースは記録されますが、40 文字を超える文字列リテラルは切り詰められ、秘密情報らしきものは置換されます。ログ記録はベストエフォートです。コマンドの出力や終了コードを変えることは決してなく、書き込みに失敗しても stderr に 1 行出力されるだけです。CDPILOT_LOG=0 でオフになり、CDPILOT_LOG_DAYS(デフォルト 14)で保存日数を設定できます。MCP サーバーはこれを browser_log として公開します。
自分のブラウザを使う(human-in-the-loop)
エージェントが突破できない CAPTCHA やログインの壁に遭遇します。人間がそれを解決し、エージェントは同じブラウザで処理を続けます。
最も簡単な方法は connect を必要としません。 cdpilot 自身のブラウザは、ヘッドレスで起動しない限り(cdpilot headless on / CHROME_HEADLESS=1)、通常の目に見えるウィンドウです。人間がその場で CAPTCHA を解決するかログインし、エージェントが続行します。
cdpilot go https://example.com/dashboard # agent: "captcha detected" / login wall
cdpilot captcha-wait 300 # agent waits while the person solves it
cdpilot go https://example.com/dashboard # agent continues in the same window
そのウィンドウは cdpilot 自身のプロファイルを使うため、ログインは後の実行でも保持されます。
connect は自分で起動するブラウザ向けです。デバッグポートと自分のプロファイルディレクトリを指定します(一度ログインすれば、Cookie は保持されます)。
# macOS
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" \
--remote-debugging-port=9450 --user-data-dir="$HOME/cdpilot-chrome"
# Linux
google-chrome --remote-debugging-port=9450 --user-data-dir="$HOME/cdpilot-chrome"
# Windows
"%ProgramFiles%\Google\Chrome\Application\chrome.exe" --remote-debugging-port=9450 --user-data-dir="%USERPROFILE%\cdpilot-chrome"
cdpilot connect 9450 # or: cdpilot connect ws://127.0.0.1:9450/devtools/browser/<id>
cdpilot connect --auto # or: find it via a DevToolsActivePort file
cdpilot go https://example.com/dashboard
cdpilot disconnect # forget it; the browser keeps running
Chrome 136 以降、デフォルトプロファイルでは --remote-debugging-port が無視されるため、別途 --user-data-dir が必要です。connect --auto は、既知の各プロファイルディレクトリ(上記のコマンドの ~/cdpilot-chrome、Chrome stable/beta/dev/canary、Chromium、Brave、Vivaldi、Edge)の DevToolsActivePort ファイルを読み取り、ブラウザが存在しないかそのポートで置き換えられたために残ったファイルをスキップし(ファイル内のブラウザ ID が一致している必要があります)、最初に見つかった稼働中のものに接続します。問い合わせは HTTP のみで行います。WebSocket によるプローブ(Chrome の chrome://inspect モードが許可プロンプトで応答することがあります)は、稼働中のブラウザが見つからなかった場合にのみ送信されます。
まだサポートされていません: Chrome の chrome://inspect/#remote-debugging トグル(Chrome 144 以降、普段ログインしているプロファイル)。このモードでは Chrome は自身の WebSocket でのみ応答し(/json/version と /json は 404 を返します)、新しいデバッグ接続ごとに許可を求められることがありますが、cdpilot は /json でタブを一覧し、コマンドごとに新しい接続を開きます。connect --auto はこのモードを認識し、中途半端に動作するのではなく、上記の起動コマンドを示して終了コード 2 で終了します。
cdpilot が接続されたブラウザで行うこと:
- ページコマンド(
go、click、fill、shotなど)は、cdpilot が自分のために新しいウィンドウで開くタブ(フォーカスを奪わないTarget.createTargetをnewWindow+backgroundで実行するため、あなたのウィンドウとタブがフォーカスを保持します)で最初のページコマンドを実行し、その後もそのタブを使い続けます。close、session-close、およびアイドルセッションのクリーンアップは、そのようなタブ、つまりこのブラウザ実行で cdpilot が開いたタブのみを閉じ、最後のタブは決して閉じません。あなた自身のタブがナビゲートされたり、入力されたりすることは決してありません。タブを指定するコマンドだけがタブに触れます(switch-tab、close-tab <index|id>、CDPILOT_TARGET、および開いているすべてのタブでスクリプトを実行するmulti-eval)。 - ブラウザを閉じたり強制終了したりすることはありません。
close、close --force、stop、stop --smart [--force]、project-stop、stop-all、session-close、および MCP のbrowser_closeは、最大でも cdpilot 自身のタブ(上記)を閉じるだけで、「connected browser left running; runcdpilot disconnectto forget it」と出力します。アイドル時の自動クローズがブラウザに触れることはなく、tabs --reapは何も閉じず、wipe、permission、cookies load、cf-replayは拒否されます(Cookie の読み込み/再生を強行するには--allow-externalを追加してください)、context closeはcontext createが作成したコンテキストのみを破棄し、launch/ MCP のbrowser_launchは何も起動しません。 close-tabは明示的なコマンドであり、あなたのタブを閉じることができます。引数なしの場合はアクティブな(cdpilot の)タブ、またはインデックスや ID で指定した任意のタブを閉じます。最後のタブは決して閉じません。それを閉じると Windows と Linux ではブラウザが終了してしまいます。- ブラウザには何も注入しません。ステルスパッチやユーザーエージェントの上書き(
cdpilot mode/stealthが何を言おうと)、glow、入力ブロッカー、開発拡張機能のスクリプト、自動 Cookie 復元は一切ありません。 - 登録は
cdpilot disconnectを実行するまで残ります。ブラウザが閉じられている場合、ページコマンドは「your connected browser is gone; runcdpilot connectagain orcdpilot disconnect」とともに終了コード 1 で終了し、cdpilot が代わりにブラウザを起動することは決してありません。 connectは、このプロジェクトにすでに cdpilot が起動したブラウザがある場合に拒否され(「stop it first (cdpilot stop) or use another project」)、127.0.0.1/localhostのみが受け入れられます(それ以外は終了コード 2 で終了します)。disconnectはこのプロジェクトのwatchデーモンも停止します。- cdpilot は、証拠がある場合にのみブラウザを自身のものとして扱います。それは
launch時に記録したブラウザ ID(または古いエントリの場合は、デバッグポートを保持している記録済みの稼働中 PID)です。ポートが使用中であることは証拠にはならないため、レジストリに残ったエントリによってstop/closeがポート 9222 上のあなた自身の Chrome に触れることは決してありません。
リスク:
- すべての cdpilot コマンド、および cdpilot を実行できるあらゆるエージェントは、そのプロファイルの Cookie とセッション(メール、銀行、管理パネル)を読み取り、操作できます。タスクに必要なものだけにログインしているプロファイルを使用してください。
- デバッグポートは、そのブラウザが実行されている間、cdpilot だけでなく、すべてのローカルプログラムに対して開かれています。作業が終わったらブラウザを閉じてください。
- サイトは自動化をより容易に判別できます。cdpilot は接続されたブラウザにステルスを適用しません。
- cdpilot のタブは同じウィンドウであなたのタブの隣に位置し、エージェントがタブを指定した場合(
switch-tab、close-tab <n>、multi-eval)、あなたのタブの 1 つで操作を行う可能性があります。
WebMCP ツール(オプトイン)
WebMCP を使うと、ページは document.modelContext に「ツール」を登録できます。registerTool() による命令的な登録、または <form toolname tooldescription>(入力は toolparamdescription で記述)による宣言的な登録が可能です。cdpilot はブラウザー自身の API である getTools() と executeTool() を通じて、これらのツールを一覧表示し呼び出します。Chrome ではこの API は chrome://flags/#enable-webmcp-testing(Chromium 146 以降)の背後にあるため、次のようにしてブラウザーを起動します。
cdpilot launch --webmcp # saved for this project: later launches (auto-launch too) keep it
cdpilot go https://example.com/shop
cdpilot tools list # name, title, description, annotations, input schema
cdpilot tools list --json
cdpilot tools call add_to_cart '{"sku":"A1","qty":2}'
cdpilot tools call add_to_cart --arg sku=A1 --arg qty=2
cdpilot launch --no-webmcp # turn it off again (applies at the next start)
launch --webmcpはブラウザーのコマンドラインに--enable-features=WebMCPを追加し、そのモードをステルスモードの隣(プロジェクトプロファイル内のwebmcp.json)に保存します。CDPILOT_WEBMCP=1|0で上書きできます。モードが有効な間はcdpilot statusに WebMCP の行が表示されます。 Chrome は起動時にのみフィーチャーフラグを読み込みます。すでに実行中のブラウザーはcdpilot stopまでそのフラグを保持します。tools listはページおよび同一オリジンの iframe(フレーム URL 付き)のツールを表示し、フォームツールとそのフォームが自身を送信するかどうか(toolautosubmit)を示し、titleとreadOnlyHint/consequentialHint/untrustedContentHintの注釈を表示します。ページには何も注入されません。このリストはその時点でのブラウザーのレジストリであるため、リロードやナビゲーションに追従します。両方のコマンドは cdpilot 独自の分離されたワールド(Runtime.enableなし)で実行されるため、getTools()/executeTool()をラップするページスクリプトがツールを追加したり、結果を変更したり、呼び出しを確認したりすることはできません。そのワールドがdocument.modelContextを認識できない場合にのみ、cdpilot はページのメインワールドを使用し、その旨を stderr に出力します。ツールが 1 つもない場合はその理由(実行中のブラウザーで WebMCP が有効になっていない、セキュアコンテキストでない、ブラウザーが古すぎる、ドキュメントがオリジンキー化されていない、またはページが何も登録していない)を表示し、終了コード 0 で終了します。tools callはまず引数をツールのinputSchemaに対して検証し(required、type—trueは整数ではありません —、enum、const、ネストされたpropertiesとitems。その他のキーワードはページに委ねられます)、不一致、不明なツール、またはツールエラーの場合は終了コード 1 で終了します。AbortSignalを渡し、--timeout(デフォルト 20 秒)が切れるとそれを中断し、timed out after <N>s (--timeout); its execution was abortedとともに終了コード 124 で終了します。シグナルは--timeoutの期限で発火し、ウォッチドッグはさらに 3 秒待ってからこのレポートを出力します。toolautosubmitのないフォームツールは、人がフォームを送信するのを待ちます。 複数のフレームが同じ名前を登録している場合、--frame <url-part>で 1 つを選択できます(完全一致のフレーム URL が優先されます)。指定しない場合はトップドキュメントのツールが使用され、それが存在しない場合は呼び出しを停止してフレームを一覧表示します。- MCP:
browser_site_toolsとbrowser_site_tool_callは、プロジェクトの WebMCP モードが有効な間(またはサーバーでCDPILOT_WEBMCP=1の場合)にのみ一覧表示されます。
セキュリティ:
tools callはページ自身のコードを実行し、ツール名、説明、結果はページコンテンツです。これらは信頼できないものとして扱ってください。 引数と結果はセッションログに書き込まれ、secret という名前を含むフィールド(password、token、key、secret、auth など)は任意の深さでマスクされます。
スケーリングとワークステーションでの使用
CDPILOT_OFFSCREEN=1 cdpilot launch # headed, but no window on your screen
- オフスクリーンモード(
CDPILOT_OFFSCREEN=1)はブラウザーをヘッドありのまま(実際のレンダリング、ヘッドレス指纹なし)に保ちつつ、フォーカスを奪わない位置にウィンドウを配置します。あなたも使用しているワークステーション上で自動化することを想定しています。 - マルチインスタンスプール(
CDPILOT_POOL_SIZE)— 計画中で、まだ出荷されていません。 ロードマップを参照してください。 - Docker + Xvfb ハーネス — 別のプライベートなベンチマークリポジトリ(
cdpilot-bench)で使用されており、このパッケージには含まれていません。
AI エージェントとの併用
cdpilot は AI エージェントからツールとして呼び出されるように設計されています。
Claude Code (MCP)
{
"mcpServers": {
"cdpilot": {
"command": "npx",
"args": ["cdpilot", "mcp"]
}
}
}
任意の LLM(ツール使用)
{
"name": "browser",
"description": "Control a browser via CDP",
"parameters": {
"command": "go https://example.com"
}
}
Python(サブプロセス)
import subprocess
result = subprocess.run(["npx", "cdpilot", "go", url], capture_output=True, text=True)
print(result.stdout)
環境変数
| 変数 | デフォルト | 説明 |
|---|---|---|
CDP_PORT | 9222 | CDP デバッグポート |
CHROME_BIN | 自動検出 | ブラウザバイナリのパス |
CDPILOT_PROFILE | ~/.cdpilot/profile | 分離されたブラウザプロファイル |
BROWSER_SESSION | 自動 | セッション識別子 |
CDPILOT_MODE | regular | ステルス段階のオーバーライド(regular/stealth/undetected) |
CDPILOT_OFFSCREEN | 0 | ヘッド付きだが画面外にレンダリング — ウィンドウがフォーカスを奪いません |
CDPILOT_TIMEOUT | 未設定 | すべてのコマンドに対するデフォルトの --timeout(秒単位)(フラグが優先、0 で無効化)。期限切れは終了コード 124 で終了します |
CDPILOT_NO_AUTOLAUNCH | 0 | 1 = ブラウザを起動する代わりに、ページコマンドが以前の「Is the browser running?」エラーで失敗します |
CDPILOT_IDLE_CLOSE | 15 | cdpilot コマンドまたはページ変更なしでこの分数が経過すると、cdpilot が起動したブラウザが自ら終了します(小数可、0 = 終了しない、起動時に読み取り)。デフォルトは自動起動と MCP 起動に適用されます。明示的な CLI の launch は、これが設定されているか --idle-close <min> が指定されない限り無効です |
CDPILOT_LOG | 1 | 0 = セッションログ(cdpilot log)を書き込みません |
CDPILOT_LOG_DAYS | 14 | 保持するセッションログの日数。古い日付のファイルはその日の最初の書き込み時に削除されます(0 ですべて保持) |
仕組み
┌─────────────┐ HTTP/WebSocket ┌──────────────┐
│ cdpilot │ ◄──────────────────────► │ Brave/Chrome │
│ (CLI) │ Chrome DevTools │ (CDP mode) │
└─────────────┘ Protocol └──────────────┘
│ │
│ Zero dependencies │ Isolated profile
│ Pure HTTP + WebSocket │ Separate from your
│ single file, stdlib + websockets │ personal browser
└────────────────────────────────────────┘
Puppeteer なし。Playwright なし。Selenium なし。 直接的な CDP 通信のみです。
Stealth Bench V1
cdpilot は、80 個の難易度の高い Web タスクのスイートに対してベンチマークされ、現代のアンチボットシステムに対する成功率を測定します。Gemini 2.5 Flash がコントローラーとして cdpilot を操作し、成功とはインターセプトなしでタスクを完全に完了することと定義されます。
v0.5.3 の結果(現行)
| カテゴリ | 成功 / 合計 | 成功率 |
|---|---|---|
| カスタムアンチボット | 5 / 5 | 100.0% |
| Temu スライダー | 1 / 1 | 100.0% |
| hCaptcha | 2 / 3 | 67.0% |
| Cloudflare | 12 / 22 | 55.0% |
| DataDome | 5 / 13 | 38.0% |
| reCaptcha | 2 / 6 | 33.0% |
| Akamai | 1 / 6 | 17.0% |
| PerimeterX | 2 / 18 | 11.0% |
| GeeTest | 0 / 4 | 0.0% |
| Shape | 0 / 1 | 0.0% |
| Kasada | 0 / 1 | 0.0% |
| 合計 | 30 / 80 | 37.5% |
バージョン履歴
| バージョン | モード | 合計 | 成功率 |
|---|---|---|---|
| v0.5.0 | ベースライン(ステルスオフ / アダプティブオフ) | 30 / 80 | 37.5% |
| v0.5.0 | ステルスのみ(ステルスオン / アダプティブオフ) | 32 / 80 | 40.0% |
| v0.5.0 | フル(ステルスオン / アダプティブオン) | 26 / 80 | 32.5% |
| v0.5.1 | フル — リグレッション修正 | 29 / 80 | 36.25% |
| v0.5.2 | フル — エントロピー自動フック | 28 / 80 | 35.0% |
| v0.5.3 | フル — エントロピースコープの厳格化 | 30 / 80 | 37.5% |
| v0.6.0 | + CAPTCHA ソルバー + cookies-auto(リグレッション) | 15 / 80 | 18.75% |
| v0.8.0 | フル — cookies の安全なホストへのスコープ限定 + タスクごとのワイプ(プロキシなし、TLS フォークなし) | 29 / 80 | 36.25% |
| v0.7.0(枠) | + 名前付きプロキシプール | ユーザーのプロキシに依存 | — |
| v0.8.0(枠) | + TLS 対応ランチャー(camoufox/undetected-chrome) | ブラウザの選択に依存 | — |
cdpilot が行わないこと: cdpilot は回避エンジンであり、CAPTCHA ソルバーではありません。私たちは、チャレンジが出現するのを防ぐために、構造的なステルス(JS フィンガープリンティング、行動エントロピー)を優先しています。CAPTCHA が進行を妨げ、回避できない場合、タスクは失敗します — これが私たちの成功率の誠実な定義です。PerimeterX(2/18)、GeeTest(0/4)、Akamai(1/6)は既知の弱点です。v0.7+(レジデンシャルプロキシ)と v0.8+(camoufox による TLS フィンガープリント補正)は、これらを直接ターゲットにしています。
推奨構成
Stealth Bench V1 の結果に基づく:
- 速度優先 (ほとんどのユースケース):
cdpilot launch— デフォルトのブラウザ動作、パッチなし - ステルス有効 (推奨、総合的に最良):
cdpilot launch && cdpilot stealth on - 完全アダプティブ (CAPTCHA が多い特定のワークフロー):
cdpilot launch && cdpilot stealth on && cdpilot adaptive on
完全アダプティブ層は、Stealth Bench V1 のタスク構成においてベースラインと同等 (30/80 対 30/80) です。ステルスのみ (32/80 = 40%) が依然として最も性能の高い単一バリアントです。特定のワークロードについては、両方をプロファイリングして選択してください。
比較
| 機能 | cdpilot | Puppeteer | Playwright | Selenium |
|---|---|---|---|---|
| インストールサイズ | 1 つの Python ファイル + 小さな Node ランチャー、node_modules なし | 400MB+ | 200MB+ | 100MB+ |
| 依存関係 | npm 0 個 (Python: websockets、自動インストール) | 50+ | 30+ | Java + ドライバー |
| セットアップ時間 | 即時 | 数分 | 数分 | 面倒 |
| AI エージェント対応 | はい | 手動 | 手動 | 手動 |
| ブラウザのダウンロード | 不要 | 必要 (Chromium) | 必要 (3 ブラウザ) | 不要 |
| CLI ファースト | はい | いいえ (ライブラリ) | いいえ (ライブラリ) | いいえ (ライブラリ) |
| MCP サポート | はい | いいえ | いいえ | いいえ |
マネタイズ / Pro (近日公開)
cdpilot CLI は無料かつオープンソース (MIT) であり、今後もそうあり続けます。
将来的な有償提供:
- cdpilot cloud — リモートブラウザインスタンス、ローカルブラウザ不要
- チームダッシュボード — 共有セッション、監査ログ、使用状況分析
- 優先サポート — エンタープライズ統合のための直接サポート
セキュリティ
- 分離されたブラウザプロファイル — cdpilot は
~/.cdpilot/profileで動作し、日常使いのブラウザとは分離されています。Cookie、パスワード、履歴が露出することはありません。 - 任意のファイルアクセスなし — MCP のスクリーンショットファイル名はサニタイズされ、スクリーンショットディレクトリに制限されます。パストラバーサルはブロックされます。
- 安全な CSS セレクター —
querySelectorに渡されるすべてのセレクターは、インジェクションを防ぐために JSON エスケープされます。 - ネットワーク露出なし — CDP は
127.0.0.1のみでリッスンします。デフォルトではリモート接続はできません。 - 依存関係なし — npm/Python のランタイム依存関係がゼロであることは、サプライチェーン攻撃の対象がゼロであることを意味します。
脆弱性を発見しましたか? 公開 issue を作成するのではなく、メンテナーに直接メールでご連絡ください。
Cookie の永続化 (v0.6+)
ナビゲーション前に自動再生されるホスト単位の Cookie キャッシュ。特に
負荷の高いチャレンジ (Cloudflare、DataDome) を伴うサイトに有用です — 一度通過すれば、
クリアランス Cookie (cf_clearance、__cf_bm) がキャッシュされ、次回の訪問時に再生されます。
# Enable auto-mode — cookies saved/replayed on every navigate
cdpilot cookies auto on
# Manual per-host workflow
cdpilot cookies save --host x.com # cache current session cookies
cdpilot cookies load --host x.com # inject before navigating
cdpilot cookies cf-replay https://x.com # explicit CF clearance injection
# Inspect and clean
cdpilot cookies list # all cached hosts + age + CF flag
cdpilot cookies clear --older-than 7d # prune stale cache
保存先: ~/.cdpilot/cookies/<host>/cookies.json (chmod 600、git にコミットされることはありません)。
期限切れの Cookie は読み込み時に自動的にフィルタリングされます。
ロードマップ
組み込みのテストアサーションを備えた唯一のブラウザ MCP。これまでにリリースしたものと、次に予定しているものをご紹介します:
リリース済み
- 70 以上の CLI コマンド(navigate、click、fill、screenshot、PDF、console、network、動画理解、フリクションラダーなど)
- AI エージェント統合用の MCP サーバー(Claude Code、Cursor など)
- 10 個の組み込みテストアサーション — assert、assert-url、assert-title、assert-count、assert-value、assert-attr、assert-visible/hidden、wait-for、check(バッチ)、screenshot-diff
-
testランナー +traceビューア —cdpilot test [--watch]は*.cdpt.jsファイルを実行します。cdpilot trace open <run>は実行のタイムトラベルトレースビューアを開きます - アクセシビリティツリーのスナップショット(
a11y-snapshot)— エージェントが直接操作できる @ref ハンドル付きの構造化テキストで、ビジョンモデルは不要です。計測した 4 ページにおいて、ページの生 HTML より 1.4~42 倍小さくなっています(2026-09-27)。常にスクリーンショットより安価とは限りません。リンクの多いページでは、小さなスクリーンショットのコストよりもテキストの方が多くなります - トークン効率の良いスクリーンショット — 要素単位のクロップ(13 倍小さい)、JPEG 品質の制御、フォーマットの選択
- ビジョンフォールバック(
describe)— a11y + スクリーンショット + テキストを 1 回の呼び出しで - 注釈付きスクリーンショット — 操作可能な要素に @N バッジをオーバーレイ
- 自動待機 — MutationObserver ベースの、5 秒間の自動要素待機
-
wait-for-text— ストリーミング AI 応答、非同期トースト、セレクター不要の同期のための、適応的なテキストベース待機(subtree + characterData) -
eval-batch— N 個の JS 式を 1 回の CDP ラウンドトリップで実行(逐次evalと比べて 5~30 倍高速) -
block— 組み込みプリセット(images/fonts/ads/media)を使ったNetwork.setBlockedURLsによるリクエストブロックで、オプトイン時にページ読み込みが 3~10 倍高速化 -
dismiss— LLM チャットのサインアップウォールに対するヒューリスティックな自動クリック(EN+TR パターンライブラリ、破壊的アクションのガード) -
adaptive— CAPTCHA で保護されたホストでは自動的に stealth にエスカレートし、ホストごとの永続メモリを保持(「run fast, climb walls」) -
cookies save/load— Cookie を JSON としてエクスポート/インポート(実行をまたいで CF/DataDome のクリアランスを再現) -
contextプール +CDPILOT_TARGET— 単一ブラウザーで真の並列自動化を実現する分離されたブラウザーコンテキスト(Playwright の並列タブモデル) -
fast/show— タイミング + ビジュアルのトグルをバンドル。0.5.0 ではデフォルトで quiet/fast - WebSocket プール +
/jsonTTL キャッシュ — MCP/バッチワークロード向けの、回帰のない接続再利用 - バッチコマンド — stdin 経由で JSON 配列をパイプしてマルチステップの自動化を実現
- ビジュアルフィードバックシステム(持続的な緑のグロー、カーソル、リップル、キーストローク表示)
- AI 制御警告トースト(自動化中にユーザーが操作したときの赤い警告)
- マルチプロジェクトのブラウザー分離(各プロジェクトが独自のポート + プロファイルを持つ)
- プリフライトウィザード(初回実行時に依存関係を自動インストール)
- 持続的な MCP グロー(Claude のオレンジのグローのように、AI セッション全体を通じて点灯し続ける)
- DevExtension システム(ブラウザーストアなしでのネイティブ JS 注入)
- スマートコマンド —
smart-click、smart-fill、smart-select— 表示テキストで操作でき、CSS セレクターも LLM も不要です。無効化された要素のガード(無効なボタンで誤って「クリックした」と判定しなくなりました)、Shadow DOM の走査(Lightning、Polymer、lit-element のウィジェット)、ロケール対応のテキストマッチング(トルコ語の İ/i、ドイツ語の ß)、smart-fillのフローティングラベル対応(aria-labelledbyとclosestによるラベル解決を介した Material / Ant / Chakra)を備えています - 動画理解(
watch)— 継続的なスクリーンキャストをリングバッファーに取り込むことで、AI エージェントが時間枠をクエリして、1 枚の静止フレームだけでなく動き(アニメーション、カーソル、スクロール)を確認できます。ローカルのfile://およびオンライン動画(YouTube/Vimeo/Twitter など)に対応。DRM プレーヤー(Netflix)は対象外 - フリクションラダー(
friction)— 6 段階の段階的なアンチボット検出(none → rate_limited → soft_captcha → login_wall → otp_sms → hard_block)、バイリンガル EN+TR、読み取り専用。レート制限の自動バックオフ、ログイン/OTP/ハードブロックは人手への引き継ぎとしてフラグ付け(自律的なバイパスは行いません) - 3 段階のステルスモード(
mode regular|stealth|undetected)— フィンガープリント表面に対する単一スイッチで、ホストごとの適応的なティア学習を備えています - 長押しソルバー(
press-hold)— PerimeterX/HUMAN の行動チャレンジ向けの、人間らしい押下 → 保持 → 解放のジェスチャー(ガウス分布 3~7 秒 + 微小なジッター)。captcha-solveは自動的にここへルーティングされます - 画像 CAPTCHA + プロファイルウォーミング — オフラインの Amazon 画像 OCR(オプションの
amazoncaptchaライブラリ)+ BYOK の画像-to-テキスト(capsolver/2captcha)。profile warmは reCAPTCHA v3 スコアのためにプロファイルを熟成させます - オフスクリーンモード(
CDPILOT_OFFSCREEN)— ウィンドウのフォーカスを奪わないヘッド付きレンダリング - データ抽出(
extract)— 構造化された DOM データをテキスト、JSON、リスト形式で - ページ観察(
observe)— 利用可能なアクションとともにすべての操作可能な要素を一覧表示 - スクリプトランナー(
run)— 合否レポート付きで.cdpスクリプトファイルを実行 - iframe ターゲティング — 要素コマンド向けの
"iframe#card >>> input"/--frame、同一オリジンおよびクロスオリジン(アウトオブプロセス)のフレームに対応。スマートコマンドはフレームを自動的に検索します
近日公開予定
- マルチインスタンスプール (
CDPILOT_POOL_SIZE) — 負荷が最も少ないプロセスにディスパッチする、N 個の独立したブラウザプロセス - セッションの記録と再生 — ブラウザセッションを記録し、決定論的に再生します
- ステルスモード (Pro) — 人間らしいマウス操作・タイピング、アンチフィンガープリント、CAPTCHA の解決
- cdpilot Cloud — ホスト型ブラウザセッション API、REST + WebSocket の MCP エンドポイント
- Chrome 拡張機能 — コマンドラインなしで任意のブラウザから cdpilot を利用
- パフォーマンス監査 — CDP Performance ドメイン経由の Core Web Vitals (LCP、CLS、INP)
- WCAG アクセシビリティ監査 — 自動化された a11y 準拠レポート
- Claude Code スキルモード — MCP に加えて
.claude/skills/スキルとして実行
アイデアがありますか? Issue を作成するか、PR を送ってください!
コントリビューション
git clone https://github.com/mehmetnadir/cdpilot.git
cd cdpilot
npm install
npm test
PR を歓迎します! まず CONTRIBUTING.md をお読みください。
ライセンス
MIT — 好きなようにしてください。
cdpilot の考え方で構築: 1 つのツール、1 つの役割、正しくやり遂げる。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。