Skip to main content
Glama

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-mcp

Para Codex:

codex mcp add emulator -- npx -y emulator-mcp

En 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 opencode

Agrega 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 cursor

Escribe .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-code

Agrega 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-mcp

Codex

Usá su comando nativo; requiere que la CLI de Codex esté instalada:

codex mcp add emulator-mcp -- npx -y emulator-mcp

Después reiniciá o reconectá Codex y verificá que aparezca el servidor.

VS Code (configuración local compatible)

npx -y emulator-mcp install vscode

Escribe 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:

  1. open_responsive_session: abre la URL en varios dispositivos.

  2. Abre o comparte el dashboardUrl devuelto para que puedas mirar el panel.

  3. observe_responsive_session con dom:true y returnImages:true: obtiene elementos accesibles y capturas.

  4. interact_responsive_session: hace scroll, clics o escribe. El estado persiste entre llamadas.

  5. Tras modificar código, navigate_responsive_session dirige todas a la URL de la aplicación.

  6. 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 demo

Imprime un enlace al panel con la página de prueba incluida. Para tu aplicación ya iniciada:

npx -y emulator-mcp demo http://localhost:3000

Mantené ese proceso abierto y usá Ctrl+C para cerrar la demo.

Herramientas

Herramienta

Uso

open_responsive_session

Abre la misma URL en varios tamaños; devuelve IDs y enlace al panel

list_responsive_sessions

Recupera las sesiones y URLs actuales del proceso

observe_responsive_session

PNG por tamaño, DOM accesible opcional, auditoría y eventos

navigate_responsive_session

Navega todas a una URL conservando sus contextos y cookies

interact_responsive_session

Repite pasos en todas o actúa sobre un screenId

close_responsive_session

Cierra páginas y panel

list_devices

Catálogo de dispositivos y resoluciones

screenshot_on

Captura y auditoría puntual de un dispositivo

preview_devices

Capturas puntuales en varios tamaños

check_responsive

Auditoría responsive sin imágenes

interact_on

Flujo completo dentro de una llamada temporal

emulator_status

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:true en 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.1 con 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

EMULATOR_MCP_BROWSER

Orden de navegadores: chrome,msedge,chromium

EMULATOR_MCP_HEADED

Si está definida, muestra las ventanas del navegador

EMULATOR_MCP_CAPTURE_DIR

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-run

Las 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 public

Despué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-mcp

Available Tools

12 tools
check_responsiveAudit layout across screensA
Read-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 statusA
Read-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 screensA
Read-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_sessionsA
Read-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_sessionA
Read-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 screensA
Read-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 screenA
Read-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

    A3.7/5.0

    Scored across 12 tools

    Disambiguation4/5

    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.

    Naming Consistency3/5

    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.

    Tool Count4/5

    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.

    Completeness4/5

    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

    ActivityNo data
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      B
      maintenance
      Enables 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.
      26
      MIT
    • A
      license
      Not graded
      quality
      A
      maintenance
      Enables 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 npm
      MIT
    • A
      license
      Not graded
      quality
      A
      maintenance
      Enables 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 npm
      MIT