ViewportWitness by Apex Labs について
ViewportWitness は Agent 向けのリモート Web サイト QA サービスで、公開 HTTPS ページをスマートフォンとデスクトップのビューポートで検査します。スクリーンショット、アクセシビリティとレイアウトの指摘を返し、アサーション、表示比較、Markdown 抽出、セキュリティ確認にも対応します。
主な機能
- 013 種類のビューポートでスクリーンショットを撮影
- 02アクセシビリティとレイアウトの問題を報告
- 03読み取り専用のページアサーションを実行
- 04ベースラインと表示を比較
- 05公開ページを Markdown に抽出
- 06リリースのセキュリティ制御を確認
活用シーン
- 01公開前にデプロイ済みサイトを確認
- 02画面サイズごとのレスポンシブレイアウトを検査
- 03状態を変更せずにページ条件をテスト
- 04リリースを保存済みベースラインと比較
MCP 対応
リモート MCP インターフェースを通じて、有料の Web サイト QA ツールを公開します。公開 HTTPS ページを対象とし、有料操作では x402 による支払いを利用します。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://qa.honeygate.app/mcpclaude mcp add --transport http baffles78-viewport-witness https://qa.honeygate.app/mcp{"mcpServers":{"baffles78-viewport-witness":{"type":"http","url":"https://qa.honeygate.app/mcp"}}}Cursor で開く{"servers":{"baffles78-viewport-witness":{"type":"http","url":"https://qa.honeygate.app/mcp"}}}VS Code で開く{"mcpServers":{"baffles78-viewport-witness":{"type":"http","url":"https://qa.honeygate.app/mcp"}}}{"mcpServers":{"baffles78-viewport-witness":{"serverUrl":"https://qa.honeygate.app/mcp"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
ツール
6| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| url | string | はい | 公開 HTTPS ページの URL。プライベート、ループバック、認証情報を含む URL、および HTTPS 以外の URL は拒否されます。 |
詳細
Apex Labs の ViewportWitness
承認前に、デプロイ済みのウェブサイトを確認しましょう。 ブラウザーのセットアップなしで、3 種類の画面サイズにおけるスクリーンショット、アクセシビリティ、レイアウトの証拠を取得できます。対象は公開 HTTPS ページのみです。
無料のサンプルレポート · 支払い不要の予算プレビューから始める
サンプルは、ローカルテスト用の静的なデモです。この変更がデプロイされると、公開 URL を利用できるようになります。
リソース消費を抑えた2つの有料エージェントツールが、ブラウザー QA を補完します。extract_page は、公開 HTML ページを1つ、決定論的な Markdown に変換します($0.005 USDC)。web_release_gate は、公開ページ1つのリリースセキュリティ制御を受動的に確認します($0.05 USDC)。どちらも Base/Solana x402 の決済レール、冪等性保護、単一ワーカーのキュー、7日間のレポートライフサイクルを共有します。呼び出し元が指定する HTML、認証情報、Cookie、カスタムヘッダー、アップロード、プライベートネットワークのターゲットは受け付けません。
AI エージェントによるブラウザー QA 用のリモート MCP サーバー兼 x402 API です。公開 HTTPS URL を送信すると、スマートフォンとデスクトップのビューポートにわたるスクリーンショット、アクセシビリティに関する指摘、レイアウト分析、構造化 JSON を取得できます。
ライブサービスは https://qa.honeygate.app にあります。標準レポートは $0.08 USDC、読み取り専用アサーションは $0.10、ベースラインとの比較は $0.12 です。ローカルインスタンスは、支払いなしのテストモードで実行できます。
ライブサービス
# Probe the live service (returns 402 with payment requirements)
curl -s -X POST https://qa.honeygate.app/v1/checks \
-H 'Content-Type: application/json' \
-d '{"url": "https://example.com"}'
# Payment discovery
curl -s https://qa.honeygate.app/.well-known/x402 | jq .
# Agent skill manifest
curl -s https://qa.honeygate.app/skill.md
有料リクエストには、x402 対応クライアント(資金を入れたウォレットで @x402/fetch を使用するなど)をお使いください。
エージェント向けの完全な利用ガイドは、llms.txt をご覧ください。
有料製品の使用例
有料エンドポイントへの通常の HTTP リクエストは HTTP 402 を返します。これはネットワーク、資産、金額、送金先アドレスを含む x402 チャレンジです。
(資金を入れたウォレットで @x402/fetch を使うなどの)x402 対応クライアントはチャレンジに対する支払いを行い、自動的に再試行します。その結果、コードは成功時の JSON を受け取ります。以下の例はリクエストの形式のみを示しています。開発中はライブサービスを呼び出したり、支払いを送信したりしないでください。ローカルでは PAYMENT_MODE=test を使用してください(ローカル開発を参照)。
POST /v1/checks — 0.08 USDC
公開 HTTPS URL を送信すると、スマートフォンとデスクトップのビューポートにわたるスクリーンショット、アクセシビリティに関する指摘、レイアウト分析、ブラウザーエラーを取得できます。
// x402-aware client pays the 402 challenge and retries automatically
const { id, pollUrl } = await fetch402('https://qa.honeygate.app/v1/checks', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ url: 'https://example.com' }),
}).then((r) => r.json())
// Poll GET pollUrl until { status: 'complete' }
POST /v1/verify — 0.10 USDC
稼働中の公開 HTTPS URL に対して、明示的な読み取り専用アサーションを実行します。ワーカーが実行するのは、状態を変更しない確認だけです。フォームの送信や、購入・削除コントロールのクリックは行いません。
const { id, pollUrl } = await fetch402('https://qa.honeygate.app/v1/verify', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
url: 'https://example.com',
assertions: [
{ type: 'selectorVisible', selector: 'h1' },
{ type: 'titleIncludes', value: 'Example Domain' },
],
}),
}).then((r) => r.json())
POST /v1/compare — 0.12 USDC
現在のレンダリングをベースラインジョブと比較します。baselineJobId には、3つすべてのビューポート(phonePortrait、phoneLandscape、desktop)のスクリーンショットを含む、完了済みで有効期限内の ViewportWitness チェックを指定する必要があります。ベースラインの有効期限は7日間です。ベースラインジョブが保留中または失敗している場合、あるいはいずれかのビューポートのスクリーンショットが欠けている場合、リクエストは拒否されます。
const { id, pollUrl } = await fetch402('https://qa.honeygate.app/v1/compare', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
url: 'https://example.com',
baselineJobId: 'JOB_ID_FROM_PREVIOUS_CHECKS',
}),
}).then((r) => r.json())
安全性:公開 HTTPS URL のみを受け付けます。ループバック、プライベート、リンクローカル、メタデータのアドレスは、すべてのホップでブロックされます。ブラウザーワーカーは状態を変更しません。フォームの送信や、状態を変更する操作は行いません。
ローカル開発
npm install
npx playwright install chromium
cp .env.example .env
npm run dev
# Create a check (test mode — no payment required)
curl -s -X POST http://localhost:3000/v1/checks \
-H 'Content-Type: application/json' \
-d '{"url": "https://example.com"}' | jq .
# Poll result
curl -s http://localhost:3000/v1/checks/JOB_ID | jq .status
# Get screenshot
curl -o desktop.png http://localhost:3000/v1/checks/JOB_ID/screenshots/desktop
ローカル環境のデフォルトは PAYMENT_MODE=test です。テストモードでは CDP キーは不要です。結果には paymentMode: "test" とラベルが付けられ、実際の支払い決済を表すものではありません。
API
| Method | Path | Description |
|---|---|---|
| GET | / | サービス情報 |
| GET | /health | 稼働確認プローブ |
| GET | /ready | 準備状況確認プローブ(DB + ワーカー) |
| GET | /openapi.json | OpenAPI 3.1 仕様 |
| GET | /llms.txt | エージェント向け利用ガイド |
| GET | /skill.md | 簡潔なエージェントスキルマニフェスト |
| GET | /privacy | プライバシーポリシー |
| GET | /terms | 利用規約 |
| GET | /logo.png | ディレクトリおよび連携用ロゴ |
| GET | /.well-known/x402 | 決済情報の検出 |
| POST | /v1/checks | QA チェックジョブを作成 |
| POST | /v1/verify | 明示的な読み取り専用アサーションを確認 |
| POST | /v1/compare | 有効期限内のベースラインジョブと比較 |
| POST | /mcp | x402 有料ツールを備えたリモート MCP インターフェース |
| GET | /v1/checks/:id | ジョブのステータスを確認/レポートを取得 |
| GET | /v1/checks/:id/screenshots/:viewport | スクリーンショット PNG をダウンロード |
| GET | /v1/checks/:id/diffs/:viewport | 比較差分 PNG をダウンロード |
ページ履歴アーカイブ(デフォルトでは無効)
ARCHIVE_ENABLED=true の場合、完了したすべての check、verify、compare レポートは、7 日間のジョブ保持期間を超えて保存される別のアーカイブ(ARCHIVE_DIR)にもコピーされます。エージェントは、指定した公開 URL 1 件について過去のスナップショットをリクエストできます。アーカイブには公開ページの証拠(スクリーンショット、検出結果、判定)のみが保存され、ジョブ ID、決済データ、呼び出し元のアサーション、ベースライン参照は除外されます。
| Method | Path | Description |
|---|---|---|
| GET | /v1/history/availability?url= | 無料:スナップショットの件数と期間を確認 |
| POST | /v1/history | 有料(HISTORY_PRICE_USDC、デフォルトは 0.02):一覧を取得 |
| GET | /v1/history/snapshots/:id | アーカイブ済みスナップショット全体(有料一覧で取得した ID を指定) |
| GET | /v1/history/snapshots/:id/screenshots/:viewport | アーカイブ済みスクリーンショット PNG |
POST /v1/history は { "url": "https://example.com", "limit": 5, "before": "<ISO time>" } を受け取り、nextBefore カーソルとともに新しい順でスナップショットを返します。スナップショットが存在しない URL への署名済みリクエストは、決済が確定する前に 404 no_snapshots を返します。上限は .env で設定します:
ARCHIVE_RETENTION_DAYS(90)、ARCHIVE_MAX_STORAGE_GB(5)、ARCHIVE_MAX_SNAPSHOTS_PER_URL(30)、
HISTORY_MAX_RESULTS(10)。
ビューポート:phonePortrait(375×812)、phoneLandscape(812×375)、desktop(1440×900)
支払いモード
| モード | 支払いの要否 | ネットワーク |
|---|---|---|
test | 不要 | —(ローカル開発のみ) |
testnet | 必要(x402) | Base Sepolia;オプションで Solana Devnet |
production | 必要(x402、$0.08 USDC) | Base mainnet;オプションで Solana mainnet |
本番モードには、ENABLE_MAINNET_PAYMENTS=true とレビュー済みリリースが必要です。
Solana は別途、デフォルトで無効になっています。有効にするには、ENABLE_SOLANA_PAYMENTS=true、公開テスト用および収益受取用の送金先、ファシリテーター機能の確認、独自の決済テストが必要です。
アプリケーションは PAYMENT_MODE に応じて適切な送金先を選択します。
有料モードでは、32 文字以上の非公開の CUSTOMER_HASH_SECRET も必要です。これは、リピート利用の測定に使う、安定した一方向の顧客ラベルを作成するためのものです。支払者のウォレットアドレスは保存されません。
アトリビューションはベストエフォートで行われ、支払い確認後の配信を妨げることはありません。このシークレットを変更すると新しい測定シリーズが開始されますが、過去のジョブは書き換えられません。
有効化の手順については、docs/RUNBOOK.md を参照してください。
テストの実行
npm test # unit tests (no browser required)
npm run test:e2e # local e2e (requires Playwright Chromium)
npm run typecheck # TypeScript strict check
Docker
docker compose build
docker compose up -d
curl http://localhost:3000/health
さらに詳しく
- ビルド仕様 — 製品と安全性に関する仕様の全文
- ランブック — 運用、バックアップ、アップグレード、メインネットの有効化
- エージェントガイド — 機械可読な使用方法
- スキルマニフェスト — 簡潔なエージェントスキルガイド
- MCP インストールガイド — ChatGPT、Claude、Codex、Cursor、VS Code への接続
- プライバシーポリシー と利用規約
- 顧客からのフィードバック — 機能のリクエストや、秘密情報を投稿せずに結果を報告できます
- ビルドのエビデンス — テスト結果と既知の制限
MIT ライセンス
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。