Skip to main content
Glama

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.mjsdetect-app-dir.mjsscaffold-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:*)"
    ]
  }
}

プラグインをインストールすると、自動的に以下が設定されます:

  • expo MCPサーバー(手動での .mcp.json 設定は不要)

  • モバイルアプリ自動テスト用の QAエージェント (qa)

  • Maestro YAMLテストフロー作成用の フローライターエージェント (flow-writer)

  • ツールリファレンスとベストプラクティスを含む 利用ガイド スキル (/expo-guide)

  • 実行証拠なしでQAのPASS判定が出た場合に警告する 検証フック

MCPサーバー単体として

このプロジェクトは GitHub経由でのみ 配布されています(npm上の expo-mcp という名前は別の無関係なパッケージです。使用しないでください)。GitHub参照経由で実行してください:

npx -y github:DaveDev42/expo-mcp

Claude 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

ツール

ライフサイクルツール

ツール

説明

get_session_status

セッションステータス(サーバー状態、デバイス情報、リース残り時間)を取得

start_session

Expoサーバーの起動、デバイス接続、デバイスリースの取得

stop_session

Expoサーバーの停止と全リソースの解放

reload_app

接続済みデバイス上のアプリをホットリロード

get_logs

Metroバンドラーのログを取得(レベルとソースでフィルタリング可能)

press_key

キーを押下(Enter, Backspace, Home, Lock, Tab, Volume Up/Down)

scroll

画面を方向にスクロール(デフォルト:下)

swipe

方向または正確な開始/終了座標を指定してスワイプ

start_session オプション

オプション

説明

target

ios-simulator

android-emulator

web-browser

起動するターゲットプラットフォーム

device_id

string

特定のデバイス(iOS UUIDまたはAndroidシリアル)。省略時は自動検出

host

lan

tunnel

localhost

接続モード

port

number

サーバーポート(デフォルト:8081、使用中の場合は自動インクリメント)

clear

boolean

Metroバンドラーキャッシュのクリア

dev

boolean

開発モード(デフォルト:true)

minify

boolean

JavaScriptの最小化

max_workers

number

Metroの最大ワーカー数

offline

boolean

オフラインモード

scheme

string

カスタムURIスキーム

simulator_name

string

iOSシミュレーター名(例: "iPhone 16 Pro")

clean_state

boolean

起動前にシミュレーターの状態をクリーンアップ(デフォルト:false)

auto_login

object

アプリ読み込み後にMaestroフローを実行 ({ flow_file: "path/to/flow.yaml" })

Maestroツール

セッションがアクティブになると、すべてのMaestroツールが自動的に機能します(device_id はセッションから注入されます):

ツール

説明

take_screenshot

スクリーンショットを撮影(LLMコンテキスト用に自動リサイズ)

tap_on

テキスト、ID、または座標でUI要素をタップ

input_text

フォーカスされたフィールドにテキストを入力

back

戻るボタンを押下

run_maestro_flow

Maestro YAMLフローをインラインで実行

run_maestro_flow_files

プロジェクトディレクトリからMaestroフローファイルを実行

check_maestro_flow_syntax

実行せずにMaestro YAMLフローの構文を検証

inspect_view_hierarchy

現在の画面のUI要素ツリーを取得

list_devices

利用可能な全デバイスをリストアップ(アクティブなセッションなしでも動作)

: デバイスツールにはアクティブなセッションが必要です。最初に start_session を呼び出してください。list_devicescheck_maestro_flow_syntax はいつでも呼び出せます。

デバイスリースシステム

デバイスリースは、1つのMCPインスタンスがデバイスを無期限に占有することを防ぎます:

  1. 取得: start_session が2分間のデバイスリースを取得します

  2. 自動更新: デバイスツール(take_screenshottap_on など)を呼び出すたびに2分間のタイマーがリセットされます

  3. 期限切れ: 2分間デバイスツールが呼び出されない場合、リースは期限切れとなり、デバイスは利用可能になります

  4. 再取得: 再度 start_session を呼び出して再取得します(サーバーは実行されたままなので再起動は不要です)

  5. 確認: get_session_status で残りのリース時間を表示します

複数のMCPインスタンスはファイルベースのレジストリ (/tmp/expo-mcp/instances/) を介して連携するため、2つのインスタンスが同時に同じデバイスを要求することはできません。

環境変数

変数

説明

デフォルト

EXPO_APP_DIR

Expoアプリディレクトリへのパス(CLIの位置引数が優先)

現在の作業ディレクトリ

MAESTRO_CLI_PATH

Maestro CLIへのパス

~/.maestro/bin/maestro

ESSENTIAL_TOOLS

公開するツールのカンマ区切りリスト(--tools が優先)

すべてのツール

EXCLUDE_TOOLS

除外するツールのカンマ区切りリスト(--exclude-tools が優先)

なし

LOG_BUFFER_SIZE

メモリ内に保持する最大ログ行数

400

EXPO_TOKEN

Expo認証トークン(オフラインモードが無効な場合のみ必要)

なし

仕組み

  1. セッション開始: start_session がExpo開発サーバーを起動し、デバイス接続を待機してリースを取得します

  2. デバイスバインド: 接続されたデバイスIDが2分間のTTL付きでセッションに保存されます

  3. 自動注入: すべてのMaestroデバイスツールが自動的にセッションのデバイスIDを使用します

  4. リース更新: デバイスツールを呼び出すたびにリースタイマーがリセットされます

  5. セッション終了: 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

A
license - permissive license
-
quality - not tested
B
maintenance

Maintenance

Maintainers
<1hResponse time
0dRelease cycle
3Releases (12mo)

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