app_status
Check whether the mobile app is connected and show device info. Call first.
无需输入参数。

io.github.Rudrasamadhiya由 GitHub 账号 Rudrasamadhiya 发布v0.3.2更新于 Oct 29, 2026
Let AI agents see, tap, type, scroll, screenshot and debug your Expo app on a real phone.
把 AI 代理接入真机上运行的 Expo/React Native 应用,让它读取界面、点击、输入、滚动、截图并调试。
Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。
参照 仓库 中的启动说明。
[expo-mcp-bridge — let your AI agent use your phone app the way it uses a browser]
[npm version] [CI] [node] [MIT license]
Website · Docs · Tools reference · One-shot AI setup · Changelog
expo-mcp-bridge gives AI agents — Claude Code, Antigravity, Cursor and any other MCP client — eyes and hands inside your Expo / React Native app, running live on your real phone. The agent reads the screen, taps, types, scrolls, takes screenshots, reads console errors and network requests, and presses hardware keys. No more pasting screenshots into the chat.
"Open the app, try the sign-up form with bad input, and tell me what breaks."
react-native-view-shot powers screenshots and ships with Expo Go; in a custom dev build, rebuild the client once after installing it. init writes your agent's MCP config, installs the agent skill and adds a guide to AGENTS.md.
Requirements: Node.js 20 or newer on your computer · an Expo (or React Native) app · phone and computer on the same Wi-Fi.
The one-shot way. Paste this into Claude Code, Antigravity or Cursor inside your Expo project and the agent installs, mounts and verifies everything itself:
By hand, in two minutes:
init (above).<AgentBridge /> once, as the last child of your root layout (example at the top of this page).npx expo start in LAN mode and open the app on your phone.app_batch fills a whole form in one call.init installs a skill for Claude Code and an AGENTS.md guide for Antigravity, Cursor, Codex and others, so agents use the tools well from the first message.<AgentBridge /> renders its children and nothing else.A real login screen, as returned by app_snapshot:
Tapping e5 (show password) returns just the difference:
Install this package, run npx expo-mcp-bridge init, and mount <AgentBridge /> in your root layout. Your agent then gets MCP tools such as app_snapshot (read the visible screen), app_tap, app_type and app_screenshot, and works directly against the app running on your phone.
That is exactly what this package replaces. Instead of you taking screenshots and pasting them into the chat, the agent calls app_snapshot itself and receives a compact outline of the screen (about 70 tokens instead of about 1,000 for an image), or app_screenshot when it really needs pixels.
Yes. The agent taps, types, scrolls and navigates through your real handlers, reads new JS errors and failed network requests after every action, and reports what broke. It works in Expo Go or a dev build, on iPhone and Android, over Wi-Fi.
Yes. Both the bridge and its screenshot dependency (react-native-view-shot) run in Expo Go. No native code, no config plugin and no rebuild are needed.
Those are end-to-end test frameworks: you write test scripts or flows and run them in CI. expo-mcp-bridge is for development with an AI agent: the agent explores and drives the live app interactively and fixes the code in the same session. It needs no native setup and reads the React tree directly, so it complements a test framework rather than replacing one.
<AgentBridge /> only runs in development (__DEV__) and only connects to your own computer. In production builds it renders its children and nothing else.
init writes .mcp.json for Claude Code. Other agents use the same server:
On Windows use "command": "cmd", "args": ["/c", "npx", "expo-mcp-bridge"].
Target elements by ref from a snapshot, by testID, or by visible text. Full parameters are in the tools reference.
Read
Act
Debug
Device
You normally never run the server yourself — the agent launches it over stdio. To try it by hand, any MCP client works: npx @modelcontextprotocol/inspector npx expo-mcp-bridge.
The in-app component reads React's live component tree, so it sees exactly what you rendered: your testIDs, labels, inputs and lists. It calls your real onPress and onChangeText handlers, so app logic runs exactly as if a user did it. Native-stack screens hidden under the current one are skipped, modals are captured as overlays, and screenshots capture the visible screen view.
More in the troubleshooting guide.
An in-app library controls your own app only; the OS blocks system dialogs and other apps. device_key covers hardware keys via adb on Android. Gestures that exist only in native code (a pan handler with no onPress) can't be triggered from JavaScript.
The tests run the bridge in Node against the real MCP server. See CONTRIBUTING.md for details.
MIT © Rudra Samadhiya
来源:README.md,提交 6f03ca7
Check whether the mobile app is connected and show device info. Call first.
无需输入参数。
Compact text outline of the current screen (buttons, inputs, text, lists) with refs like [e3] to act on. Prefer this over screenshots.
maxLinesPositions (dp, window coordinates) and font sizes of elements on the current screen. For layout checks and visual work; app_snapshot is cheaper for acting.
limitJPEG screenshot of the app. Use only for visual/layout questions; app_snapshot is cheaper for finding elements. With saveTo, writes the file and returns only its path (no image tokens).
areasaveToqualitymaxWidthfullScrollRun several actions in one call (fastest way to fill forms or walk a flow). Returns the screen once at the end. Steps: {action:"tap"|"type"|"scroll"|"toggle"|"navigate"|"wait"|"dismiss_keyboard", ...that tool's args}.
fullsteps必填snapshotPress a button/pressable element. Returns what changed on screen plus any new errors.
reffulllongtexttestIDsnapshotSet text in an input (replaces by default). Target by ref, testID, or placeholder text.
reffulltextvalue必填appendsubmittestIDsnapshotScroll a list/ScrollView (first one on screen if no target).
reffulltextamounttestIDsnapshotdirectionFlip a Switch (or set it with value).
reffulltextvaluetestIDsnapshotOpen a route (expo-router path like "/settings") or a full deep link.
fullpath必填replacesnapshotWait until text or a testID appears (or disappears with gone=true). Cheaper than polling snapshots.
gonetexttestIDtimeoutConsole logs and JS errors captured in the app.
clearlevellimitsincesearchHTTP requests made by the app (fetch/XHR) with status, timing and truncated bodies.
limitsincebodiessearchfailedOnlyRun JavaScript inside the app (dev only) and return the JSON result. Expression or statements with return. `bridge` and `RN` (react-native) are in scope.
code必填Reload the JS bundle (like pressing r in Metro).
无需输入参数。
Hide the on-screen keyboard.
无需输入参数。
Press a hardware/system key on an Android device via adb (USB or Wi-Fi debugging): volume_up, volume_down, mute, back, home, app_switch, enter, tab, delete, power, menu, escape.
key必填repeat已满足适用检查项的 90%
该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。
请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。
import { Stack, router } from 'expo-router';import { AgentBridge } from 'expo-mcp-bridge';
export default function RootLayout() { return ( <> <Stack /> <AgentBridge router={router} /> </> );}npx expo install expo-mcp-bridge react-native-view-shotnpx expo-mcp-bridge initRead https://raw.githubusercontent.com/Rudrasamadhiya/expo-mcp-bridge/main/AI_SETUP.md and set it up in this project.scroll [e1] button "icon:chevron-back" [e2] text "Welcome back" input "[email protected]" value="" [e3] input "••••••••" value="" (secure) [e4] button "icon:eye" [e5] button "Log In" [e7]Tapped.Changes (+ added, - removed):~ input "••••••••" value="" [e4]+ button "icon:eye-off" [e9]- button "icon:eye" [e5]<AgentBridge router={router} // expo-router's router, for exact app_navigate host="192.168.1.20" // your computer's IP (auto-detected from Metro) port={8347} // must match EXPO_MCP_PORT allowEval={false} // disable app_eval enabled={false} // turn the bridge off/>npx expo-mcp-bridge init # .mcp.json + agent skill + AGENTS.md sectionnpx expo-mcp-bridge init --cursor # also write .cursor/mcp.jsonnpx expo-mcp-bridge # run the MCP server (your agent starts this for you)npx expo-mcp-bridge --helpAI agent ──MCP (stdio)──▶ expo-mcp-bridge server ◀──WebSocket :8347── <AgentBridge /> in your appnpm installnpm test