easy-ui-mcp
easy-ui-mcp
Un servidor MCP (Model Context Protocol) dockerizado para pruebas de UI locales. Expone herramientas de automatización de navegador basadas en Playwright a través de HTTP/SSE para que un agente de IA (como Claude Code) pueda guiar flujos de UI web paso a paso y recibir un informe JSON + HTML con capturas de pantalla, sin LLM en el servidor y sin necesidad de escribir scripts de prueba.
Inicio rápido
docker compose up -d --build
curl http://localhost:8765/health
# {"status":"ok"}Conecta Claude Code:
claude mcp add --transport http easy-ui-mcp http://localhost:8765/mcpDespués pide a Claude Code que navegue a una página y haga una captura de pantalla: llamará a las herramientas que aparecen más abajo y te informará del resultado.
¿Usar esto desde otro repositorio? El registro de MCP es por proyecto: ejecuta también claude mcp add desde la raíz de ese repositorio (el contenedor anterior solo necesita ejecutarse una vez y se comparte entre repositorios). Consulta AGENTS.md → Uso de easy-ui-mcp desde otro repositorio para conocer todos los pasos necesarios.
Related MCP server: Playwright MCP Server
Redes
El contenedor se ejecuta con network_mode: host en docker-compose.yml (no con un puerto publicado en una red bridge). Esto es obligatorio, no opcional: el navegador que Playwright controla dentro de este contenedor necesita acceder a localhost:<port> en tu máquina host, donde se está ejecutando realmente el servidor de desarrollo de la aplicación objetivo (el repositorio que estás probando). Una red bridge por defecto le da al contenedor su propio espacio de nombres de red aislado, sin ninguna ruta de vuelta al host: las URL objetivo como http://localhost:8766 se quedarán colgadas o fallarán con ERR_CONNECTION_REFUSED, y http://<host-LAN-IP>:8766 simplemente agotará el tiempo de espera, incluso si el servidor objetivo está escuchando y es accesible mediante curl desde el shell del host.
Si haces un fork o vuelves a desplegar este contenedor en algún lugar donde network_mode: host no esté disponible (p. ej., Docker Desktop en macOS/Windows, donde la compatibilidad con la red host es limitada o inexistente), usa host.docker.internal como nombre de host objetivo en lugar de localhost al llamar a ui_navigate, y añade a docker-compose.yml extra_hosts: ["host.docker.internal:host-gateway"] como alternativa a network_mode: host.
Herramientas
ui_start_session, ui_end_session, ui_step, ui_navigate, ui_click, ui_fill, ui_assert, ui_check, ui_wait_for, ui_get_page_state, ui_take_screenshot, además de un envoltorio REST en POST /api/run-test para clientes que no usan MCP.
Etiqueta tus pasos
ui_step(label) agrupa todo lo que le sigue bajo un encabezado en lenguaje natural, hasta el siguiente ui_step. La etiqueta es la única declaración de intención del informe escrita por quien llama. El servidor usa plantillas deterministas como «Opened …», «Clicked …» y «Filled …» para las acciones individuales (no se ejecuta ningún LLM dentro del contenedor), por lo que una sesión sin etiquetas sigue mostrando descripciones de acciones legibles bajo un único grupo implícito.
ui_start_session target: "Account Access toggle smoke"
ui_step label: "Open the Settings page"
ui_navigate ...
ui_wait_for ...
ui_step label: "Turn Manual Invoice access on"
ui_click ...
ui_assert ...
ui_end_sessionLas sesiones sin llamadas a ui_step también se muestran correctamente, bajo un único grupo implícito.
Verificar vs. esperar: elige la opción correcta
Una sesión se marca como failed si falla cualquier acción dura, así que cómo verifiques decide si el informe dice la verdad.
Herramienta | Si la condición es falsa | Úsalo para |
| La sesión falla. | Una afirmación sobre la aplicación: «el interruptor ahora está activado» |
| Se registra y se muestra; la ejecución continúa | Una observación que quieres que aparezca en el informe pero que no debe condenar la ejecución |
| Sigue sondeando; si se agota el tiempo de espera, la sesión falla | Esperar a que la página se renderice o se estabilice |
No llames nunca a ui_assert en un bucle de reintentos para esperar algo: el primer resultado falso hace fallar la ejecución de forma permanente aunque la aplicación esté bien. Para eso está ui_wait_for.
Tanto para ui_check como para ui_wait_for, una condición que no puede ejecutarse (no hay ninguna página abierta o la expresión lanza una excepción) es siempre un fallo duro: eso es un error del arnés de pruebas, no una observación.
Las capturas de pantalla automáticas en caso de fallo tienen un presupuesto por sesión (FAILURE_SCREENSHOT_BUDGET, 3 por defecto). El contenido de capturas de pantalla idénticas solo se incrusta una vez en el informe HTML.
Qué muestra el informe
Una caja de veredicto (estado, objetivo, recuentos de pasos/acciones/fallos, duración), después la ejecución como pasos etiquetados con el resultado de cada paso y el tiempo transcurrido, luego cualquier problema del navegador y, por último, el registro de acciones en bruto plegado tras un elemento desplegable.
Los errores de consola, los errores de página no capturados y los fallos de solicitud a nivel de red se capturan automáticamente y se enumeran en Problemas del navegador: un flujo que pasa mientras la consola lanza errores es un falso verde que merece la pena ver. Las respuestas de error HTTP como 404 o 500 no activan el evento requestfailed de Playwright y no se enumeran automáticamente. Los problemas capturados son informativos y nunca cambian el veredicto. Se conservan hasta 50 por sesión; a partir de ahí, el informe indica que el resto se descartaron.
Consulta AGENTS.md para conocer la arquitectura y la guía completa de conexión MCP, y HARNESS.md para la referencia de la API REST. Los procedimientos de despliegue y reversión están en RUNBOOK.md.
Alcance (v1)
Solo web (Chromium), solo local, sin soporte móvil por ahora. Consulta PRD.md para conocer la intención completa del producto y PROJECT_SPEC.md para las decisiones de arquitectura.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables AI assistants to control browser automation through natural language prompts using Playwright, supporting visual element interaction, PDF generation, screenshots, and testing assertions.
- FlicenseNot gradedqualityDmaintenanceEnables web browser automation and inspection using structured data instead of screenshots, allowing AI agents to interact with web pages programmatically through the Playwright framework.
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to control web browsers through Playwright automation, providing 50+ tools for navigation, interaction, testing, accessibility audits, and visual testing across Chromium, Firefox, and WebKit.10MIT
- FlicenseNot gradedqualityCmaintenanceEnables AI assistants to execute browser automation, perform QA tasks, and generate test code through natural language commands using Playwright.5
Related MCP Connectors
AI-powered browser automation — navigate, click, fill forms, and extract data from any website.
Browser-backed QA with evidence and fix-ready reports for coding agents.
AI QA tester — real browsers scan sites for bugs, SEO, perf, and accessibility issues via chat.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/thunderkds/easy-ui-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server