JS रनटाइम के ज़रिए
हर प्रेस ≈ 1 ms · पूरी स्क्रीन का लेआउट ≈ 80 ms
सर्वर Chrome DevTools Protocol के ज़रिए React के fiber ट्री को पढ़ता है। वह एलिमेंट मापता है और प्रेस व टेक्स्ट हैंडलर को सीधे कॉल करता है, बिना किसी टच के।
React Native MCP सर्वर · iOS और Android
react-native-eye, Claude Code, Cursor या किसी भी MCP क्लाइंट को चल रहे React Native ऐप से जोड़ता है। एजेंट स्क्रीन पढ़ता है, टैप और टाइप करता है, और लॉग, नेटवर्क व स्टेट की जाँच करता है। यह Metro के ज़रिए काम करता है, इसलिए ऐप में न कोई SDK चाहिए और न कोड में कोई बदलाव।
Claude Code में जोड़ें
claude mcp add react-native-eye -- npx -y react-native-eye@latest
स्क्रीन
एजेंट क्या पढ़ता है
लॉगिन स्क्रीन के लिए उदाहरण आउटपुट। एलिमेंट ढूँढने के लिए किसी पंक्ति पर कर्सर ले जाएँ।
ज़्यादातर डिवाइस टूल में हर टैप के लिए एजेंट को मॉडल का एक चक्कर लगाना पड़ता है। यहाँ एजेंट सारे स्टेप एक साथ भेजता है और सर्वर उन्हें लगातार चलाता है। redbox या कोई अनकॉट एक्सेप्शन आते ही फ़्लो रुक जाता है, और एजेंट को हर स्टेप का नतीजा मिलता है।
observeस्क्रीनशॉट, इंटरैक्टिव एलिमेंट, हाल की त्रुटियाँ और हाल के लॉग।run_flowटैप, टाइपिंग, प्रतीक्षा और जाँच, सब सर्वर पर चलते हैं।check_stateमौजूदा रूट, स्टोर की स्टेट और अनहैंडल्ड त्रुटियाँ।{ "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" } }
] }
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
पाँच समूहों में 35 टूल। हर जवाब बताता है कि कौन-सा रास्ता इस्तेमाल हुआ, इसलिए चुपचाप कुछ नहीं बदलता।
एलिमेंट की पोज़िशन ऐप के JS रनटाइम से लगभग 80 ms में मिलती हैं। OCR वह पढ़ता है जो ट्री में नहीं होता: इमेज, WebView और नेटिव डायलॉग।
observescreenshotget_layoutread_screen_textget_component_treeJS प्रेस एलिमेंट के अपने onPress को लगभग एक मिलीसेकंड में कॉल करता है। असली टच डिवाइस पर मौजूद ड्राइवर से जाता है: जेस्चर, सिस्टम डायलॉग और नेटिव व्यू के लिए।
run_flowtaptype_textswipescroll_topress_keynavigateopen_urlलॉग, बॉडी सहित नेटवर्क अनुरोध, स्टोर की स्टेट और JS इवैल्यूएशन। जिन क्रैश को LogBox दबा देता है, वे भी रिपोर्ट होते हैं।
check_stateget_logsget_errorsget_networkget_stateeval_jsget_jobकौन-से कंपोनेंट रेंडर हुए और क्यों, Hermes CPU प्रोफ़ाइल, थ्रेड के हिसाब से CPU और फ़्रेम टाइमिंग। ऐप में कोई सेटअप नहीं चाहिए।
profile_rendersprofile_jssample_cpuget_fpsऐप इंस्टॉल, लॉन्च और रीलोड करना, परमिशन देना और वीडियो रिकॉर्ड करना।
connectlist_targetslist_deviceslaunch_appreload_appinstall_appopen_simulatorset_permissionrecord_videostop_recordingpingकंपोज़िट टूल: कई कॉल की जगह एक कॉल।
सर्वर दो रास्तों से ऐप तक पहुँचता है और हर कॉल के लिए सस्ता रास्ता चुनता है।
हर प्रेस ≈ 1 ms · पूरी स्क्रीन का लेआउट ≈ 80 ms
सर्वर Chrome DevTools Protocol के ज़रिए React के fiber ट्री को पढ़ता है। वह एलिमेंट मापता है और प्रेस व टेक्स्ट हैंडलर को सीधे कॉल करता है, बिना किसी टच के।
npm पैकेज में पहले से बना हुआ · पहले इस्तेमाल पर खुद इंस्टॉल होता है
iOS पर XCUITest रनर और Android पर instrumentation सर्वर असली टच भेजते हैं और कोई भी Unicode टेक्स्ट टाइप करते हैं। ड्राइवर शुरू न हो पाए तो इनपुट axe या adb पर चला जाता है, और जवाब में यह बताया जाता है।
मापा गया: डिवाइस ड्राइवर बनाम वे टूल जिनकी जगह वह लेता है
ये आँकड़े प्रोजेक्ट के अपने फ़ील्ड टेस्ट से हैं, जो व्यस्त वीडियो फ़ीड पर iOS 26 सिम्युलेटर और Android 16 एम्युलेटर में किए गए। दोनों चार्ट का पैमाना एक ही है।
# अपने प्रोजेक्ट फ़ोल्डर में
claude mcp add react-native-eye -- npx -y react-native-eye@latest
// .cursor/mcp.json
{
"mcpServers": {
"react-native-eye": {
"command": "npx",
"args": ["-y", "react-native-eye@latest"]
}
}
}
# ~/.codex/config.toml
[mcp_servers.react-native-eye]
command = "npx"
args = ["-y", "react-native-eye@latest"]
// मानक MCP कॉन्फ़िग, Claude Desktop के लिए भी
{
"mcpServers": {
"react-native-eye": {
"command": "npx",
"args": ["-y", "react-native-eye@latest"]
}
}
}
ऐप को iOS सिम्युलेटर या Android एम्युलेटर में वैसे ही चलाएँ जैसे आप हमेशा चलाते हैं। पोर्ट 8081–8083 और 19000–19002 पर Metro अपने आप मिल जाता है। किसी और पोर्ट के लिए आर्ग्युमेंट में --port 8090 जोड़ें।
मेरे ऐप से कनेक्ट करो और बताओ कि स्क्रीन पर क्या है।
एजेंट पहले connect और फिर observe कॉल करता है। हर डिवाइस पर पहली कॉल ड्राइवर को एक बार इंस्टॉल करती है।
नेटवर्क ट्रैफ़िक सिर्फ़ localhost पर जाता है: Metro और डिवाइस ड्राइवर तक। सर्वर के सोर्स में कोई बाहरी URL आ जाए तो एक टेस्ट बिल्ड को फ़ेल कर देता है।
जानने लायक
globalThis.__RNE_STORES__ = …, स्टोर की स्टेट पढ़ना आसान बनाती है।