分析ツール
このanalyzeツールは、実際のブラウザ環境でAxe DevToolsブラウザ拡張を使用してウェブページの包括的なアクセシビリティ解析を実行します。ローカル開発URL(例:localhost:3000)やリモート本番URLのどちらでもシームレスに動作します。
機能の説明
- 認証 - ユーザーの資格情報(APIキーまたはOAuth 2.0アクセストークンのいずれか)を検証し、認可されたアクセスを確保します
- 設定の取得 - ユーザーの組織に特化したAxe設定設定を取得します。含まれる内容は以下の通りです:
- アクセシビリティテスト基準(例: WCAG 2.2 AA)
- axe-coreのバージョン
- 要レビュー/ベストプラクティス
- 高度なルールプリセット
- ブラウザベースの分析 - バックグラウンドでAxe DevTools拡張をマウントしたブラウザインスタンスを立ち上げます
- ページナビゲーション - ユーザーがAIエージェントに提示したURLにナビゲートします
- アクセシビリティスキャン - 実際のユーザー経験をテストするためにレンダリング済みページでAxe DevToolsブラウザ拡張を使用し、完全なアクセシビリティ解析を実行します(静的HTMLだけではありません)
- 結果の配信 - 構造化された形式でエージェントに包括的な解析結果を返します
レスポンシブテスト
このanalyzeツールはオプションでviewportWidthおよびviewportHeightパラメータをサポートし、特定のビューポートサイズでページをテストできます。これにより、スマホやタブレットの表示サイズに特有のアクセシビリティ問題を発見するのに役立ちます。
Analyze http://localhost:3000 for accessibility issues at a mobile viewport of 375x812パラメータの両方が省略された場合、スキャンは1000×1080で実行されます。viewportWidthのみを渡すと高さが1080にデフォルト化されます。viewportHeightはviewportWidthの設定が必要です。いずれの次元も最大7680ピクセルまで使用できます。
部分ページスキャン
デフォルトでは、このanalyzeツールはページ全体をスキャンします。スキャン範囲を特定の領域に絞り込むには、オプションのselectorパラメータを渡します。これは単一コンポーネントに集中したり、結果からノイズの多い無関係な部分を除外するのに役立ちます。
-
単一CSSセレクタ文字列はトップフレームの要素をターゲットにします。
{ "url": "http://localhost:3000", "selector": "#main" } -
CSSセレクタの配列はiframeやシャドウDOMの境界をまたぎ、各セグメントが次のためのホストを選択します。ターゲットがiframeやシャドウルート内にある場合のみ配列を使用します:
{ "url": "http://localhost:3000", "selector": ["iframe#checkout", "#payment-form"] }
配列は10セグメントまでサポートされます。ページ上でセレクタが要素にマッチしなかった場合、スキャンはエラーを返します。selectorが省略された場合、ページ全体がスキャンされます。
自然言語でAIエージェントに指示を出します。エージェントはその意図をツールコールに変換します:
Scan only the #main region of http://localhost:3000 for accessibility issuesスキャン前のブラウザ操作
このanalyzeツールは、beforeのオプション配列をサポートし、ページが読み込まれた後からアクセシビリティスキャンの前の間に実行される操作ステップを行います。これにより、複数の実際のテストシナリオが可能になります:
- ログインが必要なページ — 認証情報を入力し、スキャン前にポストログインページを送信します
- クッキー/同意バナー — バナーを消して、ページコンテンツを隠したり覆ったりしないようにします
- 動的コンテンツ — クライアントレンダリングされたコンテンツ(ルート変更や遅延挿入されたDOM)が表示されるのを待ってからスキャンを行います
ステップは同一ブラウザコンテキストと同じブラウザコンテキストで配列順に実行されるため、localStorage、およびclickやfillでトリガーされたルート変更がスキャンに持ち越されます。
このbefore配列は20ステップまでサポートされています。各ステップはBROWSER_TIMEOUT_MS(デフォルトでは30000ミリ秒)のタイムアウトをそれぞれ持ち、ステップごとのオーバーライドはありません。
サポートされているアクション
| アクション | 必須フィールド | オプションフィールド | 目的 |
|---|---|---|---|
click |
selector |
CSS selector に一致する要素をクリックします(例:送信ボタン、バナーの「閉じる」ボタン)。 |
|
fill |
selector、value |
selector に一致する入力フォームを value で埋めます。認証情報、検索クエリ、またはフォームフィールドに使用します。空の文字列は入力をクリアします。 |
|
waitFor |
selector |
state — "visible"(デフォルト)、"attached"、"hidden"、"detached" のいずれか |
selector に一致する要素が state に達するまで待ちます。次のステップまたはスキャン自体のゲートとして使用します。ポストインタラクションの状態で存在する のみ 選択子を選んでください(例:ログアウトボタンやダッシュボードの見出し)—相互作用の前に既に存在し即座に解決する body や #app のような汎用的な選択子では何もゲートできません。 |
wait |
ms |
ms ミリ秒(1–5000)一時停止した後に続行します。ページ上で準備完了を示すものがないときに のみ を使用します―CSSトランジションの終了、デバウンスタイマーの発火、キャンバスの描画などです。要素が表示または変更される場合は、代わりに waitFor を使います: より速く推測不要です。バージョンv1.5.0以降が必要です。 |
waitFor を wait より優先します。 固定された一時停止は、必要以上に長く待機するか、短すぎるかで、すべてのスキャンをその全期間だけ遅らせます。wait のステップの合計は before 配列内で 10000 ms に制限されており、この上限を超えるリクエストは拒否されます。この一時停止は、各インタラクション後の短い自動的な定着に加えて行われ、置き換えられることはありません。
例: スキャン前のログイン
自然言語でAIエージェントに指示を出します。エージェントはその意図をツールコールに変換します:
Analyze http://localhost:3000 for accessibility issues. Before running
the analysis, fill in the #username and #password fields with USERNAME
and PASSWORD from ./.env.local, click the button[type=submit] button,
and wait for #main-content to appear.エージェントはプロンプトを解決し、次のようなペイロードで analyze ツールを呼び出します:
{
"url": "http://localhost:3000",
"before": [
{
"action": "fill",
"selector": "#username",
"value": "<resolved-from-.env.local>"
},
{
"action": "fill",
"selector": "#password",
"value": "<resolved-from-.env.local>"
},
{ "action": "click", "selector": "button[type=submit]" },
{ "action": "waitFor", "selector": "#main-content" }
]
}fill.value は機密として扱われます。 Axe MCP サーバーは fill.value をログに記録せず、エラーメッセージにエコーせず、テレメトリーに送信もしません。ユーザー提供のものやシークレットな入力(パスワード、APIトークンなど)には fill を使用し、全パイプラインでシークレットがマスキングされたままになるようにします — selector に機密情報を埋め込むことは避けてください。それは 行います ログやエラーメッセージに表示されます。
エージェントはサーバーではなく value を解決します。 Axe MCP サーバーは value をリテラル文字列として扱います — ではなく ファイルを読み取ったり、環境変数を展開したり、${VAR}、$VAR、または {{VAR}} のようなプレースホルダー構文を解釈したりしません。ユーザーの意図を具体的な文字列に解決するのは、AIエージェント(Claude、Copilot、Cursorなど)の役割です。
実際には、これは次のことを意味します:
- 自然にプロンプトを組み立てる — 「
.env.localからのユーザー名/パスワードを使用する」は機能します。エージェントは自分のファイルシステムツールを使ってファイルを読み込み、値を代入します。 - プレースホルダー構文を貼り付けないでください — プロンプトに
value: "${USERNAME}"を書くと、リテラル文字列${USERNAME}が入力に打ち込まれることになります。 - 曖昧な情報源には明示的である — 「保存された認証情報を使う」と言っても、エージェントをファイルや環境変数に向けなければ、適切な動作をするエージェントは推測ではなく質問してくるでしょう。どこを見れば良いか教えましょう。
一部の認証フローはサポートされていません。 before のアクションは、Docker化されたChromiumインスタンスでPlaywrightスタイルのインタラクションを通じてページを動かします。ここでは、意図的に範囲外とされているものを以下に示します:
- キャプチャ チャレンジ(reCAPTCHA、hCaptcha など)
- 2FA / TOTP / SMS 検証コード
- サードパーティ SSO リダイレクトチェーン(例: 「Google でサインイン」、Okta ホストのログインページ)
実際のログインフローに上記のいずれかが必要な場合、別のエントリーポイントをスキャンします:
- 事前認証されたセッションクッキー が クッキーインジェクション によって注入されます — 実際のブラウザで一度認証を行い、その結果得られたセッションクッキーを渡してスキャンを開始します。
- チームが自動テストに使用する セッショントークン または バイパスURL
- アクセシビリティテスト用の 認証が無効になったステージングURL
クッキーインジェクション
analyze ツールはオプションの cookies 配列をサポートしており、ブラウザコンテキストにクッキーを設定しナビゲーション前ページへの最初のリクエストに乗せることができます。これは、ナビゲーション before のアクション 後に実行される 後 とは異なり、初期リクエストのルーティングに影響を与えることができません。一般的な用途は次の2つです:
- 環境ルーティング — エッジまたはCDNレイヤーが読み込み、どのバージョンのサイトを提供するかを決定するためのステージングまたはフィーチャーブランチセレクタークッキーを設定します。
- 事前認証されたセッション — 正常なセッションクッキーを注入し、
beforeを通じてログインフォームを操作せずに、スキャンを既にログインした状態で開始します。
cookies配列は最大20個のクッキーをサポートします。
クッキーフィールド
| フィールド | 必須 | 説明 |
|---|---|---|
name |
はい | クッキー名。ログやエラーメッセージに表示されます — ここには秘密の値を入れないでください。 |
value |
はい | クッキー値。機密と見なされます:ログに記録されたり、エラーに出力されたり、テレメトリーに送信されたりすることはありません。最大10,000文字(JWTやセッショントークンには十分長い)。 |
domain |
はい | クッキードメイン。スコープを明示的にするために必須です。クッキーをサブドメイン間で共有するには、先頭にドット(.example.com)を使用します。 |
path |
いいえ | クッキーパス。デフォルトは/です。 |
sameSite |
いいえ | 「Strict」、「Lax」、または「None」のいずれか。「None」はsecure: trueが必要です。 |
secure |
いいえ | ブール値。 |
httpOnly |
いいえ | ブール値。 |
expires |
いいえ | 秒単位のUnixタイムスタンプとしての有効期限。セッションクッキーの場合は省略。 |
例: 事前認証されたページへのアクセス
自然言語でAIエージェントに指示を出します。エージェントはその意図をツールコールに変換します:
Analyze https://app.example.com for accessibility issues. Set the session
cookie for app.example.com from ./.env.local so the scan starts already
logged in.エージェントはクッキー値を解決し、analyzeツールを以下のようなペイロードで呼び出します。
{
"url": "https://app.example.com",
"cookies": [
{
"name": "session",
"value": "<resolved-from-.env.local>",
"domain": "app.example.com"
}
]
}cookies[*].value は機密として扱われます。 fill.valueのように、Axe MCPサーバーはクッキーのvalueをログに記録しないし、エラーメッセージに出力せず、テレメトリーに送信もしません。ただし、クッキーのnameはログやエラーメッセージに行います表示されるかもしれないので、シークレットはvalueに保管し、nameには保管しないでください。
エージェントはサーバーではなく value を解決します。 Cookie values follow the same rule as fill.value in before のアクション: the server treats value as a literal string and does ではなく read files, expand environment variables, or interpret placeholder syntax like ${VAR}. Your AI agent resolves the user's intent into a concrete string before calling the tool.
スクリーンショット
analyzeツールはページのスクリーンショットを検出報告と共に返すことができ、スキャンされた内容を確認できます。オプションのscreenshotパラメータを渡してオプトインします — 空のオブジェクトで十分です。
{
"url": "http://localhost:3000",
"screenshot": {}
}PNGがデフォルトです。写真が多いページで小さい画像にしたいときはformatを"jpeg"に設定します。
{
"url": "http://localhost:3000",
"screenshot": { "format": "jpeg" }
}画像は、違反報告の後で標準のMCP画像コンテンツブロックとして戻ってきます。
スクリーンショットに表示される内容
- 表示されるビューポートで、ページ全体ではありません。 折りたたまれた部分のコンテンツは含まれません。ページのより多くの部分をキャプチャするには、
viewportHeight(例:4096)を高く設定し、表示領域をカバーしたい部分まで広げます。 - スキャンが始まる直前のページです。 キャプチャは
axe.run()の直前に行われるため、スキャン中に発生するDOMの変更、SPAの再レンダリング、useEffectの更新、アニメーション、進行中のリクエストは反映されません。シングルページアプリではこのズレが一般的です。
スクリーンショットをAxeが見た内容の真実のソースとは見なさないでください。 上記のタイミングのズレにより、画像に表示されている要素がAxeによって評価されたものでない可能性があります。エージェントには、画像に表示されているがフラグされていない要素をスキャン結果として説明しないように頼んでください — 違反報告が権威あるものです。
コストとクライアントサポート
意図的にスクリーンショットをリクエストしてください。 画像コンテンツブロックは、次のターンでエージェントに画像入力トークンのコストを生じます — テキストの約10倍です。本当にページを見たい場合にスクリーンショットを要求し、すべてのスキャンに追加しないでください。
画像がインラインでレンダリングされるかどうかはMCPクライアント次第です。サーバーは常に仕様に準拠した画像ブロックを返しますが、一部のクライアントはツール結果を折りたたんだり画像のプレビューを省略したりします — Copilotを搭載したVS Codeは表示しますが、CursorやClaude Desktopは表示しないかもしれません。プレビューが欠けているのは、クライアント側の表示制限であり、キャプチャの失敗ではありません。
スクリーンショットをディスクに保存する
スクリーンショットはファイルに書き込むこともでき、インライン画像をレンダリングできないクライアントでキャプチャを見る信頼性のある方法です。saveToを絶対パスに設定します。
{
"url": "http://localhost:3000",
"screenshot": { "saveTo": "/Users/me/Desktop/home.png" }
}または、save: trueを設定してサーバーにファイル名を選ばせます。
{
"url": "http://localhost:3000",
"screenshot": { "save": true }
}| フィールド | タイプ | 目的 |
|---|---|---|
saveTo |
string |
画像を書き込む絶対パス。既存のディレクトリを指す場合は、その中に生成されたファイル名が書き込まれます。保存を意味するため、saveはそれと一緒に必要ありません。 |
save |
boolean |
サーバーのスクリーンショットディレクトリ(AXE_SCREENSHOT_DIR、デフォルトはOSのテンポラリディレクトリ)に生成されたファイル名で画像を書き込みます。saveToが設定されている場合は無視されます。 |
inline |
boolean |
画像をインラインブロックとして添付するかどうか(デフォルトはtrue)。インライン画像をスキップし、保存されたパスのみを返すにはfalseを設定します。 |
書き込まれた絶対パスはレスポンスのmessages配列で返されるので、エージェントはファイルの場所を伝えることができます。
画像を二重請求しないようにするために、inline: falseと保存を組み合わせます。 If your client can't render the inline image anyway, { "save": true, "inline": false } writes the file and skips the image content block — saving the image-input tokens it would otherwise cost on your agent's next turn.
inline: false 保存が実際に成功したときだけ効果を発揮します。書き込みが失敗した場合、画像はインラインで返されるので、キャプチャが失われることはありません。
Docker配布の下では、ファイルはコンテナ内に書き込まれます。 ホストからそれにアクセスするには、ターゲットディレクトリにボリュームをマウントし、コンテナ側のパスにsaveTo(またはAXE_SCREENSHOT_DIR)を指定します。サーバーはマウントの有無を検出しません — マウントがない場合、ファイルは書き込まれた後、コンテナとともに破棄されます。
保存は成功したスキャンのみに適用されます。スキャンがスクリーンショットを取得した後に失敗した場合、inlineにかかわらず、エラーとともに画像がインラインで返され、ディスクに書き込まれることはありません。
キャプチャが失敗した場合
スクリーンショットキャプチャはベストエフォートであり、スキャンを失敗させることはありません。キャプチャがタイムアウトした場合でも、スキャンは結果を返し、応答のmessages配列に注釈が付きます:
Screenshot capture failed: <reason>スクリーンショットを撮った後にスキャン自体が失敗した場合でも、画像はエラー応答とともに返されます — 問題が発生した瞬間のページの視覚的な状態は、通常、最も有用なデバッグの証拠です。
リクエストされたスクリーンショットはDequeには送信されません。 イメージはローカルでキャプチャされ、直接エージェントに返されます。これは高度なルールがアップロードするサーバーサイド評価用の全ページスクリーンショットとは別です;Dequeに送信される内容を参照してください。
高度なルール
標準のaxe-coreルールセットを超えて、analyzeツールは高度なルールを実行できます — スクリーンショット、コンピュータビジョン、大規模言語モデルを使用した自動テストで、axe-coreだけでは捉えきれない問題を見つけます。例えば、見た目は見出しのようだが本当はそうではない見出しや、役に立たない代替テキストの付いた情報画像などです。
どのプリセットが実行されるかは、組織のAxe設定により決まりますが、管理者が許可する場合には、サーバー単位でAXE_ADVANCED_RULESやスキャン単位でadvancedRules引数を使用して上書きすることができます:
{
"url": "http://localhost:3000",
"advancedRules": "thorough"
}すべての応答には実際に実行されたプリセットとその出所が報告されます:
{
"advancedRules": {
"value": "thorough",
"source": "tool_arg"
}
}高度なルールは、Web用Axe DevToolsサブスクリプションとともに提供されます — Axe MCPサーバーを提供するのと同じものです。スキャンに約15〜20秒を追加し、AIクレジットを消費し、analyzeがページデータ(全ページのスクリーンショットとページ構造)をDequeに送信する唯一のケースです。プリセット、優先順位、劣化メッセージ、プライバシーの詳細については高度なルールを参照してください。
主な利点
- 実際のブラウザテスト - 実際にレンダリングされたページをテストし、正確な結果を確保します
- 組織基準 - 一貫したテストを行うために、チームのAxe設定を尊重します
- 包括的なカバレッジ - 業界をリードするAxeプラットフォームを活用します
- レスポンシブテスト - 特定のビューポート寸法でテストを行い、ブレークポイント固有のアクセシビリティの問題を捉えます
- ターゲットスキャン -
selectorパラメータを使用して特定の領域、iframe、またはシャドウルートにスキャンの範囲を絞ります - 認証済み&インタラクティブなページ - ログイン後のページをスキャンし、クッキーバナーを閉じたり、
beforeアクションを使用して動的コンテンツを待機したりします - セッション&環境クッキー - Land already authenticated, or route to a specific environment, by injecting cookies before navigation with the
cookiesparameter - 視覚的コンテキスト - スキャンが失敗した場合を含め、
screenshotパラメータを使用してレポートと一緒にページのスクリーンショットを返します - 高度なルール - ビジュアルまたはコンテキスト的な推論を必要とする問題を捉え、組織が制御する信頼水準で検出します
- インテリジェントガイド付きテスト -
igtToolsパラメータを使用して、同じ通話で同じページに対してキーボード、インタラクティブ要素、およびモーダルダイアログのIGTを実行します
出力
ツールは以下を含む構造化されたJSON応答を返します:
- 見つかったすべてのアクセシビリティ違反
- 違反の深刻度レベル(重大、深刻、中程度、軽度)
- 特定の要素セレクタとソースコード
- ルールIDと説明
- 実行された高度なルールプリセットとそれがどこから来たかを報告する
advancedRulesブロック - 実行に関するメモ(例えば、スクリーンショットキャプチャの失敗、劣化した高度なルール実行、または保存されたスクリーンショットのパス)を持つ
messages配列
screenshotが設定されている場合、レポートに続いてイメージコンテンツブロックが続きます。igtToolsが設定されている場合、IGTの結果がAxeの結果と共にIGT名でキー付けされて返されます。
