react-native-eye

Servidor MCP de React Native · iOS y Android

Tu agente de código ve la app que está construyendo.

react-native-eye conecta Claude Code, Cursor o cualquier cliente MCP con una app de React Native en ejecución. El agente lee la pantalla, toca y escribe, y revisa los logs, la red y el estado. Funciona a través de Metro, así que la app no necesita ningún SDK ni cambios en el código.

Añádelo a Claude Code

claude mcp add react-native-eye -- npx -y react-native-eye@latest
Cursor, Codex y otros clientes
  • 35 herramientas
  • Simuladores de iOS, emuladores de Android
  • Sin telemetría
  • MIT

La pantalla

Welcome back Email Password Log in Forgot password? Create account

Lo que lee el agente

› observe
LAYOUT (js):
ERRORS:
none
LOGS:
[log] auth: no saved session
› get_layout {"search": ["Log in"]} Log in @196,468 (layout: js)

Ejemplo de salida para una pantalla de inicio de sesión. Señala una línea para encontrar el elemento.

Un flujo completo en una sola llamada

La mayoría de las herramientas para dispositivos le cuestan al agente una consulta al modelo por cada toque. Aquí el agente envía los pasos juntos y el servidor los ejecuta uno tras otro. Un redbox o una excepción no capturada detiene el flujo al instante, y el agente recibe el resultado de cada paso.

  • observeCaptura de pantalla, elementos interactivos, errores y logs recientes.
  • run_flowToques, escritura, esperas y comprobaciones, ejecutados en el servidor.
  • check_stateRuta actual, estado del store y errores no gestionados.
Solicitud · run_flow
{ "steps": [
  { "type": { "text": "a@b.c", "into": { "placeholder": "Email" } } },
  { "type": { "text": "hunter2", "into": { "placeholder": "Password" } } },
  { "tap": { "text": "Log in", "via": "os" } },
  { "wait_for": { "text": "Home", "timeout_ms": 3000 } },
  { "expect_not": { "text": "Error" } }
] }
Respuesta
Flow completed.

1. type({"text":"a@b.c","into":{"placeholder":"Email"}}) — ok (input: js)
2. type({"text":"hunter2","into":{"placeholder":"Password"}}) — ok (input: js)
3. tap({"text":"Log in","via":"os"}) — ok (input: os/runner)
4. wait_for({"text":"Home","timeout_ms":3000}) — ok
5. expect_not({"text":"Error"}) — ok

Lo que puede hacer el agente

35 herramientas en cinco grupos. Cada respuesta indica qué vía se usó, así que nada cambia en silencio.

  • Ver la pantalla

    Las posiciones de los elementos salen del runtime de JS de la app en unos 80 ms. El OCR lee lo que el árbol no puede: imágenes, WebViews y diálogos nativos.

    observescreenshotget_layoutread_screen_textget_component_tree
  • Actuar

    Una pulsación por JS llama al onPress del propio elemento en torno a un milisegundo. Un toque real pasa por el driver del dispositivo, para gestos, diálogos del sistema y vistas nativas.

    run_flowtaptype_textswipescroll_topress_keynavigateopen_url
  • Depurar

    Logs, peticiones de red con sus cuerpos, estado del store y evaluación de JS. Los fallos que LogBox se traga también se reportan.

    check_stateget_logsget_errorsget_networkget_stateeval_jsget_job
  • Medir

    Qué componentes se renderizaron y por qué, un perfil de CPU de Hermes, CPU por hilo y tiempos de fotograma. Sin configurar nada en la app.

    profile_rendersprofile_jssample_cpuget_fps
  • Gestionar dispositivos

    Instalar, lanzar y recargar la app, conceder permisos y grabar vídeo.

    connectlist_targetslist_deviceslaunch_appreload_appinstall_appopen_simulatorset_permissionrecord_videostop_recordingping

Herramientas compuestas: una llamada en lugar de muchas.

Dos caminos hacia la app

El servidor llega a la app por dos caminos y elige el más barato para cada llamada.

Tu agenteClaude Code, Cursor, Codex
MCP · stdio
react-native-eyeSe ejecuta en tu máquina
CDP · Metro
Runtime de JS (Hermes)Layout, pulsaciones, escritura, logs, red, estado
HTTP · localhost
Driver en el dispositivoToques reales, teclas, jerarquía de vistas del SO, capturas

A través del runtime de JS

≈ 1 ms por pulsación · ≈ 80 ms por layout de pantalla completa

El servidor recorre el árbol de fibers de React mediante el Chrome DevTools Protocol. Mide los elementos y llama directamente a los manejadores de pulsación y de texto, sin ningún toque.

A través del dispositivo

Precompilado en el paquete npm · se instala solo en el primer uso

Un runner de XCUITest en iOS y un servidor de instrumentación en Android envían toques reales y escriben cualquier texto Unicode. Si el driver no arranca, la entrada recurre a axe o adb, y la respuesta lo indica.

Medido: el driver del dispositivo frente a las herramientas que sustituye

Simulador de iOS. Un deslizamiento del feed, mediana de 40.
driver
0.93 s
axe
26.68 s
3 de 40 agotaron el tiempo a los 90 s
Emulador de Android. Jerarquía de vistas sobre un vídeo en reproducción, mediana de 10.
driver
4.60 s
uiautomator
27.10 s
9 de 10 fallaron

De las pruebas de campo del propio proyecto sobre un feed de vídeo con carga, en un simulador de iOS 26 y un emulador de Android 16. Ambos gráficos comparten la misma escala.

Conéctalo en tres pasos

  1. Añade el servidor a tu cliente

    # en la carpeta de tu proyecto
    claude mcp add react-native-eye -- npx -y react-native-eye@latest
  2. Inicia Metro y una build de desarrollo

    Ejecuta la app en un simulador de iOS o un emulador de Android como siempre. Metro se detecta automáticamente en los puertos 8081–8083 y 19000–19002. Para cualquier otro puerto, añade --port 8090 a los argumentos.

  3. Pídeselo al agente

    Conéctate a mi app y dime qué hay en la pantalla.

    El agente llama a connect y luego a observe. La primera llamada en cada dispositivo instala el driver una sola vez.

Sin telemetría. Sin cuentas. Sin nube.

El único tráfico de red va a localhost: Metro y los drivers del dispositivo. Un test hace fallar la build si aparece una URL externa en el código del servidor.

Conviene saber

  • Solo builds de desarrollo. Una build de producción no tiene conexión con Metro a la que acoplarse.
  • Probado en simuladores de iOS y emuladores de Android.
  • React Native anterior a 0.85 permite un solo depurador a la vez, así que cierra los demás primero.

Servidor MCP de React Native: preguntas frecuentes

¿Qué es un servidor MCP de React Native?
Un servidor MCP da a un agente de programación con IA herramientas que puede llamar. Un servidor MCP de React Native conecta esas herramientas a una app React Native en ejecución, para que el agente lea la pantalla, toque, escriba y revise logs, peticiones de red y estado mientras escribe código. react-native-eye lo hace a través de Metro, sin SDK en la app.
¿Con qué agentes de IA funciona?
Claude Code, Cursor, Codex, Claude Desktop y cualquier otro cliente que ejecute servidores MCP por stdio.
¿Funciona con Expo?
Sí. Es compatible con Expo SDK 54+ y React Native 0.70+, como build de desarrollo con Metro y Hermes en marcha.
¿Tengo que cambiar el código de mi app?
No. El servidor se conecta al endpoint de depuración que Metro ya expone. Una línea opcional, globalThis.__RNE_STORES__ = …, facilita leer el estado de los stores.
¿Funciona en iOS y Android?
Sí: simuladores de iOS en macOS y emuladores de Android a través de adb. Necesita una build de desarrollo; una build de producción no tiene Metro al que conectarse.
¿Es gratis?
Sí. Tiene licencia MIT, sin cuenta, sin límite de uso y sin telemetría.