From maestro-mcp
Use when evaluating mobile app accessibility compliance, checking WCAG guidelines, or identifying accessibility barriers in UI screenshots and hierarchies.
npx claudepluginhub slapglif/maestro-mcpThis skill uses the workspace's default tool permissions.
Use when evaluating mobile app accessibility compliance, checking WCAG guidelines, or identifying accessibility barriers in UI screenshots and hierarchies.
Generates WCAG 2.2 accessibility audit checklists with pass/fail checks, prioritized issues, and remediation suggestions for UIs, designs, web, mobile, and desktop apps.
Validates WCAG 2.1 compliance for iOS apps through accessibility tree analysis, VoiceOver testing, contrast ratios, and semantic checks.
Audits and remediates Flutter accessibility per WCAG 2.1 levels (A, AA, AAA) across mobile, desktop, web platforms, covering semantics, touch targets, focus, contrast, text scaling, animations.
Share bugs, ideas, or general feedback.
Use when evaluating mobile app accessibility compliance, checking WCAG guidelines, or identifying accessibility barriers in UI screenshots and hierarchies.
Systematically evaluate mobile UI against WCAG 2.1 Level AA standards to identify accessibility violations. Focuses on visual analysis using Claude Vision combined with UI hierarchy data from Maestro to detect contrast issues, insufficient touch targets, missing labels, and readability problems.
Accessibility is not isolated metrics - a component is accessible only in relation to the whole user experience. A button's touch target size matters relative to surrounding elements. Color contrast matters relative to the entire visual hierarchy. Text size matters relative to content importance and reading flow.
Part-to-Whole Analysis:
maestro_hierarchy containing:
min_contrast: 4.5 (WCAG AA for normal text)min_touch_target: 44 (Apple HIG minimum)require_labels: trueStandards:
Process:
Output:
{
"element": "Login button",
"text_color": "#D3D3D3",
"bg_color": "#FFFFFF",
"contrast_ratio": 1.8,
"required": 4.5,
"severity": "critical",
"wcag": "1.4.3"
}
Standards:
Process:
Output:
{
"element": "Close icon",
"bounds": {"width": 24, "height": 24},
"size_points": 24,
"required": 44,
"severity": "critical",
"wcag": "2.5.5",
"recommendation": "Increase tap area to 44x44pt, or add padding"
}
Requirements:
Process:
Output:
{
"element": "Icon button at (320, 64)",
"type": "button",
"has_visual_label": false,
"has_accessibility_label": false,
"severity": "critical",
"wcag": "4.1.2",
"recommendation": "Add accessibilityLabel describing button action"
}
Standards:
Process:
Output:
{
"element": "Description text",
"font_size": 11,
"text_type": "body",
"required_min": 16,
"severity": "warning",
"wcag": "1.4.12",
"recommendation": "Increase body text to 16pt"
}
Requirements:
Process:
Output:
{
"element": "Email input field",
"has_focus_indicator": true,
"focus_contrast": 2.1,
"required": 3.0,
"severity": "warning",
"wcag": "2.4.7"
}
Requirements:
Process:
Output:
{
"screen": "Dashboard",
"has_animations": true,
"respects_reduce_motion": "unknown",
"severity": "info",
"wcag": "2.3.3",
"recommendation": "Verify app respects prefers-reduced-motion"
}
Use Claude's multimodal capability to analyze the screenshot:
Prompt template:
Analyze this mobile app screenshot for accessibility issues. Identify:
1. Text that appears low contrast or hard to read
2. Interactive elements (buttons, links) that appear too small
3. Icon-only buttons without visible labels
4. Text that appears too small for body content
5. Any visual indicators of focus states
For each issue, describe:
- Element location and appearance
- Why it may be problematic
- Suggested fix
Context: This screen is [describe screen purpose from hierarchy].
Parse the UI hierarchy JSON to extract quantitative data:
def analyze_hierarchy(hierarchy, screenshot_path):
violations = []
for element in traverse_hierarchy(hierarchy):
# Touch target size
if element.is_interactive():
width, height = element.bounds.size
if width < 44 or height < 44:
violations.append({
"type": "touch_target",
"element": element.describe(),
"size": (width, height),
"severity": "critical" if min(width, height) < 24 else "warning"
})
# Missing labels
if element.is_interactive() and not element.has_label():
violations.append({
"type": "missing_label",
"element": element.describe(),
"severity": "critical"
})
# Text size
if element.is_text() and element.font_size:
min_size = 16 if element.is_body_text() else 12
if element.font_size < min_size:
violations.append({
"type": "text_size",
"element": element.describe(),
"size": element.font_size,
"severity": "warning"
})
return violations
Use screenshot to sample colors and compute ratios:
def check_contrast(screenshot_path, text_bounds):
img = load_image(screenshot_path)
# Sample text color (center of bounds)
text_color = sample_color(img, text_bounds.center())
# Sample background (corners of bounds, exclude text pixels)
bg_color = sample_background(img, text_bounds)
# Calculate relative luminance
L1 = relative_luminance(text_color)
L2 = relative_luminance(bg_color)
# Contrast ratio
ratio = (max(L1, L2) + 0.05) / (min(L1, L2) + 0.05)
return {
"text_color": text_color,
"bg_color": bg_color,
"contrast": round(ratio, 2),
"passes_aa": ratio >= 4.5,
"passes_aaa": ratio >= 7.0
}
Relate findings to app-wide patterns:
Questions to ask:
| Severity | Criteria | Examples |
|---|---|---|
| Critical | Blocks access for users with disabilities | Touch target < 24pt, missing label on primary action, contrast < 3:1 |
| Warning | Significantly impairs access | Touch target < 44pt, contrast 3:1-4.4:1, text size < 16pt |
| Info | Minor improvement opportunity | Contrast 4.5:1-7:0:1 (passes AA not AAA), 44pt but no spacing |
Return structured JSON report:
{
"screen_id": "screen_001",
"screen_name": "Login Screen",
"timestamp": "2024-12-19T10:30:00Z",
"wcag_score": 72,
"violations": [
{
"id": "a11y_001",
"type": "contrast",
"severity": "critical",
"wcag_criterion": "1.4.3",
"element": {
"description": "Login button text",
"bounds": {"x": 120, "y": 400, "width": 180, "height": 48},
"hierarchy_path": "Screen > Container > Button[0] > Text"
},
"finding": {
"text_color": "#D3D3D3",
"bg_color": "#FFFFFF",
"contrast_ratio": 1.8,
"required": 4.5
},
"recommendation": "Increase text color darkness to #767676 (contrast 4.5:1) or use primary brand color"
},
{
"id": "a11y_002",
"type": "touch_target",
"severity": "warning",
"wcag_criterion": "2.5.5",
"element": {
"description": "Password visibility toggle icon",
"bounds": {"x": 300, "y": 250, "width": 32, "height": 32}
},
"finding": {
"width": 32,
"height": 32,
"required": 44
},
"recommendation": "Increase tap area to 44x44pt by adding transparent padding around icon"
}
],
"passed_checks": [
{
"type": "labels",
"count": 8,
"message": "All interactive elements have accessibility labels"
}
],
"hermeneutic_notes": [
"This login screen follows common patterns seen on previous screens (Home, Settings)",
"Touch target issue is isolated to this screen - other screens use 48pt buttons",
"Contrast issue may be systemic - verify this gray is not part of design system"
]
}
The Visual Inspector agent calls this skill for each screen:
# Visual Inspector loop
- capture_screen: screen_001
- run_skill: /a11y-check
inputs:
screenshot: screen_001.png
hierarchy: screen_001_hierarchy.json
constraints: design_system.accessibility
- record_findings: accessibility
- update_hypotheses:
- "Touch target violations isolated to icon buttons"
- "Body text consistently uses 14pt (below 16pt standard)"
WCAG 2.1 Level AA Criteria:
Platform Guidelines:
Tools for verification:
Apply this skill systematically across all screens to build comprehensive accessibility profile of the application.