playwright-network-chaos-mcp
Caos dinámico de red en Playwright: errores 503, latencia, caídas en pleno vuelo
Documentación
playwright-network-chaos-mcp 🐸💥
Un servidor MCP que brinda a los agentes de IA control dinámico de caos de red sobre sesiones de navegador Playwright.
Tus pruebas se ejecutan en redes perfectas. Tus usuarios no. Este MCP permite a los agentes de IA simular caídas de API, inyectar latencia, interrumpir conexiones a mitad de vuelo y bloquear recursos de terceros — y luego verificar si la aplicación maneja la situación con elegancia.
🤔 El Problema
Los entornos de CI tienen conectividad impecable. Las APIs responden en milisegundos. Los CDN nunca se caen. Entonces tus pruebas pasan — y luego la producción se rompe cuando el servicio de pagos devuelve un 503, la red se cae a mitad del proceso de pago, o Google Analytics se cuelga durante 8 segundos y congela la página.
Los agentes de IA que escriben pruebas de Playwright no tienen forma de introducir o razonar sobre inestabilidad de red. No pueden preguntar:
- 🙈 ¿Muestra la página de pago un estado de error cuando la API de pagos falla?
- 🙈 ¿Aparece el cargador esqueleto mientras la API del panel es lenta?
- 🙈 ¿Sigue funcionando la aplicación si se bloquean todos los scripts de seguimiento?
- 🙈 ¿Qué sucede si la red se cae después de enviar el pedido pero antes de que llegue la respuesta?
playwright-network-chaos-mcp soluciona eso.
🛠️ Herramientas
simulate_api_failure
Intercepta solicitudes que coinciden con un patrón y las fuerza a devolver un código de estado de error. Verifica si la aplicación muestra una interfaz de respaldo.
{
"url": "https://your-app.com/checkout",
"intercept_pattern": "**/api/payment**",
"status_code": 503,
"fallback_selector": ".error-boundary",
"wait_ms": 2000
}
{
"intercepted_count": 2,
"fallback_found": true,
"fallback_selector": ".error-boundary",
"page_state": {
"page_errors": [],
"console_errors": ["Failed to load resource: 503"]
}
}
inject_latency
Añade retraso artificial a las solicitudes coincidentes. Verifica si aparecen estados de carga mientras la aplicación espera.
{
"url": "https://your-app.com/dashboard",
"intercept_pattern": "**/api/**",
"latency_ms": 3000,
"jitter_ms": 500,
"loading_selector": ".skeleton-loader"
}
{
"intercepted_count": 4,
"intercepted_requests": [
{ "url": "https://api.your-app.com/users", "method": "GET", "delay_ms": 3241 }
],
"loading_state_found": true,
"load_time_ms": 3890
}
block_resources
Aborta solicitudes a patrones de URL específicos — para probar caídas de terceros (analítica, CDN, píxeles de seguimiento).
{
"url": "https://your-app.com",
"block_patterns": ["**/analytics**", "*.doubleclick.net/**", "**/hotjar**"],
"core_content_selector": ".main-content",
"wait_ms": 2000
}
{
"blocked_count": 7,
"blocked_urls": ["https://www.google-analytics.com/analytics.js", "..."],
"core_content_found": true,
"page_state": { "page_errors": [], "console_errors": [] }
}
simulate_network_drop
Aborta solicitudes a mitad de vuelo después de un retraso — simulando pérdida de conexión entre solicitud y respuesta.
{
"url": "https://your-app.com/checkout",
"intercept_pattern": "**/api/order**",
"drop_after_ms": 800,
"fallback_selector": ".network-error-toast",
"wait_ms": 3000
}
{
"intercepted_count": 1,
"fallback_found": true,
"fallback_selector": ".network-error-toast",
"page_state": { "page_errors": ["TypeError: Failed to fetch"] }
}
trigger_system_network_error
Aborta solicitudes con un código de error a nivel de sistema operativo — simulando fallos de DNS, bloqueos de firewall y reinicios de conexión.
{
"url": "https://your-app.com/dashboard",
"intercept_pattern": "**/api/**",
"error_code": "addressunreachable",
"fallback_selector": ".network-error"
}
{
"error_code": "addressunreachable",
"intercepted_count": 3,
"fallback_found": true,
"page_state": { "page_errors": [], "console_errors": ["net::ERR_ADDRESS_UNREACHABLE"] }
}
simulate_stateful_failure
Falla las primeras N solicitudes y luego permite que las siguientes tengan éxito — probando lógica de reintentos y flujos de recuperación.
{
"url": "https://your-app.com/dashboard",
"intercept_pattern": "**/api/data**",
"http_status": 503,
"failure_count": 2,
"success_payload": "{\"data\":[]}",
"fallback_selector": ".retry-button"
}
{
"failure_count": 2,
"actual_failed": 2,
"actual_succeeded": 1,
"intercepted_requests": [
{ "url": "...", "method": "GET", "status": 503, "attempt": 1, "outcome": "failed" },
{ "url": "...", "method": "GET", "status": 200, "attempt": 3, "outcome": "passed" }
],
"fallback_found": true
}
inject_response_corruption
Sirve respuestas malformadas a nivel de protocolo — JSON sin terminar, mentiras de content-length o cargas truncadas.
{
"url": "https://your-app.com/checkout",
"intercept_pattern": "**/api/order**",
"corruption_type": "malformed_json",
"fallback_selector": ".parse-error"
}
{
"corruption_type": "malformed_json",
"intercepted_count": 1,
"fallback_found": false,
"page_state": { "page_errors": ["SyntaxError: Unexpected token u in JSON"] }
}
assert_chaos_handled
Inyecta un estado HTTP de caos y devuelve un veredicto estructurado de aprobado/fallido — chaos_survived es verdadero solo cuando aparece la interfaz de respaldo y no hay excepciones de JavaScript no manejadas.
{
"url": "https://your-app.com/checkout",
"intercept_pattern": "**/api/**",
"http_status": 500,
"expected_fallback_selector": ".error-boundary"
}
{
"http_status": 500,
"unhandled_exceptions": [],
"console_errors": ["Failed to load resource: 500"],
"fallback_ui_detected": true,
"chaos_survived": true
}
🚀 Instalación
npx playwright-network-chaos-mcp
O instala globalmente:
npm install -g playwright-network-chaos-mcp
npx playwright install chromium
Configuración de Claude Desktop
{
"mcpServers": {
"playwright-network-chaos-mcp": {
"command": "npx",
"args": ["-y", "playwright-network-chaos-mcp"]
}
}
}
💡 Ejemplos de Prompts para Agentes
"Verifica si la página de pago muestra un estado de error adecuado cuando la API de pagos devuelve 503"
"Simula un retraso de API de 3 segundos en el panel y verifica que aparezca el cargador esqueleto"
"Bloquea toda la analítica y los scripts de seguimiento y confirma que el contenido principal aún se carga"
"Interrumpe la solicitud de envío del pedido a mitad de vuelo y verifica si el usuario ve un mensaje de error"
"Simula un fallo de DNS para la API y verifica si se renderiza el límite de error"
"Falla las primeras 3 solicitudes y luego deja que tengan éxito — ¿la aplicación reintenta y se recupera automáticamente?"
"Inyecta JSON malformado y verifica que la aplicación no se bloquee — devuelve un veredicto de caos"
🔗 Proyectos Relacionados
- playwright-trace-decoder-mcp — análisis de causa raíz de fallos de CI a partir de trazas de Playwright
- flakiness-knowledge-graph-mcp — grafo de conocimiento de patrones de pruebas inestables
- ast-impact-mapper-mcp — encuentra pruebas afectadas por cambios de código mediante TypeScript AST
- zod-contract-mock-forge-mcp — generación determinista de mocks a partir de esquemas Zod
- playwright-spatial-layout-mcp — conciencia espacial geométrica de diseños web
📄 Licencia
MIT © vola-trebla