pour

io.github.pourdev由 GitHub 帳號 pourdev 發布v0.3.32更新於 Nov 14, 2026

WCAG 2.2 accessibility audits for agents: findings, focus order and page screenshots.

已驗證STDIO僅桌面瀏覽器自動化開發者工具

概覽

AI 產生的概覽

在無頭 Chrome 中對網頁執行 WCAG 2.2 無障礙稽核、鍵盤焦點順序檢查與模擬視覺截圖,供 AI 助理呼叫。

可以做什麼
  • 依 WCAG 2.2 A/AA(或 WCAG 3.0 草案)稽核網址或本機 HTML 檔案,回傳嚴重程度、成功準則、失敗元素與修正建議
  • 列出按 Tab 鍵的焦點順序,包含可存取名稱、CSS 路徑、正 tabindex 以及被移出可達範圍的原生控制項
  • 擷取頁面 PNG,可為原樣或經過視覺、感官、動作與結構模擬後的畫面
  • 以靜態方式讀取樣板與元件原始碼,依行號與欄號回報問題
適用情境
適合助理在撰寫或審查網頁時,需要具體的無障礙問題、焦點順序證據或模擬視覺截圖,而不是憑猜測回答。適用於前端開發與需要實際渲染頁面的品質檢查。
執行需求
以 npm 套件 pour-cli 在本機執行(需 Node 18+),啟動參數為 mcp;需要已安裝的 Chrome、Chromium 或 Edge,並透過 puppeteer-core 驅動。未宣告帳號、API 金鑰或環境變數;POUR_MCP_ROOT 可改變路徑可存取的目錄範圍。
安裝前請注意
由助理決定抓取哪些網址,因此它讀到的頁面可能影響後續載入目標;僅接受 http 與 https。檔案路徑限於伺服器啟動所在目錄。結果受視窗寬度、捲動狀態與頁面目前狀態影響,只有相同設定下的數字才可比較。需要登入的頁面無法透過此伺服器稽核。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 pour,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

README

pour-cli

Audit any URL against WCAG 2.2 from your terminal, powered by the pour engine: a clean-room WCAG engine written from the W3C specifications, the same engine behind pour.dev.

sh
npm install -g pour-clipour example.com

The page is loaded in headless Chrome, the engine runs against the live DOM, and the findings land on stdout: rule, severity, WCAG success criterion, the exact failing elements as CSS paths, and what to fix. Findings the engine cannot judge conclusively are reported as "needs review" rather than guessed at, and the exit code makes it a CI gate out of the box.

Requirements

Node 18+, and an installed Chrome (or Chromium, or Edge). The CLI drives the browser you already have via puppeteer-core, so installing it never downloads one. Point --browser (or PUPPETEER_EXECUTABLE_PATH) at a binary to use something else.

Usage

pour <url | file.html> [options]        one pagepour report <url | list.csv> [options]  a site, or a list of domains (see below)pour check <files, folders or globs>    files on disk, no browser (see below)pour mcp                                browser tools for an AI agent (see below)pour skill [install]                    teach a coding agent to use pour (see below)
One page  --viewport WxH       viewport (default 1440x900); a bare width implies x900  --scroll             scroll through the page before auditing (lazy content)  --wait <ms>          extra settle delay after load (default 0)  --timeout <ms>       navigation timeout (default 30000)  --exclude <sel>      CSS selector excluded from every rule  --bp                 include best-practice rules alongside WCAG A+AA  --root <dir>         with a local .html file: the folder served as the site                       root, for assets addressed from there (/css/site.css);                       default the file's own folder
Output  --format <what>      terminal (default) | json | markdown (a pull-request                       comment); pour check adds github (annotations on the                       changed lines) and sarif (GitHub code scanning)  --level <detail>     quiet (the totals line) | rules (one line per rule) |                       max (default: everything)  --max-nodes <n>      element details shown per rule (default 5, 0 = all)  --json               the full engine results as JSON  --fail-on <what>     violations (default) | incomplete | none
Screenshots  --filter <name>      screenshot the page through a vision/sensory simulation                       instead of auditing (--filter list shows them all)  --shot [file]        save a PNG (default name from the URL and filter);                       no audit runs  --full               the full page height, not just the viewport
Signed-in sites (pour and pour report)  --login              a browser window opens at the address; sign in there,                       press Enter here, and the run continues signed in.                       The session lives in memory for this run only:                       nothing is written to disk  --basic user:pass    HTTP authentication (a staging site behind a wall),                       the one thing a sign-in window cannot hand over
Browser  --browser <path>     Chrome/Chromium binary to drive  --headful            run the browser with a visible window  --insecure           ignore TLS certificate errors

Exit codes: 0 clean, 1 findings (per --fail-on), 2 error.

A scheme-less URL is tried over https first and falls back to http when the TLS handshake fails, the same way a browser address bar behaves.

Vision simulations

--filter renders the page as someone with a particular vision or sensory condition experiences it and saves the result as a PNG:

sh
pour example.com --filter deuteranopiapour example.com --filter glaucoma --shot tunnel.pngpour --filter list

Color-vision filters use the Brettel/Vienot/Mollon and Machado matrices (via DaltonLens), the same simulations the pour extension ships. Filters and audits are exclusive modes: some simulations restyle the page, so auditing through one would audit the simulation rather than the site.

The numbers depend on the page state

Responsive pages serve different content per breakpoint, and the engine measures what is actually rendered, so the viewport is part of the result: the report header echoes it, and comparing two runs only makes sense at the same width. --scroll walks the page first so lazy-loaded content is in the DOM; that changes the numbers too, by design.

A page on disk

A target that names an .html file is audited as the page it is, in the browser, with every rule that needs layout and paint:

sh
pour index.htmlpour build/about.html --root build   # assets addressed from the site root

The file is served from a loopback port for the length of the audit, so its relative and root-relative assets load the way they will in production. Opening it as a file:// URL instead would leave a stylesheet at /css/site.css unfetched, and the audit would report an unstyled page as if it were the real one, usually as a clean result. --root says which folder is the site root when the page addresses its assets from there rather than from its own folder.

file:// URLs still work if you type one, and carry that caveat with them.

Checking files

pour check reads HTML, JSX, TSX, Vue, Svelte, Angular, Liquid and Nunjucks files and runs the engine's markup rules over them with no browser, the same lane the pour extension for VS Code runs as you type. Every finding comes with its file, line and column.

sh
pour check src/                      # every file the lane can read, under srcpour check "src/**/*.html" --level rulespour check src --format sarif > pour.sarif

Values that come from code (alt={name}), script-built markup and anything a template tag leaves unknowable are left unjudged and counted rather than guessed. Colour contrast, target size, focus and motion need the page in a browser, so those stay with pour <url>. --bp, --fail-on, --level, --max-nodes and --format apply; --no-css skips reading the local stylesheets a page links.

Reports over many pages

pour report crawls a site breadth first from the address given (or audits the home page of every domain in a list file), with a live progress screen in the browser and one standalone HTML report at the end. Ctrl+C stops cleanly; the same command resumes.

sh
pour report yoursite.com --max 200 --report reports/yoursite.htmlpour report https://yoursite.com/help        # /help and the pages under it, nothing abovepour report https://help.yoursite.com/       # help.yoursite.com and below, not www.yoursite.com

An address with a path keeps the crawl under that path; --whole-site follows links above it too. An address on a subdomain keeps the crawl on that subdomain and its own; a start on the main host covers the whole site and its subdomains, and --same-host narrows it to the one host.

  --max <n>            pages (default 100)  --depth <n>          links deep from the start  --same-host          this host only, not its subdomains  --query              keep query strings: /list?page=2 is its own page                       (by default a page is its path, and ?page=2 is not)  --whole-site         follow links above the path given too  --workers <n>        parallel pages (4 for a site, 8 for a list)  --pause <ms>         gap between pages per worker  --load <ms>          time to let a page load (default 10000)  --timeout <ms>       for the whole page (default 20000)  --viewport WxH       as above  --report <file.html> where the finished report goes  --out <dir>          where the run itself lives (default pour-reports)  --port <n>           the progress screen's port  --no-open            do not open the screen, nor the finished report  --fresh              start over instead of resuming  --recheck            retry the pages the site refused last time  --render             write the report from what is on disk, no crawling

--login, --basic and --browser apply as above.

Signed-in sites

Pages behind a login are audited with the session you sign in with:

sh
pour https://app.example.com/dashboard --login   # a browser opens; sign in, press Enterpour report https://app.example.com/ --login     # the same, then the crawl runs signed in

The window is the Chrome you have installed, opened as an ordinary browser, so sign-in providers that refuse automated browsers (Google's "This browser or app may not be secure") accept it; the audit itself keeps using the testing build. The session is read from that window into memory and used for this run only: the site's own cookies and storage, not the sign-in provider's. Nothing is written to disk, so there is no session file to leak; the next run signs in again.

A staging site behind HTTP authentication is the one case a sign-in window cannot cover, since the browser keeps those credentials outside its cookies: --basic user:pass answers the site's challenge. Only the site's: another host's own authentication challenge on the page is declined.

A page that answers with a sign-in form instead of the address asked for is reported as exactly that, never audited as if it were the site. pour mcp has no one to sign in for it, so pages behind a login are audited from the terminal.

CI

yaml
- run: npx pour-cli https://staging.example.com --fail-on violations --level quiet

--level quiet keeps the log to the one totals line; the exit code still carries the verdict. Drop it (or use --level rules) when you want the findings in the CI log too.

Findings can land in the pull request itself. Annotations on the changed lines work on any repository:

yaml
- run: npx pour-cli check src --format github

SARIF goes to GitHub code scanning, which tracks each alert across commits and closes it when the finding goes:

yaml
- run: npx pour-cli check src --format sarif > pour.sarif- uses: github/codeql-action/upload-sarif@v3  with: { sarif_file: pour.sarif }

And --format markdown, on pour <url> or pour check, writes a comment for gh pr comment --body-file.

AI agents

pour mcp serves the same audit, the sequential focus order and the simulation screenshots to an AI agent as tools, over the Model Context Protocol on stdio. Any MCP client can use it; the command is pour with the argument mcp:

sh
claude mcp add pour -- pour mcp
json
{ "mcpServers": { "pour": { "command": "pour", "args": ["mcp"] } } }

In VS Code the pour extension registers the server by itself once pour-cli is installed. The tools:

  • pour_audit: audit a URL. Totals, then each failing rule with its severity, success criteria and up to five elements with the fix (detail and maxNodes change how much comes back), then the rules the engine would not judge without a human.
  • pour_focus_order: the keyboard focus order as Tab visits it, each stop with its accessible name and CSS path, positive tabindex flagged, and the native controls a tabindex of -1 has taken out of reach.
  • pour_screenshot: a PNG of the page, plain or through any of the vision, sensory, motor and structure simulations.

Every tool takes a viewport, a scroll switch and a settle delay, because the numbers depend on the page state.

Each tool takes either a url or a path to a file on disk. A path is served over a loopback port, the same way pour index.html is, so relative assets load; root names the site root when they are addressed from there. A path to a template or a component (.jsx, .vue, .liquid and the rest) is read as source by the static lane instead, and answers with the line and column of every finding, saying plainly that it was not rendered.

A path reaches only inside the directory the server was started in, which POUR_MCP_ROOT can point elsewhere. Started at the filesystem root, with no project to stay inside, the server refuses paths altogether.

The server loads http and https and nothing else. file:// is refused there, though the command still takes it: an agent chooses the addresses it asks for, often from a page it has just read, and the disk is not a web page.

The skill

The tools say what fails; the skill tells an agent what to do about it. It is an Agent Skill, one SKILL.md: check source files first and the rendered page after, note the viewport and scroll state with every figure, fix in the source and audit again, keep the findings that need review apart from the violations, never hide a finding with aria-hidden or an exclusion, and never call a page compliant because a run came back clean.

sh
pour skill install           # .agents/skills/pour/, and .claude/skills/pour/                             # when the project has a .claude folderpour skill install --global  # the same, in your home folderpour skill                   # print it

An install never overwrites a copy that has been edited; --force does.

In Claude Code, the plugin brings the skill and the MCP server together, and runs the server through npx, so nothing else has to be installed:

/plugin install pour --marketplace pourdev/pour-cli

License

MIT

pour is a registered trade mark in the UK, number UK00004432542. The MIT licence covers the code, not the name: forks are welcome under a name of their own.

來源:README.md,提交 d58687f

工具

3

pour_audit

Audit a page with pour

Audit a URL against WCAG 2.2 A and AA (or, with wcag3, the requirements of the WCAG 3.0 draft) with the pour engine in headless Chrome: the page is loaded, the engine runs against the live DOM, and every failing rule comes back with its severity, its success criteria, the failing elements as CSS paths with the fix, and the count of rules the engine would not judge without a human. Works on a running dev server or any URL. Results depend on the page state: the viewport width (responsive pages serve different content per breakpoint), whether the page was scrolled first (lazy content), and what is open on it. Say which you used when you report a figure.

輸入參數urlpathrootwcag3detailscrollwaitMsexcludeinsecuremaxNodesviewporttimeoutMs另有 1 個

pour_focus_order

Trace the focus order

The sequential keyboard focus order of a page, as the Tab key visits it: every reachable control in order with its tag, role, accessible name (the engine's own computation) and CSS path. Controls with a positive tabindex come first and carry the value, since it forces their position. "unreachable" lists native controls a tabindex of -1 has taken out of the keyboard's reach. The same walk as the Focus Order lens in the pour extension. Results depend on the page state: the viewport width (responsive pages serve different content per breakpoint), whether the page was scrolled first (lazy content), and what is open on it. Say which you used when you report a figure.

輸入參數urlpathrootscrollwaitMsinsecureviewporttimeoutMs

pour_screenshot

Screenshot a page, through a simulation

A PNG of the page as loaded, or as seen through one of pour's simulations, the same ones the extension ships. Vision: cataract (Clouded Lens), presbyopia (Near-Vision Loss), lowAcuityMild (Slight Defocus), lowAcuity (Uncorrected Focus), lowAcuityStrong (Significant Defocus), lowAcuityHeavy (Severe Defocus), lowLight (Dim Environment), lowContrast (Reduced Contrast), retinitisRing (Ring Loss), glaucoma (Tunnel Vision), glaucomaLarge (Tunnel Vision (Large)), macularDegeneration (Central Vision Loss), macularDegenerationLarge (Central Vision Loss (Large)), diabeticRetinopathy (Patchy Vision), nystagmus (Involuntary Eye Movement), hemianopiaLeft (Left Field Loss), hemianopiaRight (Right Field Loss), amblyopia (Reduced Acuity (One Eye)), afterimages (Afterimages), ageSlider (Age Slider), scotopicRose (Rose Tint), scotopicYellow (Yellow Tint), scotopicAqua (Aqua Tint), protanopia (Red Absent (Protanopia)), deuteranopia (Green Absent (Deuteranopia)), tritanopia (Blue Absent (Tritanopia)), achromatopsia (Monochromacy), protanomaly (Red Deficiency), deuteranomaly (Green Deficiency), tritanomaly (Blue Deficiency). Sensory, motor and structure: lightSensitivity (Light Sensitivity (Metaphor)), colourHypersensitivity (Colour Hypersensitivity (Metaphor)), motionSensitivity (Motion Sensitivity (Metaphor)), hyperfocusTunnel (Hyperfocus Tunnel (Metaphor)), attentionFragmentation (Attention Fragmentation (Metaphor)), peripheralDistraction (Peripheral Distraction (Metaphor)), detailFixation (Detail Fixation (Metaphor)), processingDelay (Processing Lag (Metaphor)), sensoryInterference (Sensory Interference (Metaphor)), sensorySpike (Sudden Sensory Spike (Metaphor)), dyslexiaVisualStress (Visual Stress (Pattern Glare) (Metaphor)), dyslexiaCrowding (Crowding Effect), dyslexiaTrackingLoss (Tracking Loss (Metaphor)), dyslexiaWashout (Letter Instability (Metaphor)), dyslexiaContrastSensitivity (Contrast Sensitivity), handTremor (Hand Tremor), handTremorStrong (Hand Tremor (Strong)), resting

輸入參數urlpathrootfilterscrollwaitMsfullPageinsecureviewporttimeoutMs

版本歷史

1
  1. v0.3.32最新Nov 14, 2026

評分

已滿足適用檢查項的 90%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通25 分
  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具必需15 分
  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分