rn-device-mcp
Provides tools for interacting with Android emulators and USB devices through adb, including listing devices, taking screenshots, opening deep links, launching/stopping apps, installing APKs, reversing the Metro port, opening the React Native dev menu, sending input, and reading logcat.
Provides tools for interacting with the iOS Simulator through simctl, including listing, booting, and shutting down simulators; taking screenshots; opening deep links, universal links, and Expo dev-client URLs; launching, terminating, and relaunching apps; installing simulator .app builds; listing installed apps; and reading unified logs.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@rn-device-mcp open myapp://course/954 and take a screenshot"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
rn-device-mcp
An MCP server that puts the iOS Simulator and Android emulators/devices in front of your coding assistant. Built for React Native / Expo work: the assistant can look at the screen, read the app's logs, open deep links, install a build and relaunch the app, instead of asking you to do it and describe what you see.
macOS only (uses xcrun simctl, sips and adb).
Tools
iOS Simulator
Tool | What it does |
| Simulators with runtime, state and udid, booted first |
| Boot by udid or name (waits until ready), shut down |
| Screen as an image (downscaled to 900 px by default) |
| Deep link, universal link or Expo dev-client URL |
| By bundle id; |
| Install a simulator |
| Installed apps with bundle ids |
| Unified log for the last N minutes, filtered by process and/or substring |
Android
Tool | What it does |
| Emulators and USB devices known to adb |
| Screen as an image |
| Deep link via ACTION_VIEW |
| By package name; |
|
|
|
|
| Opens the RN dev menu (menu key) |
| Tap at x,y, type text, or send a keyevent |
| Recent logcat, RN and crash tags only by default; |
iOS tools default to the booted simulator (simctl's booted alias); Android tools default to the only online device.
Observation tools carry readOnlyHint: true; everything that changes device state does not.
Related MCP server: React Native Debug MCP
Setup
npm install && npm run build
claude mcp add rn-device --scope user -- node /absolute/path/to/rn-device-mcp/dist/index.jsadb is found via ADB_PATH, ANDROID_HOME, ANDROID_SDK_ROOT, ~/Library/Android/sdk, then PATH.
A typical loop
ios_boot "iPhone 17 Pro"→ios_install_app build/MyApp.app→ios_launch_app com.example.myappios_open_url myapp://course/954→ios_screenshot→ the assistant reads the screenSomething is off →
ios_logs process: MyApp contains: "TypeError"Same on Android with
android_*, plusandroid_inputfor a quick tap when there is no test id to hang on to.
Development
npm test # vitest, no devices needed: the process runner is injected
npm run typechecksrc/exec.ts—execFilewrapper, no shell, so URLs and names are never interpretedsrc/image.ts— PNG → downscaled base64 image contentsrc/ios.ts/src/android.ts—simctlandadbwrappers with output parserssrc/tools.ts— tool definitions and handlerssrc/index.ts— MCP wiring over stdio
Available Tools
20 toolsandroid_devicesList Android devicesARead-only
Lists emulators and USB devices known to adb, with serial and state.
Inputs: no named parameters.
android_inputTap, type or press a keyA
Low-level input: tap at x,y (pixels from android_screenshot at maxDimension 0), type text into the focused field, or send a keyevent such as KEYCODE_BACK / 4.
Inputs: key, tap, text, serial.
android_install_apkInstall an APKC
Installs (or reinstalls, keeping data) an APK.
Inputs: apkPath (required), serial.
android_launch_appLaunch an appB
Launches an app by package name. relaunch: true force-stops it first.
Inputs: packageName (required), serial, relaunch.
android_logcatLogcatA
Recent logcat lines. By default only ReactNativeJS (console.*), ReactNative and crash tags; all: true lifts the filter. clearAfter: true empties the buffer so the next call shows only new lines.
Inputs: all, serial, contains, maxLines, +1 more.
android_open_urlOpen a URL / deep linkB
Opens a deep link or URL with an ACTION_VIEW intent.
Inputs: url (required), serial.
android_reverse_metroadb reverse for MetroA
Runs adb reverse tcp:8081 tcp:8081 so the app can reach Metro on the host (needed for USB devices, harmless on emulators).
Inputs: port, serial.
android_screenshotScreenshot the Android deviceARead-only
Captures the device screen and returns it as an image.
Inputs: serial, maxDimension.
android_stop_appForce-stop an appC
Force-stops the app.
Inputs: packageName (required), serial.
ios_appsInstalled appsARead-only
Lists installed apps with bundle ids. userOnly (default true) hides Apple's system apps.
Inputs: device, userOnly.
ios_bootBoot a simulatorA
Boots a simulator by udid or name (e.g. 'iPhone 17 Pro'), waits until it is ready and brings Simulator.app to front.
Inputs: device (required).
ios_install_appInstall a .app bundleB
Installs a simulator build (.app directory, e.g. from eas build --local or Xcode DerivedData).
Inputs: appPath (required), device.
ios_launch_appLaunch an appA
Launches an installed app by bundle id. relaunch: true terminates it first (cold start).
Inputs: bundleId (required), device, relaunch.
ios_logsSimulator logsARead-only
Recent unified-log lines from the simulator. Filter by process (the app's product name, e.g. 'MyApp') and/or a substring. JS console output from RN shows up under the app process.
Inputs: device, process, contains, maxLines, +1 more.
ios_open_urlOpen a URL / deep linkB
Opens a URL in the simulator: a deep link (myapp://...), a universal link, or an Expo dev-client URL (exp+myapp://...).
Inputs: url (required), device.
ios_screenshotScreenshot the simulatorARead-only
Captures the simulator screen and returns it as an image. Use it to see what the app is showing right now.
Inputs: device, maxDimension.
ios_shutdownShut down a simulatorA
Shuts down the booted simulator (or the given one).
Inputs: device.
ios_simulatorsList iOS simulatorsBRead-only
Lists simulators with runtime, state and udid; booted ones first.
Inputs: includeUnavailable.
ios_terminate_appTerminate an appC
Kills the app process on the simulator.
Inputs: bundleId (required), device.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 20 tools
Tools are cleanly partitioned by platform prefix and a distinct action (boot, shutdown, install, launch, terminate, screenshot, logs), so an agent can pick correctly in almost all cases. The only mild overlaps are ios_launch_app vs ios_open_url (cold start vs deep link) and android_dev_menu vs android_input's KEYCODE_MENU keyevent, both of which the descriptions clarify.
A consistent platform_action scheme (ios_*, android_*) with snake_case throughout makes the surface predictable. Minor deviations: list tools use bare nouns (ios_simulators, ios_apps, android_devices, ios_logs, android_logcat) instead of a verb, and the platform sets are asymmetric (ios_boot/ios_shutdown exist, android counterparts do not).
20 tools is on the heavy side for a device-control server, though the count is partly explained by covering two platforms. Several tools are thin one-off wrappers (android_reverse_metro, android_dev_menu) that could arguably be folded into the input/log utilities.
The iOS lifecycle (boot, install, launch, terminate, screenshot, logs, apps) and the Android equivalents are broadly covered with no severe dead ends. Notable gaps: there is no iOS UI interaction tool (no tap/type equivalent to android_input), no way to start/boot an Android emulator, and no uninstall or clear-data operations on either platform.
Related MCP Connectors
Drive and test your React Native and Expo apps end-to-end on iOS and Android. Supports real devices, simulators, and emulators. Snapshots, taps, typing, swipes, screenshots, deep links, reloads, builds and runtime errors.
Drive real devices from your AI Coding tool. Embed a client SDK (Unity, Godot, Flutter, iOS/macOS, Android, React Native, Web) in your app, then capture screenshots, traverse the UI tree, inject taps and key events, and run automated test tasks on the physical device over a secure relay.
Disposable cloud Android emulators for coding agents: run an APK or PR build, tap, type, screenshot.
Give your AI agent a real cloud Android phone: push APKs, drive it, get screenshots and logs.
Related MCP Servers
AlicenseAqualityBmaintenanceEnables AI assistants to interact with iOS Simulators and Android Emulators, allowing autonomous app development, UI interaction, profiling, and debugging through natural language.773,177Apache 2.0- AlicenseBqualityDmaintenanceEnables AI agents to inspect, log, and control React Native apps on Android emulators or iOS simulators, including UI tree, tap, scroll, and hot reload.2291 npm5MIT
- AlicenseAqualityDmaintenanceEnables AI agents to build, deploy, drive, and debug Android apps — managing Gradle builds, emulators, adb deployment, logcat capture, and full UI automation.5376 npmMIT
- AlicenseNot gradedqualityBmaintenanceEnables AI assistants and IDEs to drive real Android devices and emulators for cross-app UI automation, testing, and diagnostics, including collecting Logcat output and screenshots.Apache 2.0