dsh-verify
dsh-verify
Agent 自测全过,真实浏览器说出真相。
dsh-verify 是一个轻量、少依赖的验收测试工具,专为 智能体交付的 Web 工件 设计。你编写一份 JSON 规范,描述人类会在浏览器中检查什么;它启动一个真实的 headless Chromium,点击、读取计算样式,并生成一份 HTML 报告外加 0/1 退出码。
它之所以存在,是因为我们曾被坑过——而且我们有证据。
由来(为什么会有它)
我们运行了一个 4 智能体 Web 团队(规范编写者 → 前端开发 → QA → 审查者)。该团队交付了一个带计数器和深色模式切换按钮的演示页面。他们自己的审查报告说:
✅ “所有需求均已满足。未发现问题。”
在真实浏览器中,切换按钮 什么都没做——页面背景从未改变。.dark 类确实由 JavaScript 切换了,但 .dark 的 CSS 规则从未编写。每个智能体自测都通过了,因为页面里没有任何可让智能体运行的东西。没有人打开过真实浏览器。
这就是差距:智能体是根据他们自认为构建的东西来验证,而不是根据用户实际体验来验证。 单元测试和静态检查无法捕获缺失的 CSS 规则。
本仓库并排包含了这个 bug 及其修复——以及区分两者的浏览器驱动证据:
构建 | 智能体的说法 | 真实浏览器的说法 |
| “未发现问题” | ❌ 失败——背景从未改变 |
| 添加了一条 CSS 规则 | ✅ 通过——主题正确切换 |
同样的页面。同样的 JS。缺失一条 CSS 规则。两种不同的裁决。
Related MCP server: Mochi
报告
一份自包含的 HTML 报告——每一步都有通过/失败徽章、选择器和详情,外加截图:

功能
读取 JSON 规范(无需框架、无需配置语言)
托管你的静态目录(或指向任意 URL)
驱动 真实的 headless Chromium(Playwright)
检查人类会检查的内容:文本、类、计算样式、URL、像素
生成一份自包含的 HTML 报告,包含截图和差异图
通过时退出
0,失败时退出1→ 可放入任何 CI为 Claude Code / Cursor / Copilot 提供 MCP 服务器 · AI 起草检查清单 · GitHub Action · DSH 插件
安装
# from npm (CLI)
npm install -g dsh-verify
# as a DeepSeek Harness (DSH) plugin — available in every session of the profile
dsh plugin --profile web add dsh-verify
# or run without installing
npx dsh-verify --help在任何 AI 智能体中使用(MCP)
dsh-verify 附带一个 MCP 服务器,因此 Claude Code、Cursor、Copilot 或任何支持 MCP 的智能体都可以在真实浏览器中验证自己的交付物——无需规范文件:
# register once (Claude Code)
claude mcp add dsh-verify -- npx -y -p dsh-verify dsh-verify-mcp
# or (Cursor / generic MCP client)
# add a stdio server with the command: npx -y -p dsh-verify dsh-verify-mcp然后用普通语言告诉你的智能体:
验证 http://localhost:3000 —— 点击
#dark-toggle,然后检查body的 background-color 是否改变。截图。
智能体会调用 verify_url,并传入一组人类风格的检查项(goto / click / fill / expect_text / expect_class / capture_style / expect_style_changed / expect_url_contains / expect_navigation / expect_console_errors / expect_network_errors / screenshot / expect_screenshot),一个真实的 headless Chromium 会确定性地执行这些检查,然后智能体得到 PASS/FAIL 判定以及一份自包含的 HTML 报告。
MCP 服务器公开的工具:
工具 | 作用 |
| 针对真实 Chromium 运行现有的规范 JSON 文件(或通配符) |
| 针对内联检查列表验证实时 URL——无需文件 |
| AI 根据实时页面 + 你的需求起草检查清单,然后由真实 Chromium 执行 |
| 确认服务器和 Chromium 已就绪 |
没有 LLM 来评判结果——浏览器才是裁判。这正是关键所在。
在 CI 中使用(GitHub Action)
任何工作流中的一个步骤——隔离安装 dsh-verify 和 Chromium(不影响你的项目),运行检查,并将报告作为工件上传:
- uses: 263311487-ux/dsh-verify/.github/actions/dsh-verify@main
with:
spec: demo/fixed.json # spec file or glob
# url: https://staging.example.com # optional override
# out: dsh-verify-out # report output dir (default)本仓库自用该方案:dogfood 工作流 在每次推送时断言修复版构建 通过、缺陷版构建 失败。
视觉回归(像素级截图基线)
修改页面后,让像素告诉你结果——而不是你的眼睛或记忆:
{
"title": "my app",
"serve": "dist",
"steps": [
{ "action": "goto", "path": "/index.html" },
{ "action": "expect_screenshot", "name": "home", "threshold": 0.01 }
]
}首次运行会 创建基线(
out/baselines/home.png)并返回通过。后续运行会逐像素比较真实 Chromium 截图;超过
threshold(默认 1%)的差异会导致构建失败。红色高亮的 差异图 会放入
out/diffs/并嵌入 HTML 报告。预期有变化?刷新基线而不是让它失败:
dsh-verify --spec spec.json --update-baselines。用
"selector"限定区域,用"tolerance"(每通道,默认 10)调整噪声。
Actions:capture_baseline(显式保存基线)、expect_screenshot(与基线比较)。
AI 起草的检查清单(LLM 编写,真实浏览器执行)
不想手写 JSON?dsh-verify gen 会在真实浏览器中了解页面,让 LLM 根据你的需求起草检查清单,然后在真实 Chromium 中执行:
export DEEPSEEK_API_KEY=sk-... # or pass --api-key / --provider openai
dsh-verify gen --url http://localhost:3000 \
--prompt "dark-mode toggle must actually change the background color" \
--rungen: opening http://localhost:3000 in a real browser to learn the page...
gen: page learned (2 buttons, 0 inputs) — drafting checklist...
gen: checklist drafted by deepseek-v4-flash (10 steps) -> dsh-verify.gen.json
gen: executed in real browser -> PASS (10/10)
report: dsh-verify-out/report.htmlAI 只是 起草 检查清单——它从不评判结果。同一个确定性 Chromium 引擎会运行这些步骤,JSON 会写入磁盘,方便你在信任之前进行审查或编辑。
要求 Node >= 18,并安装一个浏览器:npx playwright install chromium。
快速开始
npm install
npx playwright install chromium # one-time browser download
# Run the two demo specs back to back
npm run demo:buggy # → FAIL (exit 1) — missing .dark style caught
npm run demo:fixed # → PASS (exit 0)
# engine self-tests + full CI flow
npm test # node:test suite
npm run ci # tests + fixed PASS + buggy FAIL (as proof of detection)本仓库自己的 CI 正是这样运行的:引擎自测,然后断言修复版构建 通过、缺陷版构建 失败——因此该工具在每次推送时都会自我验证(.github/workflows/ci.yml)。
机器可读输出
node bin/verify.mjs --spec demo/fixed.json --out /tmp/out --json
# {"verdict":"PASS","passed":11,"total":11,"failed":[],"report":"/tmp/out/report.html"}运行多个规范
node bin/verify.mjs --spec 'specs/*.json' --out reports/
# [PASS] specs/home.json (5/5)
# [FAIL] specs/cart.json (4/5)
# ❌ expect_text #total: got "0" want "99"每个规范都会获得自己的 reports/<name>/ 文件夹;仅当 全部 通过时退出码才为 0。
规范格式
顶层字段:title、serve(静态目录)、base(目标 URL)、browser(可选:chromium | firefox | webkit,默认 chromium)、steps。
{
"title": "my app",
"serve": "dist",
"browser": "chromium",
"steps": []
}每次运行可用 --browser firefox 覆盖。
{
"title": "my acceptance check",
"serve": "demo/fixed",
"steps": [
{ "action": "goto", "path": "/index.html" },
{ "action": "click", "selector": "#count-btn", "count": 3 },
{ "action": "expect_text", "selector": "#count-btn", "text": "Clicked: 3" },
{ "action": "capture_style", "selector": "#page", "prop": "backgroundColor", "var": "bg_before" },
{ "action": "click", "selector": "#color-btn" },
{ "action": "expect_class", "selector": "#page", "class": "dark", "present": true },
{ "action": "expect_style_changed", "selector": "#page", "prop": "backgroundColor", "var": "bg_before" },
{ "action": "screenshot", "name": "final-state" }
]
}Actions
操作 | 字段 | 验证内容 |
|
| 导航(若设置了 |
|
| 等待(让 CSS 过渡完成) |
|
| 点击元素,可点击 N 次 |
|
| 填充输入框 |
|
| 可见文本包含/等于目标 |
|
| 类存在(默认)或不存在 |
|
| 将 计算样式 快照到变量中 |
|
| 计算样式与快照不同——这是能捕捉“类切换了但 CSS 从未编写”这一问题的检查 |
|
| 当前 URL 包含目标文本 |
|
| 等待 URL 包含 |
|
| 运行期间无控制台错误(默认期望无错误) |
|
| 无 4xx/5xx 响应或失败的请求(默认期望无错误) |
|
| 将 PNG 保存到报告中 |
|
| 将截图保存为视觉基线 |
|
| 与基线进行像素差异比较;超过 |
capture_style → expect_style_changed 这一对是此项目的核心:它验证用户看到的内容,而不是 DOM 类列表给出的信息。
实况证据
下面两张截图是 dsh-verify 针对同一演示的两个构建输出的真实结果(Chromium,1280×800,点击切换按钮后):
缺陷版构建——点击切换按钮,背景未改变:

修复版构建——点击切换按钮,主题已切换:

Docker(固定 Chromium 版本)
docker build -t dsh-verify .
docker run --rm -v "$PWD:/app" dsh-verify --spec demo/fixed.json --out /app/reports使用 mcr.microsoft.com/playwright:v1.62.1-jammy,因此 Chromium 构建与 Playwright 版本匹配——镜像构建时无需下载浏览器。(已构建并记录;已在本地验证,尚未在 Docker 主机上验证。)
为什么其他方案做不到
在构建之前,我们调研了智能体工具社区。现有的“智能体交付物验证”大多是:
插件/安装冒烟检查——技能是否安装、CLI 是否存在(例如插件发现工具)。
静态 lint / 单元测试——验证智能体编写的代码,而不是用户体验到的行为。
仅截图的智能体——看图片,而不 断言 行为。
它们都不会针对工件运行真实浏览器并回答:“当我点击这个按钮时,用户能看到变化吗?” 这正是 dsh-verify 填补的空白——刻意保持小巧、无框架、输入 JSON 规范、输出浏览器判定。
路线图
expect_console_errors/expect_network_errors— 无控制台错误,无 4xx/失败请求--json用于 CI 日志的判定输出;失败的步骤打印到 stdout多页面流程与
expect_navigation(点击后等待 URL)--specglob (运行多个 spec,一份聚合判定)使用固定版本 Chromium 的 Docker 镜像 (
mcr.microsoft.com/playwright:v1.62.1-jammy)DSH 插件清单 (
dsh plugin add dsh-verify)MCP 服务器 — 从 Claude Code / Cursor / Copilot 进行验证 (
verify_spec/verify_url/generate_and_verify)AI 草拟的检查清单 —
dsh-verify gen(LLM 草拟,确定性浏览器强制执行)GitHub Action — 一步式 CI 验收,带报告工件
视觉回归 — 像素级截图基线 (
capture_baseline/expect_screenshot)多浏览器矩阵 —
--browser/spec.browser: chromium, firefox, webkit (CI 中全部通过)移动端视口
根据自然语言需求生成 AI spec,无需运行中的页面
许可证
MIT
Available Tools
4 toolsgenerate_and_verifyA
AI-drafts an acceptance checklist for a URL (LLM writes it, a real browser executes it), then immediately runs it in real Chromium. Pass requirements as a plain-language description of what a human QA should verify (e.g. "dark-mode toggle changes the background color"). Requires DEEPSEEK_API_KEY or OPENAI_API_KEY in the server environment. Returns the drafted spec path plus the PASS/FAIL verdict, per-step results and report path.
| Name | Required | Description | Default |
|---|---|---|---|
| out | No | Output dir for spec + report (default: ./dsh-verify-out) | |
| url | Yes | Target URL to verify | |
| model | No | LLM model (default: deepseek-v4-flash) | |
| headed | No | Run with a visible browser (debug only) | |
| requirements | No | Plain-language QA requirements (optional) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and uses it well: it reveals that an LLM drafts the spec, that it runs in a real browser (implying actual page interaction), and that API keys are required. It also states the output artifacts. It doesn't mention potential side effects on the target URL, but the 'real browser' clause provides transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, each with a distinct role: core action, user input guidance, prerequisite, and return values. No redundancy or extraneous details; the most important information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description adequately bridges the gap by enumerating the return values: spec path, PASS/FAIL verdict, per-step results, and report path. It also covers prerequisites and usage context, making it complete for the tool's moderate complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description goes beyond by providing an example for the 'requirements' parameter ('dark-mode toggle changes the background color') and tying the 'out' parameter to both spec and report paths, which adds meaning not fully spelled out in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'AI-drafts an acceptance checklist... then immediately runs it in real Chromium', which specifies the verbs (drafts and runs) and resource (acceptance checklist for a URL). This clearly distinguishes it from siblings like verify_spec and verify_url by highlighting the generation step before verification.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit context for use: pass requirements in plain language as QA criteria, and it notes the prerequisite of DEEPSEEK_API_KEY or OPENAI_API_KEY. However, it does not explicitly state when to use this tool instead of verify_spec or verify_url, so it earns a 4 rather than a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
healthA
Check that the dsh-verify MCP server and its Chromium browser are ready to run verifications.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. While it states the purpose, it does not disclose whether the check is read-only, what the result looks like, or what happens if components are not ready. For a health check, this is a notable gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence that is concise and free of filler. It communicates the essential purpose without wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple 0-parameter tool, the description covers the main purpose but omits the expected response or how to interpret the check result. Since there is no output schema, adding a brief note about the return value would make it more complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters, so schema coverage is complete. No parameter documentation is needed, and the baseline of 4 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool checks the readiness of the dsh-verify MCP server and its Chromium browser. The verb 'check' and the specific resource distinguish it from sibling tools that actually run verifications.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies this is a pre-flight check before running verifications ('ready to run verifications'), but it does not explicitly state when to use this tool versus the verification siblings, nor does it provide exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_specA
Run a dsh-verify acceptance spec (JSON file, or glob) against a real headless Chromium. The spec may serve a local static dir (spec.serve) or target any URL (spec.base / step.url). Returns PASS/FAIL with per-step results and a self-contained HTML report path. Exit-code semantics: ok=true means every step passed. This is deterministic — no LLM judges the outcome.
| Name | Required | Description | Default |
|---|---|---|---|
| out | No | Output dir for report.html + screenshots (default: ./dsh-verify-out) | |
| url | No | Optional target URL override (spec.base / step path ignored) | |
| headed | No | Run with a visible browser (debug only) | |
| specPath | Yes | Path to the spec JSON file or glob (e.g. specs/*.json) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden of behavioral disclosure. It explains that the tool is deterministic ('no LLM judges the outcome'), returns PASS/FAIL with per-step results and an HTML report, and defines exit-code semantics. It does not mention side effects like output directory creation or browser dependency, but these are partially inferable from the schema and tool nature.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four concise sentences with no fluff or repetition. It front-loads the core action and packs essential nuance about targets, outputs, and determinism into a compact space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has no output schema, but the description explicitly covers return values (PASS/FAIL with per-step results and HTML report) and exit-code semantics. All four parameters are documented in the schema, and the description adds behavior context. There are no significant gaps for an agent to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the parameters are well-documented in the schema. The description adds modest context by explaining spec structure (spec.serve, spec.base/step.url) and that specPath can be a glob, but it does not materially enhance parameter semantics beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Run a dsh-verify acceptance spec (JSON file, or glob) against a real headless Chromium.' This is a specific verb+resource pairing. It also distinguishes itself from siblings like verify_url by focusing on acceptance specs rather than single URLs, and from generate_and_verify by not mentioning any generation step.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives useful context on when to use the tool, such as the ability to serve a local static dir or target any URL, implying it is for spec-driven verification. However, it does not explicitly state when to use an alternative like verify_url for simple URL checks, so it lacks direct when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_urlA
Verify a live URL against a list of human-style checks, driven by a real headless Chromium. Checks are dsh-verify steps: goto/click/fill/wait/expect_text/expect_class/capture_style/expect_style_changed/expect_url_contains/expect_navigation/expect_console_errors/expect_network_errors/screenshot. If no goto step is given, a goto to the url is prepended. Returns PASS/FAIL with per-step results and a self-contained HTML report path. Deterministic — no LLM judges the outcome.
| Name | Required | Description | Default |
|---|---|---|---|
| out | No | Output dir for report.html + screenshots (default: ./dsh-verify-out) | |
| url | Yes | Target URL to open | |
| checks | Yes | Human-style checks, e.g. [{action:"click",selector:"#dark-toggle"}, {action:"capture_style",selector:"body",prop:"backgroundColor",var:"bg"}, {action:"expect_style_changed",selector:"body",prop:"backgroundColor",var:"bg"}] | |
| headed | No | Run with a visible browser (debug only) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully discloses key behaviors: it uses a real headless Chromium, lists all supported check steps, automatically prepends goto if missing, returns PASS/FAIL with per-step results and an HTML report, and emphasizes deterministic execution (no LLM judging). This goes far beyond a simple 'verify' statement.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences long and extremely information-dense. It front-loads the core purpose and packs the check action list and output semantics into a compact, readable format with no irrelevant details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema, the description clearly explains what the tool returns (PASS/FAIL, per-step results, HTML report path) and how it operates. It could mention potential side effects of click/fill actions or network dependencies, but the given detail is strong for a verification tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema describes all four parameters with 100% coverage, so the baseline is 3. The description adds operational context for the checks parameter (list of actions, prepending goto) and clarifies output behavior, but does not significantly augment the schema beyond that.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Verify') and resource ('a live URL') and elaborates on the method with a detailed list of check actions. It clearly distinguishes itself from siblings (health, verify_spec, generate_and_verify) by focusing on human-style browser-based verification of a live URL.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly implies when to use this tool: when you need to run human-style browser checks against a live URL. It does not explicitly mention alternatives or exclusions, but the context is unambiguous and sufficient for tool selection.
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.
4 tool updates
v0.1.0- First observed
generate_and_verify - First observed
health - First observed
verify_spec - First observed
verify_url
TDQS
Scored across 4 tools
The tools are mostly distinct: health checks readiness, verify_spec runs a spec file/glob, verify_url runs ad-hoc checks on a URL, and generate_and_verify combines AI drafting with execution. There is slight overlap between verify_spec and verify_url, but input types clearly differentiate them.
Naming is mostly snake_case but inconsistent in style: health is a noun, verify_spec and verify_url follow verb_noun, while generate_and_verify is a compound verb phrase. The pattern is still readable but not uniform.
With 4 tools, the server is well-scoped. Each tool serves a distinct purpose in the verification workflow: readiness check, spec execution, live URL verification, and AI-assisted generation, with no redundancy.
The domain of running headless Chromium verifications is well covered: health, spec-based execution, ad-hoc checks, and AI-drafted specs. Minor gaps include no standalone spec generation without execution and no spec management, but these are not critical for the core workflow.
Maintenance
Related MCP Connectors
Browser-based QA for AI-built software. Test pages with real browsers via agents.
MCP server for Mint — AI-powered QA that runs your app in a real browser on every PR.
- mcpOAuthcom.screenshotink
Screenshot, diff, audit and sitemap-capture any web page — 5 MCP tools for AI agents.
Hosted browser for AI agents: screenshots, post-JS DOM, console, WCAG. No install, no API key.
Related MCP Servers
- AlicenseAqualityAmaintenanceCode-aware browser testing agent — reads your codebase, understands functionality, tests every element, reports with screenshots. Works as MCP server for Cursor/Claude Code or standalone CLI.14107 npm5MIT
- AlicenseBqualityCmaintenanceBrowser automation MCP server with persistent memory for AI assistants, enabling automated web testing and workflow replay with self-healing selectors.543MIT
- AlicenseCqualityAmaintenanceAn MCP server that enables AI agents to autonomously test, debug, and analyze web interfaces visually using Playwright, with 30 tools for screenshots, workflows, performance, and visual comparison.3021 npm83ISC
- FlicenseNot gradedqualityDmaintenanceMCP server that enables AI agents to automate browser testing via Chromium, providing tools for navigation, interaction, and inspection.-