emulator-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@emulator-mcp open http://localhost:3000 on iPhone, iPad and laptop, then compare screenshots"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
emulator-mcp
MCP para que los agentes de programación vean la misma página en varios tamaños, interactúen y comprueben el resultado sin perder el estado entre llamadas.
Pantallas persistentes: móviles, tablets y escritorio.
Panel local lado a lado con capturas actualizadas cada 3 segundos.
Scroll, navegación, clics y escritura en todas las pantallas o en una concreta.
Capturas para modelos con visión, árbol accesible, auditoría responsive y eventos de consola/red.
Chrome o Edge local. Sin claves API, sin servicio remoto ni descarga automática de navegadores.
Installation
Necesitás Node.js 20 o superior con npm/npx y Chrome o Microsoft Edge. El MCP trabaja en la computadora donde lo ejecuta tu agente. Tu aplicación debe estar iniciada y ser accesible desde esa computadora.
El comando corto descarga el paquete desde el registro npm. No necesitás clonar el repositorio ni instalar Git. Ejecutá los instaladores desde la carpeta de la aplicación que quieras revisar.
Conectar directamente como servidor MCP
Para Claude Code:
claude mcp add emulator -- npx -y emulator-mcpPara Codex:
codex mcp add emulator -- npx -y emulator-mcpEn OpenCode, fusioná este bloque con tu configuración:
{
"mcp": {
"emulator": {
"type": "local",
"command": ["npx", "-y", "emulator-mcp"],
"enabled": true,
"timeout": 60000
}
}
}Los clientes con formato mcpServers pueden usar el bloque de otros clientes. Reiniciá el cliente y pedile al agente que abra tu URL con open_responsive_session.
También podés usar los instaladores siguientes para escribir la configuración del proyecto automáticamente.
OpenCode
npx -y emulator-mcp install opencodeAgrega el servidor local a opencode.json o al opencode.jsonc existente. Después reiniciá OpenCode y comprobá la conexión con opencode mcp list.
Cursor
npx -y emulator-mcp install cursorEscribe .cursor/mcp.json en el proyecto. Recargá Cursor y habilitá el servidor en sus ajustes MCP si te lo solicita.
Claude Code
npx -y emulator-mcp install claude-codeAgrega el servidor a .mcp.json del proyecto. Abrí Claude Code para aprobar el servidor cuando lo solicite. También podés usar su comando nativo para instalación a nivel usuario:
claude mcp add --scope user --transport stdio emulator-mcp -- npx -y emulator-mcpCodex
Usá su comando nativo; requiere que la CLI de Codex esté instalada:
codex mcp add emulator-mcp -- npx -y emulator-mcpDespués reiniciá o reconectá Codex y verificá que aparezca el servidor.
VS Code (configuración local compatible)
npx -y emulator-mcp install vscodeEscribe el formato servers en .vscode/mcp.json. Su disponibilidad depende del agente/harness activo en VS Code; las configuraciones actuales de Copilot también permiten agregar un servidor mediante MCP: Add Server → Command (stdio) usando el comando de ejecución que figura abajo.
Otros clientes MCP locales
Comando del servidor: npx. Argumentos:
["-y", "emulator-mcp"]Si tu cliente usa mcpServers, fusioná este bloque con su configuración:
{
"mcpServers": {
"emulator-mcp": {
"command": "npx",
"args": ["-y", "emulator-mcp"]
}
}
}En Windows, algunos clientes requieren command: "cmd" con argumentos ["/c", "npx", "-y", "emulator-mcp"] para encontrar el ejecutable de npx. No cambies esto si tu cliente ya conecta correctamente.
El instalador conserva comentarios JSONC y otros servidores, respalda los archivos existentes y se niega a reemplazar una entrada emulator-mcp diferente. install opencode --dry-run muestra la configuración sin escribirla. La primera ejecución necesita conexión para descargar el paquete y sus dependencias; las siguientes aprovechan la caché de npm. La instalación registra el servidor; no comprueba por sí sola la conexión del agente ni acepta sus avisos de confianza.
Related MCP server: Render & Verify MCP
Primer uso
Pedile al agente:
Usá emulator-mcp para abrir http://localhost:3000 en iPhone SE, iPad y laptop. Mostrame el enlace del panel, revisá la página por secciones haciendo scroll, compará las capturas y corregí los problemas responsive. Volvé a capturar para verificar.
El agente puede seguir este flujo:
open_responsive_session: abre la URL en varios dispositivos.Abre o comparte el
dashboardUrldevuelto para que puedas mirar el panel.observe_responsive_sessioncondom:trueyreturnImages:true: obtiene elementos accesibles y capturas.interact_responsive_session: hace scroll, clics o escribe. El estado persiste entre llamadas.Tras modificar código,
navigate_responsive_sessiondirige todas a la URL de la aplicación.close_responsive_session: libera las pantallas cuando termine.
El modelo debe admitir imágenes para interpretar las capturas. Con modelos de texto puede usar el árbol accesible, evaluaciones y la auditoría. Las herramientas no deciden ni corrigen código solas: esa tarea corresponde al agente.
Demo sin configurar un agente
npx -y emulator-mcp demoImprime un enlace al panel con la página de prueba incluida. Para tu aplicación ya iniciada:
npx -y emulator-mcp demo http://localhost:3000Mantené ese proceso abierto y usá Ctrl+C para cerrar la demo.
Herramientas
Herramienta | Uso |
| Abre la misma URL en varios tamaños; devuelve IDs y enlace al panel |
| Recupera las sesiones y URLs actuales del proceso |
| PNG por tamaño, DOM accesible opcional, auditoría y eventos |
| Navega todas a una URL conservando sus contextos y cookies |
| Repite pasos en todas o actúa sobre un |
| Cierra páginas y panel |
| Catálogo de dispositivos y resoluciones |
| Captura y auditoría puntual de un dispositivo |
| Capturas puntuales en varios tamaños |
| Auditoría responsive sin imágenes |
| Flujo completo dentro de una llamada temporal |
| Navegador, directorio de capturas y diagnóstico |
Las herramientas puntuales cierran sus páginas al terminar. Las sesiones persistentes admiten hasta 6 tamaños y 3 sesiones por proceso. Por defecto: iPhone SE, iPhone 15 Pro Max, iPad Pro 11 y laptop.
Ejemplos de argumentos MCP
Abrir una comparación:
{"url":"http://localhost:3000","devices":["iphone-se","ipad-pro-11","laptop"]}Observar con imágenes y auditoría (reemplazá ID por el sessionId devuelto):
{"sessionId":"ID","dom":true,"audit":true,"returnImages":true}Scroll hasta una sección en todas las pantallas:
{"sessionId":"ID","screenId":"all","steps":[{"action":"scroll","selector":"#contacto"}]}También admite {"action":"scroll","to":"bottom"}, to:"top" o y:800. Usá un elemento para comparar la misma sección cuando su posición cambia según el tamaño.
Acciones: navigate, click, tap, dblclick, hover, type, press, scroll, wait_for, screenshot, get_text, count, eval, assert, back, reload. Los localizadores admiten selector, testId, label, placeholder, role + name, alt o text. Las sesiones mantienen sus tamaños fijos; set_viewport solo está disponible en interact_on.
Comportamiento y límites
El panel muestra capturas de la región visible; se actualiza cada 3 segundos mientras está abierto. Permite ajustar la escala y pausar. Las acciones, incluido scroll, se ejecutan desde el MCP; el panel no transmite clics ni rueda del mouse a las páginas.
fullPage:trueen la observación guarda capturas de toda la página. En páginas largas pueden superar el límite de imágenes de la respuesta; el archivo sigue disponible por su ruta.Cada tamaño tiene cookies, almacenamiento y scroll independientes. Se inicia en la misma URL, pero un flujo puede terminar en rutas distintas. Para un menú que solo existe en móvil, actuá sobre ese
screenId.Las sesiones viven dentro de un proceso MCP y desaparecen al cerrarlo. Dos agentes que ejecutan procesos separados tienen sesiones independientes.
Emula páginas y aplicaciones web; no ejecuta Android, iOS ni aplicaciones nativas. Los perfiles iPhone se renderizan en Chromium, no en Safari real.
La auditoría usa heurísticas; los resultados necesitan revisión visual. Aprobarla no equivale a una certificación de accesibilidad ni a validar producción.
El panel escucha en
127.0.0.1con una ruta aleatoria por sesión. No necesita iframes ni quitar CSP/X-Frame-Options. El enlace del panel es una vista local, no un endpoint MCP remoto.El agente puede ejecutar acciones reales en la web abierta. Usá cuentas y entornos adecuados para tus pruebas.
Configuración
Variable | Uso |
| Orden de navegadores: |
| Si está definida, muestra las ventanas del navegador |
| Directorio personalizado para PNG |
La CLI guarda capturas en ~/.emulator-mcp/captures. El módulo src/index.cjs, usado directamente durante desarrollo, conserva el directorio captures/ del proyecto. Para usar Chromium de Playwright, instalalo explícitamente con npx playwright install chromium desde una copia del proyecto y ajustá EMULATOR_MCP_BROWSER=chromium.
Desarrollo y pruebas
git clone https://github.com/damipineda/emulator-mcp.git
cd emulator-mcp
npm ci
npm run smoke
npm test
npm run demo
npm pack --dry-runLas pruebas cubren registro de herramientas, capturas y auditoría con Chrome/Edge, interacción, sesiones por transporte MCP stdio e instalación con preservación de configuraciones. No constituyen una prueba de cada interfaz de agente: conectá y ejecutá una herramienta desde tu cliente para verificar su integración.
Referencias y licencia
Inspirado en Mobile-Simulator. Su extensión y sus assets no se redistribuyen; este proyecto usa contextos de navegador controlados por Playwright. Ver NOTICE.md.
Formatos de integración consultados: OpenCode, Cursor, Claude Code, Codex, VS Code.
Licencia MIT. Código fuente en GitHub y paquete público en npm.
Publicación del mantenedor
npm login
npm run test:package
npm publish --access publicDespués de publicar, verificar npm view emulator-mcp version y ejecutar node test/package.cjs emulator-mcp. Los usuarios no necesitan una cuenta npm para descargar el paquete público.
Versión GitHub disponible
La versión anterior distribuida directamente desde GitHub sigue disponible:
npx -y --package=https://github.com/damipineda/emulator-mcp/archive/refs/tags/v0.2.0.tar.gz emulator-mcpAvailable Tools
12 toolscheck_responsiveAudit layout across screensARead-only
Abre la URL en varias pantallas y reporta SOLO problemas de responsive, sin imagenes: desborde horizontal con el selector exacto que lo causa, texto recortado, targets tocables chicos, imágenes fuera de viewport, meta viewport faltante o que bloquea el zoom, y que media queries activan en cada ancho. Severidades: high = se rompe el layout, medium = se pierde contenido o baja performance, low = incomodo en tactil, info = contexto. Cada pantalla reporta viewport.deviceWidthPx (la pantalla real) y viewport.layoutWidthPx (lo que mide window.innerWidth); si layoutWidthPx > deviceWidthPx la pagina no es responsive ahi. Usa esta tool para verificar un rediseño o para encontrar breakpoints rotos; despues captura con screenshot_on el dispositivo que falla para verlo.
Inputs: url (required), block, locale, devices, +10 more.
close_responsive_sessionA
Cierra una comparacion responsive completa: libera sus paginas, contextos y servidor del panel visual. Usa esta herramienta al terminar para no acumular navegadores. Las capturas guardadas permanecen disponibles en disco.
Inputs: sessionId (required).
emulator_statusServer statusARead-only
Dice que navegador local usa la emulacion, donde caen las capturas y cuantas pantallas hay disponibles. Usala para diagnosticar antes de culpar a la pagina.
Inputs: no named parameters.
interact_onDrive a flow on an emulated screenA
Ejecuta una secuencia de pasos en UNA pantalla emulada dentro de la misma sesion de navegador: navegar, tocar, escribir, esperar, scrollear, medir con JS y capturar. Es la tool para probar flujos (login, checkout, menu hamburguesa, scroll) y verificar que el resultado se vea bien en ese dispositivo. Cada paso es { action, ...args }. Localizadores aceptados por paso: selector (CSS o Playwright), text, role+name, label, placeholder, alt, testId. Acciones: navigate, click, tap, dblclick, hover, type, press, scroll, wait_for, set_viewport, screenshot, get_text, count, eval, assert, back, reload. Ejemplo: [{action:"navigate",url}, {action:"click",text:"Menu"}, {action:"assert",text:"Reservar"}, {action:"screenshot",fullPage:false}]. Se detiene en el primer paso que falla (salvo continueOnError). No podras mantener una sesion entre llamadas: meté todo el flujo en una sola invocacion. Si la pagina desborda el ancho del dispositivo, click/tap se resuelven por coordenada (touchscreen.tap o mouse.click) porque el chequeo de hit-target de Playwright falla con el layout expandido; el paso devuelve "via" con lo que usó.
Inputs: url (required), steps (required), name, device, +5 more.
interact_responsive_sessionA
Ejecuta pasos en una pantalla o repite la secuencia en todas (screenId="all", predeterminado). Mantiene el estado para la proxima llamada. Usa localizadores semanticos porque el DOM puede variar segun el tamaño. Si un menu solo existe en movil, actua sobre ese screenId. Devuelve cada fallo por pantalla; despues usa observe_responsive_session para ver el resultado.
Inputs: steps (required), sessionId (required), screenId.
list_devicesList emulated screensARead-only
Devuelve los ids de pantallas que aceptan las demas tools (telefonos, tablets, laptops, desktops, con viewport, DPR, mobile y touch reales). Usa primero esta tool si no sabes que dispositivo pedir. Cualquier nombre del catalogo interno de Playwright (por ejemplo "iPhone 12", "Pixel 5", "Desktop Chrome") tambien funciona, y podes forzar apaisado agregando " landscape" al id.
Inputs: group, query.
list_responsive_sessionsARead-only
Lista las comparaciones responsive abiertas en este proceso MCP, con sus sessionIds, screenIds, tamaños, URLs actuales y enlace al panel visual. Las sesiones conservan su estado entre llamadas y desaparecen al detener el servidor.
Inputs: no named parameters.
observe_responsive_sessionARead-only
Observa las pantallas abiertas sin recargarlas: guarda un PNG por tamaño y devuelve estado, URLs y eventos recientes de consola/red. Pide dom para obtener el arbol accesible, audit para revisar el layout y returnImages para que el agente vea las capturas dentro de la respuesta MCP.
Inputs: sessionId (required), dom, audit, fullPage, +1 more.
open_responsive_sessionB
Abre la MISMA URL en varios tamaños y mantiene las paginas entre llamadas MCP. Devuelve sessionId, screenIds y dashboardUrl: abre ese enlace para ver capturas lado a lado actualizadas cada 3 segundos. Cada pantalla mantiene su propio estado web. No requiere iframes ni quitar cabeceras de seguridad.
Inputs: url (required), locale, devices, colorScheme.
preview_devicesSame page on many screensARead-only
Captura la MISMA URL en varias pantallas a la vez (hasta 4 en paralelo) y devuelve un PNG por dispositivo con el desborde horizontal de cada uno. Es la tool para responder "como se ve esto en movil, tablet y desktop". Sin "devices" usa el set standard: iphone-15-max, galaxy-s24, ipad-pro-11, laptop, desktop-hd. Si solo necesitas saber donde se rompe el layout, usa check_responsive: hace las mismas aperturas y no baja imagenes.
Inputs: url (required), block, locale, devices, +9 more.
screenshot_onScreenshot on one screenARead-only
Abre una URL dentro del navegador local emulando UNA pantalla concreto (viewport, DPR, mobile flag, touch y user-agent reales) y guarda un PNG. Tambien corre una auditoria responsive en ese viewport y devuelve los hallazgos junto al path de la imagen. Pedido tipico: { url, device: "iphone-15-max" }. Para cambiar tamano sin dispositivo: { url, viewport: { width: 380, height: 800 } }. Devolve el path en captures/; pide returnImage=true solo si necesitas ver la imagen, porque consume muchos tokens.
Inputs: url (required), name, block, device, +11 more.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 12 tools
There is real overlap: preview_devices, check_responsive, and open_responsive_session all 'open one URL across multiple screens', and interact_on mirrors interact_responsive_session. However, the descriptions sharply differentiate them (images vs. problems-only vs. persistent session; single-shot vs. stateful), so an agent can tell them apart with care.
Two recognizable families exist (_on: screenshot_on, interact_on; _responsive_session: open/list/observe/navigate/interact/close), but conventions are mixed across the set (screenshot_on, preview_devices, check_responsive, list_devices, emulator_status) with inconsistent verb/noun ordering and suffixes.
12 tools is well within a reasonable range for a device-emulation/QA server. Six of them are session lifecycle management, which is somewhat heavy but justified by the persistent-session feature.
Coverage spans device listing, single/multi screenshots, responsive auditing, scripted interaction, persistent sessions, navigation, observation, and cleanup, with diagnostics (emulator_status). Missing niceties like visual diffing or video capture, but core workflows are complete.
Maintenance
Related MCP Connectors
Give AI agents a real cloud Chrome: open sessions, navigate, read pages, click, type and screenshot.
Hosted browser for agents: open pages, search the web, extract data, read PDFs and take screenshots.
Launch, inspect, control, and share isolated cloud browsers for your agents.
Cloud browser, web extraction, screenshots, and remote CDP tools for AI agents.
Related MCP Servers
- AlicenseAqualityBmaintenanceEnables AI agents to rapidly drive and inspect real web pages through persistent browser sessions, using accessibility-tree snapshots and DevTools-grade diagnostics to identify and diagnose issues.26MIT
- AlicenseAqualityCmaintenanceEnables AI coding agents to open and exercise web applications in an isolated Chromium browser, capture screenshots and runtime/network diagnostics, and run deterministic page checks with linked evidence.121MIT
- AlicenseNot gradedqualityAmaintenanceEnables AI agents to inspect live web and responsive UIs across mobile and desktop sessions, returning measured text findings on contrast ratios, touch-target sizes, overflow, and theme drift instead of screenshot guesses. It also lets a human and the agent share one live panel, so the agent can navigate, tap, and type while reading the user's pinned notes and frames.95 npmMIT
- AlicenseNot gradedqualityAmaintenanceEnables AI agents to navigate, inspect, and interact with real websites via a persistent headless Chromium session, returning compact structured orientations, targeted element queries, and full detail only on request rather than dumping raw accessibility trees. This cuts token usage by roughly 10–140x on content-heavy pages while still supporting clicking, typing, form filling, screenshots, dialog handling, and multi-tab sessions.4 npmMIT