通过 JS 运行时
每次点击 ≈ 1 毫秒 · 整屏布局 ≈ 80 毫秒
服务器通过 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当前路由、store 状态和未处理的错误。{ "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 毫秒。OCR 能读到组件树里没有的内容:图片、WebView 和原生对话框。
observescreenshotget_layoutread_screen_textget_component_treeJS 点击直接调用元素自身的 onPress,约 1 毫秒。真实触摸由设备上的驱动完成,用于手势、系统对话框和原生视图。
run_flowtaptype_textswipescroll_topress_keynavigateopen_url日志、带请求体的网络请求、store 状态和 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 毫秒 · 整屏布局 ≈ 80 毫秒
服务器通过 Chrome DevTools Protocol 遍历 React 的 fiber 树,测量元素并直接调用点击和文本处理函数,全程不产生触摸事件。
已预编译并随 npm 包发布 · 首次使用时自动安装
iOS 上的 XCUITest runner 和 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__ = …,能让读取 store 状态更方便。