Expo Application Services について
Expo チーム向けの MCP サーバーで、EAS のビルド、ワークフロー実行、提出、認証情報、アップデートを調査し、一部の操作を管理できます。ビルドクレジットを消費するワークフローの実行には、クライアントでの承認が必要です。
主な機能
- 01ビルドとワークフローの失敗調査
- 02提出状況と認証情報の期限確認
- 03フィンガープリント、チャンネル、更新の比較
- 04ビルドとワークフロー実行のキャンセル
- 05ビルド提出とアップデート配信の管理
活用シーン
- 01ステップログからビルド失敗を診断
- 02証明書の期限前に認証情報を監査
- 03ステージング更新を本番へ昇格
- 04承認後に EAS ワークフローを実行
MCP 対応
MCP ツールとして、EAS のプロジェクト、ビルド、ワークフロー、提出、認証情報、フィンガープリント、アップデートの操作を公開します。ビルドクレジットを消費するワークフロー実行は承認対象です。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
npx -y @foreverworks/mcp-easEXPO_TOKEN_FILEシークレットPath of a file holding an Expo access token.EAS_PROJECTThe project a call means when it names none, as @account/slug.ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ツール
23掲載時のツール一覧 · 2 日前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| project | string | いいえ | プロジェクトを "@account/slug"(例:"@acme/my-app")、slug、または ID で指定します。トークンから見えるプロジェクトが 1 つだけの場合(list_projects)は省略できます。 |
| platform | enum | いいえ | ios | android |
| identifier | string | いいえ | 1 つの bundle id または package。デフォルト:プロジェクトが資格情報を持つ、またはビルドしたすべての識別子。 |
詳細
Expo Application Services MCP サーバー
Expo Application Services
(EAS)を通じて、Expo アプリのビルド、ワークフローの実行、ストアへの提出が失敗した理由を AI アシスタントに尋ねることができます。ステップごとのジョブログ、Apple または Google のエラー文、認証情報の監査、フィンガープリント、更新チャンネルを確認できます。また、ビルドや実行のキャンセル、既存ビルドの提出、アップデートの再公開や段階的な配信、バンドル ID の提出に使用する App Store Connect キーの設定、ワークフローのディスパッチもできます。dispatch_workflow は唯一の「確認が必要な」ツールです。クライアントは呼び出しのたびに確認を求めます。
必要なもの: EAS プロジェクトを含む Expo アカウントと、ファイルに保存されたアクセストークンが必要です。理想的には、Developer ロールを持つロボットユーザーのトークンを使用してください。ディスパッチでは、プロジェクトの GitHub リポジトリにあるワークフローファイルが実行され、ビルドジョブでは Expo プランのビルドクレジットが消費されます。
できること
- 「@acme/my-app の直近の iOS ワークフロー実行が失敗した理由は?」
- 「すべての iOS バンドルに TestFlight 提出用のキーが設定されていますか?また、30 日以内に期限切れとなる証明書はありますか?」
- 「main で ios-beta.yml を実行して、完了したら知らせてください。」
- 「アップデートはあるが、まだビルドがないフィンガープリントはどれですか?」
- 「staging ブランチの最新のアップデートを production に昇格させてください。」
- 「最新の production アップデートの段階的な配信率を 50% に上げてください。」
インストール
Claude Code の場合:
claude mcp add eas -e EXPO_TOKEN_FILE="<path to Expo token file>" -- npx -y @foreverworks/mcp-eas
Claude Desktop(Settings、Developer、Edit Config)や、その他ほとんどのクライアントでは、同じコマンドを JSON として読み込みます。
{
"mcpServers": {
"eas": {
"command": "npx",
"args": ["-y", "@foreverworks/mcp-eas"],
"env": {
"EXPO_TOKEN_FILE": "<path to Expo token file>"
}
}
}
}
いずれも、Node 22.19 以降で公開済みパッケージを実行します。VS Code と Claude Desktop バンドルでは、サーバーの追加時に各設定の入力を求められます。任意の設定は空のままにしてください。Cursor は各設定を環境変数から読み込むため(${env:EXPO_TOKEN_FILE} など)、Cursor の起動前に設定してください。上記のコマンドでは必須項目のみを設定しています。その他の項目については、設定をご覧ください。
クローンから実行する場合
git clone https://github.com/foreverworks/mcps.git && cd mcps
npm ci && npm run build
claude mcp add eas -e EXPO_TOKEN_FILE="<path to Expo token file>" -- node "$PWD/servers/eas/dist/index.js"
JSON 設定では、コマンドは node、引数は servers/eas/dist/index.js のフルパスです。複数のクライアントで 1 つの実行中のコピーを HTTP 経由で共有する方法については、docs/deploying.mdをご覧ください。
設定
| 変数 | 必須 | 意味 |
|---|---|---|
EXPO_TOKEN_FILE | はい、または EXPO_TOKEN | Expo アクセストークンを格納したファイルです。401 の後に再読み込みされるため、トークンを置き換えれば再起動せずに使えます。 |
EXPO_TOKEN | いいえ | トークン自体(eas-cli 独自の変数名)です。ローカルの stdio 実行に使用します。 |
EAS_PROJECT | いいえ | 呼び出しでプロジェクトが指定されておらず、トークンから複数のプロジェクトが見える場合に使用するプロジェクトです。@account/slug、スラッグ、または ID を指定します。 |
EAS_PRODUCTION_CHANNELS | いいえ | 更新が実際のユーザーに配信されるチャネル名をカンマ区切りで指定します。既定値は production です。再公開やロールアウトでは、配信先のチャネルを指定します。 |
EXPO_API_URL | いいえ | GraphQL エンドポイントです。既定値は https://api.expo.dev/graphql です。 |
validate_workflow は、MCP_FILE_ROOTS で指定されたルートから path で指定されたファイルを読み込みます。
この変数と、すべてのサーバーで共有されるその他の変数(トランスポート、制限、ツールの操作内容)については、docs/configuration.md を参照してください。
ロボットユーザーのトークンを取得する
このサーバー用のロボットユーザーを作成します。ロボットユーザーは個人ではなくアカウントに属し、ロールによってサーバーが実行できる操作が制限されるため、個別に取り消すこともできます。expo.dev のアカウント設定で、次の操作を行います。
- Robots を開き、実行場所が分かる名前で Create robot を選びます。
このサーバーのすべてのツール(ビルド、送信、認証情報)に十分な Developer ロールを付与します(請求やメンバー管理はできません)。Viewer を選ぶとサーバーは読み取り操作に限定され、書き込み操作はすべて
forbiddenを返します。 - ロボットユーザーの画面で Create access token を選びます。Expo でトークンが表示されるのは一度だけなので、自分だけが読み取れるファイルに保存します(
chmod 600)。 EXPO_TOKEN_FILEにそのファイルのパスを設定します。
Expo アクセストークンに有効期限はありません。トークンをローテーションするには、ファイルを置き換えてください。
初回実行
- アシスタントに EAS の
healthチェックを実行するよう依頼します。トークンが機能するか、どのアクターとして認識されるか(理想的にはロボットユーザー)、およびアクセスできるアカウントとプロジェクトが分かります。 - 複数のプロジェクトが表示される場合は、
EAS_PROJECTを設定するか、各リクエストでプロジェクトを指定します(list_projectsで名前を確認できます)。 - 認証情報の監査(
audit_credentials)を依頼し、不足しているものや有効期限が近いものを確認します。
ツール
read は何も変更しません。write は EAS またはストア上の何かを、ビルドクレジットを消費せずに変更します。money は EAS ビルドクレジットを消費し、クライアントは各呼び出しの前に確認を求めます。
| ツール | アクセス | 説明 |
|---|---|---|
health | read | トークンが受け入れられているか、そのアクター(できればロボットユーザー)、アカウント、表示可能なプロジェクトを確認します。 |
list_projects | read | アカウントごとにトークンから見えるプロジェクトを一覧表示します。あらゆる場所で project に指定する値を確認できます。 |
list_builds | read | ビルドを新しい順に、プラットフォーム、ステータス、プロファイル、バンドル ID またはパッケージ、コミット、フィンガープリントで絞り込んで表示します。 |
get_build | read | 1 件のビルドについて、アーティファクト、フィンガープリント、ランタイム、所要時間、エラーを表示します。ERRORED ビルドの場合は、ログから失敗したステップとその行も表示します。 |
list_workflows | read | プロジェクトの .eas/workflows ファイルを一覧表示します。 |
validate_workflow | read | ワークフローファイルを実行前に、ref またはファイルとして検証します。有効かどうか、EAS バリデーターが示す各問題、ジョブ、ディスパッチ時にクレジットを消費するビルドを表示します。 |
list_workflow_runs | read | 実行を新しい順に、ファイル、ステータス、ref で絞り込んで表示します。各 FAILURE 実行には、失敗したジョブのログから取得した reason が含まれます。 |
get_workflow_run | read | 実行のジョブ(種類、ステータス、出力、アーティファクト)を表示します。失敗した場合は、ジョブごとの失敗理由と、失敗したステップの末尾も表示します。 |
wait_for_run | read | 実行またはビルドの終了を待ちます(1 回の呼び出しにつき最大 14 分)。進捗を報告した後、get_workflow_run または get_build と同様の結果を返します。 |
get_job_logs | read | ジョブのログをステップごとに表示します。各ステップの結果と、1 つのステップの最後の行(デフォルトでは失敗したステップ)を確認できます。 |
list_submissions | read | Apple または Google のエラーテキストを含む提出を一覧表示します。ワークフローによる提出の場合、エラーテキストはジョブ上にあり、このツールで読み取れます。 |
get_submission | read | 1 件の提出を表示します。ERRORED の場合は、ログ内の失敗したステップも表示します。 |
audit_credentials | read | バンドル ID とパッケージごとに、証明書とプロファイルの有効期限、提出用の App Store Connect キー、プッシュキー、キーストアのフィンガープリント、Play サービスアカウントを確認します。不足しているもの、期限切れのもの、30 日以内に期限切れになるものも表示します。 |
list_fingerprints | read | フィンガープリントを新しい順またはハッシュで表示し、それぞれを含むビルドとアップデートも確認できます。 |
list_updates | read | チャネルと配信先のブランチ(本番環境には印を付けます)、および各ブランチのプラットフォームとランタイムごとの最新アップデートを表示します。 |
cancel_build | write | キュー内または実行中のビルドをキャンセルします。 |
cancel_workflow_run | write | 終了していない実行をキャンセルします。 |
set_submit_key | write | Apple キー ID または EAS ID を指定して、EAS が 1 つのバンドル ID の提出に使用する App Store Connect API キーを設定または解除します。その後、バンドルの監査結果を返します。 |
submit_build | write | 既存の FINISHED ビルドを提出します。iOS は App Store Connect に、Android は Play トラックに提出します。expect_version または expect_build_number と一致しないビルドは拒否します。 |
republish_update | write | 既存のアップデートグループをブランチに再度配置します(ロールバックまたは昇格)。アップロードは行いません。別のプロジェクトのグループ、署名済みのグループ、ロールアウト中のグループ、または expect_commit に一致しないグループは拒否します。 |
set_rollout | write | アップデートグループのロールアウトを、そのブランチのデバイスの指定割合まで引き上げます。100 にするとすべてのデバイスにロールアウトされます。同じ割合を再度指定しても何も変更されません。 |
revert_rollout | write | 対象デバイスをその前のアップデートに戻して、ロールアウトを終了します。何も削除しません。 |
dispatch_workflow | money | リポジトリにすでに存在する git ref でワークフローファイルを実行します。ビルドジョブは EAS ビルドクレジットを消費します。 |
金銭面
このサーバーがビルドを開始する方法はワークフローの実行だけなので、
dispatch_workflow が唯一の money ツールです。tools/list でそのように
マークされており、クライアントは呼び出しのたびに承認を求めます(Claude Code は
どの権限モードでもそうします)。呼び出しの前に、サーバーは EAS からその ref の
ワークフローファイルを読み込みます(何も実行されません)。実行ではその時点の
ファイルのリビジョンが使われるため、その間にブランチが移動しても、そのリビジョンの
ジョブが実行されます。MCP_CONFIRM=elicit を設定すると、サーバー自身が各ビルド
ジョブのプラットフォームとプロファイルを示した1行のメッセージで確認を求めます。
eas: Run EAS workflow ios-beta.yml of @acme/my-app at main: builds ios preview (if its condition holds); may spend EAS build credits.
このメッセージにはコミットが記載されません。EAS はコンテンツによってリビジョンを 識別し、そのコンテンツを最初に確認したコミットを報告するので、現在 ref が指している コミットとは限りません。ビルドジョブのないファイルの場合は、ビルドクレジットを 消費しないことが示されます。
その他の変更では何も消費しないため、write です。ただし、再公開やロールアウトは
本番環境を含め、ブランチのデバイスに次回起動時に反映されます(それぞれの応答には、
反映された本番チャンネルが記載されます)。再公開すれば元に戻せます。
submit_build と republish_update はモデルがコピーする ID を受け取り、コピーを
間違えると、気付かないうちに別のものを配信してしまう可能性があります。そのため、
各応答には配信した内容が記載されます(ビルドの場合はプラットフォーム、プロファイル、
アプリのバージョン、ビルド番号、コミット、グループの場合はプロジェクト、ソース
ブランチ、コミット、メッセージ)。さらに送信前に、想定どおりかを確認します。ビルド
では expect_version と expect_build_number、グループでは expect_commit(7文字
以上のプレフィックス)で確認します。別のプロジェクトのグループは常に拒否されます。
トラブルシューティング
config:「EXPO_TOKEN_FILE も EXPO_TOKEN も設定されていません」。 サーバーに
トークンを指定してください(ロボットユーザーのトークンを取得する)。
auth。 EAS がトークンを拒否しました。ロボットまたはそのトークンが削除または
失効しています。expo.dev(アカウント設定、Robots)で確認し、トークンファイルを
置き換えてください。次回の呼び出し時に再読み込みされます。
forbidden。 ロボットに必要な権限がありません。書き込みには、プロジェクトの
アカウントで Developer ロールが必要です。expo.dev(アカウント設定、Members)で
ロールを変更してください。
not_found。 ID または名前を確認してください。list_projects、list_builds、
list_workflow_runs、list_submissions で確認できます。別のアカウントのプロジェクトも
not_found を返します。
input。 引数がこのサーバーまたは EAS のチェックに失敗しました。想定と異なる
ビルドまたはグループ、現在より低いロールアウト率、git ref ではない ref などが該当します。
ワークフローファイルの場合、issues には EAS のバリデーターが指摘した問題がすべて、
フィールドごとに表示されます(jobs.build.params.platform: Required)。変更は
行われていません。
refused。 メッセージに記載された理由で EAS が拒否しました(すでに終了したビルド、
その ref にないワークフローファイルなど)。変更は行われていません。
outcome_unknown がディスパッチ、送信、その他の変更後に表示される場合。リクエストの
送信後に接続が切れたため、EAS が処理したかどうかは不明です。まず確認してください
(get_workflow_run、get_build、list_submissions)。ディスパッチや送信を繰り返すと、
2回実行されます。
送信ジョブが「Prepare credentials」で失敗し、何も特定しないメッセージが表示される場合。
通常、バンドル ID に送信用の App Store Connect キーが設定されていません。多くの場合、
キーが設定されているものに対応する開発用のものです。audit_credentials で確認でき、
set_submit_key でアカウントがすでに保持しているキーを設定できます。
wait_for_run が done: false を返す場合。 実行は承認待ちか、指定した時間を
過ぎてもまだ進行中です。もう一度呼び出してください。実行には影響しません。
rate_limited。 EAS がトークンを抑制しています。1分ほど待ってください。
api のステータスが 0 の場合は EAS に接続できませんでした。別のステータスの場合は
EAS でエラーが発生しています。後で再試行し、問題が続く場合は
status.expo.dev を確認してください。drift は EAS の
API が変更されたことを意味します(クエリが検証を通らなくなっています)。メッセージを
添えて報告してください。
仕組み
GraphQL エンドポイントは 1 つだけです。https://api.expo.dev/graphql。クエリは 5xx または接続切断後に再試行します。ミューテーションは確認せずに再試行することはなく、outcome_unknown として失敗します。トークンから参照できるプロジェクトは 5 分間キャッシュされ、HTTP プロセスのすべてのクライアントで共有されます。EAS はエラーを HTTP 200 と errors リストで返し、src/infra/graphqlErrors.ts が次のようにマッピングします。*_NOT_FOUND は not_found、VALIDATION_ERROR は input、それ以外の USER エラーは refused、GRAPHQL_VALIDATION_FAILED は drift です。
シークレットを保持しない、スキーマから作成されたクエリです。 src/infra/easApi/queries.ts のクエリは、EAS のイントロスペクションと eas-cli 24.10 のクエリを基に作成され、ライブスキーマに対して検証されています。EAS もリクエストごとに各クエリを検証するため、削除されたフィールドがあれば drift として明確に失敗します。いずれもシークレットを取得しません。P12 やそのパスワード、プロビジョニングプロファイルのファイル、キーストアやそのパスワード、.p8、FCM キー、環境変数の値は取得しません。set_submit_key は、アカウントがすでに保持しているキーを指定するだけで、何もアップロードされません。
ログは署名付き Cloud Storage URL からトークンなしで取得します。Brotli 圧縮され、1 行に 1 つの JSON オブジェクトが記録されています。src/domain/logs.ts はログをステップごとにまとめ、失敗したステップの失敗理由を示す行(ビルダーの「exited with non-zero code」ではない、最後に出力された行)を選びます。
ロールアウト
eas update --rollout-percentage で公開されたアップデートは、ブランチとランタイムが一致するデバイスのうち指定割合に配信され、それ以外のデバイスにはその前のアップデートが維持されます。list_updates にはグループの rolloutPercentage が表示されます。そこから次の操作を行えます。
- 割合を増やす:
set_rolloutに高い割合を指定すると、ロールアウト中のすべてのプラットフォームがまとめて移行します(platformを指定すると 1 つだけ移行します)。EAS ではロールアウトの拡大しか認められないため、低い値はロールバックを案内して拒否されます。100 になるとすべてのデバイスにアップデートが配信され、ロールアウトは終了します。 - 元に戻す:
revert_rolloutは、終了するロールアウトを指定して、ブランチ上のその前のアップデートを再公開します(進行中のロールアウトを上書きして公開するには、EAS がその指定を必須とします)。eas-cli とは異なり、ロールアウトグループは削除されません。ロールアウトはプラットフォームとランタイムに対する最新のアップデートでなければならないため、2 回目のロールバックや、新しいアップデートの公開後のロールバックは、二重公開を防ぐために拒否されます。 - 対象外: 前のアップデートがないロールアウト(そのランタイムでのブランチ初回のアップデート)を元に戻す操作です。この場合、アプリに組み込まれたアップデートに戻ることになり、プロジェクトの
expo-updatesバージョンが必要です(eas update:revert-update-rolloutで実行できます)。また、チャンネル上の 2 つのブランチ間で行うロールアウト(eas channel:rollout)も対象外です。
ワークフロー実行前の確認
validate_workflow は、チェックアウトや費用を発生させずに「このファイルは実行できるか」を回答します。ディスパッチで実行されるファイルを確認するには workflow と git_ref を指定し、編集中のファイルを確認するには path を指定します(サーバーのファイルルート内にある必要があります。HTTP 経由の場合はファイルをそこにコピーするか、スクリプトから content_base64 とその sha256 を送信してください)。ディスパッチと同じように YAML を解析し(EAS の読み取りに合わせてマージキーを有効にします)、ディスパッチ行で指定されるビルドジョブを一覧表示してから、eas workflow:validate と同じように EAS 独自のバリデーターに問い合わせます。このコマンドは各ビルドジョブのプロファイルが eas.json に存在することも確認しますが、このツールでは確認できません。
npx tsx scripts/smoke.ts は、ビルド済みサーバーを読み取り専用で動作させ、dispatch_workflow が唯一の money ツールであることを確認します(--project、--workflow、および --expect-key <Apple key id> を指定すると、すべての iOS バンドルにその送信用キーが設定されていない限り失敗します)。
制限事項
- ローカルツリーからのビルドはできません(
eas build、または--refを指定しないeas workflow:run)。作業ディレクトリがアップロードされるため、時間がかかり、ハングすることもあります。また、誰も何がビルドされたのか確認できないため、代わりにrefを指定してディスパッチしてください。 eas updateによる公開はできません。既存グループの再公開のみ可能です。また、認証情報のアップロードもできません。証明書、プロファイル、キーストア、キーはeas credentialsが配置する場所に保持されます。submit_buildでは、ビルドの識別子としてEASにすでに保存されているものを使用します。不足しているものは、まずaudit_credentialsで確認できます。- トークンから見える範囲は、そのロボットユーザーから見える範囲に限られます。別のアカウントのプロジェクトは表示されません。
- ロールアウト:アップデートごとのロールアウトのみ可能で、埋め込みアップデートへのロールバックはできません(ロールアウト)。
Expo Application Services向けのその他のサーバー
2026-10-15に調査しました。Expoが公開しているサーバーは1つで、コミュニティサーバーのうち2つがEASに対応しています。
- Expo MCP Server(Expoがホスト):Streamable HTTPを使用し、ブラウザーでユーザー本人がOAuthサインインします。ビルドの開始、キャンセル、情報やログの取得ができます。また、ワークフロー実行とジョブログの作成、検証、実行、キャンセル、情報取得ができ、完了したビルドの送信、TestFlightのクラッシュとフィードバック、App StoreとGoogle Playのレビュー(および返信)、Playのクラッシュの取得、ドキュメントの検索も可能です。
expo-mcpパッケージを使うと、ローカルシミュレーターを操作できます。ワークフローの作成、プロファイルからのビルド、クラッシュ、ストアレビューへの対応では、このサーバーのほうが優れています。 - PyPIの**
shipstores**:stdioを使用し、保守されています。プロジェクトフォルダー内でeas-cliを実行するEASツールが5つあり、多数のApp Store ConnectおよびPlay Consoleツールも備えています。 - GitHubの**
expo-mcp-server**:stdioを使用します。ビルド、アップデート、送信に対応していますが、2025年12月以降更新されていません。
このサーバーでは、他のサーバーにない機能を利用できます。バンドルIDとパッケージごとの認証情報監査、AppleまたはGoogleのエラーテキストを含む送信一覧、各失敗実行の理由を一覧内に表示する機能、フィンガープリント、アップデートチャネル、アップデートグループの再公開、およびバンドルIDからの送信に使用するApp Store Connectキーの設定です。権限の範囲がロールで制限されたロボットユーザーとしてサインインし、トークンをファイルに保存するため、共有サービスとして実行できます。Expoのサーバーは対話的なサインインのみをサポートします。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。