playwright-trace-decoder-mcp

Servidor MCP para desempaquetar y analizar archivos trace.zip de Playwright

Documentación

Traducción al Español

Preservando todos los tokens y estructura. A continuación el documento traducido:


🎭 playwright-trace-decoder-mcp

npm version npm downloads CI License: MIT

Un servidor MCP que desempaqueta y estructura los archivos trace.zip de Playwright para que los agentes de IA puedan realizar análisis de causa raíz en fallos de CI, sin ahogarse en JSON crudo ni reventar la ventana de contexto.

🤔 El Problema

Cuando una prueba de Playwright falla en CI, obtienes un trace.zip. Es un blob binario. Los LLM no pueden leerlo de forma nativa, y volcar el contenido crudo supera la ventana de contexto. Los ingenieros terminan copiando fragmentos de logs a ChatGPT manualmente, como si estuviéramos en 2022.

Este servidor MCP resuelve eso: 16 herramientas enfocadas que exponen exactamente la señal que un agente necesita para diagnosticar un fallo, con paginación y compresión ARIA para mantener los costos de tokens bajos.

🐸 Ejemplo de Investigación de Fallo E2E

Así es como un agente de IA usa las nuevas herramientas en v0.3.0 para encontrar e inspeccionar un fallo al instante:

  1. Localizar el error exacto en el código fuente mediante map_locator_to_source:

    // Request arguments
    { "trace_path": "/path/to/trace.zip" }
    
    // Response payload
    {
      "action_type": "Click locator('#super-toad-not-found')",
      "locator": "#super-toad-not-found",
      "error": "TimeoutError: locator.click: Timeout 5000ms exceeded.",
      "step_title": "Click locator('#super-toad-not-found')",
      "stack": [
        {
          "file": "/Users/albertdev/Projects/ideas/sample-playwright-project/tests/google-pom.spec.ts",
          "line": 18,
          "column": 17
        }
      ],
      "source_location": {
        "file": "/Users/albertdev/Projects/ideas/sample-playwright-project/tests/google-pom.spec.ts",
        "line": 18,
        "column": 17
      }
    }
    

    ¡No más suposiciones! El agente sabe exactamente qué archivo, línea y columna causaron el tiempo de espera agotado.

  2. Extraer los fotogramas visuales críticos alrededor del fallo mediante extract_critical_frames:

    // Request arguments
    { "trace_path": "/path/to/trace.zip", "limit": 1 }
    
    // Response payload
    [
      {
        "timestamp": 1779137404287,
        "mime_type": "image/jpeg",
        "step_title": "Clicking #super-toad-not-found element",
        "data": "/9j/4AAQSkZJRgABAQAAAQABAAD/..." // Base64 JPEG
      }
    ]
    

    Permite al agente verificar visualmente el estado de la página inmediatamente antes/después del fallo sin tener que arrastrar listas masivas de imágenes.

  3. Recortar la traza para ahorrar costos de almacenamiento/transferencia en CI mediante trim_trace_archive:

    // Request arguments
    { "trace_path": "/path/to/trace.zip" }
    
    // Response payload
    {
      "original_size_bytes": 2449682,
      "trimmed_size_bytes": 511698,
      "compression_ratio_percent": 79,
      "trimmed_trace_path": "/path/to/trace.trimmed.zip"
    }
    

    Reduce trazas grandes eliminando capturas de pantalla fuera de la ventana crítica del fallo. ¡Ahorra un 79% de espacio en disco!

🛠️ Herramientas

Las herramientas se agrupan según cómo un agente debería secuenciarlas al diagnosticar un fallo.

Inspección — leer datos de la traza

HerramientaArgumentosQué devuelve
get_test_metadatatrace_pathNavegador, plataforma, viewport, título de prueba, hora de inicio en reloj de pared
get_trace_summarytrace_pathAcción fallida + error de nivel superior + recuento total de acciones
get_action_timelinetrace_path, limit, offsetLista paginada de todas las acciones con nombres de API, localizadores y tiempos
get_filtered_network_logstrace_path, limit, offsetSolo respuestas 4xx/5xx — recursos estáticos (CSS, JS, fuentes, imágenes) eliminados
get_console_errorstrace_path, limit, offsetExcepciones JS y advertencias de la consola del navegador
get_element_state_at_failuretrace_pathLocalizador fallido, mensaje de error y metadatos crudos antes/después
extract_trace_metadata_stricttrace_pathVersión de formato, desglose de sesiones de reintento, modo de carga HAR (embeber/adjuntar/omitir)

Todas las herramientas que devuelven listas admiten limit (1–500, por defecto 50) y paginación offset con una bandera has_more.

trace_path acepta una ruta local absoluta o una URL HTTPS — el servidor descarga el archivo automáticamente y lo cachea para la sesión.

Análisis de DOM / UI

HerramientaArgumentosQué devuelve
get_aria_accessibility_treetrace_path, action_index?Árbol de accesibilidad ARIA como YAML compacto (~90% menos tokens que HTML crudo). Por defecto, la instantánea en la acción fallida.
get_dom_mutation_deltatrace_path, action_indexDiferencia de líneas ARIA antes vs después de una acción específica — solo elementos añadidos/eliminados, no dos dumps completos del DOM
get_screenshot_at_failuretrace_path, screenshot_index?Captura JPEG en base64 más cercana al momento del fallo. Úsalo cuando el árbol ARIA esté vacío (captcha, página en blanco). screenshot_index te permite recorrer toda la línea de tiempo visual.
analyze_race_conditionstrace_pathSolicitudes de red que estaban en vuelo cuando se disparó una interacción o aserción
correlate_dom_and_networktrace_pathPara cada acción donde un fetch se completó y el DOM mutó dentro de ±100 ms: URL desencadenante, estado de respuesta, fragmento del cuerpo y nodos exactos añadidos/eliminados
extract_critical_framestrace_path, lookback_ms?, lookforward_ms?, limit?Extrae capturas clave de screencast (base64) de una ventana temporal alrededor del fallo, resueltas con títulos de paso

Análisis de causa raíz

HerramientaArgumentosQué devuelve
get_causal_chain_for_failuretrace_path, lookback_ms?Cadena cronológica de acciones precedentes, errores de red y errores de consola que llevan al fallo (ventana por defecto: 5 s)
generate_error_signaturetrace_pathHash SHA-1 estable de 12 caracteres del error normalizado — úsalo para agrupar fallos duplicados en ejecuciones de CI paralelas
compare_tracespassing_trace_path, failing_trace_pathSecuencia de acciones alineada con LCS entre una ejecución exitosa y una fallida: divergencia estructural, anomalías de tiempo (>500 ms), acciones no coincidentes, delta de red
map_locator_to_sourcetrace_path, action_index?Mapea una interacción de navegador fallida (o un índice de acción específico) a la línea exacta del código de prueba mediante la pila de ejecución del runner

Análisis de rendimiento

HerramientaArgumentosQué devuelve
detect_performance_anomaliestrace_path, slow_action_threshold_ms?, frame_drop_threshold_ms?Lista clasificada de acciones lentas y caídas de frames con suspected_cause (hilo principal bloqueado / saturación de red / tiempo de espera de navegación). También informa duración p50/p95 y un indicador de fuga de memoria.
trim_trace_archivetrace_path, divergence_only?Reduce el zip de la traza eliminando capturas de pantalla fuera de la ventana crítica del fallo (t_fail - 5s a t_fail + 1s). Devuelve la ruta recortada y el delta de tamaño.

💬 Flujo de trabajo sugerido para el agente

get_trace_summary              ← what failed?
get_causal_chain_for_failure   ← what led up to it?
get_aria_accessibility_tree    ← what did the page look like?
get_screenshot_at_failure      ← ARIA empty? get the actual screenshot
get_dom_mutation_delta         ← what changed right before the failure?
analyze_race_conditions        ← was a network request still pending?
correlate_dom_and_network      ← which fetch caused which DOM change?
compare_traces                 ← flaky? compare to a passing run
detect_performance_anomalies   ← timeout but no JS error? check for Long Tasks

🚀 Configuración

Compilar desde el código fuente

git clone https://github.com/vola-trebla/playwright-trace-decoder-mcp.git
cd playwright-trace-decoder-mcp
npm install
npm run build

Añadir a tu cliente MCP

Claude Desktop (~/Library/Application Support/Claude/claude_desktop_config.json)

{
  "mcpServers": {
    "playwright-trace-decoder": {
      "command": "node",
      "args": ["/absolute/path/to/playwright-trace-decoder-mcp/dist/index.js"]
    }
  }
}

Cursor (.cursor/mcp.json) o VS Code (.vscode/mcp.json)

{
  "mcpServers": {
    "playwright-trace-decoder": {
      "command": "node",
      "args": ["/absolute/path/to/playwright-trace-decoder-mcp/dist/index.js"]
    }
  }
}

Claude Code

claude mcp add playwright-trace-decoder \
  node /absolute/path/to/playwright-trace-decoder-mcp/dist/index.js

Docker

docker build -t playwright-trace-decoder-mcp .
{
  "mcpServers": {
    "playwright-trace-decoder": {
      "command": "docker",
      "args": ["run", "--rm", "-i", "-v", "/path/to/traces:/traces", "playwright-trace-decoder-mcp"]
    }
  }
}

💬 Ejemplo de uso

Análisis básico de fallos

Pregunta a tu agente:

"La ejecución de CI falló. Aquí está la traza: /tmp/trace.zip. ¿Qué salió mal y por qué?"

El agente llama a get_trace_summaryget_causal_chain_for_failureget_aria_accessibility_tree, profundizando según sea necesario — sin que tengas que copiar y pegar nada.

Cuando la página estaba en blanco o redirigida

"El árbol ARIA está vacío. ¿Puedes mostrarme qué había realmente en pantalla cuando falló?"

El agente llama a get_screenshot_at_failure y obtiene el JPEG tomado más cercano al momento del fallo — útil para detectar captchas, páginas de error o redirecciones inesperadas.

Diagnóstico de flakiness

"Esta prueba pasa localmente pero falla en CI. Compara estas dos trazas y dime qué fue diferente."

El agente llama a compare_traces, que alinea con LCS ambas secuencias de acciones y saca a la superficie la primera divergencia estructural, anomalías de tiempo y solicitudes de red que solo aparecieron en la ejecución fallida.

Agrupar fallos duplicados en ejecuciones de CI paralelas

"Tenemos 12 trazas fallidas de este pipeline. ¿Son todas el mismo fallo?"

Llama a generate_error_signature en cada una — firmas idénticas significan causa raíz idéntica, sin necesidad de leer cada traza.

Diagnosticar qué llamada API causó un cambio de DOM

"El modal apareció pero no sé qué fetch lo desencadenó."

correlate_dom_and_network une el registro HAR y las instantáneas de DOM automáticamente. Ejemplo de salida:

{
  "total_correlations": 1,
  "correlations": [
    {
      "action_id": "4:Locator.click",
      "triggering_request_url": "https://api.example.com/cart/items",
      "response_status_code": 200,
      "response_body_snippet": "{\"items\":[{\"id\":\"abc\",\"qty\":1}]}",
      "time_to_dom_mutation_ms": 38,
      "resulting_dom_mutations": [
        { "type": "added", "selector": "heading \"Cart (1 item)\"" },
        { "type": "removed", "selector": "button \"Add to cart\" [disabled]" }
      ]
    }
  ]
}

Tiempos de espera por rendimiento — no solo elementos faltantes

"La prueba agota el tiempo en goto, pero no hay error de JS. ¿Qué está bloqueando la página?"

detect_performance_anomalies inspecciona las brechas de fotogramas del screencast y marca Long Tasks. Ejemplo de salida:

{
  "anomalies": [
    {
      "kind": "slow_action",
      "blocked_action_id": "2:Frame.goto",
      "task_duration_ms": 4200,
      "threshold_ms": 500,
      "concurrent_network_load": 9,
      "frame_drop_count": 0,
      "worst_frame_gap_ms": 0,
      "suspected_cause": "network_saturation"
    }
  ],
  "suspected_memory_leak_flag": false,
  "p50_action_duration_ms": 95,
  "p95_action_duration_ms": 780,
  "total_frame_drop_count": 0
}

suspected_cause distingue un hilo principal bloqueado (main_thread_blocked — hay brechas de fotogramas), una cascada de fetchs concurrentes (network_saturation — ≥5 en vuelo) y un tiempo de espera de navegación/duro (timeout_or_navigation — duración >3 s sin otras señales).

Comprobar qué versión de Playwright y modo HAR usa una traza

"La traza proviene de una configuración de CI desconocida. ¿Están disponibles los datos del cuerpo de la respuesta?"

extract_trace_metadata_strict inspecciona el archivo antes de que ejecutes cualquier otra herramienta:

{
  "format_version": 6,
  "har_mode": "embed",
  "retry_sessions": [
    { "session_id": "s1", "failed": false },
    { "session_id": "s2", "failed": true }
  ],
  "failed_session_id": "s2"
}

har_mode: "embed" significa que los fragmentos del cuerpo están en línea. "attach" significa que están en archivos de recursos separados. "omit" significa solo cabeceras — correlate_dom_and_network devolverá response_body_snippet vacíos en ese caso.

🏗️ Arquitectura

trace.zip
  ├── *.trace          → JSONL: before/after action pairs, console events, frame snapshots
  ├── *.network        → JSONL: HAR resource-snapshot entries
  └── resources/
      ├── page@*.jpeg  → screenshots taken during the run
      └── ...          → fonts, stylesheets, other captured resources

El analizador transmite cada archivo línea por línea (sin división completa del buffer) y cachea los resultados en proceso con un LRU (máx. 50 entradas), claveado por ruta + mtime. Releer la misma traza no modificada cuesta cero I/O.

Las instantáneas de fotogramas almacenan el DOM como arrays anidados (["TAG", {attrs}, ...children]). El traductor ARIA recorre este árbol y genera YAML compacto, reduciendo el costo de tokens en ~90% frente al HTML crudo.

🏗️ Stack tecnológico

  • @modelcontextprotocol/sdk — runtime del servidor MCP
  • adm-zip — extracción de zip
  • zod v4 — validación de esquema de entrada
  • TypeScript, ESLint, Prettier, Husky, GitHub Actions CI

📋 Scripts

npm run build        # compile TypeScript → dist/
npm run lint         # ESLint
npm run format       # Prettier --write
npm run format:check # Prettier check (used in CI)

📄 Licencia

MIT