Skip to main content
Glama

wcagc-mcp

WCAG-Compliance/wcagc-mcp MCP server

An MCP server that lets an AI assistant (Claude, ChatGPT, or any MCP-compatible client) run real, deterministic accessibility scans through wcagc — axe-core under the hood, not an LLM guess. Every scan result carries an explicit coverage disclaimer and never claims "compliant": automated testing finds only a portion of accessibility barriers, and this tool says so in every response.

This package is a thin, stateless adapter. It holds no database, no scan logic, and no secrets beyond the wcagc API base URL — it translates MCP tool calls into HTTP calls against the wcagc API and forwards the caller's own bearer. All authentication, entitlements, quotas, and scan orchestration live in the API; this code is safe to read end to end.

Two ways to run it

Local (stdio) — for Claude Desktop, Cursor, or any MCP client that spawns a local process:

npx @wcagc/mcp

Configure your MCP client with:

{
  "mcpServers": {
    "wcagc": {
      "command": "npx",
      "args": ["-y", "@wcagc/mcp"],
      "env": {
        "WCAGC_MCP_KEY": "<your mcp:scan API key>"
      }
    }
  }
}

Mint an mcp:scan key from your wcagc account under Settings → API keys — available on every plan, with a daily quota on Free/Starter and unlimited on Pro/Agency.

Hosted (Streamable HTTP + managed OAuth) — what Claude web/desktop/mobile connectors and ChatGPT use, since neither runs a local process for you. Add this remote MCP connector:

https://mcp.wcagc.com/mcp

The client discovers /.well-known/oauth-protected-resource/mcp, opens the wcagc login/consent flow, and binds the connection to one Organization. No key copy/paste is required. API-key bearer authentication remains supported for local stdio and CI.

ChatGPT availability depends on the ChatGPT plan and on whether the client permits action tools; scan_url creates a scan and is not a read-only operation. See wcagc.com/integrations/mcp.

Related MCP server: WCAG Color Contrast MCP Server

Tools

Tool

Plan

What it does

scan_url

all

Scan any public URL, or a registered site for full tracking (Pro+).

check_pdf

all

Run a PDF/UA-1 structure check on a public PDF.

get_scan · get_findings

all

Read a scan_url scan's status, severity counts, and findings — either kind, recorded or one-off.

list_sites

Pro+

List the account's registered sites.

scan_site

Pro+

Crawl and scan every reachable page of a registered site.

get_run · get_run_findings

Pro+

Read a full-site run from scan_site.

get_root_causes

Pro+

Group a run's repeated DOM patterns and return factual element/page blast radius.

run_journey

Pro+

Replay a saved multi-step journey and check each step.

get_trends

Pro+

Read a site's violation-count history over time.

One id, one poll tool: whatever scan_url did with a URL, get_scan and get_findings read it back. get_run and get_run_findings are only for full-site runs from scan_site.

Every scan-producing tool returns the coverage disclaimer in both the text content and the structured content. There is no score, grade, or conformance verdict — automated testing finds roughly 30–57% of accessibility issues, and the remainder needs manual review.

Configuration

Env var

Used by

Meaning

WCAGC_API_BASE_URL

both

The wcagc API to call. Defaults to https://api.wcagc.com; set it only when self-hosting.

WCAGC_MCP_KEY

stdio

Your mcp:scan API key.

PORT

hosted

Port to listen on (default 8080).

WCAGC_MCP_ALLOWED_HOSTS

hosted

Comma-separated Host-header allowlist (DNS-rebinding protection when bound to 0.0.0.0).

WCAGC_MCP_INTROSPECT_TTL_SECONDS

hosted

How long a verified bearer is cached before re-checking with the API (default 60).

WCAGC_MCP_OAUTH_ISSUER

hosted

Expected OAuth issuer (defaults to WCAGC_API_BASE_URL).

WCAGC_MCP_OAUTH_JWKS_URL

hosted

Authorization Server public JWKS URL.

WCAGC_MCP_URL

hosted

Canonical RFC 9728 protected-resource URL (defaults to https://mcp.wcagc.com/mcp).

WCAGC_MCP_JWKS_TTL_SECONDS

hosted

JWKS cache TTL; an unknown kid triggers an immediate refetch.

WCAGC_OPENAI_APPS_CHALLENGE

hosted

OpenAI Plugins Directory domain-verification token; keep it in the deployment secret store, never in source.

Development

npm install
npm run dev        # hosted, watch mode
npm run start:stdio # stdio mode
npm run typecheck
npm run verify      # node:test against a local fixture API

License

MIT — see LICENSE.

Available Tools

16 tools
check_pdfCheck a PDF for PDF/UA-1 conformanceAInspect

Downloads a public PDF URL and runs a machine-verifiable veraPDF PDF/UA-1 check (document structure, tags, reading order — not a full WCAG audit). Free tier, counted against the caller's daily quota. Queues the check and returns immediately with an id; call get_pdf_check to poll.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesA public URL serving a PDF file.

Output Schema

ParametersJSON Schema
NameRequiredDescription
pdfCheckYes
standardYesThe standard the checks were run against, e.g. "WCAG 2.1 AA".
scoringGuidanceYesBinding instruction for the assistant reading this result. Follow it literally.
coverageDisclaimerYesWhy this result is not a compliance verdict. Always relay it; never present a scan as proof of conformance.

TDQS

A4.7/5.0
Behavior5/5

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

The description discloses key non-obvious behaviors beyond the annotations: it downloads a remote URL, consumes free-tier quota, queues the check, and returns immediately with an id instead of a synchronous result. This is exactly the kind of context that helps an agent set expectations and avoid misinterpreting the immediate return.

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

Conciseness5/5

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

The description is three sentences with zero filler. The primary action and scope are front-loaded, followed by quota/cost notes and then the asynchronous behavior plus polling instruction. Every sentence contributes distinct value, and the structure matches the tool's actual workflow.

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 one-parameter tool with an output schema and annotations, the description covers all necessary operational context: URL type, PDF/UA-1 scope, caveat about WCAG, quota counting, async queue behavior, and the follow-up tool to poll. Nothing essential for invoking the tool correctly is missing.

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?

The input schema already fully documents the single parameter, url, with type, format, maxLength, and description. The description only adds 'Downloads a public PDF URL', which mostly repeats the schema's 'A public URL serving a PDF file.' No significant additional parameter meaning is provided, so the baseline score of 3 applies.

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?

The description states a specific verb and resource: 'Downloads a public PDF URL and runs a machine-verifiable veraPDF PDF/UA-1 check'. It also defines the exact scope ('document structure, tags, reading order') and explicitly differentiates from a full WCAG audit, making it easy to distinguish from sibling scanning tools.

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?

The description gives clear context on when to use this tool and what it is not for: 'not a full WCAG audit'. It also names the polling alternative, get_pdf_check, and instructs the agent to call it after queuing. This is explicit workflow routing.

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

get_findingsGet a scan's findingsA
Read-onlyIdempotent
Inspect

The findings for a scan started by scan_url — rule id, severity, help URL and the element selector. Works for both kinds of scan_url scan. A one-off scan returns the top-5 sample; a scan recorded against a registered site returns its full findings. For a full-site run from scan_site, use get_run_findings instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
scanIdYesThe id returned by scan_url.

Output Schema

ParametersJSON Schema
NameRequiredDescription
violationsYes
recordedAgainstSiteYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false. The description adds valuable behavioral context: the differential output based on scan type and the fields included. No contradictions with annotations.

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

Conciseness5/5

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

Three sentences, each adding essential information without redundancy. Front-loaded with key information about the resource and output.

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?

With one parameter, output schema present, and annotations covering safety, the description is complete. It explains both usage scenarios and directs to alternative tool for different inputs.

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?

The only parameter 'scanId' is fully described in the schema (100% coverage). The description mentions 'The id returned by scan_url' which matches the schema description, so no additional value beyond schema.

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?

The description clearly states the verb-resource (get findings) and specifies the outputs: rule id, severity, help URL, and element selector. It distinguishes from sibling tool 'get_run_findings' by noting the input type (scan_url vs scan_site).

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?

Explicitly indicates when to use (both kinds of scan_url scans) and when not to (for full-site runs, use get_run_findings instead). Also explains the difference in output size (top-5 sample vs full findings) based on scan type.

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

get_fixesList tracked fixesA
Read-onlyIdempotent
Inspect

Lists tracked remediation items for a registered site, including status and the scope of any automated verification proof. Pro+ (REMEDIATION_TRACKING).

ParametersJSON Schema
NameRequiredDescriptionDefault
siteHostYesThe registered site's normalized host, as list_sites reports it.

Output Schema

ParametersJSON Schema
NameRequiredDescription
fixesYes
standardYesThe standard the checks were run against, e.g. "WCAG 2.1 AA".
scoringGuidanceYesBinding instruction for the assistant reading this result. Follow it literally.
coverageDisclaimerYesWhy this result is not a compliance verdict. Always relay it; never present a scan as proof of conformance.

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, indicating a safe read operation. The description adds that the tool returns 'status and the scope of any automated verification proof', which is output-oriented rather than behavioral. No additional behavioral traits (e.g., rate limits, side effects) are disclosed beyond annotations.

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

Conciseness5/5

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

The description consists of two concise sentences. The first sentence clearly states the purpose and includes output details. The second mentions the required feature gate. No extraneous information; front-loaded with the action verb.

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

Completeness4/5

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

Given the tool has a single parameter, no enums, and an output schema exists, the description adequately covers the purpose and output content. It mentions the required Pro+ feature. It might miss details like pagination or ordering, but these are likely covered by the output schema. Overall, it is sufficiently complete for a list tool.

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

Parameters4/5

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

The schema describes the single required parameter 'siteHost' as 'The registered site's normalized host'. The description adds value by specifying 'as list_sites reports it', which clarifies the expected format and ties it to another tool's output. This reduces ambiguity beyond the schema alone.

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?

The description clearly states 'Lists tracked remediation items for a registered site', specifying the verb (list), resource (remediation items), and scope (per site). It distinguishes itself from siblings like verify_fix by focusing on listing, not verification. The inclusion of output details (status, verification proof scope) adds clarity.

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

Usage Guidelines3/5

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

The description implies usage for listing fixes but lacks explicit guidance on when to use this tool over related siblings (e.g., get_fix_verification, verify_fix). The mention of 'Pro+ (REMEDIATION_TRACKING)' hints at subscription requirements but does not provide when-not-to-use or exclusion criteria.

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

get_fix_verificationGet fix verificationB
Read-onlyIdempotent
Inspect

Polls a targeted fix verification and reports only what was detected on the selected pages checked. Pro+.

ParametersJSON Schema
NameRequiredDescriptionDefault
fixVerificationIdYesThe id returned by verify_fix.

Output Schema

ParametersJSON Schema
NameRequiredDescription
standardYesThe standard the checks were run against, e.g. "WCAG 2.1 AA".
verificationYes
scoringGuidanceYesBinding instruction for the assistant reading this result. Follow it literally.
coverageDisclaimerYesWhy this result is not a compliance verdict. Always relay it; never present a scan as proof of conformance.

TDQS

B3.1/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint. The description adds polling behavior and scoped reporting ('only what was detected on selected pages'), which provides useful context beyond annotations. However, it does not elaborate on return format or potential edge cases.

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

Conciseness3/5

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

The description is very short (two sentences), but the 'Pro+' fragment is incomplete and potentially confusing. It is efficient but lacks clarity in the second part.

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

Completeness3/5

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

Given the tool's simplicity (1 param, annotations, output schema exists), the description is adequate but not thorough. It conveys the core purpose but misses details like expected response or prerequisites (already partly in schema).

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 coverage is 100% and the schema's description for fixVerificationId is already clear ('The id returned by verify_fix'). The description adds no further parameter meaning, so baseline 3 is appropriate.

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

Purpose4/5

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

The description clearly indicates the tool polls a fix verification and reports detected issues. The verb 'polls' and resource 'fix verification' are specific. It distinguishes from sibling tools like verify_fix (which initiates verification) and get_fixes (which lists all fixes), though not explicitly.

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

Usage Guidelines2/5

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

The description implies usage after calling verify_fix (since it requires a fixVerificationId from that tool), but it provides no explicit guidance on when to use or when not to use, and no alternatives are mentioned.

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

get_journey_runGet a journey run by idA
Read-onlyIdempotent
Inspect

Polls a run started by run_journey — per-step checkpoints and, once terminal, a failure reason if a step failed. Pro+.

ParametersJSON Schema
NameRequiredDescriptionDefault
runIdYesThe id returned by run_journey.

Output Schema

ParametersJSON Schema
NameRequiredDescription
runYes
standardYesThe standard the checks were run against, e.g. "WCAG 2.1 AA".
scoringGuidanceYesBinding instruction for the assistant reading this result. Follow it literally.
coverageDisclaimerYesWhy this result is not a compliance verdict. Always relay it; never present a scan as proof of conformance.

TDQS

A4.2/5.0
Behavior4/5

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

Beyond annotations (readOnlyHint, idempotentHint, destructiveHint), the description adds that the tool polls, provides per-step checkpoints, and gives failure reason on terminal state. No contradictions.

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

Conciseness5/5

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

Two sentences, front-loaded with key information, no redundancy. Every sentence adds value.

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

Completeness4/5

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

With full schema coverage and output schema implied, the description sufficiently covers polling behavior and terminal state. Minor gap: no mention of error handling or rate limits, but acceptable for a simple read-only tool.

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 coverage is 100% for the single parameter runId, described as 'The id returned by run_journey.' The description does not add new meaning beyond the schema, so baseline score of 3.

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?

The description clearly states the tool polls a journey run started by run_journey, with per-step checkpoints and failure reason. It differentiates from siblings like get_run by specifying 'journey run' and referencing run_journey.

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

Usage Guidelines4/5

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

The description indicates usage after run_journey and mentions 'Pro+' tier. It does not explicitly state when not to use or list alternatives, but the sibling list provides context.

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

get_pdf_checkGet a PDF check by idA
Read-onlyIdempotent
Inspect

Polls a PDF check started by check_pdf — status, failed-rule and failed-check counts, and a failure reason if it did not complete.

ParametersJSON Schema
NameRequiredDescriptionDefault
checkIdYesThe id returned by check_pdf.

Output Schema

ParametersJSON Schema
NameRequiredDescription
pdfCheckYes
standardYesThe standard the checks were run against, e.g. "WCAG 2.1 AA".
scoringGuidanceYesBinding instruction for the assistant reading this result. Follow it literally.
coverageDisclaimerYesWhy this result is not a compliance verdict. Always relay it; never present a scan as proof of conformance.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already indicate readOnlyHint and idempotentHint. The description adds value by explaining the polling behavior and the specific data returned (status, counts, failure reason), which are not captured in annotations.

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

Conciseness5/5

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

The description is a single sentence that efficiently conveys the tool's purpose and return data. No unnecessary words or repetition.

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?

Given the existence of an output schema (not shown but indicated), the description appropriately mentions key return fields without needing to detail the schema. The single parameter is clearly documented.

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 coverage is 100% with a clear description for checkId. The description does not add significant new meaning beyond the schema, so a baseline score 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?

The description clearly states it polls a PDF check started by check_pdf and returns status, counts, and failure reason. It distinguishes from siblings by specifying the polling nature and the type of data returned.

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

Usage Guidelines3/5

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

The description implies usage after check_pdf but does not explicitly state when to use this tool versus alternatives like get_scan or get_findings. No exclusions or alternative recommendations are provided.

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

get_root_causesGet a scan run's root causesA
Read-onlyIdempotent
Inspect

Returns deterministic repeated DOM patterns and factual blast-radius counts for a full-site run. Grouping does not expand automated-test coverage and may not match the site's real component boundaries. Pro+.

ParametersJSON Schema
NameRequiredDescriptionDefault
runIdYesThe id returned by scan_site.

Output Schema

ParametersJSON Schema
NameRequiredDescription
rootCausesYes

TDQS

A4.4/5.0
Behavior5/5

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

The description adds value beyond annotations by mentioning deterministic behavior and the limitation regarding automated-test coverage and component boundaries. It also notes the Pro+ tier, which is not in annotations.

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

Conciseness5/5

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

The description is three sentences with no wasted words. The first sentence states purpose, the second adds a behavioral caveat, and the third notes the tier. Each sentence serves a clear function.

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

Completeness4/5

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

The tool has one required parameter, an output schema (not shown but present), and clear annotations. The description explains what is returned and gives a key limitation. For a simple read-only tool, this is nearly complete; a missing element would be describing the output structure, but the output schema likely covers that.

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 the parameter 'runId' is already documented as 'The id returned by scan_site.' The description adds no further semantic detail about the parameter beyond what the schema provides, earning a baseline of 3.

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?

The description clearly states the tool returns 'deterministic repeated DOM patterns and factual blast-radius counts' for a 'full-site run', distinguishing it from sibling tools like get_findings or get_run_findings. It also specifies the Pro+ tier, which sets context.

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

Usage Guidelines4/5

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

The description provides implicit guidance by noting the tool is for full-site runs and warns that grouping 'does not expand automated-test coverage and may not match the site's real component boundaries'. However, it does not explicitly list alternatives or when not to use it.

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

get_runGet a full-site scan run by idA
Read-onlyIdempotent
Inspect

Polls a full-site run started by scan_site — page progress, severity counts and, once terminal, a failure reason. Pro+. For a single-page scan from scan_url, use get_scan instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
runIdYesThe id returned by scan_site.

Output Schema

ParametersJSON Schema
NameRequiredDescription
runYes
standardYesThe standard the checks were run against, e.g. "WCAG 2.1 AA".
scoringGuidanceYesBinding instruction for the assistant reading this result. Follow it literally.
coverageDisclaimerYesWhy this result is not a compliance verdict. Always relay it; never present a scan as proof of conformance.

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false. The description adds behavioral context beyond annotations: it is a polling operation (implies repeated calls), provides progress, severity counts, and failure reason. The 'Pro+' hint about access control is additional.

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

Conciseness5/5

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

Two sentences, no wasted words. First sentence defines the tool's core function, second provides a clear alternative. Information is front-loaded.

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?

The description is complete for a simple read-only poll tool with one parameter and an output schema. It explains what the tool does, what it returns, prerequisites (run started by scan_site), and distinguishes from sibling. No gaps.

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

Parameters4/5

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

Schema description coverage is 100% and already states 'The id returned by scan_site.' The tool description reinforces this by mentioning the parameter in context ('Polls a full-site run started by scan_site — ...'). This adds value by linking the parameter to the tool's workflow.

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?

The description clearly states the verb 'polls', the resource 'full-site run started by scan_site', and what it returns (page progress, severity counts, failure reason). It also distinguishes from the sibling tool 'get_scan' by specifying the scope (full-site vs single-page).

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?

The description explicitly says when to use ('after scan_site') and provides an alternative ('For a single-page scan from scan_url, use get_scan instead'). Also mentions 'Pro+' which indicates access tier requirements.

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

get_run_findingsGet a full-site scan run's findingsA
Read-onlyIdempotent
Inspect

Run-level, rule-deduplicated findings for a scan_site run — one entry per rule, with the WCAG success criteria it maps to. Pro+. For a single-page scan from scan_url, use get_findings instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
runIdYesThe id returned by scan_site.

Output Schema

ParametersJSON Schema
NameRequiredDescription
violationsYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, ensuring safe read behavior. Description adds that results are deduplicated per rule and include WCAG mappings, but doesn't contradict annotations.

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

Conciseness5/5

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

Two sentences: first delivers core purpose and details, second provides alternative usage. No unnecessary words, well-structured.

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?

Given the presence of an output schema, description need not detail return format. It specifies scope (full-site scan), deduplication, and WCAG mapping, which is sufficient for the tool's context.

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 coverage is 100% for the single parameter runId, with clear description in schema. Tool description does not add additional parameter semantics beyond what schema provides.

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?

Clearly states it retrieves run-level, rule-deduplicated findings for a scan_site run, including WCAG success criteria mapping. Explicitly distinguishes from sibling 'get_findings' for single-page scans.

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?

Provides explicit alternative usage: 'For a single-page scan from scan_url, use get_findings instead.' Also notes 'Pro+' restriction, setting clear context.

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

get_scanGet a scan by idA
Read-onlyIdempotent
Inspect

Polls a scan started by scan_url — either kind, recorded against a registered site or one-off; this tool finds it either way. Returns severity counts, a finding sample, the coverage disclaimer, and (once terminal) a failure reason if the scan did not complete. For a full-site run from scan_site, use get_run instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
scanIdYesThe id returned by scan_url.

Output Schema

ParametersJSON Schema
NameRequiredDescription
scanYes
pollWithYesThe tool that reads this scan's progress and result.
standardYesThe standard the checks were run against, e.g. "WCAG 2.1 AA".
scoringGuidanceYesBinding instruction for the assistant reading this result. Follow it literally.
coverageDisclaimerYesWhy this result is not a compliance verdict. Always relay it; never present a scan as proof of conformance.
recordedAgainstSiteYesTrue when the URL belongs to a registered site and the scan was kept against it (so it feeds history and trends); false for a one-off scan.

TDQS

A4.6/5.0
Behavior4/5

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

Description adds beyond annotations by detailing return values (severity counts, finding sample, coverage disclaimer, failure reason) and clarifying it is a polling operation. No contradiction with annotations.

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

Conciseness5/5

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

Two sentences, no wasted words. Purpose and key details are front-loaded. Every sentence adds value.

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

Completeness4/5

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

Given output schema exists, description sufficiently summarizes return values and covers both scan types. A bit more detail on polling behavior could be added, but it's adequate.

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

Parameters4/5

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

The single parameter scanId is well-described in both schema and description; description adds context that it is the id from scan_url. Schema coverage is 100%, so minor extra value justifies above baseline.

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?

The description clearly states the tool polls a scan started by scan_url, works for registered or one-off scans, and distinguishes from sibling get_run for full-site runs.

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?

Explicitly says when to use (after scan_url) and when not (instead use get_run for full-site runs). Also mentions it works for either kind of scan.

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

list_sitesList registered sitesA
Read-onlyIdempotent
Inspect

Lists this organization's registered sites — their normalized hosts are what every other Pro+ tool takes as siteHost. Pro+ (requires sites:read + API_ACCESS).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
sitesYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare non-destructive, read-only, idempotent nature. Description adds permission requirements (sites:read + API_ACCESS), which is useful behavioral context beyond annotations. No contradictions.

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

Conciseness5/5

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

Two concise sentences with front-loaded action. Every word adds value, no redundancy.

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 zero-parameter tool with annotations and output schema, description covers permission needs and output purpose. Complete and self-sufficient.

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

Parameters4/5

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

No parameters exist, so description does not need to add parameter meaning. Baseline 4 applies as no parameter information is missing.

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?

Clearly states it lists registered sites and explains the significance of normalized hosts. Distinguishes from sibling tools like scan_url or get_scan which focus on scanning rather than listing.

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

Usage Guidelines4/5

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

Implies usage to obtain site hosts for other Pro+ tools, but does not explicitly provide when-not-to-use or alternative options. Still clear enough given no competing list tools among siblings.

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

run_journeyRun a saved user journeyA
Destructive
Inspect

Replays a saved multi-step journey (e.g. "add to cart -> checkout") against its registered site and checkpoints accessibility at each step. Pro+ (JOURNEYS; also AUTHENTICATED_SCANS when the journey logs in). Steps and any login credential always come from the journey's own saved configuration — never accepted here. Saved click or fill steps can submit forms or trigger external actions, so run only a journey the user has reviewed. Queues the run and returns immediately with a runId — call get_journey_run to poll.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteHostYesThe registered site's normalized host, as list_sites reports it.
journeyNameYesThe saved journey's name, as configured in the app.

Output Schema

ParametersJSON Schema
NameRequiredDescription
runYes
standardYesThe standard the checks were run against, e.g. "WCAG 2.1 AA".
scoringGuidanceYesBinding instruction for the assistant reading this result. Follow it literally.
coverageDisclaimerYesWhy this result is not a compliance verdict. Always relay it; never present a scan as proof of conformance.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations include destructiveHint=true and openWorldHint=true. The description reinforces this by warning that saved steps can submit forms or trigger actions, and explains the async nature (queues and returns immediately). No contradictions with annotations.

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

Conciseness5/5

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

The description is four sentences, front-loaded with the main purpose. Every sentence provides essential information: purpose, licensing, risk warning, and async polling. No filler or redundancy.

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

Completeness4/5

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

The description covers purpose, side effects, async behavior, and polling. With an output schema presumed to describe the return format, it adequately informs the agent. Lacks details on error scenarios but remains largely complete.

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

Parameters4/5

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

Schema coverage is 100% with clear descriptions of siteHost and journeyName. The description adds value by clarifying that steps and credentials come from saved config and are not accepted as parameters, enhancing understanding beyond schema.

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?

The description clearly states the tool replays a saved multi-step journey and checks accessibility at each step. It distinguishes from siblings like scan_url and get_journey_run by emphasizing saved journeys and polling mechanism.

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

Usage Guidelines4/5

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

The description provides clear context: it warns about destructive side effects from saved steps, mentions license requirements (Pro+), and directs to poll get_journey_run. It implicitly contrasts with scanning tools but does not explicitly list alternatives.

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

scan_siteStart a full-site scanAInspect

Crawls and scans every reachable page of a registered site. Pro+ (SCAN_FULL_SITE). Queues the run and returns immediately with a runId — call get_run to poll. Call list_sites first if you do not already know the exact registered host.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteHostYesThe registered site's normalized host, exactly as list_sites reports it — host only, no scheme and no path.

Output Schema

ParametersJSON Schema
NameRequiredDescription
runYes
standardYesThe standard the checks were run against, e.g. "WCAG 2.1 AA".
scoringGuidanceYesBinding instruction for the assistant reading this result. Follow it literally.
coverageDisclaimerYesWhy this result is not a compliance verdict. Always relay it; never present a scan as proof of conformance.

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already indicate the operation is not read-only, is not idempotent, and is not destructive. The description adds valuable behavioral context by disclosing that the tool 'queues the run and returns immediately with a runId,' implying asynchronous execution rather than synchronous completion. This goes beyond the annotations to explain what the agent should actually expect. It does not cover failure modes or then-разрешения, but the queuing behavior is the most important non-obvious trait.

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

Conciseness5/5

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

The description is three sentences with no filler. The core action is first, the asynchronous behavior and polling instruction follow, and the prerequisite condition is last. Every sentence carries functional information and nothing is repeated from the schema or annotations unnecessarily.

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

Completeness4/5

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

For a tool that starts an async job, the description covers the essential flow: initiate, obtain runId, poll with get_run, and precondition (list_sites). It also mentions the Pro+ (SCAN_FULL_SITE) requirement, providing permission context. It could be more complete by stating what happens if the siteHost is invalid or whether scans can be canceled, but those are secondary for a first invocation. Given the lack of an output schema, the runId and polling instructions sufficiently complete the mental model.

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

Parameters4/5

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

The schema description for siteHost is already detailed: it specifies the normalized host, exactly as list_sites reports it, with no scheme or path. The tool description reinforces this by pointing to list_sites as the source for a correct value, which helps the agent avoid constructing the host incorrectly. With 100% schema coverage, the baseline is 3; the explicit list_sites reference adds real guidance on how to obtain the parameter value, pushing it to 4.

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?

The description states a specific verb ('crawls and scans') and a specific resource ('every reachable page of a registered site'). It immediately conveys the action and scope, and the mention of 'every reachable page' distinguishes it from any more targeted scan tool. Though no sibling tools are listed, the purpose is unambiguous on its own.

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?

The description provides explicit sequencing: 'Call list_sites first if you do not already know the exact registered host,' and 'call get_run to poll' after the run is queued. This tells the agent when to use this tool versus its companion tools and clarifies the expected workflow. No ambiguous or missing guidance exists for the primary use case.

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

scan_urlScan a URLAInspect

Scans one http(s) URL for accessibility problems with axe-core — deterministic checks, not a language model's opinion. Pass the URL and nothing else. If it belongs to a site registered in the caller's account (and their plan allows), the scan is recorded against that site so it feeds history and trends; otherwise it runs as a one-off. Either way, poll it with get_scan. Returns immediately with an id — never a compliance score, because automated testing finds only a portion of accessibility barriers; see coverageDisclaimer in the result.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesThe http(s) URL to scan.

Output Schema

ParametersJSON Schema
NameRequiredDescription
scanYes
pollWithYesThe tool that reads this scan's progress and result.
standardYesThe standard the checks were run against, e.g. "WCAG 2.1 AA".
scoringGuidanceYesBinding instruction for the assistant reading this result. Follow it literally.
coverageDisclaimerYesWhy this result is not a compliance verdict. Always relay it; never present a scan as proof of conformance.
recordedAgainstSiteYesTrue when the URL belongs to a registered site and the scan was kept against it (so it feeds history and trends); false for a one-off scan.

TDQS

A4.5/5.0
Behavior5/5

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

The description goes well beyond the annotations by disclosing that scans are deterministic, may be recorded against a site depending on account registration and plan, return an id immediately, never return a compliance score, and include a coverageDisclaimer. These details meaningfully shape caller expectations.

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

Conciseness5/5

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

The description is well-structured and front-loaded with the core action, followed by concise behavioral notes. Every sentence adds useful information without redundancy or filler.

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 single-parameter tool with an output schema and annotations, the description covers key runtime behavior: asynchronous id-based polling, site association conditions, result caveats, and the coverage disclaimer. An agent has enough context to invoke it correctly and interpret the immediate response.

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%, and the single url parameter is already documented as 'The http(s) URL to scan.' The description reinforces the http(s) constraint and that no other arguments should be passed, but it does not add substantial meaning beyond the schema.

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: 'Scans one http(s) URL for accessibility problems with axe-core.' It also differentiates from siblings by emphasizing a single URL and deterministic checks rather than a language model's opinion, making it easy to distinguish from scan_site and other tools.

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

Usage Guidelines4/5

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

Provides clear usage context: 'Pass the URL and nothing else,' explains the registered-site versus one-off behavior, and directs the caller to poll with get_scan. It does not explicitly name alternatives or exclusion cases, but the single-URL framing strongly implies when this tool is appropriate.

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

verify_fixVerify a tracked fixAInspect

Queues a targeted automated re-check of representative pages for one tracked fix. This is not a full-site re-scan or a compliance guarantee. Pro+.

ParametersJSON Schema
NameRequiredDescriptionDefault
remediationItemIdYesA fix id returned by get_fixes.

Output Schema

ParametersJSON Schema
NameRequiredDescription
pollWithYes
standardYesThe standard the checks were run against, e.g. "WCAG 2.1 AA".
verificationYes
scoringGuidanceYesBinding instruction for the assistant reading this result. Follow it literally.
coverageDisclaimerYesWhy this result is not a compliance verdict. Always relay it; never present a scan as proof of conformance.

TDQS

A4.2/5.0
Behavior4/5

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

The description adds meaningful behavioral context beyond the annotations: it reveals the action is queued rather than synchronous, scopes the check to 'representative pages', and notes the 'Pro+' entitlement requirement. This is consistent with idempotentHint=false and readOnlyHint=false; no contradiction exists.

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

Conciseness5/5

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

The description is two focused sentences with no filler. The primary action and scope are front-loaded, and the caveats are cleanly separated at the end.

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

Completeness4/5

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

For a simple one-parameter tool with an output schema, the description is largely complete: it communicates async behavior, scope, limitations, and entitlement. The only notable gap is that it does not suggest using the sibling get_fix_verification to check the queued verification outcome, which would be helpful for a queued action.

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?

The input schema already covers the single parameter with 100% coverage, including the description 'A fix id returned by get_fixes.' The tool description's phrase 'one tracked fix' does not add materially new meaning beyond what the schema already conveys.

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?

The description uses a specific verb ('Queues'), a clear resource ('one tracked fix'), and a specific method ('targeted automated re-check of representative pages'). It also distinguishes itself from a full-site re-scan and from compliance guarantees, so an agent can tell it apart from broader scanning tools.

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

Usage Guidelines4/5

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

It gives an explicit invocation context: use this when you want a targeted automated re-check for one tracked fix. It also provides clear negative boundaries ('not a full-site re-scan or a compliance guarantee'), though it does not explicitly name sibling alternatives such as get_fix_verification for retrieving verification results.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 3 tool updatesv0.1.4
    • Addedget_fix_verification
    • Addedget_fixes
    • Addedverify_fix
  2. 1 tool updatev0.1.3
    • Addedget_root_causes
  3. 12 tool updatesv0.1.2
    • Addedcheck_pdf
    • Addedget_findings
    • Changedget_journey_run2 fields changed
      • addedInput schema / properties / runId / description
        Added value: +"The id returned by run_journey."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "coverageDisclaimer": {
        +      "description": "Why this result is not a compliance verdict. Always relay it; never present a scan as proof of conformance.",
        +      "type": "string"
        +    },
        +    "run": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "checkpoints": {
        +          "items": {
        +            "additionalProperties": false,
        +            "properties": {
        +              "label": {
        +                "type": "string"
        +              },
        +              "scanId": {
        +                "type": "string"
        +              },
        +              "status": {
        +                "type": "string"
        +              },
        +              "url": {
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "scanId",
        +              "label",
        +              "url",
        +              "status"
        +            ],
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "createdAt": {
        +          "type": "string"
        +        },
        +        "failedStepIndex": {
        +          "type": [
        +            "number",
        +            "null"
        +          ]
        +        },
        +        "failureReasonCode": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "failureReasonText": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "finishedAt": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "id": {
        +          "type": "string"
        +        },
        +        "journeyId": {
        +          "type": "string"
        +        },
        +        "siteId": {
        +          "type": "string"
        +        },
        +        "startedAt": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "status": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "id",
        +        "journeyId",
        +        "siteId",
        +        "status",
        +        "checkpoints",
        +        "createdAt"
        +      ],
        +      "type": "object"
        +    },
        +    "scoringGuidance": {
        +      "description": "Binding instruction for the assistant reading this result. Follow it literally.",
        +      "type": "string"
        +    },
        +    "standard": {
        +      "description": "The standard the checks were run against, e.g. \"WCAG 2.1 AA\".",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "run",
        +    "coverageDisclaimer",
        +    "scoringGuidance",
        +    "standard"
        +  ],
        +  "type": "object"
        +}
    • Addedget_pdf_check
    • Changedget_run2 fields changed
      • addedInput schema / properties / runId / description
        Added value: +"The id returned by scan_site."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "coverageDisclaimer": {
        +      "description": "Why this result is not a compliance verdict. Always relay it; never present a scan as proof of conformance.",
        +      "type": "string"
        +    },
        +    "run": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "counts": {
        +          "anyOf": [
        +            {
        +              "additionalProperties": false,
        +              "properties": {
        +                "critical": {
        +                  "type": "number"
        +                },
        +                "minor": {
        +                  "type": "number"
        +                },
        +                "moderate": {
        +                  "type": "number"
        +                },
        +                "serious": {
        +                  "type": "number"
        +                }
        +              },
        +              "required": [
        +                "critical",
        +                "serious",
        +                "moderate",
        +                "minor"
        +              ],
        +              "type": "object"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ]
        +        },
        +        "failureReason": {
        +          "anyOf": [
        +            {
        +              "additionalProperties": false,
        +              "properties": {
        +                "code": {
        +                  "type": "string"
        +                },
        +                "reason": {
        +                  "type": [
        +                    "string",
        +                    "null"
        +                  ]
        +                }
        +              },
        +              "required": [
        +                "code"
        +              ],
        +              "type": "object"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ]
        +        },
        +        "id": {
        +          "type": "string"
        +        },
        +        "pagesDone": {
        +          "type": [
        +            "number",
        +            "null"
        +          ]
        +        },
        +        "pagesTotal": {
        +          "type": [
        +            "number",
        +            "null"
        +          ]
        +        },
        +        "siteId": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "status": {
        +          "type": "string"
        +        },
        +        "totalViolations": {
        +          "type": [
        +            "number",
        +            "null"
        +          ]
        +        }
        +      },
        +      "required": [
        +        "id",
        +        "status"
        +      ],
        +      "type": "object"
        +    },
        +    "scoringGuidance": {
        +      "description": "Binding instruction for the assistant reading this result. Follow it literally.",
        +      "type": "string"
        +    },
        +    "standard": {
        +      "description": "The standard the checks were run against, e.g. \"WCAG 2.1 AA\".",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "run",
        +    "coverageDisclaimer",
        +    "scoringGuidance",
        +    "standard"
        +  ],
        +  "type": "object"
        +}
    • Changedget_run_findings2 fields changed
      • addedInput schema / properties / runId / description
        Added value: +"The id returned by scan_site."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "violations": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "failureSummary": {
        +            "type": "string"
        +          },
        +          "helpUrl": {
        +            "type": "string"
        +          },
        +          "htmlSnippet": {
        +            "type": "string"
        +          },
        +          "impact": {
        +            "type": "string"
        +          },
        +          "ruleId": {
        +            "type": "string"
        +          },
        +          "target": {
        +            "type": "string"
        +          },
        +          "url": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "wcagSc": {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          }
        +        },
        +        "required": [
        +          "ruleId",
        +          "impact",
        +          "wcagSc",
        +          "helpUrl",
        +          "target",
        +          "htmlSnippet",
        +          "failureSummary"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "violations"
        +  ],
        +  "type": "object"
        +}
    • Addedget_scan
    • Changedget_trends2 fields changed
      • changedInput schema / properties / siteHost / description
        Previous value: -"The registered site's normalized host."New value: +"The registered site's normalized host, as list_sites reports it."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "coverageDisclaimer": {
        +      "description": "Why this result is not a compliance verdict. Always relay it; never present a scan as proof of conformance.",
        +      "type": "string"
        +    },
        +    "scoringGuidance": {
        +      "description": "Binding instruction for the assistant reading this result. Follow it literally.",
        +      "type": "string"
        +    },
        +    "standard": {
        +      "description": "The standard the checks were run against, e.g. \"WCAG 2.1 AA\".",
        +      "type": "string"
        +    },
        +    "trend": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "points": {
        +          "items": {
        +            "additionalProperties": false,
        +            "properties": {
        +              "addedCount": {
        +                "type": [
        +                  "number",
        +                  "null"
        +                ]
        +              },
        +              "bySeverity": {
        +                "additionalProperties": false,
        +                "properties": {
        +                  "critical": {
        +                    "type": "number"
        +                  },
        +                  "minor": {
        +                    "type": "number"
        +                  },
        +                  "moderate": {
        +                    "type": "number"
        +                  },
        +                  "serious": {
        +                    "type": "number"
        +                  }
        +                },
        +                "required": [
        +                  "critical",
        +                  "serious",
        +                  "moderate",
        +                  "minor"
        +                ],
        +                "type": "object"
        +              },
        +              "finishedAt": {
        +                "type": "string"
        +              },
        +              "pagesScanned": {
        +                "type": "number"
        +              },
        +              "resolvedCount": {
        +                "type": [
        +                  "number",
        +                  "null"
        +                ]
        +              },
        +              "scanRunId": {
        +                "type": "string"
        +              },
        +              "status": {
        +                "type": "string"
        +              },
        +              "totalViolations": {
        +                "type": "number"
        +              },
        +              "truncated": {
        +                "type": "boolean"
        +              }
        +            },
        +            "required": [
        +              "scanRunId",
        +              "finishedAt",
        +              "status",
        +              "pagesScanned",
        +              "truncated",
        +              "totalViolations",
        +              "bySeverity"
        +            ],
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "siteId": {
        +          "type": "string"
        +        },
        +        "standard": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        }
        +      },
        +      "required": [
        +        "siteId",
        +        "points"
        +      ],
        +      "type": "object"
        +    }
        +  },
        +  "required": [
        +    "trend",
        +    "coverageDisclaimer",
        +    "scoringGuidance",
        +    "standard"
        +  ],
        +  "type": "object"
        +}
    • Changedlist_sites1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "sites": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "id": {
        +            "type": "string"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "normalizedHost": {
        +            "type": "string"
        +          },
        +          "rootUrl": {
        +            "type": "string"
        +          },
        +          "verified": {
        +            "type": "boolean"
        +          }
        +        },
        +        "required": [
        +          "id",
        +          "name",
        +          "rootUrl",
        +          "normalizedHost",
        +          "verified"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "sites"
        +  ],
        +  "type": "object"
        +}
    • Changedrun_journey2 fields changed
      • changedInput schema / properties / siteHost / description
        Previous value: -"The registered site's normalized host."New value: +"The registered site's normalized host, as list_sites reports it."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "coverageDisclaimer": {
        +      "description": "Why this result is not a compliance verdict. Always relay it; never present a scan as proof of conformance.",
        +      "type": "string"
        +    },
        +    "run": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "checkpoints": {
        +          "items": {
        +            "additionalProperties": false,
        +            "properties": {
        +              "label": {
        +                "type": "string"
        +              },
        +              "scanId": {
        +                "type": "string"
        +              },
        +              "status": {
        +                "type": "string"
        +              },
        +              "url": {
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "scanId",
        +              "label",
        +              "url",
        +              "status"
        +            ],
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "createdAt": {
        +          "type": "string"
        +        },
        +        "failedStepIndex": {
        +          "type": [
        +            "number",
        +            "null"
        +          ]
        +        },
        +        "failureReasonCode": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "failureReasonText": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "finishedAt": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "id": {
        +          "type": "string"
        +        },
        +        "journeyId": {
        +          "type": "string"
        +        },
        +        "siteId": {
        +          "type": "string"
        +        },
        +        "startedAt": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "status": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "id",
        +        "journeyId",
        +        "siteId",
        +        "status",
        +        "checkpoints",
        +        "createdAt"
        +      ],
        +      "type": "object"
        +    },
        +    "scoringGuidance": {
        +      "description": "Binding instruction for the assistant reading this result. Follow it literally.",
        +      "type": "string"
        +    },
        +    "standard": {
        +      "description": "The standard the checks were run against, e.g. \"WCAG 2.1 AA\".",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "run",
        +    "coverageDisclaimer",
        +    "scoringGuidance",
        +    "standard"
        +  ],
        +  "type": "object"
        +}
    • Addedscan_site
    • Addedscan_url
  4. 5 tool updatesv0.1.1
    • Removedcheck_pdf
    • Addedget_run
    • Addedget_run_findings
    • Addedlist_sites
    • Addedrun_journey
  5. 4 tool updatesv0.1.1
    • Addedcheck_pdf
    • Addedget_journey_run
    • Addedget_trends
    • Removedscan_site
  6. 1 tool updatev0.1.0
    • First observedscan_site

TDQS

A3.9/5.0

Scored across 16 tools

Disambiguation4/5

Most tools are clearly scoped to distinct resources and actions: scan_url/scan_site, check_pdf, run_journey, and verify_fix each have their own dedicated polling tool. The many get_* tools could be confused at a glance, but descriptions explicitly cross-reference which poller to use for each job type.

Naming Consistency5/5

All tools follow a consistent lowercase snake_case verb_noun pattern (scan_url, list_sites, get_run_findings, verify_fix). Paired queue/poll tools are predictably named (check_pdf -> get_pdf_check, run_journey -> get_journey_run), making the set easy to navigate.

Tool Count4/5

16 tools is slightly above the ideal 3-15 range but each tool maps to a distinct stage in the scanning pipeline: initiating a job, polling it, retrieving findings, and listing supporting resources. The count feels justified by the breadth of scan types rather than redundant.

Completeness4/5

The surface covers the core lifecycle for URL scans, full-site runs, PDF checks, journeys, trend history, and fix verification. Minor gaps exist — no site registration/update/delete and no cancellation or re-run operations — but these are likely managed outside the MCP and don't block primary workflows.

Maintenance

ActivityActive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Provides comprehensive access to WCAG 2.2 accessibility guidelines, including all 87 success criteria with full Understanding documentation, 400+ techniques, glossary terms, and ACT test rules from official W3C data.
    20
    251 npm
    13
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables accurate WCAG color contrast checking and accessibility analysis by calculating actual contrast ratios between color pairs, checking compliance levels, and analyzing luminance values for web accessibility.
    -
  • A
    license
    Not graded
    quality
    D
    maintenance
    Provides AI agents with web accessibility analysis tools via MCP, enabling checks for alt text, heading hierarchy, color contrast, ARIA validation, and form accessibility.
    30 npm
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables AI assistants to capture screenshots, run visual diffs, accessibility audits, and batch sweep plans for web pages via MCP tools.
    14 npm
    2
    MIT