Argus Testing

MCP de QA autónomo que prueba aplicaciones web y macOS como un ingeniero real y verifica cada error.

Documentación

Argus Testing logo — an eye with a verified check

Argus

Un servidor MCP que prueba aplicaciones como un ingeniero de pruebas real: explora recorridos de usuario, descubre errores no guionados y demuestra cada hallazgo antes de reportarlo.

Argus es un servidor MCP. Añade QA de navegador basado en evidencia a Claude Code, Codex, Cursor o cualquier host MCP sin asumir la identidad del agente anfitrión ni su tarea de codificación más amplia. El agente explora, inspecciona, verifica la persistencia y registra errores reproducibles. Cada hallazgo certificado es reconfirmado de forma independiente desde una carga de página limpia antes de reportarse.

PyPI Python MCP server Official MCP Registry Capability ceiling License: MIT

Página de producto · Inicio rápido · Por qué Argus · Comparación · Herramientas · Benchmarks


El resultado

Dale una URL; obtén un informe de errores, cada uno etiquetado con si Argus lo reprodujo de forma independiente o solo lo observó:

Argus bug report — verified findings with reproduction receipts

La insignia verde es el punto clave. Cualquiera puede hacer que un LLM afirme un error. Argus recarga la página desde cero y vuelve a comprobar el síntoma antes de decir VERIFICADO — así que el informe es una lista de errores en los que puedes confiar, no una lista de conjeturas para triar.


Cómo funciona

flowchart LR
    A(["observe"]) --> B{"looks wrong?"}
    B -->|not sure| C["act: click · type · resize · verify"]
    C --> A
    B -->|bug| D["verify_persistence — reload from a clean state"]
    D -->|symptom repeats| E(["VERIFIED"])
    D -->|symptom gone| F(["dropped — no false positive"])
    E --> G[["report: HTML · JSON · JUnit · SARIF"]]

El agente es la inteligencia. Argus proporciona una guía de QA concisa, una superficie de herramientas basada en descripciones (click_what("Login button"), no click(7)), un registro de cobertura de objetivos y un motor de recibos de reproducción que convierte "el modelo cree que esto es un error" en "este error es real, aquí está la prueba".


Inicio rápido

Con uv instalado, no se requiere instalación global de paquetes de Python. Instala Chromium una vez:

uvx --from playwright playwright install chromium

Luego conecta Argus a tu cliente MCP.

Claude Code

claude mcp add argus -- uvx --from argus-testing argus-mcp

Codex y la aplicación de escritorio de ChatGPT

Codex CLI, la extensión de IDE de Codex y la aplicación de escritorio de ChatGPT comparten la misma configuración MCP local:

codex mcp add argus -- uvx --from argus-testing argus-mcp

Cursor

Add Argus to Cursor

El botón añade Argus a Cursor; ejecuta el comando de instalación de Chromium de arriba una vez antes de la primera prueba.

Cualquier cliente MCP stdio

{
  "mcpServers": {
    "argus": {
      "command": "uvx",
      "args": ["--from", "argus-testing", "argus-mcp"]
    }
  }
}

El perfil predeterminado core expone el flujo de trabajo principal de pruebas web sin inundar al host con cada herramienta especializada. Usa uvx --from argus-testing argus-mcp --list-tools para inspeccionar el perfil seleccionado, --tool-profile screen para pruebas nativas de macOS, o --tool-profile full para toda la superficie avanzada. ARGUS_TOOL_PROFILE proporciona la misma configuración a través del entorno.

Luego simplemente pregunta, en tu sesión de agente:

"Prueba mi aplicación en http://localhost:3000 — encuentra errores reales."

Eso es todo. El agente conduce; Argus lo mantiene honesto y escribe el informe.

Para una revisión acotada, el host puede dar a start_session goals explícitos, constraints, y un time_budget_minutes de asesoramiento. Argus devuelve el protocolo de prueba completo una vez y mantiene los objetivos pendientes y las páginas descubiertas visibles en observaciones posteriores. Marca un objetivo in_progress antes de su recorrido; cuando coverage_update lo marca como exercised o blocked, Argus requiere una explicación concreta y enlaza automáticamente las URLs, acciones con valores redactados, capturas de pantalla, comprobaciones de persistencia, errores y observaciones producidas en esa ventana de prueba. Los informes finales en HTML y JSON preservan tanto la cobertura completada como la incompleta, en lugar de implicar que una pasada incompleta fue exhaustiva.

instalación con pip
pip install argus-testing
playwright install chromium
claude mcp add argus -- argus-mcp
Modo CLI (sin host MCP — trae tu propio LLM)
# Uses a LiteLLM-backed planner. Set a provider key (OPENAI_API_KEY, DEEPSEEK_API_KEY, …).
uvx --from argus-testing argus http://localhost:3000 --model deepseek/deepseek-chat

# Higher recall: union N independent passes (deduped, proven instance kept)
uvx --from argus-testing argus http://localhost:3000 --passes 3
Modo pantalla (macOS) — prueba cualquier aplicación nativa, no solo la web
pip install 'argus-testing[mac]'
brew install cliclick          # keystroke / coordinate fallback
argus-mcp --doctor             # check Screen Recording + Accessibility grants
claude mcp add argus-screen -- argus-mcp --tool-profile screen

Mismas herramientas basadas en descripciones, pero el objetivo es cualquier aplicación en primer plano en macOS — Notes, Cursor, Safari, tu función en progreso. Sin Chrome headless, sin Playwright guionado. Argus ve lo que tú ves, a través del árbol de Accesibilidad.

Límites de artefactos y recursos

Argus escribe las capturas de pantalla de cada ejecución en su propio directorio de ejecución para que las pruebas posteriores no puedan sobrescribir evidencia anterior. Las sesiones largas de navegador también mantienen registros de eventos en memoria acotados y solo leen cuerpos de respuesta para tráfico de API inspeccionable; los cuerpos binarios y de gran tamaño se omiten antes de entrar en la memoria de Python.

La limpieza de informes es explícita y con simulación (dry-run) por defecto. Las 20 ejecuciones completas más recientes están protegidas en este ejemplo; los diarios de .argus y las cápsulas de estado nunca se eliminan:

argus-cleanup --output ./argus-reports --keep-runs 20
argus-cleanup --output ./argus-reports --keep-runs 20 --apply

Usa --older-than-days y --max-size-mb para políticas más estrictas. Los límites avanzados se pueden ajustar con ARGUS_MAX_NETWORK_EVENTS, ARGUS_MAX_ERROR_EVENTS, ARGUS_MAX_DOWNLOAD_EVENTS, ARGUS_MAX_DIALOG_EVENTS, ARGUS_MAX_RESPONSE_BODY_BYTES y ARGUS_MAX_RESPONSE_READ_BYTES. Las respuestas sin una longitud declarada se omiten por defecto; ARGUS_CAPTURE_UNKNOWN_LENGTH_BODY=1 opta por leerlas. Cuando un límite descarta evidencia antigua, Argus lo dice en la salida de la herramienta y en el resumen final de la sesión.


Por qué Argus es diferente

Las herramientas de prueba existentes solo prueban lo que guionas. Playwright y Cypress ejecutan las aserciones que escribiste. Argus descubre errores que no pensaste en probar — y luego hace lo que un LLM solo no puede hacer de forma confiable: los demuestra.

Autónomo y de caja negraLe das una URL, no un plan de prueba. Explora como un usuario real — sin acceso al repositorio, sin pasos guionados.
Contrato de coberturaObjetivos opcionales en lenguaje natural, restricciones de usuario, páginas descubiertas y presupuesto de tiempo permanecen visibles durante toda la sesión y en el informe final.
Recibos de reproducciónAntes de certificar un error, recarga la página desde un estado limpio y reconfirma el síntoma. Diseñado para cero falsas certificaciones.
Encuentra errores de ojo humanoFalsa escasez de "¡Solo quedan 3!", un toast de "Guardado" que no guarda, una insignia de oferta donde el precio no bajó, una barra de navegación obsoleta después de un cambio de nombre. El análisis estático no detecta ninguno de estos.
Descubrir → protegerLos hallazgos se registran; argus-regression los vuelve a comprobar en cada compilación con costo cero de LLM y una salida no cero — una puerta de CI real contra errores conocidos que regresan.
Legible por máquinaCada informe también emite JSON, JUnit y SARIF — para que los hallazgos controlen un pipeline y aparezcan como anotaciones en línea en GitHub PR.

Cómo se compara

En el eje que importa para encontrar errores — descubrir autónomamente, verificar de forma independiente y reportar — Argus ocupa un lugar diferente al de la multitud de browser-MCP:

ArgusPlaywright MCPChrome DevTools MCPbrowser-use
Encuentra autónomamente errores desconocidosSíNo (controlador)No (depurador)Parcial (limitado a tareas)
Verifica de forma independiente cada hallazgoSí (recibo)NoNoNo (puntuación LLM)
Informe de errores rico en evidenciaSíNoNoParcial
Caja negra (sin acceso a repo / fuente)SíSíSíSí
Puerta de regresión CI con cero LLMSíParcialNoParcial

Estas no son herramientas "peores" — son un trabajo diferente. Playwright MCP le da a un agente excelentes manos; Chrome DevTools MCP le da una inspección profunda de red/rendimiento/memoria que Argus no tiene. Argus es la capa que decide qué es un error y lo demuestra. Úsalas juntas.


Benchmarks

$ python -m argus.bench --target all

  buggytasks    22 / 22  = 100 %   ·  mechanical bugs (console errors, fake delete, auth bypass…)
  darkshop      12 / 12  = 100 %   ·  human-eye bugs (fake scarcity, lying toasts, stale state…)
  ──────────────────────────────────────────────────────────────────────
  total         34 / 34  = 100 %   ·  reproducible from git clone in two commands

34 / 34 es el techo de capacidad — lo que es encontrable a través de la superficie de herramientas, medido por scripts deterministas. Está deliberadamente separado de con qué frecuencia un LLM dado recuerda usar bien las herramientas, que es ruidoso y se reporta honestamente abajo.

Recuerdo real de LLM — el número honesto (y por qué reportamos la dispersión)

python -m argus.bench.agent_runner pone un modelo real en el asiento del conductor y puntúa el recuerdo en múltiples pruebas. Lo que hemos aprendido al ejecutarlo:

  1. El recuerdo real está muy por debajo del techo de 34/34. Un controlador en vivo encuentra una fracción de los errores sembrados por pasada — el techo es lo que es encontrable, esto es lo que un modelo encuentra.
  2. La varianza es grande — nunca clasifiques modelos con unas pocas ejecuciones. El recuerdo por prueba varía ampliamente; reportamos la dispersión, no un único número heroico.
  3. Probar el banco de pruebas con dogfooding encontró errores reales en el propio Argus — un fallo de record_bug con un argumento de cadena que descartaba silenciosamente hallazgos, fallos del resolvedor en frases comunes. La herramienta que prueba herramientas fue probada.
  4. La precisión se mantiene independientemente del controlador. En cada prueba, el recibo de reproducción mantuvo las falsas certificaciones en cero — un modelo débil encuentra menos errores, pero los marcados como VERIFICADO siguen siendo reales.
Qué siembran los fixtures

BuggyTasks (:5555) — 22 errores mecánicos en una aplicación de tareas: errores de consola, enlaces muertos, eliminación falsa (la UI dice "¡eliminado!" pero los datos persisten al recargar), bypass de autenticación, fechas NaN, conteos desviados por uno, condiciones de carrera. El nivel "un E2E guionado podría encontrar estos".

DarkShop (:5556) — 12 errores de ojo humano en una tienda de aspecto pulido: escasez hardcodeada de "¡Solo quedan 3!", insignias de -50% donde el precio de oferta es igual al original, un banner de "envío gratis por más de $50" contradicho por un $5 fijo en el checkout, jerarquía visual invertida ("Añadir al carrito" degradado bajo un prominente "Suscribirse"), deriva de estado entre páginas (el cambio de nombre persiste en /account, el saludo de la barra de navegación no). El análisis estático no detecta casi ninguno de estos — requieren un agente que lea la página y razone.

python test-site/app.py           # BuggyTasks  :5555
python human-eye-fixture/app.py   # DarkShop    :5556
python -m argus.bench --target all

Superficie de herramientas

argus-mcp comienza con el perfil web enfocado core. Cada herramienta pública está documentada abajo. Los conteos también están disponibles directamente desde el servidor instalado:

uvx --from argus-testing argus-mcp --list-tools
uvx --from argus-testing argus-mcp --tool-profile screen --list-tools
uvx --from argus-testing argus-mcp --tool-profile full --list-tools
PerfilHerramientas públicasUso previsto
core30Flujo de trabajo principal de QA de navegador; el predeterminado.
screen14Pruebas nativas de macOS enfocadas a través de Accesibilidad y capturas de pantalla.
full77Todo en core y screen, más controles especializados de navegador, estado, red, coordenadas y rastreo.
Perfil core — 30 herramientas | Herramientas | Propósito | |-------|---------| | `start_session` | Iniciar una revisión de navegador `exploratory`, `visual` o `regression`; aceptar opcionalmente `goals`, `constraints` y `time_budget_minutes`; devolver el protocolo de un solo uso y la observación inicial. | | `observe` | Devolver URL, título, elementos interactivos clave por descripción, recuentos, retroalimentación visible, árbol ARIA y estado del viewport. | | `coverage_update` | Abrir una ventana de evidencia de objetivo con `in_progress` y luego marcarla como `exercised` o `blocked`; los estados terminales requieren una explicación y enlazan automáticamente la evidencia de la sesión. | | `click_what` | Hacer clic en el elemento que mejor coincida con una descripción en lenguaje natural; devolver candidatos en lugar de adivinar cuando haya ambigüedad. | | `type_into` · `select_into` | Resolver un campo por descripción y luego escribir texto o seleccionar una opción. | | `hover_what` · `press_key` | Probar estados de hover e interacciones de teclado sobre objetivos clave por descripción. | | `resize` · `emulate_device` | Probar puntos de interrupción responsivos o reabrir la página con configuración real de táctil móvil, UA, DPR y viewport. | | `upload_file` | Adjuntar uno o más archivos locales a una entrada de archivo coincidente. | | `navigate` · `go_back` · `scroll_down` | Navegar directamente, volver mediante el historial del navegador o revelar contenido debajo del pliegue. | | `inspect_element` · `check_layout` | Inspeccionar estilos calculados, ARIA y marcado, o señales acotadas de desbordamiento, recorte, objetivos pequeños y superposiciones. | | `screenshot` · `screenshot_diff` | Capturar evidencia de viewport, página completa o elemento, y producir una superposición de diff de píxeles con tinte rojo. | | `get_errors` | Drenar errores de consola correlacionados y eventos HTTP 4xx/5xx capturados desde la lectura anterior. | | `capsule_save` · `capsule_restore` | Guardar y restaurar un estado de navegador autenticado o sembrado con nombre, con una verificación de actividad opcional. | | `verify_persistence` | Forzar una carga nueva y comprobar si el texto objetivo está presente o ausente. El toast «¡Guardado!» no es prueba; esto sí lo es. | | `test_action` · `test_form` | Realizar una acción clave por descripción o un envío de formulario y devolver el diff de estado resultante en un solo viaje de ida y vuelta. | | `check_links` · `check_performance` | Probar enlaces internos de la página actual y exponer métricas de rendimiento del navegador sin certificar automáticamente hallazgos de auditoría genéricos. | | `regression_check` | Volver a probar hallazgos registrados para el origen actual sin requerir otra pasada de descubrimiento. | | `record_bug` · `record_observation` | Registrar un defecto reproducible con evidencia y recibo, o mantener una nota de revisión cualitativa separada de los errores certificados. | | `end_session` | Cerrar la sesión activa y emitir informes HTML, JSON, JUnit y SARIF. |

Los informes conservan las capturas de pantalla originales como evidencia y, por defecto, escriben vistas previas WebP compactas en report-assets/ en lugar de incrustar en base64 cada PNG de tamaño completo en el HTML. Establezca ARGUS_PORTABLE_REPORT=1 cuando un único archivo HTML autocontenido sea más importante que el tamaño. La salida JSON incluye recibos de reproducción completos, el contrato de cobertura y sus referencias de evidencia estructuradas, restricciones, modo de revisión, recuentos de llamadas a herramientas y pasos registrados, metadatos de capturas y observaciones cualitativas. Los totales de fallos del conjunto JUnit coinciden con los nodos <failure> emitidos.

Perfil de pantalla — 14 herramientas
HerramientasPropósito
start_screen_sessionVincularse a la aplicación en primer plano o a una aplicación macOS con nombre después de verificar los permisos de Grabación de pantalla y Accesibilidad.
screen_observeDevolver la aplicación en primer plano, el título de la ventana, el árbol AX acotado, las coordenadas de pantalla y una captura reciente.
screen_click_what · screen_type_into · screen_press_keyResolver contra el árbol AX y actuar mediante accesibilidad nativa, con respaldo a cliclick.
screen_wait_for_stableEsperar hasta que la ventana objetivo permanezca visualmente estable dentro de un umbral configurable.
screen_launch · screen_quit · screen_is_runningControlar e inspeccionar una aplicación por nombre localizado, ID de paquete o ruta absoluta.
screen_screenshot_regionCapturar una región rectangular precisa de la pantalla para evidencia visual detallada.
screen_session_statusInformar del tiempo transcurrido, presupuesto de sesión restante, recuentos de acciones y la ruta del archivo de aborto.
record_bug · record_observation · end_sessionUsar las herramientas compartidas de evidencia, informes y cierre en modo pantalla.

Seguridad: tiempo de espera por llamada, un límite de sesión de 30 minutos, un archivo de pánico ~/.argus/abort que detiene toda acción posterior, y un rastro automático de capturas antes/después en cada acción.

Perfil completo — 77 herramientas

El perfil completo incluye todas las herramientas principales y de pantalla anteriores más estas 36 herramientas especializadas. Úselo cuando el flujo de trabajo realmente necesite estado de bajo nivel, inyección de fallos, control de múltiples pestañas, coordenadas o rastreo.

Herramientas adicionalesPropósito
paste_into · right_clickDisparar un evento real de pegado del portapapeles o abrir el menú contextual de un objetivo.
emulate_mediaEmular esquemas de color oscuro/claro y preferencias de movimiento reducido.
click_at · type_at · hover_at · drag_at · drag_whatProbar interfaces canvas/WebGL, revelado al pasar el cursor y arrastrar y soltar por coordenadas o descripción.
drop_fileEnviar una caída de archivo real sobre una zona de caída coincidente.
set_dialog_handlerPoner en cola una respuesta de aceptar, descartar o indicar para el siguiente diálogo de JavaScript.
eval_jsEjecutar JavaScript arbitrario en el contexto de la página. Permanece deshabilitado a menos que el servidor también se inicie con --unsafe.
network_requests · network_requestInspeccionar el registro de solicitudes acotado u obtener el detalle completo de una solicitud coincidente.
network_mock · network_unmock · network_clear_mocks · network_clear_logInyectar respuestas HTTP predefinidas y restablecer de forma independiente los mocks activos o el tráfico capturado.
cookies_get · cookies_set · cookies_clearInspeccionar, sembrar o borrar cookies del contexto del navegador.
storage_get · storage_set · storage_remove · storage_clearInspeccionar y mutar localStorage o sessionStorage locales de la página.
tabs_list · tabs_switch · tabs_closeControlar OAuth, pagos y otros recorridos de ventanas emergentes o múltiples pestañas.
wait_for_text · wait_for_requestEsperar texto visible específico o tráfico saliente coincidente con un tiempo de espera acotado.
get_downloadsInspeccionar archivos descargados durante la sesión, incluyendo sus rutas y tamaños.
crawl_siteRastrear páginas internas acotadas y recopilar eventos del navegador, resultados de enlaces y evidencia de rendimiento.
screen_click_at · screen_hover_at · screen_drag · screen_keys · screen_type_atUsar coordenadas de pantalla absolutas y secuencias de múltiples teclas cuando una aplicación nativa no expone ningún elemento AX útil.

Para exponer eval_js como una herramienta operativa en lugar de un stub de seguridad deshabilitado:

uvx --from argus-testing argus-mcp --tool-profile full --unsafe

Seguridad y privacidad local-primero

Argus se ejecuta en su máquina y no envía telemetría a un servicio operado por Argus. Los informes y capturas permanecen en ./argus-reports por defecto; su host MCP y su proveedor de modelos configurado aún pueden recibir los resultados de herramientas incluidos en la conversación. Las acciones del navegador y los controles nativos de macOS pueden causar efectos secundarios reales, así que use cuentas de prueba y datos que no sean de producción siempre que sea posible.

Lea la divulgación de privacidad completa y la política de seguridad antes de usar Argus con sistemas sensibles.


Filosofía

Confíe en el agente, no simule inteligencia

Argus asume un controlador de clase Opus. Las reglas estáticas que pretenden ser la capa inteligente son sustractivas: añaden mantenimiento y falsos positivos y desvían la atención de lo que el agente realmente vio. Por eso detector.py es diminuto: solo captura los dos canales que el agente literalmente no puede ver (el flujo de eventos de consola y la capa HTTP). «¿Es engañoso este toast? ¿Está mal la jerarquía visual? ¿Está desviado ese recuento?» — el agente lee observe() y decide.

Guíe la revisión; no secuestre la tarea del host

La instrucción global es intencionalmente diminuta para no repetir un largo prompt de QA en cada descripción de herramienta MCP. start_session devuelve una sola vez el ritual completo de evidencia-primero, objetivos, restricciones y presupuesto; las observaciones luego muestran solo el registro compacto de cobertura en vivo. Argus sigue siendo una capacidad dentro de la tarea actual del usuario: no impide el trabajo de implementación, no reemplaza la identidad del host ni implica autoridad para acciones externas irreversibles.

Clave por descripción, no por índice

click_what("Login button"), no click(7). Los índices de elementos son una abstracción con fugas incluso dentro de un observe. Un agente capaz describe lo que quiere por lo que es, y el resolvedor lo mapea al elemento correcto — negándose a hacer clic incorrecto ante la ambigüedad en lugar de adivinar.


Estructura del proyecto

argus/
├── mcp_server.py     # tool surface + role instructions + reproduction-receipt engine
├── browser.py        # Playwright backend: DOM/ARIA extraction, capsule/replay
├── resolver.py       # description → element (web + screen)
├── reporter.py       # HTML + JSON + JUnit + SARIF
├── detector.py       # console + network capture (only)
├── cli.py            # argus (explore) + argus-regression
├── bench/            # deterministic ceiling + real-LLM recall harness
└── screen/           # macOS AX backend, permissions, safety
test-site/            # BuggyTasks  (22 mechanical bugs)
human-eye-fixture/    # DarkShop    (12 human-eye bugs)