关于 Lazynext Accessibility Checker
Lazynext Accessibility Checker 扫描渲染后的网页或 HTML,检查 WCAG 无障碍问题,并生成按严重程度加权的评分和可分享报告。开发者和网站团队可通过 API、MCP 工具、SDK 及 CI 扫描使用它。
主要功能
- 01扫描渲染后的 URL 和 HTML
- 02按严重程度加权评分
- 03键盘焦点与对比度检查
- 04网站爬取与每日监控
- 05可分享报告及导出
- 06SDK、命令行与 CI 门禁
适用场景
- 01发布前检查网页
- 02审查整个网站的无障碍情况
- 03按评分阈值门禁 CI 构建
- 04通过报告链接分享问题
MCP 相关
MCP 端点提供 `scan_url`、`scan_html`、`get_report` 和 `list_rules` 工具。MCP 扫描使用与 `/scan` API 相同的配额,并保存为同类报告。
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
https://api.lazynext.com/mcpclaude mcp add --transport http com-lazynext-accessibility-checker https://api.lazynext.com/mcp{"mcpServers":{"com-lazynext-accessibility-checker":{"type":"http","url":"https://api.lazynext.com/mcp"}}}在 Cursor 中打开{"servers":{"com-lazynext-accessibility-checker":{"type":"http","url":"https://api.lazynext.com/mcp"}}}在 VS Code 中打开{"mcpServers":{"com-lazynext-accessibility-checker":{"type":"http","url":"https://api.lazynext.com/mcp"}}}{"mcpServers":{"com-lazynext-accessibility-checker":{"serverUrl":"https://api.lazynext.com/mcp"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
工具
4| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| url | string | 是 | 要扫描的 http(s) URL |
| site | boolean | 否 | 抓取同源页面(免费版 3 个 / Pro 版 10 个) |
| license | string | 否 | Pro 许可证邮箱(可选) |
| viewport | enum | 否 | 渲染配置——移动设备 390×844 手持设备(默认);桌面设备保留移动端之前的基准渲染mobile | desktop |
详细介绍
无障碍检查器
真正的 WCAG 2.1 无障碍审计:粘贴 URL,我们会在真实的 Chromium 中渲染页面,按 Tab 键追踪键盘焦点,根据计算后的样式计算颜色对比度,并返回带评分的报告,附上规则引用,可直接据此创建工单。
在线体验: https://checker.lazynext.com/
API: https://accessibility-checker.dry-hall-6a50.workers.dev
curl -X POST https://accessibility-checker.dry-hall-6a50.workers.dev/scan \
-H 'content-type: application/json' \
-d '{"url": "https://yoursite.com", "license": "[email protected]", "email_report": true}'
# → {"score": 70, "score_model": "weighted-v1", "issues": [{"rule": "wcag-1.3.1", ...}],
# "rendered": true, "benchmark": {"pct": 61, "sites": 128},
# "report": ".../report/<id>"}
评分按严重程度加权:已确认的 WCAG A 级问题按完整权重计分,AA/AAA 级问题的权重逐级降低,警告类启发式检查按一半权重计分,同一规则的重复问题按一半边际成本计分——满是小瑕疵的页面,得分会高于存在几个阻断性问题的页面。
端点:POST /scan(html 或 url;{"url": ..., "site": true} 会抓取同源页面——免费版 3 个 / Pro 版 10 个——并返回每页评分;真实网站扫描还会返回 benchmark——该评分相对于此工具已扫描网站集合的排名,扫描网站达到 ≥10 个后显示),
GET /checkout(从试用版升级为付费版),
POST /cancel(通过购买时使用的邮箱自助取消),
POST /lead(收集邮箱),GET /report/:id(可分享的报告——支持 ?level=A|AA|AAA|BP、?rule=<id>、?by=page 视图;CSV/JSON/PDF 导出遵循这些筛选条件),
GET /badge/:id.svg(可嵌入报告的评分徽章),
GET /rules(覆盖范围清单——涵盖 74 项 WCAG 标准和 1 项最佳实践检查;列出每项检查的名称、级别、WCAG 版本和检测方式;Accept: text/html 返回可浏览的目录,默认返回 JSON),
GET /openapi.json(涵盖整个 REST 接口的 OpenAPI 3.1 契约),
POST /monitor / GET /monitor?license= / DELETE /monitor(Pro 每日监控——平台会重新扫描每个已注册的 URL,并在页面评分下降 ≥ 10 分时发送 Brevo 警报邮件),GET /health。
Agent 接入方式
- MCP —
POST /mcp,JSON-RPC 2.0(initialize、tools/list、tools/call;GET 返回 405,不支持 SSE)。工具:scan_url、scan_html、get_report、list_rules。添加到 MCP 客户端:{"mcpServers": {"a11y": {"url": "https://checker.lazynext.com/mcp"}} - A2A — Agent 卡片位于
GET /.well-known/agent.json;POST /a2a处理message/send(发送包含 URL 或 HTML 的文本部分)、tasks/send(别名)和tasks/get(任务 ID 即持久化报告 ID)。扫描会以已完成任务的形式返回,并附带报告产物。 - Widget —
<script src="https://checker.lazynext.com/widget.js" data-target="#el"></script>可在任意位置挂载 Shadow DOM 扫描框;Pro 用户可选填data-license="[email protected]"。 - 通过 MCP/A2A 执行的扫描共用
/scan免费配额(每天每个 IP 3 次 URL 扫描),并持久保存相同的 30 天报告。
SDK + CLI
import { AccessibilityChecker } from './sdk/js/index.js';
const a11y = new AccessibilityChecker({ license: '[email protected]' }); // license optional
const { score, issues, report } = await a11y.scan({ url: 'https://example.com' });
await a11y.site('https://example.com'); // same-origin crawl
await a11y.report(id); // stored report object (.json export)
await a11y.reportCsv(id); // CSV export
await a11y.rules(); // full coverage manifest
c := checker.New("[email protected]") // license optional
res, err := c.Scan(checker.ScanOptions{URL: "https://example.com"})
rep, _ := c.Report(id) // stored report object (.json export)
rules, _ := c.Rules()
from lazynext_a11y import AccessibilityChecker # sdk/python, stdlib only
c = AccessibilityChecker(license="[email protected]") # license optional
res = c.scan(url="https://example.com")
lazynext-a11y scan https://example.com --site # bin/cli.js in sdk/js
lazynext-a11y rules --pretty
lazynext-a11y report <id> # CSV to stdout (--json for the object)
lazynext-a11y monitor add <url> --license [email protected]
sdk/js—index.js+index.d.ts,零依赖,支持 Node 18+ 和浏览器;bin:入口为lazynext-a11y(安装前可运行node sdk/js/bin/cli.js)sdk/go—checker包,仅使用标准库(go build可顺利完成)sdk/python—lazynext_a11y模块,仅使用标准库(pip install sdk/python)scripts/ci-scan.mjs— CI 门禁:node scripts/ci-scan.mjs --url <u> --fail-under 80
检查内容
- 渲染后的 DOM(通过 Cloudflare Browser Rendering):地标、标题、图片替代文本、表单标签关联(包括标签包裹)、含糊的链接文本、视口缩放锁定
- 计算样式对比度(WCAG 1.4.3 + 1.4.6):基于实际绘制样式进行亮度计算——普通文本 4.5:1 / 大号文本 3:1,另含 7:1 的增强级别
- 其他规则(
src/rules/additional.js):标题内容(2.4.6)、标签名称一致性(2.5.3)、视口最大缩放比例(1.4.4)、文本间距覆盖(1.4.10)、部分内容的语言(3.1.2)、状态消息(4.1.3)、焦点可见性(2.4.7 — 行内 + 样式表轮廓抑制)、定时刷新(2.2.1)、自动播放/移动内容(1.4.2/2.2.2)、自动完成令牌(1.3.5)、焦点时上下文变化(3.2.1)、更改时自动提交(3.2.2)、accesskey / 单字符快捷键(2.1.4)、文字图片(1.4.5)、多种导航机制(2.4.5)、未启用连字符断词的两端对齐文本(1.4.8 — warn-class 启发式)、仅图标控件的可访问名称覆盖率(4.1.2)、动作触发运动(2.5.4)、方向锁定(1.3.4)、不支持通过 Escape 关闭的悬停/焦点内容(1.4.13 — warn-class)以及按下事件导航(2.5.2)。此外还包括此前需要浏览器才能检查的静态覆盖项:重复 ID(4.1.1)、悬空的 label/aria/label-for 引用 + iframe 标题 + 无效的 role/aria-attribute 名称 + 可聚焦的 aria-hidden 元素 + 嵌套交互元素(4.1.2)、多余的列表/dl 项目 + fieldset/optgroup/表格结构 + 已弃用的呈现标记(1.3.1)、没有替代内容的图片输入框/区域/canvas/svg(1.1.1)、没有字幕轨道的媒体(1.2.1)、autofocus(3.2.1)、role/tabindex/可滚动区域的键盘操作缺陷(2.1.1)、javascript:/失效/悬空片段链接(2.4.4)、闪烁内容(2.3.1)、仅依赖感官的说明(1.3.3 — warn-class)、未关联的标签(3.3.2)、长篇内容缺少分节标题(2.4.10 — AAA 建议项)以及未命名的重复地标(1.3.1) - 渲染布局检查:目标尺寸 24×24px(2.5.8 — 豁免行内链接和 UA 控件)、焦点未被作者叠加层遮挡(2.4.11)、可见的焦点指示器(2.4.13)、控件边界的非文本对比度(1.4.11 — 与相邻背景相比为 3:1)、文本间距覆盖导致的裁切(1.4.12 — 注入 WCAG 度量,仅检查差值)以及颜色的使用(1.4.1 — 限定于正文:未加下划线的正文链接与周围文本的对比度必须 ≥3:1;按该准则本身,导航/结构性链接不在检查范围内)
- 键盘:在浏览器中实际按 Tab — 无法通过键盘操作的页面(2.1.1)、焦点陷阱(2.1.2)、焦点顺序缺陷和循环(2.4.3)、对话框的 Escape 处理;静态检查也能捕获粘贴的 HTML 中吞掉 Tab 按键的处理程序和无法关闭的对话框
- Shadow DOM:渲染扫描会将开放的 shadow root 序列化为
<template shadowrootmode>标记,因此标记规则也会检查封装内容;焦点盘点和 Tab 跟踪同样会遍历开放的 root。按设计无法遍历封闭的 root——这是明确的局限。元素规则会忽略<script>内容,因此形似标记的 JS 字符串不会被重复计为真实元素 - 跨页面(
src/rules/crosspage.js,站点扫描):一致的导航(3.2.3)、一致的识别(3.2.4)、一致的帮助机制(3.2.6) - WCAG 2.2 + Section 508:
src/rules/wcag22.js添加 2.2 时代的检查项(可访问的身份验证 3.3.8、冗余输入 3.3.7、拖动 2.5.7,…);src/rules/section508.js将发现的问题映射到 36 CFR 1194 条款 - DOM 事实:iframe 标题、重复 ID、可聚焦的 aria-hidden 元素、autofocus、没有 noopener 的
target=_blank、媒体字幕、表头、跳转链接
定价
- 免费:每个 IP 每天 3 次渲染扫描
- Pro $9/mo:无限扫描 + 电子邮件报告 —
/checkout(Dodo Payments)- 14 天免费试用:预先收取银行卡信息,第 14 天自动转为付费;可随时通过
POST /cancel或网站上的取消链接取消 - 第 11 天通过电子邮件发送试用到期提醒
- 14 天免费试用:预先收取银行卡信息,第 14 天自动转为付费;可随时通过
架构
src/scanner.js— 无依赖的 WCAG 引擎(API 运行的同一模块)src/rules/— additional(每页静态检查)、crosspage(全站扫描检查)、 focuscycle、wcag22、section508 — 均已接入扫描流程src/crawl.js+src/monitor.js— 同源站点爬取(免费版 3 个页面 / Pro 版 10 个页面)和定时重新扫描并发送提醒的监控器worker.js— Cloudflare Worker:扫描 API、速率限制、许可证检查、 可分享的报告、潜在客户收集、试用版结账、自助取消、 通过电子邮件发送 Pro 报告,以及 MCP/A2A/widget/PWA 界面src/openapi.js— 在/openapi.json提供的 OpenAPI 3.1 契约;src/rules_catalog.js—/rules对应的 HTML 覆盖范围目录index.html— Pages 站点(扫描 UI、站点扫描、监控器、试用版 CTA、 取消、电子邮件报告订阅、402 潜在客户转化漏斗、localStorage 扫描历史)action.yml+scripts/ci-scan.mjs— 用于 CI 门禁的 GitHub Action
GitHub Action
根据无障碍评分控制部署:
- uses: Lazynext-AI/accessibility-checker@main
with:
url: https://staging.example.com
fail-under: 80 # fail the build below this score
# license: ${{ secrets.A11Y_LICENSE }} # Pro: higher limits
# site: true # crawl same-origin pages
# fail-on: wcag-1.1.1,wcag-2.1.2 # rules that always fail
输出 score 和 issues;发现的问题会显示在步骤摘要中,并附带报告链接。独立运行:node scripts/ci-scan.mjs --url <u> --fail-under 80。
scripts/—sync-page.mjs重新生成嵌入式 UI 包,deploy.mjs使用完整绑定进行部署(切勿使用wrangler deploy),ci-scan.mjs是 CI/独立命令行工具test/—node --test测试套件(277 项测试),在 CI 中于每次推送时运行
由 Lazynext agents 自主构建和运维。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。