Skip to main content
Glama

a11y-toolkit: Infinite-scroll audit

a11y_scroll
Read-onlyIdempotent

Audits infinite-scroll and paginated feeds for accessibility: checks focus survival across scroll batches, new-content announcements, and a reachable end or load-more option.

Instructions

Infinite-scroll accessibility audit — the documented disaster nobody automates (Deque guidance + ARIA APG Feed pattern; criteria 2.4.3, 4.1.3, 2.2.2). Real scrolling batches in Chromium with a live-region observer: does the focused element SURVIVE each batch (re-render destroys it — the documented failure)? Is new content ANNOUNCED (aria-live/status receives text, role=feed)? Does the feed END or offer a load-more alternative (footer reachability)? APG feed pattern as positive signal. Honest guard: if no standard items are detected (login walls, non-standard markup) the unfounded signals are skipped with a note. Requires local Playwright. — For paginated feeds only; general page audit is a11y_audit_url/dom. Returns JSON: {mode, url, score, findings [{criterion, severity, signal, issue, remediation}], summary} — same shape as the audits.

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "url": "<url>"
    },
    "name": "a11y_scroll"
  }
}

Input Schema

NameRequiredDescriptionDefault
urlYesFeed URL to audit (best on feeds you own or can authenticate into)
langNoOutput language (default en)
browserNoBrowser engine (auto = detect the first available)
auth_stateNoPath to a Playwright storage_state JSON (exported session) to audit an authenticated feed
max_batchesNoscroll batches (5 default)

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changedv5.27.0
    • addedInput schema / properties / browser
      Added value: +{
      +  "description": "Browser engine (auto = detect the first available)",
      +  "enum": [
      +    "auto",
      +    "chromium",
      +    "firefox",
      +    "webkit",
      +    "chrome",
      +    "msedge"
      +  ],
      +  "type": "string"
      +}
  2. Changed2 schema fields changedv5.14.0
    • addedInput schema / properties / max_batches
      Added value: +{
      +  "description": "scroll batches (5 default)",
      +  "type": "integer"
      +}
    • removedInput schema / properties / max_tandas
      Removed value: -{
      -  "description": "scroll batches (5 default)",
      -  "type": "integer"
      -}
  3. Changed1 schema field changedv5.6.0
    • removedInput schema / browser
      Removed value: -{
      -  "description": "Browser engine (auto = detect the first available)",
      -  "enum": [
      -    "auto",
      -    "chromium",
      -    "firefox",
      -    "webkit",
      -    "chrome",
      -    "msedge"
      -  ],
      -  "type": "string"
      -}
  4. Changed4 schema fields changedv4.0.0
    • addedInput schema / browser
      Added value: +{
      +  "description": "Browser engine (auto = detect the first available)",
      +  "enum": [
      +    "auto",
      +    "chromium",
      +    "firefox",
      +    "webkit",
      +    "chrome",
      +    "msedge"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / auth_state
      Added value: +{
      +  "description": "Path to a Playwright storage_state JSON (exported session) to audit an authenticated feed",
      +  "type": "string"
      +}
    • addedInput schema / properties / lang / description
      Added value: +"Output language (default en)"
    • addedInput schema / properties / url / description
      Added value: +"Feed URL to audit (best on feeds you own or can authenticate into)"
  5. Addedv3.3.0

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/openWorld/idempotent, but the description goes well beyond them: it explains that it drives real scrolling batches in Chromium with a live-region observer, and that unfounded signals are skipped with a note when standard feed items are absent. It also discloses the Playwright dependency and the JSON return shape, which no output schema supplies.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core checks and the sibling routing are front-loaded in the first lines, and the return shape is placed at the end. Some phrasing ('the documented disaster nobody automates') is editorial filler, but the surrounding sentences carry real signal.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 5-parameter browser-driven audit with no output schema, the description covers the checks performed, the guard behavior for unsupported pages, the execution prerequisite, and an inline description of the returned JSON fields. Nothing an agent needs in order to call it correctly is left out.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so url, lang, browser, auth_state, and max_batches are already documented in the schema. The description adds only indirect context ('feeds you own or can authenticate into' implying auth_state), so the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (infinite-scroll accessibility audit) and immediately scopes it: focused-element survival, live-region announcement, and feed termination. It explicitly distinguishes itself from a11y_audit_url/dom for general page audits, so an agent can route without opening another schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit when-to-use ('For paginated feeds only') and names the alternatives for the other case (a11y_audit_url/a11y_audit_dom). It also adds a prerequisite ('Requires local Playwright') and an applicability caveat around login walls and non-standard markup.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.