react-native-dev-mcp
# react-native-dev-mcp
> MCP server that gives AI coding agents hands, eyes and a mechanic's ear for React Native development.
[](https://github.com/luizhbesper/react-native-mcp/actions/workflows/ci.yml)
[](https://www.npmjs.com/package/react-native-dev-mcp)
[](package.json)
[](LICENSE)
Coding agents are good at writing React Native code and bad at everything around it:
putting the app on a device, seeing what it logs, and understanding why the native build
exploded into 4,000 lines of Gradle. This server closes that loop with three pillars:
| Pillar | What the agent gets |
| --- | --- |
| ๐คฒ **Device control** | One uniform interface over `simctl` + `adb`: list/boot devices, install/launch apps, deep links, screenshots, demo status bar. The agent never needs to know which platform it's driving. |
| ๐ **Runtime bridge** | Connects to Metro's inspector (CDP/Hermes, RN 0.76+ "Fusebox"). Streams `console.*` and uncaught errors into a cursor-based buffer, and runs `evaluate_js` inside the live app โ inspect Redux/Zustand state, trigger navigation, verify the fix actually worked. Zero app code changes. |
| ๐ง **Build diagnostics** | Runs `xcodebuild`/Gradle as background jobs and parses the log against a community-maintained [signature database](signatures/) of known RN failures, returning `{errorType, file, line, probableCause, suggestedFix}` instead of a log dump. Also parses any existing log offline. |
Works with **Expo and bare React Native CLI**, RN **0.76+** (tested on 0.80+).
The server is environment-aware: on Windows/Linux, iOS tools are never even registered, and
every failure returns a structured remediation the agent can act on. Start with the
`doctor` tool.
## Install
Requires Node 22+. The server runs on your machine over stdio.
### Claude Code
```bash
claude mcp add rn-dev -- npx -y react-native-dev-mcp
```
Or per-project, in `.mcp.json`:
```json
{
"mcpServers": {
"rn-dev": {
"command": "npx",
"args": ["-y", "react-native-dev-mcp"]
}
}
}
```
### Codex CLI
In `~/.codex/config.toml`:
```toml
[mcp_servers.rn-dev]
command = "npx"
args = ["-y", "react-native-dev-mcp"]
```
### Cursor / Claude Desktop / others
Any MCP client that speaks stdio works โ point it at `npx -y react-native-dev-mcp`.
Useful flags: `--project-root <path>`, `--metro-port <port>`, `--eager-metro`, `--verbose`.
## Try asking your agent
Once installed, talk to your agent in plain language โ it picks the right tools:
> *"Run my app on Android and figure out why it's broken at startup."*
> *"Boot an iPhone simulator, build and install the app, then screenshot the login screen."*
> *"The iOS build is failing. Diagnose it, apply the suggested fix and rebuild until it's green."*
> *"Watch the console while I tap through checkout and summarize any errors you see."*
> *"What's in the Redux store right now? Read the auth slice from the running app."*
> *"Open the deep link myapp://profile/42 and verify it lands on the right screen."*
## The loop
A typical agent session against a real app:
```text
doctor โ toolchains ok, Metro running, project: expo ยท RN 0.85
list_devices โ iPhone 16 Pro (booted)
run_build {platform: "ios"} โ job a1b2c3d4
get_build_status {jobId} โ โ failed ยท "Sandbox not in sync with Podfile.lock"
โ fix: run pod install (tool run_pod_install)
run_pod_install โ โ
run_build โ get_build_status โ โ
artifact: .../MyApp.app
install_app + launch_app โ app running
read_console {level:"error"} โ "TypeError: cannot read property 'id' of undefined"
evaluate_js {expression:
"globalThis.store.getState().auth"} โ { user: null, โฆ } โ found it
(agent edits code) โ reload_app โ read_console โ clean โ
take_screenshot โ ๐ธ verified visually
```
## Tools (20)
**Environment** ยท `doctor`
**Devices** ยท `list_devices` `boot_device` `shutdown_device` `install_app` `uninstall_app` `launch_app` `terminate_app` `open_url` `take_screenshot` `set_status_bar_demo`
**Runtime** ยท `list_runtime_targets` `read_console` `evaluate_js` `reload_app`
**Build** ยท `run_build` `get_build_status` `cancel_build` `run_pod_install` `parse_build_log`
Full reference with schemas and error codes: **[documentation site](https://luizhbesper.github.io/react-native-mcp)**.
## Good to know
- **One debugger at a time (Hermes limitation).** If React Native DevTools is attached, runtime
tools return `DEBUGGER_OCCUPIED` with instructions. Close the DevTools tab and retry.
- **Builds never block.** `run_build` returns a job id in <2s; poll with `get_build_status`
(it long-polls up to 60s per call). Logs persist on disk and can be re-parsed any time with
`parse_build_log`.
- **Token-frugal by design.** Lists are collapsed and capped, console reads are cursor-based and
deduped, build results carry at most 10 diagnostics plus a `logPath` escape hatch.
## Contributing
The easiest high-impact contribution is a **build error signature** โ pure YAML plus a log
snippet, no TypeScript. See [CONTRIBUTING.md](CONTRIBUTING.md). Development is spec-driven:
every tool's contract lives in [`specs/`](specs/).
## License
[MIT](LICENSE) ยฉ Luiz Esper
TDQS
Scored across 9 tools
Each tool has a distinct purpose: doctor checks environment health, evaluate_js/read_console/reload_app interact with running app, run_build/get_build_status/cancel_build/parse_build_log handle builds, and list_runtime_targets discovers runtimes. No significant overlap.
Most tools follow a clear verb_noun snake_case pattern (e.g., cancel_build, evaluate_js, get_build_status). The exception is 'doctor', which is a single word noun used as a command, but it's a standard term in React Native CLI.
With 9 tools, the set is well-scoped for React Native development. It covers build management, runtime interaction, diagnostics, and health checks without being overwhelming or sparse.
The tool surface covers the core development loop: build, status, parse logs, cancel, reload, inspect state, read console, health, and runtime discovery. Minor gaps like explicit device running or Metro starting are likely out of scope.