Skip to content
Expo Agent Kit

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 init

init 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

app/_layout.tsx
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 start

Scan 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-bridge

4. 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.

Claude Code won't type your real passwords. Sign in on the phone yourself when a real account is needed; the skill tells the agent to wait for you.

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