Browserless について
Browserlessは、Browserless.ioのブラウザー自動化とスクレイピング機能をLLMクライアントに提供するホスト型MCPサーバーです。検索、クロール、ブラウザーセッション、性能監査に加え、アカウントやセッションの診断にも対応します。
主な機能
- 01ページのスクレイピングとサイトのクロール
- 02ウェブ検索とサイトURLのマッピング
- 03永続ブラウザーセッションの自動操作
- 04Lighthouseによる性能監査
- 05カスタムPuppeteerスクリプトの実行
- 06アカウント使用量とセッションの確認
活用シーン
- 01JavaScriptを含むページのコンテンツ抽出
- 02サイトを検索して確認対象のページを収集
- 03複数段階のブラウザー操作の自動化
- 04Lighthouseスコアとブラウザーリクエストの確認
MCP 対応
https://mcp.browserless.io/mcp でホストされ、MCPクライアントにBrowserlessのツールを公開します。クライアントはヘッダーまたはクエリパラメーターでトークン認証します。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://mcp.browserless.io/mcpclaude mcp add --transport http browserless https://mcp.browserless.io/mcp{"mcpServers":{"browserless":{"type":"http","url":"https://mcp.browserless.io/mcp"}}}Cursor で開く{"servers":{"browserless":{"type":"http","url":"https://mcp.browserless.io/mcp"}}}VS Code で開く{"mcpServers":{"browserless":{"type":"http","url":"https://mcp.browserless.io/mcp"}}}{"mcpServers":{"browserless":{"serverUrl":"https://mcp.browserless.io/mcp"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
https://mcp.browserless.io/mcp認証が必要ツール
14| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| url | string | はい | エクスポートする URL(http または https である必要があります) |
| gotoOptions | object | いいえ | ナビゲーション用の Puppeteer Page.goto() オプション |
| gotoOptions.waitUntil | any | いいえ | ナビゲーションが完了したと判断するタイミング |
| gotoOptions.timeout | number | いいえ | ナビゲーションのタイムアウト(ミリ秒) |
| gotoOptions.referer | string | いいえ | Referer ヘッダーの値 |
| bestAttempt | boolean | いいえ | true の場合、待機中のイベントが失敗またはタイムアウトしても続行します。 |
| includeResources | boolean | いいえ | true の場合、リンクされたすべてのリソース(CSS、JS、画像)を ZIP ファイルにまとめます。 |
| waitForTimeout | integer | いいえ | ページ読み込み後、エクスポート前に待機する時間(ミリ秒) |
| timeout | integer | いいえ | リクエストのタイムアウト時間(ミリ秒) |
| profile | string | いいえ | ページのエクスポート前にブラウザーへ読み込む、任意の認証プロファイル名です。リクエストの実行前に、プロファイルの Cookie、localStorage、IndexedDB がセッションに復元されます。このプロファイルは、使用中の API トークン用にあらかじめ作成されている必要があります。まずライブエージェントセッションで Browserless.saveProfile を使用して作成してください。 |
| _prompt | string | いいえ | 判明している場合は、このツール呼び出しにつながったエンドユーザーの元の依頼を一字一句そのまま入力してください。ツールの使用方法を把握できるよう、自然言語での意図を記載してください。秘密情報、パスワード、API キー、トークン、その他の認証情報は含めないでください。入手できない場合は省略してください。 |
詳細
Browserless MCP Server
Browserless.io 用の MCP(Model Context Protocol)サーバーです。Browserless のスマートスクレーパー API を、Claude Desktop、Cursor、VS Code、Windsurf などの LLM クライアントに公開します。
クイックスタート
browserless.io から API トークンを取得し(無料プランも利用できます)、MCP クライアントをホストされたサーバーに接続してください。
{
"mcpServers": {
"browserless": {
"url": "https://mcp.browserless.io/mcp?token=your-token-here"
}
}
}
ローカルへのインストールは不要です。クライアントごとの設定例については、設定を参照してください。
ツール
| ツール | 説明 |
|---|---|
browserless_smartscraper | 単一のウェブページをスクレイピングし、コンテンツを Markdown または HTML として返します。JavaScript を多用するページやボット対策にも自動で対応します。複数ページにわたるコンテンツには browserless_crawl を、サイトの URL 一覧には browserless_map を使用してください。 |
browserless_search | Browserless を使ってウェブを検索し、各検索結果をスクレイピングすることもできます。地域ターゲティングや期間フィルターに対応したウェブ、ニュース、画像検索をサポートします。 |
browserless_map | ウェブサイト上のすべての URL を検出し、マッピングします。サイトマップとリンク抽出を使ってスキャンします。タイトルと説明を付けて URL を返すこともできます。サイト監査やコンテンツの発見に便利です。 |
browserless_crawl | ウェブサイトをクロールし、検出したすべてのページをスクレイピングします。深さの制御、パスのフィルタリング、サイトマップ戦略、スクレイピングオプションの設定に対応します。各ページのスクレイピング済みコンテンツとメタデータを返します。 |
browserless_performance | 任意の URL で Lighthouse 監査を実行します。カテゴリ別スコアをその場で返し、会話の外部に完全な JSON レポートを保存します(stdio の場合はローカルパス、HTTP の場合は認証付きの使い捨てダウンロード URL)。ディスクにダウンロードし、jq で必要なフィールドだけを確認してください。ファイルは 15 分後、または MCP セッションの終了時に期限切れになります。カテゴリによるフィルタリング、モバイルまたはデスクトップデバイスのエミュレート、カスタム Lighthouse 設定やパフォーマンス予算の指定も可能です。 |
browserless_function | Browserless クラウド上でカスタムの Puppeteer JavaScript を実行します。関数には page オブジェクトと任意の context が渡されます。{ data, type } を返すことで、ペイロードと Content-Type を制御できます。 |
browserless_export | Browserless の /export API を使ってウェブページをエクスポートします。URL を取得し、コンテンツタイプを自動検出してネイティブの形式(HTML、PDF、画像など)で返します。 |
browserless_agent | ReAct ループを使って永続的なブラウザーセッションを操作します。ページのスナップショットを取得し、計画を立て、操作(クリック、入力、スクロール、評価など)をまとめて実行してから、再度スナップショットを取得します。スナップショットから得た ref ベースのセレクターを使用し、複数タブのワークフロー、スクリーンショット、CAPTCHA の解決、ライブ URL、ファイルのアップロードとダウンロードに対応します(取得したダウンロードは自動的にハンドルとして表示され、バイト列がコンテキストに入ることはありません)。 |
browserless_skill | 複雑なページの仕組み(シャドウ DOM、Cookie の同意、モーダル、CAPTCHA、動的コンテンツ、スナップショットの取得漏れ、スクリーンショット、タブなど)に対応するための、必要に応じて読み込める手順を提供します。browserless_agent と併用します。 |
browserless_profiles | 現在のトークンに保存されている認証プロファイルを、Cookie とオリジンの件数とともに一覧表示します。別のツールにプロファイル名を profile として渡すと、ログイン状態を再利用できます。 |
browserless_account | 現在のトークンに紐づくアカウント情報(プラン、ユニット残高、請求期間、API キー名)を読み取ります。API トークンの値は返しません。 |
browserless_usage | リクエストとユニットの消費状況(成功、エラー、タイムアウト、キューイング、最大同時実行数、CAPTCHA、プロキシのバイト数、ユニット数)を読み取ります。特定の API キーに絞り込むこともできます。 |
browserless_sessions | アカウントのセッションを確認します。現在実行中のブラウザー、専用ワーカー上の永続セッション、記録されたセッションのリプレイ、1Password の認証情報連携が含まれます。また、ネットワーク接続なしでレンダリングできる、完全に自己完結した rrweb プレーヤーページとしてリプレイをダウンロードします(action: "replay")。サーバーがローカルで実行されている場合はブラウザーで開き、それ以外の場合はサイズが十分小さければインライン HTML リソースとして添付されます。 |
browserless_logs | Browserless 自身が記録した最近のリクエストを読み取ります。試行した内容、失敗したかどうか、停止した理由、所要時間、費用を確認できます。Browserless 側で失敗した実行の診断に使うツールです。利用可能な期間はプランによって異なります。 |
ネイティブファイルのステージング(デフォルトでは無効)
HTTP の全サーフェスでは、ネイティブの
openai/fileParams ファイル記述子を使用する browserless_stage_file が公開されています。stdio と準拠サーフェスには含まれていません。**ネイティブダウンロードは現在無効です。**本番ホスト名の許可リストが空のため、すべてのステージングリクエストは DNS またはネットワークへのアクセス前に失敗します。ツールの入力や環境変数では有効にできません。
実装は file.download_url と file.file_id を受け付け、file.mime_type と file.file_name は任意です。信頼できるホストが検証され、コードで有効化されると、ステージングの成功時には { handle, filename, mimeType, size } のみが返されます。ハンドルは browserless_agent の uploadFile に渡してください。ハンドルは認証済みトークンに属し、15 分間再利用可能で、MCP トランスポートには紐付けられません。保存された MIME タイプは、アップロード時に上書きされない限り引き継がれます。
管理されたテストでは、ネイティブの ChatGPT 添付ファイルが受け付けられることは確認できていません。実際の添付ファイルの受け入れと、デプロイ済みレプリカ間でのハンドル解決は未検証です。ファイルストアはプロセスローカルです。既存のマルチパート /upload とインラインコンテンツのアップロードに変更はありません。
スキル
このサーバーには、エージェントが難しいページの操作に対応するため、必要に応じて読み込めるレシピ集であるスキルが組み込まれています。トリガーが発動すると(例:エージェントが Cookie バナーに遭遇した場合)、スキルは browserless_agent の応答に自動的に挿入されます。また、browserless_skill ツールを使って手動で読み込むこともできます。
| スキル | ソース | 目的 |
|---|---|---|
shadow-dom | src/skills/shadow-dom.md | Shadow Root を介した詳細なセレクターと iframe の指定。 |
cookie-consent | src/skills/cookie-consent.md | ベンダー固有の非表示化レシピ(OneTrust、Cookiebot、Didomi、TrustArc など)。 |
modals | src/skills/modals.md | ダイアログ、アラートダイアログを閉じる方法と、オーバーレイの閉じるボタンに関するヒューリスティクス。 |
captchas | src/skills/captchas.md | solve コマンド、応答のセマンティクス、エスカレーション手順の使用方法(Cloud のみ)。 |
profile-import | src/skills/profile-import.md | Browserless CLI を使って、ユーザーのローカル Chrome/Brave/Edge のサインイン情報をプロファイルとしてインポートします(同意が必要、全サーフェスのみ)。 |
dynamic-content | src/skills/dynamic-content.md | 非同期/AJAX/SPA コンテンツに適した wait* メソッドの選び方。 |
snapshot-misses | src/skills/snapshot-misses.md | 切り詰められたスナップショット、空のスナップショット、画像として表示されたコンテンツへの対処。 |
screenshots | src/skills/screenshots.md | スクリーンショットとスナップショットの使い分け、対象範囲と形式の選択。 |
tabs | src/skills/tabs.md | 複数タブのワークフローと、targetId を使って切り替えずに内容を確認する方法。 |
スキルを明示的に読み込みます。
{
"method": "tools/call",
"params": {
"name": "browserless_skill",
"arguments": { "id": "cookie-consent" },
},
}
組み込みプロキシ(browserless_agent)
browserless_agent にトップレベルの proxy オブジェクトを渡すと、データセンターまたは住宅用 IP 経由でセッションをルーティングできます。データセンターは MB あたりの料金が安く、住宅用 IP はブロックされにくくなります。
{
"method": "tools/call",
"params": {
"name": "browserless_agent",
"arguments": {
"method": "goto",
"params": { "url": "https://example.com" },
"proxy": {
"proxy": "residential",
"proxyCountry": "us",
"proxySticky": true,
},
},
},
}
| フィールド | 説明 |
|---|---|
proxy | 低コストの場合は "datacenter"、データセンターのトラフィックがブロックされる対象には "residential" を指定します。 |
proxyCountry | ISO-2 国コード("us"、"de")。自動的に小文字に正規化されます。英字以外の値は拒否されます。 |
proxyState | 空白をアンダースコアに置き換えた米国の州名("new_york")。有料プラン限定です。対象外のトークンには 401 が返されます。 |
proxyCity | 接続先の都市。有料プランまたはエンタープライズプラン限定です。対象外のトークンには 401 が返されます。 |
proxySticky | 基盤となる WebSocket が開いている間、同じ IP を維持します。再接続時(アイドルによる切断、ネットワークの一時的な障害、ブラウザーのクラッシュ)には、新しいスティッキー ID と新しい IP が割り当てられます。 |
proxyLocaleMatch | navigator のロケールをプロキシ IP の国に合わせます。 |
proxyPreset | 住宅用 IP 専用の名前付きプリセット(例:"px_amazon01")。利用可能なプリセットはプランによって異なります。利用できるプリセットについては Browserless サポートにお問い合わせください。 |
externalProxyServer | 独自の上流プロキシ(例:http://user:pass@host:port)を指定します。http:// または https:// である必要があります。 |
注: 地域、スティッキー、ロケールの各オプションを使うには、組み込みの
proxyティアまたはexternalProxyServerが必要です。proxyPresetにはproxy: "residential"が必要です。MCP は、API が組み合わせを黙って無視するのではなく、サポートされていない組み合わせを拒否します。
proxy オブジェクトはセッション作成時に一度だけ読み込まれます。変更するには、close を呼び出して新しいセッションを開始してください。エージェントクライアントはプロキシのフィンガープリントを基にセッションを管理するため、異なる設定を渡すと新しい WebSocket に接続されます。
OS ペルソナ(browserless_agent)
エージェントセッションでは、トップレベルの作成オプションを使って、一貫性のある OS ペルソナを選択できます。
| フィールド | 説明 |
|---|---|
emulationOs | "windows"、"macos"、"linux"、または "android"。プラットフォームのスプーフィングを有効にします。 |
emulatedDevice | Android デバイスのスラッグ。emulationOs: "android" の場合にのみ使用されます。 |
screen | デスクトップ画面。WIDTHxHEIGHT 形式で指定します。 |
deviceScaleFactor | デスクトップデバイスのピクセル比。1 または 1.25 を指定します。 |
deviceSlot | 0 以上の安定したデスクトップデバイススロット。サーバーがアカウントごとの範囲を検証します。 |
ナビゲーションを開始する前に最初の呼び出しでペルソナのオプションを設定し、その後は返された
sessionId を再利用してください。ペルソナはブラウザーセッションが存続する間固定されます。
別のペルソナを選択する前にセッションを閉じてください。
設定
サーバーは https://mcp.browserless.io/mcp でホストされています。ヘッダー(推奨)または ?token= クエリパラメーターで認証します。
AI エージェントを使ってインストールしますか?エージェントが読み取れるセットアップ手順については、install.md をご覧ください。
ヘッダーを使用する場合(ヘッダーに対応したクライアントで推奨):
{
"mcpServers": {
"browserless": {
"url": "https://mcp.browserless.io/mcp",
"headers": {
"Authorization": "Bearer your-token-here"
}
}
}
}
URL クエリパラメーターを使用する場合(URL のみを受け付ける Claude.ai のカスタムコネクターなどのクライアント向け):
https://mcp.browserless.io/mcp?token=your-token-here
特定の Browserless リージョナルエンドポイントに接続するには、x-browserless-api-url ヘッダーまたは browserlessUrl クエリパラメーターを追加します。
{
"mcpServers": {
"browserless": {
"url": "https://mcp.browserless.io/mcp",
"headers": {
"Authorization": "Bearer your-token-here",
"x-browserless-api-url": "https://production-lon.browserless.io"
}
}
}
}
https://mcp.browserless.io/mcp?token=your-token-here&browserlessUrl=https://production-lon.browserless.io
ヘッダーとクエリパラメーターの両方が指定されている場合は、ヘッダーが優先されます。
API URL の上書き先として指定できるのは、browserless.io とそのサブドメイン、設定された BROWSERLESS_API_URL のオリジン(同じスキーム、ホスト名、ポート)、および MCP_ALLOWED_API_URL_HOSTS に記載されたホストに限られます。パスは指定できますが、認証情報、クエリ文字列、フラグメント(単独の ? または # を含む)は指定できません。上書きしない場合は、オペレーターが設定した URL が変更されずに使用されます。
Claude Desktop
claude_desktop_config.json に追加します。
{
"mcpServers": {
"browserless": {
"url": "https://mcp.browserless.io/mcp?token=your-token-here"
}
}
}
Cursor
Cursor の MCP 設定に追加します。
{
"mcpServers": {
"browserless": {
"url": "https://mcp.browserless.io/mcp?token=your-token-here"
}
}
}
VS Code
VS Code の設定(settings.json)に追加します。
{
"mcp": {
"servers": {
"browserless": {
"url": "https://mcp.browserless.io/mcp",
"headers": {
"Authorization": "Bearer your-token-here"
}
}
}
}
}
Windsurf
Windsurf の MCP 設定に追加します。
{
"mcpServers": {
"browserless": {
"url": "https://mcp.browserless.io/mcp?token=your-token-here"
}
}
}
セルフホスティング
エアギャップ環境へのデプロイやセルフホストの Browserless インスタンスへの接続に便利なように、サーバーをローカルで実行することもできます。このリポジトリをクローンし、Docker イメージをビルドします。
docker build -f docker/Dockerfile -t browserless-mcp .
docker run \
-e BROWSERLESS_TOKEN=your-token \
-e BROWSERLESS_API_URL=https://your-browserless-instance.example.com \
-p 8080:8080 \
browserless-mcp
その後、上記と同じヘッダー/クエリパラメーター認証を使用して、MCP クライアントを http://localhost:8080/mcp に接続します。
セルフホスト環境変数
| 変数 | 必須 | デフォルト | 説明 |
|---|---|---|---|
BROWSERLESS_TOKEN | はい | — | Browserless API トークン |
BROWSERLESS_API_URL | いいえ | https://production-sfo.browserless.io | API エンドポイント(セルフホスト可能な Browserless 用) |
MCP_ALLOWED_API_URL_HOSTS | いいえ | — | Browserless と設定済みの API オリジンに加えて、クライアントから指定された API URL の上書きで許可されるホスト(カンマ区切り) |
BROWSERLESS_API_SERVER | いいえ | https://api.browserless.io | アカウント API のホスト — browserless_account、_usage、_sessions、_logs を提供します。ブラウザーの実行環境である BROWSERLESS_API_URL とは異なるホストです。信頼できるホストを指定してください。リプレイのダウンロードでは、この API が返す署名付きリンクを取得するため、運用するエンドポイントのみを指定してください |
TRANSPORT | いいえ | stdio | トランスポートの種類:stdio または httpStream |
PORT | いいえ | 8080 | HTTP サーバーのポート(httpStream トランスポートの場合のみ) |
BROWSERLESS_TIMEOUT | いいえ | 30000 | リクエストのタイムアウト(ミリ秒) |
BROWSERLESS_MAX_RETRIES | いいえ | 3 | 失敗したリクエストの最大再試行回数 |
BROWSERLESS_CACHE_TTL | いいえ | 60000 | キャッシュの TTL(ミリ秒、無効にする場合は 0) |
AMPLITUDE_API_KEY | いいえ | — | Amplitude プロジェクトの API キー。MCP の使用状況分析データ(SDK のライフサイクルイベントと、独自のツール/スキルイベント)を送信します |
MCP_COMPLIANCE_MODE | いいえ | 未設定(全機能を提供) | ディレクトリ準拠の縮小された機能を提供します。フェイルクローズ方式です。false/0/no/off 以外の値が設定されている場合、有効になります |
ホスト型 OpenTelemetry
httpStream では、OTEL_ENABLED=true を設定し、OTEL_EXPORTER_OTLP_ENDPOINT
に信頼できるコレクターのベース URL を指定します。メトリクスと stderr のログは
OTLP HTTP/protobuf 経由でエクスポートされます。トレースは無効です。stdio では
この SDK は起動しません。OTEL_METRIC_EXPORT_INTERVAL でエクスポート間隔をミリ秒単位で
指定します(デフォルトは 60000、最小値は 1000 です)。
NodeSDK がプロバイダーを管理し、標準の Node ランタイム計測によって
nodejs.* および v8js.* メトリクスが出力されます。アプリケーションのセッション、ツール、アカウント、Redis の
メトリクスは、引き続き browserless.mcp.* に属します。すべての継続時間メトリクスの単位は秒
(s)、メモリの単位はバイト(By)、リクエストカウンターの単位は {request} です。
アプリケーションの呼び出し元は引き続き
ミリ秒を渡し、メトリクス記録時に一度だけ変換されます。
browserless.mcp.auth.duration と .auth.in_flight は、POST 認証を対象とし、
リクエスト全体の実行は対象としません。browserless.mcp.session.cleanup.age は、追跡対象の
MCP アイドル状態のクリーンアップ、および明示的/アイドル/上限によるエージェントのクリーンアップを対象とし、
すべてのセッション終了を対象とするわけではありません。スイープで検出された MCP の経過時間は検出時点から始まり、エージェントの経過時間は再接続時にリセットされます。
browserless.mcp.accounts.active は、各集計ウィンドウ内の異なるトークンハッシュ数をカウントします。
トップアカウントの件数は、本文にイベント
browserless.mcp.account.window、active_accounts、top_accounts を含む INFO ログとして記録されます(最大
20 件の {hash, count} エントリー)。アカウントごとの永続的なメトリクス系列ではありません。
アイドル状態のウィンドウではアカウントログは出力されません。stderr のテキストは INFO、console.warn は WARN、
Error を含む引数は ERROR です。stderr のレコードには
log.iostream=stderr が付与されます。OTEL_SDK_DISABLED=true を設定した場合も、ホスト型テレメトリは無効になります。
初期のテレメトリ PR に基づくダッシュボードでは、カスタムのイベントループ
メトリクスを nodejs.eventloop.* に、GC の停止時間を v8js.gc.duration に、アクティブな
リソースを v8js.resource.active に置き換えてください。ツール/上流/Redis の
継続時間の名前から _ms を削除し、上記の認証名とクリーンアップ名を使用し、ミリ秒単位のしきい値を 1000 で割ってください。account.requests のクエリはウィンドウログに置き換えてください。
継続時間ヒストグラムの境界も秒単位で、1 秒未満の Redis 操作から 2 時間のセッションまでをカバーします。Amplitude のイベントフィールドとタイムアウト設定は、引き続きミリ秒単位です。
スキル取得の診断
Skill Retrieval Completed は、実際にリモートからスキルを取得するたびに、既存の分析キューを通じて一度だけ送信されます(ANALYTICS_ENABLED、SQS_QUEUE_URL、SQS_REGION が設定されている場合)。SDK の AMPLITUDE_API_KEY トランスポート経由では重複して送信されません。キャッシュヒットや、1 回の取得を共有する同時呼び出しでは、完了イベントは追加で送信されません。取得に失敗した場合、次の呼び出しで再試行できます。この計測によって再試行が追加されることはありません。
フィールドは、result=hit|miss|error、正規化された domain、UUID の request_id、source、attempt、整数の duration_ms、stage=fetch|decode|validate、および取得可能な場合は http_status です。skill_count は有効なレスポンスの場合にのみ含まれ、ヒットでは正の値、ミスではゼロになります。エラーには error_category=timeout|network_error|http_error|invalid_json|invalid_shape が含まれます。ソースは cli_agent、script_builder、autologin、agent_run、mcp_client、または unknown です。現在、各取得の attempt=1 です。これらの呼び出し箇所では実行 ID を取得できないため、run_id は省略されます。
制限されたホスト名の形式に合わないドメインは invalid になりますが、完了イベントは分母から除外されません。
信頼できるコレクターの完全な /v1/logs URL を OTEL_EXPORTER_OTLP_LOGS_ENDPOINT に設定すると、対応する skill.retrieval.failed WARN レコードが OTLP/HTTP JSON としてエクスポートされます。デフォルトでは無効です。エクスポートの期限は 1 秒、同時リクエスト数は最大 16 件で、再試行はありません。捕捉されたキューまたはスキル分析のエラーは、プロセスごとに最大 1 分に 1 回、originating_event と固定の診断カテゴリ delivery_error を含む skill.telemetry.delivery_failed を生成します。エクスポーターの失敗は、再帰的に報告されないように握りつぶされます。新しいログにトークン、プロンプト、完全な URL、レスポンス本文、レシピのテキストが含まれることはありません。キューには、ログフィールドとは別に、既存の認証フィールドが保持されます。
失敗属性の例:
{
"event.name": "skill.retrieval.failed",
"result": "error",
"domain": "shop.example",
"request_id": "416e0409-25e2-4399-a3fa-6939f43a75e0",
"source": "mcp_client",
"attempt": 1,
"stage": "fetch",
"error_category": "http_error",
"http_status": 429,
"duration_ms": 17
}
取得エラー率は、エラー完了数を全完了数で割った値です。ヒット率は、ヒット完了数を有効な完了数で割った値です。別個のサーバー側 Skill Lookup イベントを、どちらの分母にも加えないでください。テストではローカルまたはモックのシンクを使用します。エクスポーターの設定やコンソールメッセージは、リモートで受信された証拠にはなりません。
失敗の診断
MCP Tool Request には、analytics_version=2、既存の大まかな error_category、status_code、タイミング、およびツール固有のプロパティが保持されます。追加されるこれらの診断フィールドは失敗時のみ含まれ、再試行が成功した場合は含まれません。
| プロパティ | 意味 |
|---|---|
error_reason | selector_miss、invalid_params、unknown_method、script_error、unauthorized、forbidden、not_found、server_error、session_lost、navigation_failed、timeout、rate_limited、または unknown です。エージェントエラーでは既存の詳細な分類が維持されます。ローカル URL/バッチの検証エラーは invalid_params です。 |
error_source | validation、script、target_website、api、transport、または unknown です。これは観測された障害発生境界を示すもので、責任の所在を示すものではありません。403 だけでは発生元を特定できません。 |
failed_command_index | 呼び出し時のコマンドバッチ内での 0 始まりのインデックスであり、セッション全体のコマンドカウンターではありません。コマンド開始前にセットアップ/検証で失敗した場合は省略されます。 |
failed_method | 失敗したコマンドで認識された型付きメソッド名です。認識されない自由形式のメソッド名は、任意の入力を出力しないよう省略されます。コマンドはインデックスで特定できます。 |
error_code | 許可リストに含まれる構造化コードです。上記の大文字の理由名、SELECTOR_NOT_FOUND、BROWSER_CRASHED、ECONNRESET、ECONNREFUSED、ENOTFOUND、EAI_AGAIN、ETIMEDOUT が該当します。不透明なコードや認識されないコードはメッセージにコピーせず、省略されます。 |
error_status_code | 構造化エラーメタデータに含まれる HTTP ステータスの整数値(100~599)です。エラーの文章から抽出されることはありません。 |
error_status_origin | 観測された API 応答/アップグレードの場合は api、ナビゲーション結果の失敗の場合は target_website、それ以外の場合は unknown です。構造化ステータスがない場合は省略されます。 |
error_message | 500 文字を上限とする合成された要約です。生のエラーメッセージ、応答本文、HTML、スクリプト、セレクター、認証情報、Cookie、認証ヘッダー、URL がこのフィールドにコピーされることはありません。 |
browserless_function、browserless_export、browserless_smartscraper の場合、失敗結果に記録された status_code によって理由が決まります。function ツールでの 400 → script_error(ソースは script)、401 → unauthorized、403 → forbidden、404 → not_found、408 → timeout、429 → rate_limited、5xx → server_error、それ以外 → unknown です。function と export のステータスは Browserless API のものです(error_status_origin=api)。スマートスクレーパーのステータスは対象ウェブサイトのものです(error_status_origin=target_website、error_source=target_website)。Export の 400 は引き続き unknown となり、ステータスは保持されます。 |
status_code はツール固有の元の意味を維持します。新しいステータスフィールドはこれに置き換わるものではなく、成功した対象ページの HTTP レスポンスを失敗として扱うこともありません。HTTP エラーは、例外が発生した場合も API レスポンスのステータスを保持します。コードは、構造化エラー、または既存の 4xx エラーハンドラーが読み取る JSON 本文にすでに含まれている場合に保持されます。診断処理で 5xx エラー時に追加の本文を読み取ることはありません。
構造化された根拠がない検索の失敗は、error_reason=unknown および error_message="Unclassified search failure." を報告します。従来の user_error カテゴリーはグラフとの互換性のために維持されますが、呼び出し元に原因があることの根拠にはなりません。
内訳の例:success=false で絞り込み、tool → error_reason でグループ化します。エージェント呼び出しの場合は failed_method → error_reason でグループ化します。HTTP エラーの場合は error_status_origin → error_status_code でグループ化します。古いイベントでフィールドが欠落している場合は、unknown の失敗を意味するのではなく、計測情報が利用できないことを意味します。過去のデータへの遡及適用はありません。これらのプロパティが本番環境で利用可能とみなす前に、デプロイ後、受信したイベントの代表例を確認してください。
ライブ URL の手順
browserless_live_url は、既存のブラウザー用のビューアーリンクを REST 経由で作成します。人間への引き継ぎには、action: "create"、browserId、interactable: true を設定してください。
{
"action": "create",
"browserId": "running-browser-id",
"interactable": true,
"instructions": {
"layout": "panel",
"format": "markdown",
"title": "Complete sign in",
"summary": "Enter your **verification code**.",
"steps": ["Open your inbox", "Enter the code"],
"currentStep": 2
},
"doneLabel": "Continue",
"failLabel": "Need help",
"requesterName": "Support"
}
文字列による従来の手順指定も引き続き使用できます。文字列の場合は、トップレベルに instructionsTitle、steps、currentStep、instructionsFormat を指定します。オブジェクトの場合は、instructions の中に title、steps、currentStep、format としてこれらの値を指定します。ボタンのラベルと依頼者名は引き続きトップレベルに指定します。タイトルは 80 文字まで、空でないステップは最大 10 件で各 300 文字まで、ボタンのラベルは 40 文字まで、依頼者名は 60 文字までです。currentStep は 1 から始まり、指定したステップを参照する必要があります。要約テキストはサーバーによってトリミングされ、2048 文字までに制限されます。ステップのみのカードもサポートされています。Markdown のリンクには HTTP または HTTPS を使用してください。サーバーは複数フィールドにまたがる制約を検証します。デプロイ環境は、リッチ REST 手順をサポートしている必要があります。
MCP リソース
| リソース URI | 説明 |
|---|---|
browserless://api-docs | スマートスクレーパー API のドキュメント |
browserless://status | サービスのリアルタイム稼働状況 |
MCP プロンプト
| プロンプト | 説明 |
|---|---|
scrape-url | ウェブページをスクレイピングし、内容を要約します |
extract-content | ウェブページから特定の情報を抽出します |
開発
npm install
npm run build
npm test
npm run coverage
テスト
テストスイートでは、Mocha、Chai、Sinonを使用しています。テスト仕様はコードと同じ場所にある test/(test/lib/、test/tools/、test/prompts/、test/resources/、test/integration/)に配置され、コンパイル済みの build/ に対して実行されます。
npm test— TypeScript をコンパイルし、build/test/配下のすべての*.spec.jsを実行します。外部サービスもBROWSERLESS_TOKENも不要です。API クライアントはスタブ化されています。npm run coverage— c8 を使用してテストスイートを実行します。しきい値はpackage.jsonで設定されています(行カバレッジ ≥ 80%、分岐カバレッジ ≥ 70%、関数カバレッジ ≥ 80%)。
テストは、Node 24 上で Test workflow により、すべてのプルリクエストで自動的に実行されます。マージするには、プルリクエストでテストスイートをすべて成功させる必要があります。
API トークン
browserless.io で API トークンを取得してください。このトークンは、Browserless API へのすべてのリクエストの認証に使用されます。
ライセンス
SSPL-1.0
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。