Supports Android emulator automation for Expo apps, including launching, UI interaction through Maestro tools (tap, input, screenshots), and view hierarchy inspection.
Provides session-based automation for Expo/React Native development including dev server management (start, stop, reload), device binding, and Metro bundler log access for iOS simulator, Android emulator, and web browser targets.
Supports iOS simulator automation for Expo apps, including launching, UI interaction through Maestro tools (tap, input, screenshots), and view hierarchy inspection.
Enables automation of React Native app development through Expo integration, including hot reloading, device management, and UI testing capabilities.
Click on "Install 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., "@Expo MCP Serverlaunch expo on ios simulator 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.
expo-mcp
MCP server for Expo/React Native app automation with Maestro integration.
Features
Session-Based Architecture: Launch Expo and device binds automatically - no manual device ID management
Expo Dev Server Management: Start/stop/reload Expo development server
Maestro Integration: Full UI automation tools (tap, input, screenshot, etc.)
Installation
Usage with Claude Code
Add to your .mcp.json:
Quick Start
Tools
Lifecycle Tools
Tool | Description |
| Get session status (server info, device_id) |
| Start Expo server and establish session with device |
| Stop Expo server and end session |
| Hot reload the app on connected device |
| Get Metro bundler logs (filterable by level) |
launch_expo Options
Option | Type | Description |
|
| Device to launch |
|
| Connection mode |
| number | Server port (default: 8081, auto-increments if busy) |
| boolean | Clear Metro bundler cache |
| boolean | Development mode (default: true) |
Maestro Tools
All Maestro tools work automatically once a session is active:
Tool | Description |
| Tap on UI element by text, id, or point |
| Type text into focused field |
| Capture screen (auto-resized for LLM) |
| Get UI element tree |
| Launch app by bundle ID |
| Press back button |
| Run Maestro YAML flow |
Note: Maestro tools require an active session. Call
launch_expofirst.
Environment Variables
Variable | Description | Default |
| Path to Expo app directory | Current working directory |
| Path to Maestro CLI |
|
| Comma-separated list of tools to expose | All tools |
| Max log lines to keep in memory | 400 |
| Expo authentication token (optional, only needed if offline mode is disabled) | None |
How It Works
Session Creation:
launch_expostarts Expo dev server and waits for device connectionDevice Binding: Once device connects, its ID is stored in the session
Automatic Injection: All Maestro tools automatically use the session's device ID
Session End:
stop_expocleans up everything
This eliminates the need for manual device_id management.
Non-Interactive Environments (CI/CD, AI Agents)
This MCP server automatically enables --offline mode when running in CI environments (CI=1). This allows the app to work without requiring an EXPO_TOKEN.
What Offline Mode Does
Skips Expo server communication (manifest signing)
Does NOT affect your app's network features (API calls, fetch, etc.)
Tunnel mode (
--tunnel) is not available in offline mode
If You Need Expo Account Features
For features requiring Expo authentication, disable offline mode and provide EXPO_TOKEN:
Then call launch_expo with offline: false:
Requirements
Node.js >= 18
Xcode (for iOS Simulator)
Android Studio (for Android Emulator)
Maestro CLI (for UI automation)
License
MIT