Expo MCP Server
expo-mcp
Maestro統合によるExpo/React Nativeアプリ自動化のためのMCPサーバー。
機能
セッションベースのアーキテクチャ:
start_sessionでExpoを起動し、デバイスをバインドしてリースを取得します。手動でのデバイスID管理は不要です。TTL付きデバイスリース: デバイスツールを呼び出すたびに2分間のリースが自動更新されます。非アクティブ状態が続くと期限切れとなり、他のインスタンスがデバイスを使用できるようになります。
インスタンス間連携: 複数のMCPインスタンスをデバイスの競合なしに同時に実行可能です。
Expo開発サーバー管理: Expo開発サーバーの開始/停止/リロード。
Maestro統合: 完全なUI自動化ツール(タップ、入力、スクリーンショットなど)。
インストール
Claude Codeプラグインとして(推奨)
2つのコマンドを実行し、再起動します:
# 1. Install the plugin. Just dismiss the "Expo App Directory" prompt
# (or leave it empty) — the next step configures it for you.
/plugin marketplace add DaveDev42/expo-mcp
/plugin install expo-mcp --scope project
# 2. One-shot installer. Runs environment checks, auto-detects the Expo
# app directory, and writes the userConfig directly into
# .claude/settings.json. No /plugin UI round-trip needed.
/expo-mcp:install # auto-detect
/expo-mcp:install apps/mobile # monorepo: pass the path explicitlyその後、Claude Codeを再起動すれば、すべてのツール、エージェント、スキルが使用可能になります。
インストーラーフラグ:
/expo-mcp:install apps/mobile --global # write to ~/.claude/settings.json
/expo-mcp:install --scaffold-maestro # also create a starter maestro/
/expo-mcp:install --skip-doctor # skip prerequisite checksインストーラーは、プラグインディレクトリからバンドルされたNodeスクリプト(doctor.mjs、detect-app-dir.mjs、scaffold-maestro.mjs)を実行します。Claude Codeは初回実行時に各スクリプトの承認を求めます。続行するには承認してください。
スクリプトを事前に承認(プロンプトなし)したい場合は、プロジェクト内の .claude/settings.local.json に以下を追加してください(<PATH> は各スクリプトの初回実行時にClaude Codeが表示する絶対パスに置き換えてください):
{
"permissions": {
"allow": [
"Bash(node <PATH>/doctor.mjs:*)",
"Bash(node <PATH>/detect-app-dir.mjs:*)",
"Bash(node <PATH>/scaffold-maestro.mjs:*)"
]
}
}プラグインをインストールすると、自動的に以下が設定されます:
expoMCPサーバー(手動での.mcp.json設定は不要)モバイルアプリ自動テスト用の QAエージェント (
qa)Maestro YAMLテストフロー作成用の フローライターエージェント (
flow-writer)ツールリファレンスとベストプラクティスを含む 利用ガイド スキル (
/expo-guide)実行証拠なしでQAのPASS判定が出た場合に警告する 検証フック
MCPサーバー単体として
このプロジェクトは GitHub経由でのみ 配布されています(npm上の expo-mcp という名前は別の無関係なパッケージです。使用しないでください)。GitHub参照経由で実行してください:
npx -y github:DaveDev42/expo-mcpClaude Codeでの使用方法
手動でのMCP設定
プラグインを使用しない場合は、.mcp.json に以下を追加してください:
{
"mcpServers": {
"expo": {
"command": "npx",
"args": ["-y", "github:DaveDev42/expo-mcp"]
}
}
}モノレポ設定
位置引数を使用してアプリディレクトリを指定します:
{
"mcpServers": {
"expo": {
"command": "npx",
"args": ["-y", "github:DaveDev42/expo-mcp", "apps/mobile"]
}
}
}特定のデバイス
--device-id で特定のシミュレーターまたはエミュレーターを指定します:
{
"mcpServers": {
"expo": {
"command": "npx",
"args": ["-y", "github:DaveDev42/expo-mcp", "--device-id=6D192F60-1234-5678-ABCD-000000000000"]
}
}
}ツールフィルタリング
--exclude-tools で特定のツールを除外します:
{
"mcpServers": {
"expo": {
"command": "npx",
"args": ["-y", "github:DaveDev42/expo-mcp", "apps/mobile", "--exclude-tools=list_devices"]
}
}
}または、--tools で特定のツールのみを公開します:
{
"mcpServers": {
"expo": {
"command": "npx",
"args": ["-y", "github:DaveDev42/expo-mcp", "--tools=start_session,stop_session,take_screenshot"]
}
}
}CLIリファレンス
Usage: expo-mcp [app-dir] [options]
Arguments:
app-dir Path to Expo app directory (default: cwd)
Options:
--device-id=<id> Specific device to use (iOS simulator UUID or Android serial)
--exclude-tools=tool1,tool2 Exclude specific tools from the MCP server
--tools=tool1,tool2 Only expose specific tools
-h, --help Show help message
-v, --version Show version numberクイックスタート
# 1. Start session (launches Expo + binds device + acquires lease)
start_session({ target: "ios-simulator" })
# 2. Use tools directly (no device_id needed!)
take_screenshot()
tap_on({ text: "Login" })
input_text({ text: "hello@example.com" })
press_key({ key: "Enter" })
scroll({ direction: "down" })
swipe({ direction: "left" })
# 3. Run Maestro flows
run_maestro_flow({ flow_yaml: "- assertVisible: Welcome" })
check_maestro_flow_syntax({ flow_yaml: "- tap: Login" })
# 4. Reload app after code changes
reload_app()
# 5. Check logs if needed
get_logs({ level: "error" })
# 6. Stop session when done
stop_session()プラグイン機能
Claude Codeプラグインとしてインストールすると、以下の追加機能が利用できます:
QAエージェント
モバイルQAテストを qa エージェントに委任します。シミュレーター/エミュレーター上でアプリを体系的にテストし、厳格な証拠要件を課します(コードレビューのみの判定は不可)。
# In Claude Code, delegate to the QA agent:
"Test the login flow on iOS simulator" → delegates to qa agentエージェントは、アプリ起動 → UI検査 → インタラクション → 検証 → PASS/FAIL/INCONCLUSIVE判定のレポートという構造化された手法に従います。
フローライターエージェント
flow-writer エージェントはライブアプリを検査し、Maestro YAMLテストフローを作成します:
# Ask the flow writer to create a test flow:
"Write a Maestro flow for the onboarding sequence" → delegates to flow-writer agent構文を検証し、フローを実行して動作を確認し、.yaml ファイルをプロジェクトに書き込みます。
利用ガイド
/expo-guide でツールリファレンスとベストプラクティスにアクセスします:
/expo-guide # Full guide
/expo-guide session # Session lifecycle
/expo-guide debugging # Debugging tipsツール
ライフサイクルツール
ツール | 説明 |
| セッションステータス(サーバー状態、デバイス情報、リース残り時間)を取得 |
| Expoサーバーの起動、デバイス接続、デバイスリースの取得 |
| Expoサーバーの停止と全リソースの解放 |
| 接続済みデバイス上のアプリをホットリロード |
| Metroバンドラーのログを取得(レベルとソースでフィルタリング可能) |
| キーを押下(Enter, Backspace, Home, Lock, Tab, Volume Up/Down) |
| 画面を方向にスクロール(デフォルト:下) |
| 方向または正確な開始/終了座標を指定してスワイプ |
start_session オプション
オプション | 型 | 説明 | ||
|
|
|
| 起動するターゲットプラットフォーム |
| string | 特定のデバイス(iOS UUIDまたはAndroidシリアル)。省略時は自動検出 | ||
|
|
|
| 接続モード |
| number | サーバーポート(デフォルト:8081、使用中の場合は自動インクリメント) | ||
| boolean | Metroバンドラーキャッシュのクリア | ||
| boolean | 開発モード(デフォルト:true) | ||
| boolean | JavaScriptの最小化 | ||
| number | Metroの最大ワーカー数 | ||
| boolean | オフラインモード | ||
| string | カスタムURIスキーム | ||
| string | iOSシミュレーター名(例: "iPhone 16 Pro") | ||
| boolean | 起動前にシミュレーターの状態をクリーンアップ(デフォルト:false) | ||
| object | アプリ読み込み後にMaestroフローを実行 ( |
Maestroツール
セッションがアクティブになると、すべてのMaestroツールが自動的に機能します(device_id はセッションから注入されます):
ツール | 説明 |
| スクリーンショットを撮影(LLMコンテキスト用に自動リサイズ) |
| テキスト、ID、または座標でUI要素をタップ |
| フォーカスされたフィールドにテキストを入力 |
| 戻るボタンを押下 |
| Maestro YAMLフローをインラインで実行 |
| プロジェクトディレクトリからMaestroフローファイルを実行 |
| 実行せずにMaestro YAMLフローの構文を検証 |
| 現在の画面のUI要素ツリーを取得 |
| 利用可能な全デバイスをリストアップ(アクティブなセッションなしでも動作) |
注: デバイスツールにはアクティブなセッションが必要です。最初に
start_sessionを呼び出してください。list_devicesとcheck_maestro_flow_syntaxはいつでも呼び出せます。
デバイスリースシステム
デバイスリースは、1つのMCPインスタンスがデバイスを無期限に占有することを防ぎます:
取得:
start_sessionが2分間のデバイスリースを取得します自動更新: デバイスツール(
take_screenshot、tap_onなど)を呼び出すたびに2分間のタイマーがリセットされます期限切れ: 2分間デバイスツールが呼び出されない場合、リースは期限切れとなり、デバイスは利用可能になります
再取得: 再度
start_sessionを呼び出して再取得します(サーバーは実行されたままなので再起動は不要です)確認:
get_session_statusで残りのリース時間を表示します
複数のMCPインスタンスはファイルベースのレジストリ (/tmp/expo-mcp/instances/) を介して連携するため、2つのインスタンスが同時に同じデバイスを要求することはできません。
環境変数
変数 | 説明 | デフォルト |
| Expoアプリディレクトリへのパス(CLIの位置引数が優先) | 現在の作業ディレクトリ |
| Maestro CLIへのパス |
|
| 公開するツールのカンマ区切りリスト( | すべてのツール |
| 除外するツールのカンマ区切りリスト( | なし |
| メモリ内に保持する最大ログ行数 | 400 |
| Expo認証トークン(オフラインモードが無効な場合のみ必要) | なし |
仕組み
セッション開始:
start_sessionがExpo開発サーバーを起動し、デバイス接続を待機してリースを取得しますデバイスバインド: 接続されたデバイスIDが2分間のTTL付きでセッションに保存されます
自動注入: すべてのMaestroデバイスツールが自動的にセッションのデバイスIDを使用します
リース更新: デバイスツールを呼び出すたびにリースタイマーがリセットされます
セッション終了:
stop_sessionで全てをクリーンアップするか、非アクティブ状態が続いてリースが期限切れになります
非対話型環境(CI/CD、AIエージェント)
このMCPサーバーは、CI環境 (CI=1) で実行されると自動的に --offline モードを有効にします。これにより、EXPO_TOKEN を必要とせずにアプリを動作させることができます。
オフラインモードの動作
Expoサーバー通信(マニフェスト署名)をスキップします
アプリのネットワーク機能(API呼び出し、fetchなど)には 影響しません
トンネルモード (
--tunnel) はオフラインモードでは利用できません
Expoアカウント機能が必要な場合
Expo認証が必要な機能を使用する場合は、オフラインモードを無効にして EXPO_TOKEN を提供してください:
{
"mcpServers": {
"expo": {
"env": {
"EXPO_TOKEN": "your-token-here"
}
}
}
}その後、offline: false を指定して start_session を呼び出します:
start_session({ target: "ios-simulator", offline: false })要件
Node.js >= 18
Xcode (iOSシミュレーター用)
Android Studio (Androidエミュレーター用)
Maestro CLI (UI自動化用)
ライセンス
MIT
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/DaveDev42/expo-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server