Test an Expo app with Claude Code on a real phone
Claude Code can read files and run commands, but on its own it can't see your app. expo-mcp-bridge is an MCP server that gives it eyes and hands inside your running Expo app — on the phone in your hand, through Expo Go or a dev build — so it can test flows end to end the way it tests a web page.
1. Install the bridge
npx expo install expo-mcp-bridge react-native-view-shot
npx expo-mcp-bridge initinit writes .mcp.json with an expo-app server and installs the expo-app-control skill in .claude/skills/, which teaches Claude Code the snapshot, act, read-the-diff loop.
2. Mount it in your app
import { Stack, router } from 'expo-router';
import { AgentBridge } from 'expo-mcp-bridge';
export default function RootLayout() {
return (
<>
<Stack />
<AgentBridge router={router} />
</>
);
}It only runs in development. In production builds it renders its children and nothing else.
3. Open the app on your phone
npx expo startScan the QR code with Expo Go (or open your dev build) on the same Wi-Fi as your computer. Then restart Claude Code in the project so it loads .mcp.json. If you skipped init, add the server by hand:
claude mcp add expo-app -- npx expo-mcp-bridge4. Ask for a test
Try prompts like these:
- “Open the app, try the sign-up form with bad input, and tell me what breaks.”
- “Open Settings and check that every toggle saves after a reload.”
- “Scroll the feed to the bottom and report any JS errors or failed requests.”
- “Take a screenshot of each tab and compare the spacing to the design.”
Claude Code calls app_snapshot to read the visible screen as a compact outline, acts with app_tap, app_type or app_batch, and gets back only what changed — plus any new JS errors and failed network requests caused by that action. Every tool is in the tools reference.
Why not just screenshots?
A screenshot costs about 1,000 tokens and the model has to guess where to tap. A snapshot is about 70 tokens, names every button and input with a stable ref, and each action returns a small diff — so a full sign-up flow takes a handful of calls instead of dozens.
Next
- Troubleshooting if the app doesn't connect
- Make an App Store preview video of the same app