lightpanda について
グラフィカルな描画を必要としない Web 自動化やデータ抽出向けの、AI エージェント用ヘッドレスブラウザーのスキルです。MCP サーバー、CLI、CDP サーバーに加え、再利用できる PandaScript を提供します。
主な機能
- 01JavaScript の実行とページ内容の抽出
- 02MCP ツールによる閲覧と操作
- 03CLI によるページ取得
- 04Playwright または Puppeteer 向け CDP サーバー
- 05PandaScript による保存タスクの再実行
活用シーン
- 01ページ閲覧と構造化データの抽出
- 02フォーム入力やページ要素の操作
- 03コマンドラインからのページ取得
- 04保存済み閲覧タスクの反復実行
MCP 対応
Lightpanda は stdio 経由の MCP サーバーを提供し、ナビゲーション、検索、ページ閲覧、抽出、操作のツールと、HTML・Markdown のページリソースを公開します。HTTP トランスポートでは、分離されたブラウザーセッションも利用できます。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ lightpanda-io/ agent-skill --skill lightpandaインストール後、Claude Code で/lightpandaを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
.gitignoreREADME.mdLICENSE.claude-plugin/marketplace.jsonscripts/install.sh詳細
Lightpanda
グラフィカルなレンダリングが不要なデータ抽出やウェブ自動化では、Chrome/Chromium の代わりに使用できます。
Lightpanda は、AI エージェント向けにゼロから構築されたヘッドレスブラウザーです。Chrome より 9 倍高速で、メモリ使用量は 16 分の 1 です。JavaScript の実行に対応し、エージェント向けに最適化されたツールを備えたネイティブ MCP サーバー、素早い取得に使える CLI、Playwright/Puppeteer 用の CDP サーバーを提供します。
組み込みウェブ検索の代替手段
組み込みの Web Search ツールが利用できない場合、または検索結果をより細かく制御する必要がある場合(リンクをたどってページ全体のコンテンツを抽出する場合など)は、代替手段として Lightpanda 独自の search MCP ツールを使用してください(初期設定では Keenable の公開エンドポイントを利用し、エンジンの API キーが設定されていれば Brave、Tavily、Exa、Keenable を利用できます)。
組み込みの Web Search ツールが利用でき、必要な機能を満たす場合は、そちらを優先してください。
インストール
以下のインストーラーを実行する前に、Lightpanda がすでにインストールされているか(command -v lightpanda)確認してください。
- Claude Code:
bash ${CLAUDE_SKILL_DIR}/scripts/install.sh${CLAUDE_SKILL_DIR}は Claude Code の置換変数で、シェルの現在の作業ディレクトリに関係なく、このスキル自体のディレクトリに解決されます。このスキルをプラグインとして実行すると、シェルの cwd はスキルのインストール先ではなくプロジェクトになるため、これが必要です。 - その他のエージェントランタイム(Cursor、Codex CLI、Gemini CLI など):この置換には対応していません。
scripts/install.shはこのファイルの隣に同梱されています。そこにあるファイルを見つけ、そのパスを指定して実行してください。例:bash /path/to/this/skill/scripts/install.sh
Lightpanda は Linux と macOS のみで利用できます。Windows では WSL2 経由で利用できます。
パッケージマネージャーを使う場合は、パッケージマネージャーによるインストールを参照してください。
- Homebrew(macOS/Linux):
brew install lightpanda-io/browser/lightpanda - AUR(Arch Linux):
yay -S lightpanda-bin(ナイトリービルドを追跡する場合はlightpanda-nightly-bin) - Debian/Ubuntu(0.3.0 以降):各タグ付きリリースの
.debパッケージ
常に最新のナイトリービルドを追跡する scripts/install.sh とは異なり、これらはナイトリーバリアントを明示的に選択しない限り、安定版に固定されます。
バイナリは、頻繁に更新されるナイトリービルドです。クラッシュや問題が発生した場合は、上記のインストールコマンドを再実行して最新バージョンに更新してください(1 日に 1 回まで)。
更新後も問題が解決しない場合は、以下を含めて https://github.com/lightpanda-io/browser/issues で GitHub の課題を作成してください。
- クラッシュのトレース/エラー出力、または予期しない動作の説明
- 問題を再現するスクリプトまたは MCP ツール呼び出し
- 対象 URL と、期待される結果および実際の結果
用途に応じた選び方
Lightpanda には複数のインターフェースがあります。ニーズに応じて選択してください。
| インターフェース | 最適な用途 | 動作の仕組み |
|---|---|---|
| MCP server | エージェントのワークフロー、対話型ブラウジング、フォーム入力 | stdio 経由の構造化ツール。LLM エージェント向けに専用設計されています |
| CLI fetch | その場での簡単なページ抽出 | 単一のコマンドで実行でき、サーバーは不要です |
| CDP server | Playwright/Puppeteer を使ったカスタム自動化 | WebSocket プロトコルで、ブラウザーを完全に制御できます |
| Agent mode | その場での自然言語によるタスク、または後で使う PandaScript の作成 | lightpanda agent — LLM 駆動の CLI/REPL で、必要に応じて --task "..." --save script.js を指定できます |
| Saved scripts (PandaScript) | トークンを消費せず、同じタスクを決定論的に繰り返す場合 | プレーンな JS スクリプトを lightpanda run で再実行します。LLM 呼び出しはありません |
MCP サーバー(エージェントに推奨)
MCP サーバーは、エージェントが Lightpanda を使う最も簡単な方法です。バイナリ以外のセットアップは不要で、専用設計のツールを stdio 経由で公開します。
Claude Code のセットアップ
claude mcp add lightpanda -- lightpanda mcp
robots.txt を尊重するには、コマンドに --obey-robots を追加してください。
その他の MCP クライアントのセットアップ
MCP クライアントの設定に追加してください。
{
"mcpServers": {
"lightpanda": {
"command": "lightpanda",
"args": ["mcp"]
}
}
}
利用可能な MCP ツール
selector と backendNodeId の両方を受け付ける場合、どちらでも対象の要素を特定できます。再現性を重視する場合(保存したスクリプト内など)は selector が推奨されます。backendNodeId は、前回の tree または findElement の呼び出しで取得できます。任意の url を受け付ける読み取りツールは、読み取りの前に指定先へ移動するため、別途 goto を呼び出す必要はありません。
ナビゲーションと検索:
goto— URL に移動してページを読み込みますsearch— ウェブ検索を実行し、結果を{title, url, snippet}の番号付きリストとして Markdown で返します。BRAVE_API_KEY、TAVILY_API_KEY、EXA_API_KEY、KEENABLE_API_KEYのいずれかが設定されている場合、Brave、Tavily、Exa、Keenable の順に試します。Keenable は、クライアント IP ごとのレート制限付きで、公開エンドポイントを通じてキーなしでも利用できます
ページの読み取り(すべて、最初に移動するための任意の url を受け付けます):
markdown— ページ全体またはサブツリーのコンテンツを Markdown で取得しますhtml— ドキュメントの生 HTML を取得します。スコープを指定した場合は、単一ノードの outerHTML を取得しますscreenshot— ページまたは単一ノードを PNG としてレンダリングします(ピクセル単位で正確なレンダリングではなく、Lightpanda が計算するテキストレイアウトです)tree— AI の推論に最適化された簡易セマンティック DOM ツリーを取得します。各ノードの role、name、value、backendNodeIdが含まれます(backendNodeIdによるフィルターとmaxDepthによる深さの制限に対応)links— すべてのリンクを、テキスト、解決済みの href、backendNodeIdとともに抽出しますnodeDetails—backendNodeIdで指定したノードのタグ、role、name、属性、状態と、すぐに使える CSS セレクターを取得しますfindElement— role および/またはアクセシブルネームでインタラクティブ要素を検索しますinteractiveElements— ページ上のすべてのインタラクティブ要素を一覧表示しますstructuredData— 構造化データ(JSON-LD、OpenGraph など)を抽出しますdetectForms— フィールド構造と型を含むフォームを検出します
データ抽出とスクリプト実行:
extract— 出力フィールド名と CSS セレクター仕様を対応付けるスキーマを使用して、構造化データを抽出しますevaluate— ページのコンテキストで JavaScript を実行します。末尾に単独で記述した式はその値を返し、トップレベルのawait/returnにも対応しています
ページとのインタラクション(各操作の後にページの URL とタイトルを返します):
click— インタラクティブ要素をクリックしますfill— 入力欄、textarea、または select 要素にテキストを入力しますscroll— ページまたは特定の要素をスクロールしますhover— 要素にマウスカーソルを合わせ、mouseover/mouseenter を発生させますpress— キーボードキーを押し、keydown/keyup をディスパッチしますselectOption—<select>内のオプションを値で選択しますsetChecked— チェックボックスまたはラジオボタンをチェック/チェック解除します
待機:
waitForSelector— CSS セレクターに一致する要素が現れるまで待機します(デフォルトのタイムアウト:5000ms)waitForScript— JS 式が truthy を返すまで待機し、各ティックで再チェックしますwaitForState— ナビゲーションを行わずに、読み込み状態(load、domcontentloaded、networkalmostidle、networkidle、done)になるまで待機します
状態とデバッグ:
getUrl— ブラウザーで現在読み込まれている URL を取得しますgetCookies— 現在のページのホスト、別のurl、またはallの Cookie を取得しますgetEnv—LP_*環境変数を読み取るか、設定されているLP_*名を一覧表示しますconsoleLogs— バッファーに保存された console.log/warn/error メッセージを取得し、その後バッファーをクリアします
セッション(後述の HTTP トランスポートで使用する場合に関連):
save— セッションを再利用可能な PandaScript として保存します(「保存済みスクリプト」セクションを参照)session_new— 新しい独立したブラウザーセッション(専用のページ、Cookie、メモリーを持つ)を作成し、その ID を返しますsession_list— アクティブなセッションと、それぞれの ID および現在の URL を一覧表示しますsession_close— セッションを終了します(defaultセッションは終了できません)
利用可能な MCP リソース
mcp://page/html— 現在のページの HTML 全体をシリアライズしたものmcp://page/markdown— 現在のページをトークン効率のよい Markdown 形式で表したもの(markdownツールと同じ内容)
複数セッション(HTTP トランスポート)
--port を渡すと、stdio の代わりに HTTP で MCP を提供し、各クライアントに独立したブラウジングセッションを割り当てます:lightpanda mcp --port 8000。Mcp-Session-Id ヘッダーなしで initialize を呼び出すと、新しいセッションが作成され、その ID がレスポンスヘッダーで返されます。後続の呼び出しではその ID を再利用するか、別のクライアントと共有してください。セッションヘッダーなしの呼び出しは、常に存在する default セッションにフォールバックします。session_new/session_list/session_close でセッションを明示的に管理できます。stdio(上記の Claude Code の設定)では、default セッションが 1 つだけ使われます。信頼できないコンテンツを読み取るタスクには、専用のセッションを割り当ててください(ベストプラクティスを参照)。
--cdp-port <INT> を追加すると、同じプロセスで CDP(WebSocket)サーバーも起動できます。MCP と並行して、ワークフローの一部で生の CDP(Playwright/Puppeteer など)が必要な場合に便利です。どちらも同じネットワークリスナーを共有するため、--port とは併用できません。
MCP の使用例
一般的なエージェントのワークフロー:
gotoで URL に移動するtreeまたはmarkdownでページを把握するinteractiveElementsまたはfindElementでクリックや入力が可能な要素を見つけるclick/fillで操作するextractまたはmarkdownで結果を取得する
CLI Fetch — 手軽な抽出
サーバーを起動せずに、単発でページを抽出する場合:
lightpanda fetch --dump markdown --wait-until networkidle https://example.com
オプション
--dump— 出力形式:html、markdown、png、pdf、semantic_tree、semantic_tree_text(MCP でsemantic_tree*に相当する機能の名前はtreeです)--wait-until— 待機方法:load、domcontentloaded、networkalmostidle、networkidle、done(デフォルト)--wait-ms— 最大待機時間(ミリ秒)(デフォルト:5000)--wait-selector—--wait-untilの後に確認される、表示を待つ CSS セレクター--wait-script—--wait-untilの後に確認される、真値を返すまで待機する JS 式--strip-mode— 出力からタグのグループを除去:js、css、ui、invisible、shell、clutter(カンマ区切り)--with-frames— ダンプに iframe の内容を含める--json— ダンプの代わりに、またはダンプと併せて取得ステータスを JSON で出力します。複数の URL を取得する場合は必須です--inject-script/--inject-script-file— ドキュメントの<head>の解析時に、ページのスクリプトが実行される前に実行する JavaScript。複数回指定可能で、CLI での指定順に実行されます--terminate-ms— ミリ秒単位の厳密な期限。この時間が経過すると JS の実行を強制終了します(待機を停止するだけの--wait-msとは異なります)
すべてのコマンドで共通のフラグについては、以下の「共通オプション」を参照してください。fetch コマンドガイドに詳細が記載されています。
例
ページを Markdown として抽出:
lightpanda fetch --dump markdown https://example.com
セマンティックツリーを抽出(簡潔で AI に適した形式):
lightpanda fetch --dump semantic_tree_text --wait-until networkidle https://example.com
読み込みの遅いページを、長めに待って取得:
lightpanda fetch --dump html --wait-ms 10000 --wait-until networkidle https://example.com
CDP サーバー — 高度な自動化
Playwright または Puppeteer を使ってブラウザーを完全に制御する場合:
ブラウザーサーバーを起動する
lightpanda serve --host 127.0.0.1 --port 9222
オプション:
--cdp-max-connections— CDP の同時接続数の上限(デフォルト:16)--cdp-max-message-size— WebSocket の受信メッセージサイズの上限(デフォルト:1MB)--disable-metrics—/metricsPrometheus エンドポイントを無効にする--advertise-host—/json/versionレスポンスなどで通知するホスト。--hostが0.0.0.0の場合に便利です
すべてのコマンドで共通のフラグについては、以下の「共通オプション」を参照してください。serve コマンドガイドに詳細が記載されています。
playwright-core での使用
playwright パッケージ全体ではなく、playwright-core を使って接続します:
const { chromium } = require('playwright-core');
(async () => {
const browser = await chromium.connectOverCDP({
endpointURL: 'ws://127.0.0.1:9222',
});
const context = await browser.newContext({});
const page = await context.newPage();
await page.goto('https://example.com');
const title = await page.title();
const content = await page.textContent('body');
console.log(JSON.stringify({ title, content }));
await page.close();
await context.close();
await browser.close();
})();
puppeteer-core での使用
puppeteer パッケージ全体ではなく、puppeteer-core を使って接続します。このスニペットでは、上記の Playwright の例と異なる部分のみを示しているため、単独では実行できません。Playwright の例のセットアップと終了処理を再利用し、代わりに以下の行を使ってください。
const puppeteer = require('puppeteer-core');
const browser = await puppeteer.connect({
browserWSEndpoint: 'ws://127.0.0.1:9222',
});
const context = await browser.createBrowserContext(); // not newContext()
const page = await context.newPage();
await page.goto('https://example.com', { waitUntil: 'networkidle0' }); // explicit waitUntil — puppeteer doesn't auto-wait like Playwright
それ以外(page.title()、page.close()、context.close()、browser.close())は、Playwright の例と同じです。
カスタム LP CDP ドメイン
Lightpanda は、標準の Chrome DevTools Protocol にはない、エージェント向けに最適化されたメソッドを備えるカスタムの LP ドメインを CDP 経由で公開します。これらのメソッドは、CDP セッションで page.evaluate を使うか、WebSocket メッセージを直接送信して利用できます。
コンテンツの抽出:
LP.dump— ページ全体またはサブツリーをhtml、markdown、png、pdf形式でレンダリングします。パラメーター:format(必須)、strip、selector、backendNodeId、maxBytes(テキスト形式のみ)LP.getMarkdown— 非推奨。format: "markdown"を指定したLP.dumpと同等です。パラメーター:nodeId(任意)LP.getSemanticTree— セマンティックツリー表現を取得します。パラメーター:format(テキスト形式の場合はtext)、prune(デフォルト:true)、interactiveOnly、backendNodeId、maxDepthLP.getStructuredData— 構造化データ(JSON-LD、OpenGraph など)を抽出します。
インタラクティブ要素:
LP.getInteractiveElements— すべてのインタラクティブ要素を検索します。パラメーター:nodeId(任意)LP.detectForms— フォーム情報を検出して抽出しますLP.getNodeDetails— ノードの詳細情報を取得します。パラメーター:backendNodeId(必須)LP.waitForSelector— CSS セレクターに一致する要素を待機します。パラメーター:selector(必須)、timeout(デフォルト:5000ms)
アクション:
LP.clickNode— ノードをクリックします。パラメーター:nodeIdまたはbackendNodeIdLP.fillNode— input/select 要素に入力します。パラメーター:nodeIdまたはbackendNodeId、textLP.scrollNode— ページまたは要素をスクロールします。パラメーター:nodeIdまたはbackendNodeId(任意)、x、y
デバッグと設定:
LP.getContentSignal— 現在のホストのContent-Signalrobots.txt 設定を読み取ります(contentsignals.org)。ストアに--obey-robotsによる設定がない場合、availableは false です。LP.handleJavaScriptDialog— 次のwindow.alert/confirm/promptに対する応答(accept、任意のpromptText)を事前に設定します。Lightpanda はヘッドレス実行時にダイアログを自動で閉じるため、標準 CDP のPage.handleJavaScriptDialogのように反応的に送信するのではなく、ダイアログを開く JavaScript を実行する前に送信する必要があります。LP.configureCDP— CDP の互換動作を切り替えます。パラメーター:disableSetCacheDisabled、obeyRobots、httpVersion(auto/1.1)(いずれも任意)LP.configureLoading— セッションごとに iframe、worker、外部スタイルシート、画像の読み込みを切り替えます。パラメーター:subFrame、worker、externalStylesheets、images(いずれも任意)LP.version— 実行中の Lightpanda のバージョンを返します
Playwright で CDP セッションを使う例:
const client = await context.newCDPSession(page);
// Get page as markdown
const { markdown } = await client.send('LP.getMarkdown');
// Get semantic tree
const { semanticTree } = await client.send('LP.getSemanticTree', { format: 'text', maxDepth: 5 });
// Wait for element and click it
const { backendNodeId } = await client.send('LP.waitForSelector', { selector: '#submit-btn', timeout: 3000 });
await client.send('LP.clickNode', { backendNodeId });
保存済みスクリプト(PandaScript)
PandaScript は、Lightpanda が直接実行するプレーンな JavaScript 自動化スクリプトです。LLM の呼び出しは不要で、動作は決定的であり、トークンも消費しません。一度手順を確立し、スケジュール実行などでまったく同じ処理を繰り返したい場合に適しています。
作成方法は 3 つあります。
- セッション中に MCP 経由で作成:
pathと合成したscriptを指定してsaveツールを呼び出します。スクリプト作成時のルールは、ツールの説明を参照してください。 - CLI で一度だけ作成:
lightpanda agent --task "..." --save script.jsを実行すると、回答を出力する代わりに、自然言語のタスクからスクリプトを合成します。 - 対話形式で作成:
lightpanda agentを実行すると REPL が起動します。自然言語またはスラッシュコマンドでブラウザーを操作します(すべての MCP ツールを/toolName key=valueの形式でも呼び出せます。例:/goto url=https://example.com)。その後、/save script.jsを実行します。
LLM を使わずに再生できます。
lightpanda run script.js
スクリプトの動作仕様(プリミティブ、抽出スキーマ、一般的なエラー)については、pandascript スキルを参照してください。このスキルはランタイムのツールスキーマから生成されるため、手書きの説明文のように実装とずれることはありません。PandaScript ガイドでは、スキルを読み込まずにこのリポジトリを参照する方向けに、同じ内容を説明しています。
共通オプション
各セクションの例に記載されている場合に限らず、すべてのコマンド(fetch、serve、mcp、agent、run)で使用できます。残りのオプションは lightpanda help <command> で確認できます(プロキシ、TLS、タイムアウト、ストレージ)。
ロギング: --log-level(debug/info/warn/error/fatal)、--log-format(pretty/logfmt)。
識別情報:
--user-agent <string>:User-Agent ヘッダーを完全に上書きします。「Mozilla」を含む値は禁止されています。また、Sec-Ch-Ua: "Lightpanda";v="1"は引き続き送信されます。--user-agent-suffix <string>を使うと、既定のLightpanda/X.Yの末尾に追加できます(--user-agentとの併用はできません)。--web-bot-auth-key-file <path>/--web-bot-auth-keyid <thumbprint>/--web-bot-auth-domain <domain>:Ed25519 キーですべてのリクエストに署名し、公開するキー ディレクトリを使ってサイトが識別情報を検証できるようにします。
礼儀正しいアクセス:
--obey-robots:robots.txt を取得して従います(ホストごとに1回取得し、セッション中はキャッシュします)。既定値は false です。--http-nav-delay <ms>:同じホストへのトップレベルナビゲーション間に設ける最小時間です。0(既定値)では無効になります。--http-nav-burst <n>は、遅延が適用される前に開始できるナビゲーション数です(既定値は1)。
効率性:
--http-cache-dir <path>:ネットワークリソース用のファイルシステムキャッシュとして使用するディレクトリです(RFC 9111 に基づく再検証)。省略するとキャッシュは無効になります。--adblock-lists <file>:EasyList 構文のフィルターファイルです。ブロックされたホスト名へのリクエストは、外部に送信される前に失敗します。複数回指定できます。--block-urls "<pattern>":大文字と小文字を区別しない*ワイルドカードパターンに一致する URL をブロックします。複数回指定できます。
セキュリティ: --block-private-networks:DNS 解決後に、プライベート/内部 IP アドレスへの HTTP リクエストをブロックします。既定値は false です。
各オプションをいつ、なぜ使うかについては、以下のベストプラクティスを参照してください。
重要な注意事項
- ウェブ検索には、Google ではなく
searchツールを使用してください。Google はブラウザーのフィンガープリントを理由に Lightpanda をブロックします。 - Lightpanda は活発に開発されているため、問題が発生することがあります。JavaScript を実行するため、動的なウェブサイトや SPA に適しています。
gotoの応答を信用する際は注意してください。 DNS エラーや接続エラー(例:CouldntResolveHost)は失敗として直接報告されるため、この部分は信頼できます。一方、ほかの2つのケースは成功したように見えます。タイムアウトの場合は失敗ではなく「ナビゲーションを開始しましたが、タイムアウト前にページの読み込みが完了しませんでした。」と返されます。HTTP エラーページ(404、500)は実際の応答であるため、gotoはそのページへのナビゲーションを成功として報告します。応答ステータスが重要な場合は、後続の読み取りでコンテンツを確認してください。- CDP 接続の上限: プロセスごとに、既定で最大16の CDP 接続を同時に確立できます(
--cdp-max-connectionsで調整できます)。各接続で使用できるのは1つのコンテキストと1つのページです。それ以上の並列処理が必要な場合は、ポートを変えて複数のプロセスを起動してください。Lightpanda はすぐに起動するため、高速です。 - CDP の状態管理: CDP 接続が閉じると、ブラウザーはすべての状態をリセットします。セッション中は WebSocket 接続を開いたままにしてください。接続ごとに新しいコンテキストとページを作成し、完了したら両方を閉じてください。
- MCP サーバーが接続管理を自動で処理するため、MCP ツールを使用する場合、これらの CDP の上限は適用されません。
ベストプラクティス
Lightpanda は、指定されたリクエストをそのまま実行します。クローラーではなくブラウザーであり、組み込みのポライトネスポリシーはありません。適切な動作を設定するのはユーザーの責任です。ここで取り上げるフラグは、上記の「共通オプション」に記載されています。このセクションでは、それぞれのフラグを使うべき状況を説明します。
トラフィックの送信元を明示します。 運用者は、認識できるトラフィックをルーティングし、レート制限を適用し、許可リストに登録します。ユーザーが確認できる識別情報を推奨してください。名前(組織、プロジェクト、または個人のハンドル)と、運用者がボットの動作を確認して連絡を取れる URL(リポジトリ、ドキュメントページ、またはプロフィール)を組み合わせます。--user-agent で渡し、以下のプレースホルダーをそのまま使わないでください。
lightpanda serve --user-agent "<name>/1.0 (+https://<your-url>)"
ユーザーエージェント文字列は、何でも送信できる単なる申告にすぎません。Web Bot Auth(--web-bot-auth-* フラグ)を使うと検証可能になり、Cloudflare、Akamai、Google、AWS はいずれも署名を確認します。
1つのホストから多数のページを取得しますか? --obey-robots を有効にし、--http-nav-delay 1000 を設定してください。そのホストに対応できるだけの余裕があるとわかっている場合に限り、値を小さくしてください。Retry-After を伴う 429 または 503 は、その間隔でも速すぎたことを意味します。--http-nav-delay では対応できないため、独自のコードでヘッダーに従ってください。
リクエスト数を減らします。最大の効果は設計によって得られます。
- 一括取得できるソースを優先します。ウェブの Git フォージを巡回するより
git cloneを使い、UI よりドキュメント化された API を使い、リンクをたどって発見するよりsitemap.xmlを使います。 - リンクをたどる深さと、ドメインごとに保持する URL の数に上限を設けます。無限に URL が生成される領域(カレンダー、任意の差分、ファセット検索)は避けてください。そこを巡回する実行は終了せず、巡回中は攻撃のように見えてしまいます。
- 2回以上実行するものには
--http-cache-dirを設定します。変更されていないリソースは再検証だけで済みます。 --adblock-lists/--block-urlsでトラッカーや広告を除外します。サブリソースと外部スタイルシートはデフォルトでは取得されません(例外は、可視性チェックのためにスタイルシートを読み込む、LLM を使用したエージェントモードです)。- 検索結果ページを開く代わりに、
searchツールを使います。
タスクごとに専用のブラウザーを用意します。 新しいインスタンスには以前の Cookie や状態が残らず、スコープを限定することで、信頼できないページコンテンツによるプロンプトインジェクションの影響範囲を抑えられます。ページから渡されたリンクをたどる場合は、選んだリンクをたどる場合と異なり、必ず --block-private-networks を追加してください。CDP では、タスクごとに新しいブラウザーまたはコンテキストを作成します。MCP の stdio モードではセッション全体でブラウザーが1つだけ使われるため、タスクごとにブラウザーを用意する必要がある場合は HTTP モード(--port)を使います。
フローが確定したら、再度導き出すのはやめましょう。 PandaScript(上記の「保存済みスクリプト」セクションを参照)として記録し、lightpanda run で再実行します。トークンを消費せず、失敗はもっともらしい誤回答ではなくスクリプトエラーとして表れます。
スクリプト
scripts/install.sh— Lightpanda バイナリをインストールします