voyager-browser について
voyager-browserは、ライブURLを限定的に調べる読み取り専用のウェブページ観察ツールです。静的HTMLを解析し、ページの構造・セキュリティ・アクセシビリティを報告し、JavaScriptは実行しません。
主な機能
- 01静的HTMLページの検査
- 02セキュリティとCookieの確認
- 03フォームとリンクのリスク検出
- 04アクセシビリティの手掛かり確認
- 05信頼できない内容の明示
- 06SSRF対策付き読み取り専用取得
活用シーン
- 01ページのセキュリティヘッダー確認
- 02フォームやリンク設定のリスク検出
- 03基本的なアクセシビリティ確認
- 04スクリプトを実行せずURLを調査
MCP 対応
MCPクライアント向けに`observe_page`ツールを公開し、単一URLを観察してページの検出結果を返します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
1掲載時のツール一覧 · 2 週間前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| url | string | はい | 観察する単一の http(s) URL。 |
| maxBytes | integer | いいえ | |
| timeoutMs | integer | いいえ | |
| authorized | boolean | いいえ | 自身のプライベート/ループバック/イントラネット対象(ステージング環境、内部アプリ)を観察する場合は true に設定します。プライベートアドレス範囲を許可しますが、クラウドメタデータとリンクローカルは引き続き拒否します。デフォルトの false はパブリック URL のみです。 |
| discoverPaths | boolean | いいえ | 上限付きの同一オリジン読み取り専用 GET によって、既知の機密パスを受動的に検出します(確認済みの特徴のみフラグ付け)。デフォルトは true。スキップするには false に設定します。 |
詳細
@dir-ai/voyager-browser
Voyager のウェブページ感覚。 稼働中の URL 1 件を安全に読み取り専用で観察し、構造、フォーム、リンク、スクリプトの配信元、セキュリティ態勢(HTTPS/HSTS/CSP/混在コンテンツ/Cookie)、アクセシビリティの指標(lang、画像の alt の網羅率、見出しの順序)を確認します。それぞれに修正案を説明しますが、適用はしません。
静的 HTML を解析します。JavaScript は実行せず、ヘッドレスブラウザーも使用しません。そのため、確認できることとできないことを正直に示します(クライアント側 SPA の実行時の状態はレンダリングしません)。ページ内のテキストはすべて、信頼できないものとして明示して返されます。SSRF 対策として、http(s) 以外の URL と、プライベート、ループバック、クラウドメタデータのアドレスに解決される URL は拒否します。
Voyager ファミリーの感覚の 1 つです。すべての感覚と同じく読み取り専用であり、フォームの送信やクリック、変更は一切行いません。
インストール
npm i -g @dir-ai/voyager-browser
使い方
voyager-browser observe https://example.com
voyager-browser observe https://example.com --json
https://example.com/
https://example.com — 200; 3 finding(s), worst: medium. 0 form(s), 1 link(s).
title: Example Domain
security: https · a11y lang:yes alt:n/a
med HTTPS without HSTS
↳ add Strict-Transport-Security: max-age=63072000; includeSubDomains
med no Content-Security-Policy
↳ add a Content-Security-Policy to constrain scripts/resources
low no X-Content-Type-Options: nosniff
↳ add X-Content-Type-Options: nosniff
MCP サーバーとして
ツールは observe_page の 1 つです。
{ "command": "voyager-browser", "args": ["mcp"] }
ライブラリとして
import { observe } from '@dir-ai/voyager-browser'
const brief = await observe('https://example.com')
console.log(brief.summary)
console.log(brief.security) // { https, hsts, csp, mixedContent, thirdPartyScripts, … }
console.log(brief.forms) // insecure / cross-origin / sensitive flags
console.log(brief.findings) // severity + described fix
確認項目
- セキュリティ態勢(有無だけでなく品質も確認) — 平文 HTTP、HSTS の未設定/脆弱な設定、CSP の未設定、または脆弱と評価される CSP(
unsafe-inline/unsafe-eval/ワイルドカード/object-srcなし/base-uriなし)、クリックジャッキング対策の未設定(X-Frame-Options/frame-ancestors)、nosniff、Referrer-Policy、Permissions-Policy の未設定、バージョンが漏れるServer/X-Powered-By、HTTPS ページ上の混在コンテンツ(プレフィックスではなくオリジンを比較)、Cookie ごとの Secure/HttpOnly、サブリソース整合性のないサードパーティスクリプト。 - フォーム — HTTPS ページ上のフォームが平文 HTTP に送信される(
critical)、機密性の高いフォーム(パスワード/支払い)がクロスオリジンまたは HTTP 経由で送信される、機密性の高いPOSTに CSRF 対策トークンがない、機密データがGETで送信される。 - リンク — 外部リンクの
target="_blank"にrel="noopener"がない(リバースタブナビング)。 - 本文コンテンツの漏えい — ディレクトリ一覧(Apache/nginx の autoindex)、言語固有のスタックトレース(Python/Java/PHP/Node/Oracle/SQLSTATE/MySQL)、レスポンス本文で開示される詳細なフレームワークデバッグページ(Werkzeug/Flask、Rails、Symfony/Whoops、ASP.NET YSOD)。それぞれ、一致したシグネチャ(信頼できないものとして明示)を示します。
- 露出した JWT — HTML、レスポンスヘッダー、
Set-Cookie、同一オリジンのバンドルで見つかった JWT 形式のトークンをデコードし(ヘッダー+ペイロード、base64url、署名検証なし、秘密情報のクラッキングなし)、alg:none(critical)、期限切れ(expが過去)、またはexpの欠落を検出します。クレーム値は信頼できないものとして明示します。 - 一般的な機密パスの受動的な検出 — 短い固定リスト(
/.git/config、/.env、/.svn/entries、/.DS_Store、/config.json、/wp-config.php~、/backup/、/uploads/)に対し、同一オリジンで範囲を限定した読み取り専用のGETを行い、本文のシグネチャが確認された場合のみ検出します。単なる200では検出しません。検証済み IP に固定し、--authorizedに従います。--no-discoveryで無効にできます。 - アクセシビリティ —
<html lang>の未設定、altのない画像、見出しレベルの飛ばし、ラベルのないフォームフィールド。 - レンダリングの正確な説明 —
render: static | hybrid | client-heavyフィールドを含みます。ページのコンテンツが JavaScript でレンダリングされる場合は、その旨を概要で示し、シェルを問題なしと報告するのではなく PARTIAL とマークします。 - 構成のヒント —
@dir-ai/voyager/@dir-ai/voyager-netで検証すべきサードパーティスクリプトの配信元。
安全性
- 読み取り専用です。 1 回の GET でページを取得し、送信、クリック、変更は行いません。
- コードは実行しません。 静的な HTML の解析のみを行い、ページの JavaScript は実行しません。
- SSRF を防止し、IP を固定します。
http(s)のみを受け付け、URL は 1 つだけです(リストや認証情報は不可)。ホストを解決し、すべてのアドレスを正規の方法で分類します(IPv4 マップド IPv6、未指定、CGNAT、NAT64、リンクローカル、プライベート、ループバック、メタデータはすべて拒否されます)。また、接続先を検証済みの IP に固定するため、チェックから取得までの間に DNS リバインディングで内部アドレスに差し替えられることはありません。リダイレクトの各段階で再検証し、IP を再固定します。 - 設計上、信頼できないデータとして扱います。 要約に含まれる、所有者が管理するすべての文字列(タイトル、見出し、メタデータ、リンク、フォームのアクション、フィールド名)は、インジェクションを除去して枠で囲みます。エージェントはこれらを指示ではなくデータとして扱う必要があります。
- 取得量に上限があります。 ヘッダーと本文に共通の期限を適用し、本文のバイト数にも上限を設けます。読み取りが途中で切れた場合は信頼度を下げ、「問題なし」と報告することはありません。
- 限界を正直に示します。 サーバーが送信した内容を読み取ります。クライアント側でレンダリングされた状態は確認できません。そのため、
renderフィールドで確認できた範囲を正確に示します。
ロードマップ
- v0.3 — 同一オリジンの JS バンドルの静的スキャン(公開されたシークレット/エンドポイント/ソースマップ)、サードパーティ/トラッカー/Cookie の一覧表示と技術スタックのフィンガープリント、WCAG に対応したアクセシビリティの詳細な分析、およびページの観察結果を
@dir-ai/voyager-agentのミッション(ページ → ホスト → 依存関係チェーン)に取り込むCognitiveClaimアダプター。 - v1.0 — 真の SPA/レンダリング済み DOM の網羅性を実現する、オプトインかつ同意に基づく
--renderサンドボックス化ヘッドレス処理(ネットワーク分離、リソース上限付き)。出力には常にレンダーモードであることを明記します。また、安定した検出結果のkind分類体系と、完全なセキュリティ態勢スコアも導入します。
方針は変わりません。voyager-browser は、すでに提供されているものをさらに読み取ることで機能を拡張し、サーバーに対してさらに操作を行うことはありません。送信、ファジング、プロービングなどの能動的な操作は、別の同意に基づく機能に任せます。
Voyager ファミリー
| パッケージ | 感覚 |
|---|---|
@dir-ai/voyager | Web — 検証済みのインターネット検索 |
@dir-ai/voyager-browser | Web ページ — 稼働中の URL を 1 つ観察 |
@dir-ai/voyager-repo | コード — リポジトリ内の状況を把握 |
@dir-ai/voyager-net | ホスト — 許可されたホストを監査 |
@dir-ai/voyager-contract | 感覚が共有する認知契約 |
@dir-ai/voyager-agent | 感覚を組み合わせる唯一のエージェント |
ライセンス
MIT © dir-ai
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。