Skip to main content
Glama

dsh-verify

ci

263311487-ux/dsh-verify MCP server

Agent 自测全过,真实浏览器说出真相。

dsh-verify 是一个轻量、少依赖的验收测试工具,专为 智能体交付的 Web 工件 设计。你编写一份 JSON 规范,描述人类会在浏览器中检查什么;它启动一个真实的 headless Chromium,点击、读取计算样式,并生成一份 HTML 报告外加 0/1 退出码。

它之所以存在,是因为我们曾被坑过——而且我们有证据。


由来(为什么会有它)

我们运行了一个 4 智能体 Web 团队(规范编写者 → 前端开发 → QA → 审查者)。该团队交付了一个带计数器和深色模式切换按钮的演示页面。他们自己的审查报告说:

✅ “所有需求均已满足。未发现问题。”

在真实浏览器中,切换按钮 什么都没做——页面背景从未改变。.dark 类确实由 JavaScript 切换了,但 .dark 的 CSS 规则从未编写。每个智能体自测都通过了,因为页面里没有任何可让智能体运行的东西。没有人打开过真实浏览器。

这就是差距:智能体是根据他们自认为构建的东西来验证,而不是根据用户实际体验来验证。 单元测试和静态检查无法捕获缺失的 CSS 规则。

本仓库并排包含了这个 bug 及其修复——以及区分两者的浏览器驱动证据:

构建

智能体的说法

真实浏览器的说法

demo/buggy

“未发现问题”

❌ 失败——背景从未改变

demo/fixed

添加了一条 CSS 规则

✅ 通过——主题正确切换

同样的页面。同样的 JS。缺失一条 CSS 规则。两种不同的裁决。

Related MCP server: Mochi

报告

一份自包含的 HTML 报告——每一步都有通过/失败徽章、选择器和详情,外加截图:

dsh-verify report


功能

  • 读取 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 服务器公开的工具:

工具

作用

verify_spec

针对真实 Chromium 运行现有的规范 JSON 文件(或通配符)

verify_url

针对内联检查列表验证实时 URL——无需文件

generate_and_verify

AI 根据实时页面 + 你的需求起草检查清单,然后由真实 Chromium 执行

health

确认服务器和 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" \
  --run
gen: 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.html

AI 只是 起草 检查清单——它从不评判结果。同一个确定性 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

操作

字段

验证内容

goto

path / url

导航(若设置了 serve,则使用托管的目录)

wait

ms

等待(让 CSS 过渡完成)

click

selector, count?

点击元素,可点击 N 次

fill

selector, text

填充输入框

expect_text

selector, text, exact?

可见文本包含/等于目标

expect_class

selector, class, present?

类存在(默认)或不存在

capture_style

selector, prop, var

将 计算样式 快照到变量中

expect_style_changed

selector, prop, var

计算样式与快照不同——这是能捕捉“类切换了但 CSS 从未编写”这一问题的检查

expect_url_contains

text

当前 URL 包含目标文本

expect_navigation

to, timeout?

等待 URL 包含 to(例如点击链接后)

expect_console_errors

present?

运行期间无控制台错误(默认期望无错误)

expect_network_errors

present?

无 4xx/5xx 响应或失败的请求(默认期望无错误)

screenshot

name, full?

将 PNG 保存到报告中

capture_baseline

name, selector?

将截图保存为视觉基线

expect_screenshot

name, threshold?, tolerance?, selector?

与基线进行像素差异比较;超过 threshold(默认 1%)则失败

capture_style → expect_style_changed 这一对是此项目的核心:它验证用户看到的内容,而不是 DOM 类列表给出的信息。

实况证据

下面两张截图是 dsh-verify 针对同一演示的两个构建输出的真实结果(Chromium,1280×800,点击切换按钮后):

缺陷版构建——点击切换按钮,背景未改变: buggy build final state

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

完整的分步报告:缺陷版报告 · 修复版报告。

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)

  • --spec glob (运行多个 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 tools
generate_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.

ParametersJSON Schema
NameRequiredDescriptionDefault
outNoOutput dir for spec + report (default: ./dsh-verify-out)
urlYesTarget URL to verify
modelNoLLM model (default: deepseek-v4-flash)
headedNoRun with a visible browser (debug only)
requirementsNoPlain-language QA requirements (optional)

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
outNoOutput dir for report.html + screenshots (default: ./dsh-verify-out)
urlNoOptional target URL override (spec.base / step path ignored)
headedNoRun with a visible browser (debug only)
specPathYesPath to the spec JSON file or glob (e.g. specs/*.json)

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
outNoOutput dir for report.html + screenshots (default: ./dsh-verify-out)
urlYesTarget URL to open
checksYesHuman-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"}]
headedNoRun with a visible browser (debug only)

TDQS

A4.4/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 4 tool updatesv0.1.0
    • First observedgenerate_and_verify
    • First observedhealth
    • First observedverify_spec
    • First observedverify_url

TDQS

A4/5.0

Scored across 4 tools

Disambiguation4/5

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 Consistency3/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessSlow

Related MCP Connectors

Related MCP Servers