axe MCPãµãŒããŒ
æŠèŠ
axe MCPãµãŒããŒã¯ããšã³ã¿ãŒãã©ã€ãºã°ã¬ãŒãã®ã¢ã¯ã»ã·ããªãã£ãã¹ããéçºã®ã¯ãŒã¯ãããŒã«çŽæ¥çµ±åããã¢ãã«ã³ã³ããã¹ããããã³ã«ïŒMCPïŒãµãŒããŒã§ããä¿¡é Œæ§ã®é«ãaxeãã©ãããã©ãŒã äžã«æ§ç¯ãããŠãããéçºè ãIDEãé¢ããããšãªãå æ¬çãªã¢ã¯ã»ã·ããªãã£ã¹ãã£ã³ãå®è¡ããå°éçãªä¿®æ£ã¬ã€ãã³ã¹ãåãåãããšãã§ããŸãã
ãµãŒããŒã¯3ã€ã®æ©èœãæäŸããŸã - analyzeãremediateãigtã
ãããã®ããŒã«ã¯ãMCPäºæã®ã¯ã©ã€ã¢ã³ãïŒClaude DesktopãCopilotã䜿çšããVS CodeãCursorãªã©ïŒã«ã·ãŒã ã¬ã¹ã«çµ±åãããçµç¹ã®axeèšå®ãå°éããŸãã
ã¢ã¯ã»ã¹ãååŸãã
Axe MCP Serverã¯Axe DevTools for Webãã³ãã«ã«å«ãŸããŠããŸããAxe MCP Serverãžã®ã¢ã¯ã»ã¹ãèš±å¯ããããã®ãµãã¹ã¯ãªãã·ã§ã³ã¯ãDequeã®å¶æ¥æ åœè ãšçžè«ããŠèšå®ããŸãã
ããŒã«ãšæ©èœ
analyzeããŒã«
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ãããã®ãã©ã¡ãŒã¿ãçç¥ãããšããã©ãŠã¶ã¯ããã©ã«ãã®ãã¥ãŒããŒããµã€ãºã䜿çšããŸãã
éšåããŒãžã¹ãã£ã³
ããã©ã«ãã§ã¯ãanalyze ããŒã«ã¯ããŒãžå
šäœãã¹ãã£ã³ããŸããç¹å®ã®é åã®ã¹ãã£ã³ã«éå®ããã«ã¯ããªãã·ã§ã³ã®selectorãã©ã¡ãŒã¿ãŒãæž¡ããŸããããã¯ãåäžã®ã³ã³ããŒãã³ãã«éäžããå ŽåãããŒãžã®ãã€ãºã®å€ãç¡é¢ä¿ãªéšåãçµæããé€å€ããå Žåã«æçšã§ãã
-
åäžã®CSSã»ã¬ã¯ã¿æåå ã¯ããããã¬ãŒã å ã®èŠçŽ ãã¿ãŒã²ããã«ããŸãã
{ "url": "http://localhost:3000", "selector": "#main" } -
CSSã»ã¬ã¯ã¿ã®é å 㯠iframe ã shadow-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æé ã®é
åããµããŒãããŠãããããŒãžã®èªã¿èŸŒã¿åŸãå®è¡ãããŸããã¢ã¯ã»ã·ããªãã£ã¹ãã£ã³ã®åãããŸãããããã«ãããããã€ãã®å®éã®ãã¹ãã·ããªãªãå¯èœã«ãªããŸãïŒ
- ãã°ã€ã³ãå¿ èŠãªããŒãž â èªèšŒæ å ±ãå ¥åããŠéä¿¡ãããã°ã€ã³åŸã®ããŒãžãã¹ãã£ã³ããåã«
- Cookie/åæãã㌠â ãããŒãè§£é€ããŠãããŒãžã³ã³ãã³ãã®äžã«éãªã£ããèŠã£ããããªãããã«ããŸã
- åçã³ã³ãã³ã â ã¯ã©ã€ã¢ã³ãã¬ã³ããªã³ã°ãããã³ã³ãã³ãïŒã«ãŒã倿ŽãåŸããæ¿å ¥ãããDOMïŒã衚瀺ãããã®ãåŸ ã£ãŠããã¹ãã£ã³ãè¡ããŸã
Steps execute in array order, in the ã¹ãã£ã³ãšåããã©ãŠã¶ãŒã³ã³ããã¹ã as the scan, so cookies, localStorage, and any route changes triggered by click or fill persist into the scan.
before é
åã¯æå€§20ã¹ãããããµããŒãããŸããåã¹ãããã«ã¯BROWSER_TIMEOUT_MSïŒããã©ã«ãã¯30000msïŒã®ã¿ã€ã ã¢ãŠããèšå®ãããŠãããã¹ãããããšã®äžæžãã¯ãããŸããã
ãµããŒããããŠããã¢ã¯ã·ã§ã³
| ã¢ã¯ã·ã§ã³ | å¿ é ãã£ãŒã«ã | ãªãã·ã§ã³ãã£ãŒã«ã | ç®ç |
|---|---|---|---|
click |
selector |
CSSselectorã«äžèŽããèŠçŽ ãã¯ãªãã¯ããŸãïŒäŸ: ãµãããããã¿ã³ããããŒäžã®ãéããããã¿ã³ïŒã |
|
fill |
selectorãvalue |
selectorã«äžèŽããå
¥åã«valueãå
¥åããŸããèªèšŒæ
å ±ãæ€çŽ¢ã¯ãšãªããŸãã¯ãã©ãŒã ãã£ãŒã«ãçšã«äœ¿çšããŸããç©ºã®æååã§å
¥åãã¯ãªã¢ããŸãã |
|
waitFor |
selector |
state â "visible"ïŒããã©ã«ãïŒã"attached"ã"hidden"ã"detached"ã®ãããã |
Wait for the element matching selector to reach state. Use to gate the next step or the scan itself. Pick a selector that exists ã®ã¿ in the post-interaction state (e.g., a logout button or dashboard heading) â generic selectors like body or #app already exist before the interaction and resolve instantly, so they won't gate anything. |
ã¹ãã£ã³åã®ãã°ã€ã³äŸ
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 ã¯æ©å¯æ±ããããŸãã The axe MCP Server never logs fill.value, never echoes it in error messages, and never sends it to telemetry. Use fill for any user-supplied or secret input (passwords, API tokens, etc.) so secrets stay redacted across the entire pipeline â and never embed sensitive values in a selector, which ãã°ããšã©ãŒã¡ãã»ãŒãžã« appear in logs and error messages.
ãšãŒãžã§ã³ããvalueã解決ããŸããããµãŒããŒã¯ããŸããã axe MCP Serverã¯valueããªãã©ã«æååãšããŠæ±ããŸã â ãã¡ã€ã«ãèªã¿åã£ãããç°å¢å€æ°ãå±éãããããã¡ã€ã«ãèªã¿èŸŒãããšãç°å¢å€æ°ãå±éããããšã${VAR}ã$VARã{{VAR}}ã®ãããªãã¬ãŒã¹ãã«ããŒæ§æãè§£éããããšã¯ããŸããããŠãŒã¶ãŒã®æå³ãå
·äœçãªæååã«è§£æ±ºããã®ã¯ãAIãšãŒãžã§ã³ãïŒClaudeãCopilotãCursorãªã©ïŒã®è²¬ä»»ã§ãã
å®éã«ã¯ãããã¯æ¬¡ã®ããšãæå³ããŸãïŒ
- ããã³ãããèªç¶ã«è¡šçŸãã â ã
.env.localããUSERNAME/PASSWORDã䜿çšãããã¯æå¹ã§ãããšãŒãžã§ã³ãã¯èªåã®ãã¡ã€ã«ã·ã¹ãã ããŒã«ã䜿çšããŠãã¡ã€ã«ãèªã¿èŸŒã¿ãå€ãä»£å ¥ããŸãã - ãã¬ãŒã¹ãã«ããŒæ§æã貌ãä»ããªã â ããã³ããã§
value: "${USERNAME}"ãèšè¿°ãããšãæåå${USERNAME}ãå ¥åæ¬ã«å ¥åãããŸãã - ææ§ãªãœãŒã¹ã«ã€ããŠå ·äœçã«ç€ºã â ãšãŒãžã§ã³ãã«ãã¡ã€ã«ãç°å¢å€æ°ãæå®ããã«ãä¿åãããèªèšŒæ å ±ã䜿çšããããšèšã£ãå Žåãé©åã«åäœãããšãŒãžã§ã³ãã¯æšæž¬ããããšãªã質åããŸããã©ããèŠãã°ããããäŒããŠãã ããã
äžéšã®èªèšŒãããŒã¯ãµããŒããããŠããŸããã before ã¢ã¯ã·ã§ã³ã¯ãDockeråãããChromiumã€ã³ã¹ã¿ã³ã¹ã§Playwrightã¹ã¿ã€ã«ã®ã€ã³ã¿ã©ã¯ã·ã§ã³ãéããŠããŒãžãæäœããŸãã以äžã¯æå³çã«ç¯å²å€ã§ãïŒ
- Captcha ãã£ã¬ã³ãžïŒreCAPTCHAãhCaptchaãªã©ïŒ
- 2FA / TOTP / SMS æ€èšŒã³ãŒã
- ãµãŒãããŒãã£ã®SSO ãªãã€ã¬ã¯ããã§ãŒã³ïŒäŸïŒãGoogleã§ãµã€ã³ã€ã³ããOktaãã¹ãã®ãã°ã€ã³ããŒãžïŒ
å®éã®ãã°ã€ã³ãããŒãäžèšã®ãããããå¿ èŠãšããå Žåã¯ã代æ¿ã®ãšã³ããªãŒãã€ã³ããã¹ãã£ã³ããŸãïŒ
- èªèšŒæžã¿ã»ãã·ã§ã³ã¯ãã㌠ã«Cookieæ³šå ¥ãæ³šå ¥ â å®ãã©ãŠã¶ã§äžåºŠèªèšŒãè¡ãããã®åŸã»ãã·ã§ã³ã¯ãããŒãæž¡ãããšã§ãã¹ãã£ã³ãæ¢ã«ãã°ã€ã³ãããç¶æ ã§éå§ããŸã
- èªååãã¹ãçšã«ããŒã ã䜿çšããã»ãã·ã§ã³ããŒã¯ã³ãŸãã¯ãã€ãã¹URL
- ã¢ã¯ã»ã·ããªãã£ãã¹ãçšã®èªèšŒãç¡å¹ãªã¹ããŒãžã³ã°URL
Cookieæ³šå ¥
analyze ããŒã«ã¯ããã©ãŠã¶ã³ã³ããã¹ãã«ã¯ãããŒãèšå®ãããªãã·ã§ã³ã®cookiesé
åããµããŒãããããã²ãŒã·ã§ã³ã®åããŒãžãžã®æåã®ãªã¯ãšã¹ãã«çŽä»ããŸããããã¯before ã¢ã¯ã·ã§ã³ãšã¯ç°ãªããåŸããã²ãŒã·ã§ã³åŸã«å®è¡ããããããæåã®ãªã¯ãšã¹ãã®ã«ãŒãã«åœ±é¿ãäžããããšã¯ã§ããŸãããäžè¬çãªäœ¿çšäŸïŒ
- ç°å¢ã«ãŒãã£ã³ã° â ã¹ããŒãžã³ã°ãŸãã¯ãã£ãŒãã£ãŒãã©ã³ãã»ã¬ã¯ã¿ã¯ãããŒãèšå®ãããšããžãŸãã¯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ã¯æ©å¯æ
å ±ãšããŠæ±ãããŸãã As with fill.value, the axe MCP Server never logs a cookie's value, never echoes it in error messages, and never sends it to telemetry. A cookie's name, however, ãã°ããšã©ãŒã¡ãã»ãŒãžã« appear in logs and error messages â keep secrets in value, never in 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.
äž»ãªå©ç¹
- å®éã®ãã©ãŠã¶ãã¹ã - ãœãŒã¹ã³ãŒãã ãã§ãªããå®éã«ã¬ã³ããªã³ã°ãããããŒãžããã¹ãããæ£ç¢ºãªçµæãä¿èšŒããŸã
- çµç¹ã®åºæº - ãã¹ãŠã®ãŠãŒã¶ãŒã§äžè²«ãããã¹ããè¡ãããã«ãã䜿ãã®ããŒã ã®axeèšå®ãå°éããŸã
- å æ¬çãªã«ãã¬ããž - æ¥çããªãŒãããaxeãã©ãããã©ãŒã ãæŽ»çšããŸã
- ã¬ã¹ãã³ã·ããã¹ã - ç¹å®ã®ãã¥ãŒããŒããµã€ãºã§ãã¹ããè¡ãããã¬ãŒã¯ãã€ã³ãç¹æã®ã¢ã¯ã»ã·ããªãã£ã®åé¡ãæããŸã
- ã¿ãŒã²ããã¹ãã£ã³ - ã¹ãã£ã³ãç¹å®ã®é åãiframeããŸãã¯ã·ã£ããŠã«ãŒãã«
selectorãã©ã¡ãŒã¿ã§éå®ããŸã - èªèšŒæžã¿ã»ã€ã³ã¿ã©ã¯ãã£ãããŒãž - ãã°ã€ã³ã®èåŸã«ããããŒãžãã¹ãã£ã³ããã¯ãããŒãããŒãè§£æ¶ãããã
beforeã¢ã¯ã·ã§ã³ã䜿çšããŠåçã³ã³ãã³ããåŸ æ©ããŸã - ã»ãã·ã§ã³ïŒç°å¢ã¯ãã㌠- èªèšŒæžã¿ã§ã¢ã¯ã»ã¹ããããç¹å®ã®ç°å¢ã«ã«ãŒããããããããã«ã
cookiesãã©ã¡ãŒã¿ã§ããã²ãŒã·ã§ã³åã«ã¯ãããŒãæ¿å ¥ããŸã
åºå
ãã®ããŒã«ã¯ä»¥äžãå«ãæ§é åãããJSONã¬ã¹ãã³ã¹ãè¿ããŸãïŒ
- èŠã€ãã£ããã¹ãŠã®ã¢ã¯ã»ã·ããªãã£éå
- éåã®é倧床ã¬ãã«ïŒéå€§ãæ·±å»ãäžçšåºŠã軜埮ïŒ
- ç¹å®ã®èŠçŽ ã»ã¬ã¯ã¿ãšãœãŒã¹ã³ãŒã
- ã«ãŒã«IDãšèª¬æ
remediateããŒã«
remediateããŒã«ã¯ãanalyzeãŸãã¯igtããŒã«ã«ãã£ãŠç¹å®ããã1ã€ãŸãã¯è€æ°ã®ã¢ã¯ã»ã·ããªãã£åé¡ãåã蟌ã¿ãæèã«åºã¥ããAI察çã¬ã€ãã³ã¹ãçæããŸããããã«ãããã³ãŒãã£ã³ã°ãšãŒãžã§ã³ããå®éã®ã³ãŒãä¿®æ£ã«å€æã§ããããã«ãªããŸããåé¡ã¯äžæ¬ã§æåºããããããäžåºŠã®åŒã³åºãã§ããŒãžäžã®ãã¹ãŠã®éåã«å¯Ÿããä¿®æ£ãè¿ãããšãã§ããŸãã
æ©èœ
- èªèšŒ - ãŠãŒã¶ãŒã®è³æ Œæ å ±ãæ€èšŒããŸãâAPIããŒãŸãã¯OAuth 2.0ã¢ã¯ã»ã¹ããŒã¯ã³ã®ããããã§èªèšŒãããã¢ã¯ã»ã¹ã確ä¿ããŸã
- AIã¯ã¬ãžããäœ¿çšæ³ - ãããå ã®ååé¡ã¯ãDequeã®è±å¯ãªã¢ã¯ã»ã·ããªãã£å°éç¥èã§ãã¬ãŒãã³ã°ãããé«åºŠãªAIã¢ãã«ã䜿çšããããã®AIã¯ã¬ãžããããããªãã®çµç¹ã®å²ãåœãŠããæ¶è²»ããŸã
- AIçæã®ä¿®æ£ææ¡ - ã³ãŒãã£ã³ã°ãšãŒãžã§ã³ããè§£éããŠãœãŒã¹ã³ãŒãã«å®è£ ã§ãããããªé«å質ã§å®çšçãªã¢ã¯ã»ã·ããªãã£ä¿®æ£ãäœæããŸã
AIã¯ã¬ãžãããæ¯æžããå Žåãã¯ã¬ãžãããè£å
ããããŸã§ïŒè¿œå 賌å
¥ãŸãã¯æ¯æã®ãµã€ã¯ã«ãªã»ããã«ããïŒãremediateããŒã«ã¯åäœããªããªããŸãããã ããanalyzeããŒã«ã¯æ©èœãç¶ããŸãã
ãããä¿®æ£
ããŒã«ã¯issuesé
åãåãå
¥ããŸããåäžanalyzeãŸãã¯igtã®å®è¡ããåé¡ãã¹ãŠã®ã1åã®åŒã³åºãã§äžç·ã«éä¿¡ããåé¡ããšã«ããŒã«ã1ååŒã³åºãã®ã§ã¯ãªããäžæ¬ã§1ãã25ã®ãŸã§ã®åé¡ã«å¯Ÿå¿ããŸãã
ååé¡ã«ã¯ä»¥äžã®ãã£ãŒã«ãããããŸã:
| ãã£ãŒã«ã | å¿ é | 説æ |
|---|---|---|
id |
ã¯ã | åŒã³åºãå
ãéžãã èå¥åã§ããããå
ã§äžæïŒäŸïŒã«ãŒã«IDã«ã«ãŠã³ã¿ãŒã远å : color-contrast-0ïŒã§ããå
¥åã«çµæãé¢é£ä»ããããã ãã«äœ¿çšãããŸãã |
rule |
ã¯ã | analyze/igtåºåããã®axeã«ãŒã«IDïŒäŸïŒcolor-contrastãimage-altïŒã |
elementHtml |
ã¯ã | éåããŠããèŠçŽ ã®HTMLã¹ããããã |
remediation |
ã¯ã | äœãåé¡ã§ãäœãä¿®æ£ããå¿ èŠããããã®èª¬æïŒåé¡ã®èŠçŽããååŸããããªãã·ã§ã³ã§è©³çްããã«ãããã¹ãããŸãã¯AIã®æšè«ã§åŒ·åãããããšããããŸãïŒã |
pageUrl |
ããã | analyzeå¿çããè£æ£ãããŠããããŒãžã®URLã§ãã |
èªç¶èšèªã§AIãšãŒãžã§ã³ãã«æç€ºãåºããŸã â ããããè§£æçµæããçµã¿ç«ãŠãŸã:
Analyze http://localhost:3000 and remediate every issue foundãšãŒãžã§ã³ãã¯ããã³ããã解決ããæ¬¡ã®ãããªãã€ããŒãã§remediateããŒã«ãåŒã³åºããŸãã
{
"issues": [
{
"id": "color-contrast-0",
"rule": "color-contrast",
"elementHtml": "<span style=\"color: #aaa\">Sign up</span>",
"remediation": "Increase the contrast ratio to at least 4.5:1",
"pageUrl": "http://localhost:3000"
},
{
"id": "image-alt-1",
"rule": "image-alt",
"elementHtml": "<img src=\"logo.png\">",
"remediation": "Add alt text describing the image"
}
]
}åºå
ããŒã«ã¯ãååé¡ã«å¯Ÿããçµæã®é
åãè¿ããidã«ãã£ãŠãã®å
¥åã«æ»ãããŸããçµæã¯2ã€ã®åœ¢ç¶ã®ããããã§ãã
- æå â
status: "ok"ã§ãremediationãªããžã§ã¯ãã«ã¯äžè¬çãªèª¬æãè£æ£ã¹ããããããã³å ·äœçãªã³ãŒãä¿®æ£ãå«ãŸããŸã - ãšã©ãŒ â
status: "error"ã§ãè£æ£ã§ããªãã£ãåé¡ã«å¯ŸããŠerrorãªããžã§ã¯ãïŒcodeããã³messageïŒããããŸã
{
"data": [
{
"id": "color-contrast-0",
"status": "ok",
"remediation": {
"general_description": "...",
"remediation": "...",
"code_fix": "<span style=\"color: #595959\">Sign up</span>"
}
},
{
"id": "image-alt-1",
"status": "error",
"error": { "code": "LLM_ERROR", "message": "..." }
}
]
}çµæã¯ç¬ç«ããŠããŸãïŒããåé¡ã§ã®å€±æãä»ã®åé¡ã®ã¬ã€ãã³ã¹ã劚ããããšã¯ãããŸããã
ã¯ã¬ãžãã䜿çšç¶æ³
remediateããŒã«ã¯AIã¯ã¬ãžãã管çã·ã¹ãã ã®äžéšã§ãããããå
ã®ååé¡ãçµç¹ã®æ¯æã®å²ãåœãŠããã¯ã¬ãžãããæ¶è²»ããŸãã管çè
ã¯axeã¢ã«ãŠã³ãããŒã¿ã«ãéããŠã¯ã¬ãžãã䜿çšéãç£èŠã§ããŸãã
igtããŒã«
igtããŒã«ã¯Dequeã®èªåã€ã³ããªãžã§ã³ãã¬ã€ããã¹ãïŒIGTïŒãããªãã®IDEããã®ãŠã§ãããŒãžã«å¯ŸããŠå®è¡ããŸããéåžžãaxe DevToolsãã©ãŠã¶æ¡åŒµæ©èœã¯ããããããŒãæåããã³ãããéããŠIGTãé²ããŸãããigtããŒã«ã¯ãã¹ããèªåçã«å®è¡ããã³ãŒãã£ã³ã°ãšãŒãžã§ã³ããè¡åã§ããæ§é åãããçµæãè¿ããŸãã
仿¥ãããŒã«ã¯ããŒããŒãIGTããµããŒãããŠãããããŒãžäžã®ã€ã³ã¿ã©ã¯ãã£ãèŠçŽ ãããŒããŒãã®ã¿ã§ã¢ã¯ã»ã¹ããã³æäœå¯èœãã©ãããè©äŸ¡ããŸãã
æ©èœ
- èªèšŒ - ãŠãŒã¶ãŒã®è³æ Œæ å ±ãæ€èšŒããŸãâAPIããŒãŸãã¯OAuth 2.0ã¢ã¯ã»ã¹ããŒã¯ã³ã®ããããã§èªèšŒãããã¢ã¯ã»ã¹ã確ä¿ããŸã
- ãã©ãŠã¶ããŒã¹ã®ã©ã³ - åãChromiumã€ã³ã¹ã¿ã³ã¹ã§ãã¹ããå®è¡ããŸããããã«ã¯
analyzeããŒã«ã䜿çšããaxe DevToolsæ¡åŒµæ©èœãããŠã³ããããŠããŸãã - ããŒãžããã²ãŒã·ã§ã³ - AIãšãŒãžã§ã³ããžã®ããã³ããã§ãŠãŒã¶ãŒãæäŸããURLã«ããã²ãŒãããŸã
- èªåããŒããŒãIGT - ããŒãžãã¿ãç§»åããAIãåã¿ãã¹ããããåæãããã©ãŒã«ã¹é åºãšããŒããŒãæäœæ§ãè©äŸ¡ããŸããæåå ¥åã¯å¿ èŠãããŸããã
- çµæã®é ä¿¡ - æ§é åããã調æ»çµæããšãŒãžã§ã³ãã«è¿ããŸã
å©çš
ãã®ããŒã«ã¯ãå®è¡ãã¹ãIGTãæå®ããurlãšigtToolsã®é
åãåãå
¥ããŸããçŸåšãµããŒããããŠããå€ã¯ããŒããŒãIGTã®ã¿ã§ãã
{
"url": "http://localhost:3000",
"igtTools": ["keyboard"]
}AIãšãŒãžã§ã³ããèªç¶èšèªã§ä¿ãããšãŒãžã§ã³ããããªãã®æå³ãããŒã«åŒã³åºãã«ç¿»èš³ããŸãïŒ
Run the keyboard IGT on http://localhost:3000ãã¹ãåã®ãã©ãŠã¶æäœ
analyzeããŒã«ãšåæ§ã«ãigtã¯ããŒãžã®èªã¿èŸŒã¿åŸãå®è¡ããŸãããã¬ã€ãä»ããã¹ããéå§ãããåã«ããšã«ãã£ãŠå®è¡ãããã€ã³ã¿ã©ã¯ã·ã§ã³ã¹ãããã®beforeé
åããªãã·ã§ã³ã§åãå
¥ããŸããããã«ããããã°ã€ã³ãå¿
èŠãªããŒãžã«å¯ŸããŠã¬ã€ãä»ããã¹ããå®è¡ããããã¯ãããŒãããŒãæ¶ããããåçãªã³ã³ãã³ããåºçŸããã®ãåŸ
ã€ããšãã§ããŸãã
ã¹ãããã¯ãã¹ããšåã¹ãã£ã³ãšåããã©ãŠã¶ãŒã³ã³ããã¹ãã§å®è¡ãããããïŒã¯ãããŒãlocalStorageãã«ãŒãã®å€æŽã¯æç¶ããŸãïŒãåãclickãfillãwaitForã¢ã¯ã·ã§ã³ã䜿çšãã20ã¹ãããã®å¶éå
ã§è¡ãããŸããfill.valueã®æ©å¯å€åŠçããã³ã»ã¬ã¯ã¿ãŒèŠåãå«ãå®å
šãªãªãã¡ã¬ã³ã¹ã«ã€ããŠã¯ãanalyzeããŒã«ã®ãµããŒããããŠããã¢ã¯ã·ã§ã³ãåç
§ããŠãã ããã
{
"url": "http://localhost:3000",
"igtTools": ["keyboard"],
"before": [
{ "action": "fill", "selector": "#username", "value": "<resolved-from-.env.local>" },
{ "action": "click", "selector": "button[type=submit]" },
{ "action": "waitFor", "selector": "#main-content" }
]
}åºå
ããŒã«ã¯ãæ§é åãããJSONã¬ã¹ãã³ã¹ãè¿ããŸãïŒ
{
"pageUrl": "http://localhost:3000",
"data": {
"keyboard": {
"issues": [],
"unanalyzedElements": [],
"terminatedReason": "keyboard-trap"
}
}
}issues- å®è¡äžã«çºèŠãããããŒããŒãã¢ã¯ã»ã·ããªãã£ã®éåunanalyzedElements- AIãåæã§ããªãã£ãã¿ãã¹ãããããããã¯issuesãšã¯å¥ã«å ±åãããæåã§ã¬ãã¥ãŒã§ããããã«ããŸããããã«ãã£ãŠåæ ŒãŸãã¯äžåæ ŒãšããŠèª€å ±ãããããšãé²ããŸããterminatedReason- å®è¡ãå šãŠã®ã¿ãã¹ããããåæããåã«äžæããããšãã®ã¿ãæç€ºãããŸããçŸåšã®å€ã¯"keyboard-trap"ã§ããã¹ããæãåºããªãããŒããŒããã©ããã«ééããããšãæå³ããŸããæ®ãã®ã¹ãããã¯äžæããããã®æç¹ãŸã§ã«åæãããã¿ãã¹ããããissuesã§è¿ãããŸãã
ã¯ã¬ãžãã䜿çšç¶æ³
igtããŒã«ã¯AIãæŽ»çšããæ©èœã§ãAIã¯ã¬ãžãã管çã·ã¹ãã ã®äžéšã§ããåå®è¡ã¯è²Žç€Ÿçµç¹ã®ææ¬¡å²åœããAIã¯ã¬ãžãããæ¶è²»ããŸãã管çè
ã¯axeã¢ã«ãŠã³ãããŒã¿ã«ãéããŠã¯ã¬ãžããã®äœ¿çšç¶æ³ãç£èŠã§ããŸãã
AIã¯ã¬ãžãããæ¯æžããå ŽåãigtããŒã«ã¯ã¯ã¬ãžãããå埩ãããŸã§åäœããŸããïŒè¿œå 賌å
¥ãããææ¬¡ãµã€ã¯ã«ãæŽæ°ãããããšã§ïŒããã ããanalyzeããŒã«ã¯åŒãç¶ãæ©èœããŸãã
å§ãã«
axe MCPãµãŒããŒã®ã»ããã¢ããã«ã¯ã3ã€ã®ç¬ç«ããéžæããããŸã:
- ãã£ã¹ããªãã¥ãŒã·ã§ã³ãéžæ â DockerãŸãã¯npm
- èªèšŒãèšå® â APIããŒãŸãã¯OAuth 2.0
- ã¯ã©ã€ã¢ã³ããæ§æ â VS Code with Copilotãã«ãŒãœã«ããŸãã¯Claude Code
ç°å¢å€æ°ãšæšå¥šãããAIãšãŒãžã§ã³ãã®æç€ºã«ã€ããŠã¯æ§æãªãã¡ã¬ã³ã¹ãåç §ããŠãã ãããäžå ·åãçºçããå Žåã¯ãã©ãã«ã·ã¥ãŒãã£ã³ã°ãåç §ããŠãã ããã
ãµã³ãã«ããã³ãã
æåŸ ãããããŒã«ãåŒã³åºãããããšã確èªãã
å€ãã®IDEã§æ¬¡ã®æ§æïŒã#ããã¬ãã£ãã¯ã¹ïŒã䜿çšãããšãaxe MCP ServerããŒã«ãæåŸ éãã«åŒã³åºãããŸã:
#analyze the http://localhost:3033/ web page for accessibility issues and #remediate any violations foundããŒã«ã«ãã¹ãURLã®ã¢ã¯ã»ã·ããªãã£åé¡ãåæãã:
Analyze http://localhost:3000 for accessibility issuesä¿®æ£ã䌎ãåæ:
Analyze https://example.com for accessibility issues and fix any issues foundãã°ã€ã³ã®èåŸã«ããããŒãžãåæããïŒ
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 https://example.com for accessibility issues, but first click the
#cookie-dismiss button to dismiss the cookie consent banner.ã»ãã·ã§ã³ã¯ãããŒãæ³šå ¥ããŠããŒãžãã¹ãã£ã³ããŸãïŒ
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.ãµããŒã
axe MCPãµãŒããŒã«é¢ãã質åãåé¡ããã£ãŒãããã¯ã«ã€ããŠïŒ
- æè¡ãµããŒã: helpdesk@deque.com
- äžè¬çãªãåãåãã: helpdesk@deque.com
- 販売ã«é¢ãã質å: sales@deque.com
ã»ãã¥ãªãã£ãšãã©ã€ãã·ãŒã«é¢ããFAQ
axe MCPãµãŒããŒãæã ã®ãœãŒã¹ã³ãŒãããã£ããã£ãŸãã¯ä¿åããŸããïŒ
ãããã axe MCPãµãŒããŒã¯ãé 眮ãããã³ãŒããããŒã¿ããŒã¹ãŸãã¯æ°žç¶çãªã¹ãã¬ãŒãžã«ã¯ä¿åããŸããã
analyzeããŒã«ãå®è¡ããããšãå¿çã«ã¯ã¢ã¯ã»ã·ããªãã£åé¡ã®èŠçŽ ã®HTMLãœãŒã¹ã³ãŒããå«ãŸããŠããŸããããã¯ãã³ã³ããã¹ããšãããã°ç®çã®ããã§ãããã ãããã®ããŒã¿ã¯ïŒ
- ããªãã®AIãšãŒãžã§ã³ããžã®å³æã®APIå¿çã«ã®ã¿è¿ãã
- Deque管çã®ããŒã¿ããŒã¹ã«ä¿åãããããšã¯ãããŸãã
- ããŒã«ã«ã®éçºç°å¢å ã«ãšã©ãŸããŸã
- åæãå®äºãããšç Žæ£ãããŸã
MCPãã¹ãçµæã¯Deque管çã®ã€ã³ãã©ã¹ãã©ã¯ãã£äžã§ã©ããããã®æéä¿åãããŸããïŒ
ä¿åãããŸããã MCPãã¹ãã®çµæã¯ãDequeã管çããããŒã¿ããŒã¹ãã¹ãã¬ãŒãžã·ã¹ãã ã«ã¯æ°žç¶åãããŸããã
analyzeããŒã«ïŒ
- å®å šã«ããªãã®ãã·ã³äžã§å®è¡ãããŸã â Dockerã³ã³ããå ããŸãã¯npmãã£ã¹ããªãã¥ãŒã·ã§ã³ã䜿çšããããŒã«ã«Node.jsããã»ã¹ãšããŠ
- çµæãçŽæ¥ããªãã®AIãšãŒãžã§ã³ãã«è¿ããŸã
- åæçµæãDequeãµãŒããŒã«éä¿¡ããŸãã
å¯äžã®äŸå€ã¯remediateããŒã«ãåŒã³åºããšãã§ãAIã«ããä¿®æ£ã¬ã€ãã³ã¹ãçæããããã«æå°éã®éåã¡ã¿ããŒã¿ãå«ãå ŽåããããŸãïŒäžèšåç
§ïŒã
ã©ã®ããŒã¿ãDequeãµãŒããŒã«éä¿¡ãããŸããïŒ
remediateããŒã«ã䜿çšããå Žåã®ã¿ïŒ
以äžã®ããŒã¿ããä¿®æ£ã¬ã€ãã³ã¹ãçæããããã«Dequeã®AI修埩ãšã³ããã€ã³ãã«éä¿¡ãããŸãïŒ
- ã«ãŒã«ID - éåããç¹å®ã®ã¢ã¯ã»ã·ããªãã£ã«ãŒã«
- èŠçŽ ã®HTML - 圱é¿ãåããèŠçŽ ã®HTMLããŒã¯ã¢ãã
- åé¡ã®ã¡ã¿ããŒã¿ - axe-coreããã®éåã®èª¬æããã³æ¹åã¬ã€ãã³ã¹
ãã®ããŒã¿ã¯ã修埩ã¬ã€ãã³ã¹ãçæããããã«ã®ã¿äœ¿çšãããDequeããŒã¿ããŒã¹ã«é·æéä¿åãããããšã¯ãããŸããã
analyzeããŒã«ã¯DequeãµãŒããŒã«ããŒã¿ãéä¿¡ããŸããèªèšŒèŠæ±ãè¶
ããŠïŒAPIããŒãŸãã¯OAuth 2.0ã¢ã¯ã»ã¹ããŒã¯ã³ã®èªèšŒïŒ
AIãšãŒãžã§ã³ããæ©èœããããã«ã¯ã©ã®çšåºŠã®ã¢ã¯ã»ã¹ãå¿ èŠã§ããïŒ
AIãšãŒãžã§ã³ãïŒClaudeãCopilotãCursor ãªã©ïŒã«å¿ èŠãªã¢ã¯ã»ã¹æš©ïŒ
-
MCPãµãŒããŒéä¿¡ - ãšãŒãžã§ã³ãã¯ã¢ãã«ã³ã³ããã¹ããããã³ã«ãéããŠMCPãµãŒããŒã®ããŒã«ãåŒã³åºãããšãã§ããªããã°ãªããŸãã
-
ããŒã«å¿çããŒã¿ - ãšãŒãžã§ã³ããåãåãïŒ
analyzeã³ãŒã«ããã®ã¢ã¯ã»ã·ããªãã£éåããŒã¿remediateã³ãŒã«ããã®æ¹åã¬ã€ãã³ã¹- ãã®ããŒã¿ã¯ããšãŒãžã§ã³ããåé¡ãçè§£ããã³ãŒãä¿®æ£ãçæããããã«å¿ èŠã§ã
-
ããªãã®ã³ãŒãããŒã¹ïŒãªãã·ã§ã³ïŒ - ãšãŒãžã§ã³ããã³ãŒãä¿®æ£ãèªåçã«é©çšãããå ŽåããœãŒã¹ã³ãŒããã¡ã€ã«ã«ã¢ã¯ã»ã¹ããå¿ èŠããããŸã
- ããã¯IDEïŒVS CodeãCursor ãªã©ïŒã§ã®AIã³ãŒãã£ã³ã°ã¢ã·ã¹ã¿ã³ãã®æšæºã§ã
- ããŒã«ãåæãšã¬ã€ãã³ã¹ã®ããã ãã«äœ¿çšããå Žåã¯å¿ èŠãããŸããïŒäŸïŒClaudeãã¹ã¯ãããã¢ããªçµç±ïŒ
MCPãµãŒããŒèªäœãå¿ èŠãšããã¢ã¯ã»ã¹ã¯ïŒ
- ããªããæå®ãããã¹ãçšã®URLïŒããŒã«ã«ãšãªã¢ãŒãã®äž¡æ¹ããµããŒãïŒ
- ããªãã®axeã¯ã¬ãã³ã·ã£ã«ïŒaxeã¢ã«ãŠã³ãããŒã¿ã«ã§çæããAPIããŒãã
@deque/axe-authãéããŠååŸããOAuth 2.0ã¢ã¯ã»ã¹ããŒã¯ã³ãç°å¢å€æ°ãéããŠæäŸãããŸãã
éèŠïŒ MCPãµãŒããŒã¯ããªãã®ãã·ã³äžã§ããŒã«ã«ã«åäœããDockerã³ã³ãããŸãã¯npmé åžã§Node.jsããã»ã¹ãšããŠå®è¡ããŸãããã¡ã€ã«ã·ã¹ãã å šäœã®ã¢ã¯ã»ã¹ãé«åºŠãªç¹æš©ã¯å¿ èŠãããŸããã
ãã¹ããã©ã¯ãã£ã¹
- è³æ Œæ
å ±ã®ã»ãã¥ãªã㣠- ããªãã®
AXE_API_KEYãŸãã¯AXE_ACCESS_TOKENãç°å¢å€æ°ãšããŠä¿åããã³ãŒãã«ä¿åããªããOAuth 2.0ã䜿çšããå Žåã@deque/axe-authã¯ããŒã¯ã³ãOSããŒãã§ãŒã³ã«ä¿åããèµ·åæã«æ°ããªã¢ã¯ã»ã¹ããŒã¯ã³ãæ³šå ¥ããŸãããã®ãããé 眮ã«é·æéã®ç§å¯ãæãããå¿ èŠã¯ãããŸããã - ããŒã«ã«ãã¹ã - éçºäžã®ããŒã«ã«ã®URLïŒlocalhostïŒãã¹ããŒãžã³ã°ããã¹ãããŠãæ©å¯æ§ã®ãããã¬ãããã¯ã·ã§ã³ã®ã³ãŒããéé¢ããŸã
- ãããã¯ãŒã¯ã®éé¢ - MCPãµãŒããŒã¯æ¬¡ã«ã®ã¿éä¿¡ããŸãïŒ
- åæãæç€ºçã«èŠæ±ãããURL
- èªèšŒïŒAPIããŒãŸãã¯OAuth 2.0ããŒã¯ã³ã®ç¢ºèªïŒã𿝿£æªçœ®ïŒåŒã³åºãããå ŽåïŒã®ããã®DequeãµãŒããŒ
- MCPãããã³ã«ãä»ããããŒã«ã«AIãšãŒãžã§ã³ã
- é©çšåã®ç¢ºèª - AIçæã®ã³ãŒã倿Žãã³ãããããåã«å¿ ãã¬ãã¥ãŒããŠãã ãã
