react-native-eye

Serveur MCP React Native · iOS et Android

Votre agent de code voit l'app qu'il construit.

react-native-eye connecte Claude Code, Cursor ou tout autre client MCP à une app React Native en cours d'exécution. L'agent lit l'écran, touche et saisit du texte, puis vérifie les logs, le réseau et l'état. Tout passe par Metro : l'app n'a besoin ni de SDK ni de modification du code.

L'ajouter à Claude Code

claude mcp add react-native-eye -- npx -y react-native-eye@latest
Cursor, Codex et autres clients
  • 35 outils
  • Simulateurs iOS, émulateurs Android
  • Aucune télémétrie
  • MIT

L'écran

Welcome back Email Password Log in Forgot password? Create account

Ce que lit l'agent

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

Exemple de sortie pour un écran de connexion. Pointez une ligne pour retrouver l'élément.

Un parcours complet en un seul appel

Avec la plupart des outils, chaque toucher coûte à l'agent un aller-retour avec le modèle. Ici, l'agent envoie les étapes ensemble et le serveur les enchaîne. Un redbox ou une exception non interceptée arrête le parcours aussitôt, et l'agent reçoit le résultat de chaque étape.

  • observeCapture d'écran, éléments interactifs, erreurs et logs récents.
  • run_flowTouchers, saisie, attentes et assertions, exécutés côté serveur.
  • check_stateRoute actuelle, état du store et erreurs non gérées.
Requête · 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" } }
] }
Réponse
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

Ce que l'agent peut faire

35 outils en cinq groupes. Chaque réponse indique le chemin utilisé : rien ne change en silence.

  • Voir l'écran

    Les positions des éléments viennent du runtime JS de l'app en 80 ms environ. L'OCR lit ce que l'arbre ne contient pas : images, WebViews et dialogues natifs.

    observescreenshotget_layoutread_screen_textget_component_tree
  • Agir

    Un appui JS appelle le onPress de l'élément lui-même en une milliseconde environ. Un vrai toucher passe par le driver installé sur l'appareil, pour les gestes, les dialogues système et les vues natives.

    run_flowtaptype_textswipescroll_topress_keynavigateopen_url
  • Déboguer

    Logs, requêtes réseau avec leur contenu, état du store et évaluation de JS. Les plantages avalés par LogBox sont signalés eux aussi.

    check_stateget_logsget_errorsget_networkget_stateeval_jsget_job
  • Mesurer

    Quels composants ont été rendus et pourquoi, un profil CPU Hermes, le CPU par thread et le temps par image. Aucune configuration dans l'app.

    profile_rendersprofile_jssample_cpuget_fps
  • Gérer les appareils

    Installer, lancer et recharger l'app, accorder des permissions et enregistrer une vidéo.

    connectlist_targetslist_deviceslaunch_appreload_appinstall_appopen_simulatorset_permissionrecord_videostop_recordingping

Outils composites : un appel au lieu de plusieurs.

Deux chemins vers l'app

Le serveur atteint l'app par deux chemins et choisit le moins coûteux pour chaque appel.

Votre agentClaude Code, Cursor, Codex
MCP · stdio
react-native-eyeS'exécute sur votre machine
CDP · Metro
Runtime JS (Hermes)Layout, appuis, saisie, logs, réseau, état
HTTP · localhost
Driver sur l'appareilVrais touchers, touches, hiérarchie de vues de l'OS, captures d'écran

Par le runtime JS

≈ 1 ms par appui · ≈ 80 ms pour le layout d'un écran entier

Le serveur parcourt l'arbre de fibers de React via le Chrome DevTools Protocol. Il mesure les éléments et appelle directement les gestionnaires d'appui et de texte, sans aucun toucher.

Par l'appareil

Précompilé dans le paquet npm · s'installe tout seul au premier usage

Un runner XCUITest sur iOS et un serveur d'instrumentation sur Android envoient de vrais touchers et saisissent n'importe quel texte Unicode. Si le driver ne démarre pas, la saisie se rabat sur axe ou adb, et la réponse le signale.

Mesuré : le driver de l'appareil face aux outils qu'il remplace

Simulateur iOS. Un balayage du fil, médiane sur 40.
driver
0.93 s
axe
26.68 s
3 sur 40 ont expiré à 90 s
Émulateur Android. Hiérarchie de vues par-dessus une vidéo en lecture, médiane sur 10.
driver
4.60 s
uiautomator
27.10 s
9 sur 10 ont échoué

Issu des tests de terrain du projet sur un fil vidéo chargé, avec un simulateur iOS 26 et un émulateur Android 16. Les deux graphiques partagent la même échelle.

Connexion en trois étapes

  1. Ajoutez le serveur à votre client

    # dans le dossier de votre projet
    claude mcp add react-native-eye -- npx -y react-native-eye@latest
  2. Lancez Metro et un build de développement

    Lancez l'app dans un simulateur iOS ou un émulateur Android comme d'habitude. Metro est détecté automatiquement sur les ports 8081–8083 et 19000–19002. Pour un autre port, ajoutez --port 8090 aux arguments.

  3. Demandez à l'agent

    Connecte-toi à mon app et dis-moi ce qu'il y a à l'écran.

    L'agent appelle connect, puis observe. Le premier appel sur chaque appareil installe le driver une seule fois.

Aucune télémétrie. Aucun compte. Aucun cloud.

Le seul trafic réseau va vers localhost : Metro et les drivers de l'appareil. Un test fait échouer le build si une URL externe apparaît dans le code du serveur.

Bon à savoir

  • Builds de développement uniquement. Un build de production n'a pas de connexion Metro à laquelle se rattacher.
  • Testé sur des simulateurs iOS et des émulateurs Android.
  • React Native avant 0.85 n'accepte qu'un débogueur à la fois : fermez d'abord les autres.

Serveur MCP React Native : questions fréquentes

Qu'est-ce qu'un serveur MCP React Native ?
Un serveur MCP donne à un agent de code IA des outils qu'il peut appeler. Un serveur MCP React Native relie ces outils à une app React Native en cours d'exécution : l'agent lit l'écran, touche, saisit et consulte les logs, les requêtes réseau et l'état pendant qu'il écrit le code. react-native-eye le fait via Metro, sans SDK dans l'app.
Avec quels agents IA fonctionne-t-il ?
Claude Code, Cursor, Codex, Claude Desktop et tout autre client qui lance des serveurs MCP en stdio.
Fonctionne-t-il avec Expo ?
Oui. Il prend en charge Expo SDK 54+ et React Native 0.70+, en build de développement avec Metro et Hermes lancés.
Faut-il modifier le code de l'app ?
Non. Le serveur se branche sur le point de débogage que Metro expose déjà. Une ligne facultative, globalThis.__RNE_STORES__ = …, facilite la lecture de l'état des stores.
Fonctionne-t-il sur iOS et Android ?
Oui : simulateurs iOS sous macOS et émulateurs Android via adb. Il faut un build de développement ; un build de production n'a pas de Metro auquel se connecter.
Est-ce gratuit ?
Oui. Il est sous licence MIT, sans compte, sans limite d'utilisation et sans télémétrie.