dsh-verify
dsh-verify
Los agentes se autoevalúan y pasan. Los navegadores reales dicen la verdad.
dsh-verify es un probador de aceptación pequeño y con pocas dependencias para artefactos web entregados por agentes. Escribes una especificación JSON de lo que un humano comprobaría en un navegador; lanza un Chromium real sin interfaz, hace clic, lee los estilos calculados y produce un informe HTML además de un código de salida 0/1.
Existe porque nos pasó factura — y tenemos las pruebas.
La historia (por qué existe esto)
Montamos un equipo web de 4 agentes (redactor de especificaciones → desarrollador frontend → QA → revisor). El equipo publicó una página de demostración con un contador y un interruptor de modo oscuro. Su propio informe de revisión decía:
✅ "Todos los requisitos cumplidos. No se encontraron problemas."
En un navegador real, el botón de alternancia no hacía nada: el fondo de la página nunca cambiaba. La clase .dark se alternaba con JavaScript, pero la regla CSS para .dark nunca se escribió. Todos los autotests de los agentes pasaron porque no había nada en la página que los agentes pudieran ejecutar. Nadie abrió un navegador real.
Esa es la brecha: los agentes verifican contra lo que creen que han construido, no contra lo que el usuario experimenta realmente. Las pruebas unitarias y las comprobaciones estáticas no pueden detectar una regla CSS que falta.
Este repositorio contiene el error, corregido, lado a lado — y la evidencia basada en el navegador que los separa:
Compilación | Lo que dijeron los agentes | Lo que dice un navegador real |
| "No se encontraron problemas" | ❌ FALLO — el fondo nunca cambia |
| una regla CSS añadida | ✅ PASA — el tema cambia |
Misma página. Mismo JS. Una regla CSS que falta. Dos veredictos distintos.
Related MCP server: Mochi
El informe
Un informe HTML autocontenido — cada paso con una insignia de aprobado/suspenso, selector y detalle, además de capturas de pantalla:

Qué hace
Lee una especificación JSON (sin framework, sin lenguaje de configuración)
Sirve tu directorio estático (o apunta a cualquier URL)
Maneja un Chromium real sin interfaz (Playwright)
Comprueba lo que los humanos comprueban: texto, clases, estilos calculados, URLs, píxeles
Genera un informe HTML autocontenido con capturas e imágenes de diferencias
Sale con
0si pasa,1si falla → introdúcelo en cualquier CIServidor MCP para Claude Code / Cursor / Copilot · Listas de verificación redactadas por IA · GitHub Action · DSH plugin
Instalación
# 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Úsalo desde cualquier agente de IA (MCP)
dsh-verify incluye un servidor MCP, así que Claude Code, Cursor, Copilot, o cualquier agente compatible con MCP puede verificar sus propias entregas en un navegador real — sin necesidad de archivos de especificación:
# 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-mcpLuego dile a tu agente, en palabras sencillas:
Verifica http://localhost:3000 — haz clic en
#dark-toggley comprueba que elbackground-colordebodyha cambiado. Toma una captura.
El agente llama a verify_url con una lista de comprobaciones de estilo humano (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), un Chromium real sin interfaz las ejecuta de forma determinista, y el agente recibe un veredicto PASS/FAIL además de un informe HTML autocontenido.
Herramientas que expone el servidor MCP:
Herramienta | Qué hace |
| Ejecuta un archivo de especificación JSON existente (o patrón global) contra Chromium real |
| Verifica una URL en vivo contra una lista de comprobaciones en línea — sin necesidad de archivos |
| La IA redacta la lista de verificación a partir de la página en vivo + tus requisitos, y luego Chromium real la ejecuta |
| Confirma que el servidor y Chromium están listos |
Ningún LLM juzga el resultado — el navegador es el juez. Ese es el punto.
Úsalo en CI (GitHub Action)
Un solo paso en cualquier flujo de trabajo — instala dsh-verify y Chromium de forma aislada (tu proyecto queda intacto), ejecuta las comprobaciones y sube el informe como artefacto:
- 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)El repositorio lo usa en producción: el flujo de trabajo dogfood verifica que la compilación corregida pasa y que la compilación con errores falla en cada push.
Regresión visual (líneas base de capturas de pantalla a nivel de píxel)
Cambia la página y deja que los píxeles te lo digan — no tus ojos, no tu memoria:
{
"title": "my app",
"serve": "dist",
"steps": [
{ "action": "goto", "path": "/index.html" },
{ "action": "expect_screenshot", "name": "home", "threshold": 0.01 }
]
}La primera ejecución crea la línea base (
out/baselines/home.png) y pasa.Las ejecuciones posteriores comparan capturas de pantalla de Chromium real píxel a píxel; las diferencias superiores a
threshold(por defecto 1 %) hacen fallar la compilación.Una imagen de diferencias resaltada en rojo va a
out/diffs/y se incrusta en el informe HTML.¿Un cambio esperado? Actualiza las líneas base en lugar de fallar:
dsh-verify --spec spec.json --update-baselines.Acota una región con
"selector", ajusta el ruido con"tolerance"(por canal, por defecto 10).
Acciones: capture_baseline (guardar una línea base explícitamente), expect_screenshot (comparar contra la línea base).
Listas de verificación redactadas por IA (las escribe un LLM, un navegador real las impone)
¿No quieres escribir el JSON a mano? dsh-verify gen aprende la página en un navegador real, hace que un LLM redacte la lista de verificación según tus requisitos y luego la ejecuta en Chromium real:
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.htmlLa IA solo redacta la lista de verificación — nunca juzga el resultado. El mismo motor Chromium determinista ejecuta los pasos, y el JSON se escribe en disco para que puedas revisarlo o editarlo antes de confiar en él.
Requiere Node >= 18 y una instalación de navegador: npx playwright install chromium.
Inicio rápido
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)El CI del propio repositorio ejecuta exactamente eso: autotests del motor, y luego verifica que la compilación corregida pasa y que la compilación con errores falla — así la herramienta se verifica a sí misma en cada push (.github/workflows/ci.yml).
Salida legible por máquina
node bin/verify.mjs --spec demo/fixed.json --out /tmp/out --json
# {"verdict":"PASS","passed":11,"total":11,"failed":[],"report":"/tmp/out/report.html"}Ejecutar muchas especificaciones
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"Cada especificación recibe su propia carpeta reports/<name>/; la salida es 0 solo si todas pasan.
Formato de la especificación
Campos de nivel superior: title, serve (directorio estático), base (URL de destino), browser (opcional: chromium | firefox | webkit, por defecto chromium), steps.
{
"title": "my app",
"serve": "dist",
"browser": "chromium",
"steps": []
}Anula por ejecución con --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" }
]
}Acciones
Acción | Campos | Qué verifica |
|
| Navegar (usa el directorio servido si |
|
| Esperar (permite que las transiciones CSS se asienten) |
|
| Hacer clic en un elemento, N veces |
|
| Rellenar un campo de entrada |
|
| El texto visible contiene/es igual al objetivo |
|
| La clase está presente (por defecto) o ausente |
|
| Guardar un estilo calculado en una variable |
|
| El estilo calculado difiere de la instantánea — la comprobación que detecta "la clase se alternó pero el CSS nunca se escribió" |
|
| La URL actual contiene el objetivo |
|
| Esperar hasta que la URL contenga |
|
| Sin errores de consola durante la ejecución (por defecto: no se espera ninguno) |
|
| Sin respuestas 4xx/5xx ni solicitudes fallidas (por defecto: no se espera ninguna) |
|
| Guardar un PNG en el informe |
|
| Guardar una captura como línea base visual |
|
| Diferencia de píxeles contra la línea base; falla si supera |
El par capture_style → expect_style_changed es el corazón de este proyecto: verifica lo que ve el usuario, no lo que dice la lista de clases del DOM.
Evidencia en vivo
Las dos capturas siguientes son resultados reales de dsh-verify contra las dos compilaciones de la misma demo (Chromium, 1280×800, después de hacer clic en el interruptor):
Compilación con errores — interruptor pulsado, fondo sin cambios:

Compilación corregida — interruptor pulsado, tema cambiado:

Informes completos paso a paso: informe con errores · informe corregido.
Docker (Chromium fijado a una versión)
docker build -t dsh-verify .
docker run --rm -v "$PWD:/app" dsh-verify --spec demo/fixed.json --out /app/reportsUsa mcr.microsoft.com/playwright:v1.62.1-jammy para que la compilación de Chromium coincida con la versión de Playwright — sin descarga del navegador en el momento de construir la imagen. (Construido y documentado; verificado localmente, todavía no en un host Docker).
Por qué nada más hace esto
Investigamos la comunidad de herramientas para agentes antes de construir esto. La "verificación" existente para entregas de agentes es principalmente:
Comprobaciones de humo de plugins/instalación — si una habilidad se instala, si existe una CLI (por ejemplo, herramientas de descubrimiento de plugins).
Lint estático / pruebas unitarias — validan el código que escribió el agente, no el comportamiento que experimenta el usuario.
Agentes solo de capturas de pantalla — miran una imagen, no afirman un comportamiento.
Ninguno de ellos ejecuta un navegador real contra el artefacto y responde: "Cuando hago clic en este botón, ¿ve el usuario el cambio?" Ese es el nicho que llena dsh-verify — deliberadamente pequeño, sin framework, especificación JSON de entrada, veredicto de navegador de salida.
Hoja de ruta
expect_console_errors/expect_network_errors— sin errores de consola, sin solicitudes 4xx/fallidas--jsonsalida de veredicto para registros de CI; pasos fallidos impresos en stdoutFlujos de varias páginas y
expect_navigation(esperar URL después del clic)--specglob (ejecutar muchas especificaciones, un veredicto agregado)Imagen de Docker con Chromium fijado (
mcr.microsoft.com/playwright:v1.62.1-jammy)Manifiesto del plugin DSH (
dsh plugin add dsh-verify)Servidor MCP — verificar desde Claude Code / Cursor / Copilot (
verify_spec/verify_url/generate_and_verify)Listas de verificación redactadas por IA —
dsh-verify gen(la LLM redacta, el navegador determinista aplica)GitHub Action — aceptación de CI en un solo paso con artefacto de informe
Regresión visual — líneas base de capturas de pantalla a nivel de píxel (
capture_baseline/expect_screenshot)Matriz de múltiples navegadores —
--browser/spec.browser: chromium, firefox, webkit (todo verde en CI)Viewports móviles
Generación de especificaciones por IA a partir de un requisito en lenguaje natural sin una página en ejecución
Licencia
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.-