App Store Connect について
AI エージェントに Apple App Store Connect API を提供する、Rust 製の MCP サーバーです。ライフサイクル向けのツールに加え、汎用 JSON:API アクセスを備え、領域別の絞り込みや読み取り専用モードに対応しています。
主な機能
- 01注釈付きの 114 個のツール
- 02他の API エンドポイントへの汎用アクセス
- 03領域別または読み取り専用の絞り込み
- 04ツールの検索と入力スキーマの確認
- 05アプリ、TestFlight、レビュー、分析の管理
活用シーン
- 01アプリのメタデータ更新と審査提出
- 02TestFlight のビルドとテスターの管理
- 03レビュー、サブスクリプション、分析の確認
- 04エージェントの操作を読み取り専用に制限
MCP 対応
Apple App Store Connect の操作を MCP ツールとして公開します。注釈で安全性を示し、任意のフィルターでクライアントに公開するツールを制御できます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
appstore-mcp
AI エージェントに Apple App Store Connect API を公開する、Rust で記述された MCP サーバーです。アプリとメタデータ、アプリ内課金、サブスクリプションとそのオファー、価格と提供状況、App Store のバージョン、App Review への提出、TestFlight、プロビジョニングと署名、アセットのアップロード、プロモーション対象の購入、カスタマーレビュー、段階的リリース、ユーザーとアクセス権、アプリ内イベント、Xcode Cloud、分析レポートなど、製品ライフサイクル全体を114 個のツールでカバーしています。また、2 つの汎用 JSON:API ツールを通じて、その他の App Store Connect エンドポイントにもアクセスできます。
公式の rmcp SDK を使用し、stdio 経由で動作します。
📖 すべてのツールのリファレンス → docs/TOOLS.md — 各ツールの用途とパラメーターを記載しています。
すべてのツールには MCP アノテーションが付いているため、クライアントは list_apps と remove_user を区別できます。必要なドメインだけを提供する(ASC_TOOLS)、または書き込みができないツールだけを提供する(ASC_READ_ONLY)こともできます。詳しくは提供するツールの選択をご覧ください。
設計:ハイブリッドなカバレッジ
App Store Connect API には数百のエンドポイントがありますが、いずれも一貫してJSON:APIを使用しています。エンドポイントごとにツールを用意するのではなく、このサーバーはハイブリッド型です。
- 厳選されたツール(112 個):一般的なワークフロー、複数ステップにわたるワークフロー、またはエラーが発生しやすいワークフロー向けです。アプリとメタデータ、IAP、サブスクリプションとオファー、バージョン、価格、提供状況、App Review への提出、TestFlight、プロビジョニング、アセットのアップロード、プロモーション対象の購入、カスタマーレビュー、段階的リリース、ユーザー、アプリ内イベント、Xcode Cloud、分析レポート、カスタムプロダクトページをカバーします。
- 汎用のエスケープハッチツール 2 つ —
appstore_requestとappstore_list— 生の JSON:API ドキュメントを使用して、任意のエンドポイントを呼び出せます。
ツール
| グループ | ツール |
|---|---|
| 汎用 | appstore_request, appstore_list |
| アプリとメタデータ | list_apps, get_app, update_app, list_app_infos, update_app_info, set_age_rating, create_app_info_localization, update_app_info_localization |
| アプリ内課金(v2) | list_in_app_purchases, create_in_app_purchase, update_in_app_purchase, delete_in_app_purchase, create_iap_localization, set_iap_price_schedule, upload_iap_review_screenshot |
| サブスクリプション | list_subscription_groups, create_subscription_group, create_subscription, update_subscription, create_subscription_localization, set_subscription_price |
| バージョンとメタデータ | list_app_store_versions, create_app_store_version, create_version_localization, update_version_localization |
| アプリレビューの提出 | create_review_submission, add_review_submission_item, submit_review_submission, list_review_submissions, submit_in_app_purchase, set_app_review_detail, create_app_encryption_declaration, assign_build_encryption_declaration |
| 価格設定 | list_territories, list_iap_price_points, list_subscription_price_points |
| 提供状況 | set_iap_availability, set_subscription_availability, set_app_availability |
| TestFlight | list_builds, list_beta_groups, create_beta_group, add_beta_tester, submit_build_for_beta_review, set_build_test_notes, set_build_beta_detail, set_beta_app_review_detail, expire_build, add_build_to_beta_group |
| プロビジョニングと署名 | list_bundle_ids, create_bundle_id, enable_bundle_id_capability, disable_bundle_id_capability, list_certificates, create_certificate, list_devices, register_device, list_profiles, create_profile |
| アセット | upload_app_screenshot, upload_app_preview, create_screenshot_set, create_preview_set, delete_screenshot_set, delete_preview_set, reorder_screenshots |
| サブスクリプションオファー | create_introductory_offer, create_promotional_offer, create_winback_offer, list_winback_offers |
| オファーコード | create_offer_code, generate_one_time_use_codes, create_custom_offer_code, list_offer_codes |
| プロモーション対象の購入項目 | create_promoted_purchase, update_promoted_purchase, set_promoted_purchase_order, list_promoted_purchases |
| カスタマーレビュー | list_customer_reviews, respond_to_review, delete_review_response |
| 段階的リリース | start_phased_release, update_phased_release |
| ユーザーとアクセス | list_users, invite_user, update_user, remove_user |
| アプリ内イベント | create_app_event, create_app_event_localization, upload_app_event_screenshot |
| Xcode Cloud | list_ci_products, list_ci_workflows, start_ci_build, get_ci_build_run, list_ci_build_actions |
| 分析レポート | request_analytics_report, list_analytics_reports, list_analytics_report_instances, list_analytics_report_segments, download_analytics_segment |
| カスタムプロダクトページ | list_custom_product_pages, get_custom_product_page, create_custom_product_page, update_custom_product_page, delete_custom_product_page, list_custom_product_page_versions, create_custom_product_page_version, list_custom_product_page_localizations, create_custom_product_page_localization, update_custom_product_page_localization, create_cpp_screenshot_set, create_cpp_preview_set |
各ツールの説明とパラメーターについては、docs/TOOLS.md を参照してください。カスタムプロダクトページの画像は、既存の upload_app_screenshot / upload_app_preview ツールでアップロードします。
インストール
macOS(ユニバーサル)、Linux(x86-64)、Windows(x86-64) 向けのビルド済みバイナリは、すべての GitHub Release に添付されています。 クライアントに対応するチャンネルを選んでください。どのチャンネルでも認証情報が必要です(認証情報を参照)。
Claude Desktop — ワンクリックバンドル
最新リリースから appstore-mcp.mcpb をダウンロードし、Claude Desktop で開きます
(Settings → Extensions → Install Extension… を選択するか、ファイルをウィンドウにドラッグします)。
Issuer ID、Key ID、.p8 キーファイルの入力を求められます。バンドルには3つのプラットフォームすべてのバイナリが含まれており、適切なものが自動的に選択されます。
Claude Code — プラグインマーケットプレイス
/plugin marketplace add forgeopslabs/appstore-mcp
/plugin install appstore-mcp@forgeopslabs
プラグインは PATH から appstore-mcp バイナリを起動するため、まずインストールしてください —
最新リリースからお使いの OS 用のバイナリをダウンロードして PATH に追加するか、cargo install --git https://github.com/forgeopslabs/appstore-mcp を実行します。
Claude Code の起動元の環境に ASC_ISSUER_ID、ASC_KEY_ID、ASC_PRIVATE_KEY_PATH を設定します。
Codex
Codex では MCP サーバーを直接設定します(マーケットプレイスはありません)。appstore-mcp を PATH に追加した状態で、次を実行します。
codex mcp add appstore \
--env ASC_ISSUER_ID=... --env ASC_KEY_ID=... \
--env ASC_PRIVATE_KEY_PATH=/path/AuthKey_XXXXXX.p8 \
-- appstore-mcp
または ~/.codex/config.toml に次のように記述します。
[mcp_servers.appstore]
command = "appstore-mcp"
args = []
env = { ASC_ISSUER_ID = "...", ASC_KEY_ID = "...", ASC_PRIVATE_KEY_PATH = "/path/AuthKey_XXXXXX.p8" }
MCP Registry
io.github.forgeopslabs/appstore-mcp として公開されており(メタデータは
server.json にあります)、MCP 対応のクライアントであれば検出できます。
ソースからビルド
cargo build --release # -> target/release/appstore-mcp
認証情報
App Store Connect → Users and Access → Integrations →
App Store Connect API で Team Key を生成し、.p8 ファイルをダウンロードします。次に、以下を設定します。
| 変数 | 必須 | 説明 |
|---|---|---|
ASC_ISSUER_ID | ✅ | キーテーブルの上部に表示される Issuer UUID です。 |
ASC_KEY_ID | ✅ | API キーの Key ID です。 |
ASC_PRIVATE_KEY | いずれか一方 | インラインの .p8 PEM の内容です。 |
ASC_PRIVATE_KEY_PATH | いずれか一方 | ダウンロードした .p8 ファイルへのパスです。 |
ASC_BASE_URL | 任意 | API のオリジンを上書きします。 |
ASC_LOG | 任意 | ログフィルター(stderr への出力)。デフォルトは info です。 |
.env.example を参照してください。サーバーは、キーで署名した有効期間の短い ES256 JWT を使って各リクエストを認証します(キャッシュされ、自動的に更新されます)。
認証情報がなくてもサーバーは起動するため、クライアントはツールの一覧を取得できます。 認証情報を設定するまでは、ツールを呼び出すと設定を促すエラーが返されます。
提供するツールの選択
100 個のツール定義は、セッションごとにコンテキストを消費します。また、すべてが平坦に並んだリストを見せられたクライアントは、読み取りと削除を区別できません。次の 2 つの設定で解決できます。
| 変数 | デフォルト | 説明 |
|---|---|---|
ASC_TOOLS | all | 提供するツールグループをカンマ区切りで指定するか、プリセット core を指定します。 |
ASC_READ_ONLY | 0 | アカウントを変更できないツールのみを提供します。 |
ASC_TOOL_DISCOVERY | 0 | search_tools、get_tool_details、call_discovered_tool のみを公開します。フィルターされたドメインツールは、ディスカバリーを通じて引き続き利用できます。 |
ASC_TOOLS=core # 41 tools: generic, apps, versions, assets, testflight, submission
ASC_TOOLS=testflight,provisioning # just what a build-distribution agent needs
ASC_READ_ONLY=1 # 35 read-only tools; writes are withheld entirely
ASC_TOOL_DISCOVERY=1 # 3 visible tools; discover domain tools on demand
グループは、generic、apps、iap、subscriptions、versions、pricing、
availability、submission、testflight、provisioning、assets、offers、
offer-codes、promotions、reviews、users、events、xcode-cloud、
analytics、custom-product-pages に加え、all と core です。認識されない名前は stderr に警告が出力され、すべてのツールに暗黙的に切り替わることなく、何も提供されません。
読み取り専用モードでは appstore_request は維持されますが、GET 以外のメソッドはすべて拒否されます。そのため、厳選されたツールがないエンドポイントにも、制限を回避する手段にならずにアクセスできます。
提供されるすべてのツールは、MCP アノテーション(readOnlyHint、destructiveHint、idempotentHint)を提示します。クライアントはこれを使って、何に確認が必要かを判断します。破壊的とマークされているツールは 9 つあります。7 つの delete_*/remove_* ツール、expire_build、disable_bundle_id_capability、および任意の DELETE エンドポイントにアクセスできる appstore_request です。
ディスカバリーモード。 タスクで検索し、一致するツールの完全な入力スキーマと安全性アノテーションを確認してから、その正確な名前と引数を call_discovered_tool に渡します。ASC_TOOLS と ASC_READ_ONLY は、検索または実行の前に非公開カタログをフィルターします。非表示のツール名を直接呼び出すと失敗します。これはサーバー側のディスカバリーです。確認したスキーマはツールの結果に表示され、ホストから新しい独立した MCP ツールとして注入されることはありません。
汎用の実行ツールは、書き込みが有効な場合は常に破壊的とマークされます。ホストは、非表示の各ツールに個別の承認ルールを適用できません。実行する前に、基盤となるツールを確認し、書き込みを承認してください。デフォルトモードでは、従来どおり個別にアノテーションされたツール群が維持されます。
調整
ツール呼び出しがハングしたり、単一の応答がエージェントのコンテキストを圧迫したりしないよう、デフォルト値が設定されています。以下はすべて任意です。
| 変数 | デフォルト | 説明 |
|---|---|---|
ASC_TIMEOUT_SECS | 60 | リクエスト全体のタイムアウトです。0 で無効になります。 |
ASC_CONNECT_TIMEOUT_SECS | 10 | 接続タイムアウトです。0 で無効になります。 |
ASC_TRANSFER_TIMEOUT_SECS | 300 | アセットのアップロードとレポートのダウンロードのタイムアウトです。 |
ASC_MAX_RETRIES | 3 | 最初の試行後の再試行回数です。0 で無効になります。 |
ASC_MAX_RESPONSE_BYTES | 60000 | ツール結果のサイズ上限です。0 で無効になります。 |
ASC_COMPACT_RESPONSES | 1 | 応答から冗長な JSON:API リンクを削除します。 |
再試行。 Apple がリクエストを適用せずに拒否したため、どのメソッドでも 429 は再試行されます。5xx またはリクエスト途中のタイムアウトは、GET/PATCH/PUT/DELETE の場合に限って再試行されます。重複リソースを作成する可能性がある POST は再試行されません(Apple は製品 ID などの識別子を永久に予約するためです)。ジッターを加えた指数バックオフを使用し、Retry-After に従います。
応答の整形。 結果はコンパクトにシリアライズされます。同じ内容でもインデント付き JSON は 1.72 倍のバイト数になるため、同じ上限で、要求したデータを約 40%多く保持できます。リソースごとの self リンクと、リンクのみのリレーションシップは削除されます。アドレス指定可能なコンテンツは失われず、ページネーション用の links.next は保持されます。それでも応答が上限を超える場合は、まず included が削除され、次に末尾の data 項目が削除されます。結果には、欠落した内容とクエリを絞り込む方法を示す _truncated キーが含まれます。トリミング後に links.next をたどると削除された項目を飛ばしてしまうため、代わりに limit を小さくして再リクエストしてください。
ビルドと実行
cargo build --release
ASC_ISSUER_ID=... ASC_KEY_ID=... ASC_PRIVATE_KEY_PATH=/path/AuthKey_XXX.p8 \
./target/release/appstore-mcp
サーバーは stdio 経由で MCP を使用します。ログは stderr に出力され、stdout はプロトコルの通信チャネルです。
MCP クライアントで使用する
クライアント設定の例(Claude Desktop の mcpServers など):
{
"mcpServers": {
"appstore": {
"command": "/absolute/path/to/appstore-mcp/target/release/appstore-mcp",
"env": {
"ASC_ISSUER_ID": "00000000-0000-0000-0000-000000000000",
"ASC_KEY_ID": "ABCD123456",
"ASC_PRIVATE_KEY_PATH": "/absolute/path/to/AuthKey_ABCD123456.p8"
}
}
}
}
MCP Inspector で確認する
npx @modelcontextprotocol/inspector ./target/release/appstore-mcp
使用上の注意
- ID は不透明です。 まず一覧取得/取得を行い、アプリ、IAP、サブスクリプション、セット、価格ポイントの ID を確認してから、作成/更新ツールに渡してください。
- 価格設定には価格ポイントが必要です。
list_iap_price_points/list_subscription_price_pointsを使ってset_iap_price_schedule/set_subscription_priceに渡すidを取得してください。 - アセットのアップロード(
upload_*)では、ローカルファイルのパスを指定すると、予約 → チャンク分割アップロード → MD5 コミットの一連の処理が 1 回の呼び出しで実行されます。ファイルはストリーミングされるため、ピーク時のメモリ使用量はアセットのサイズではなく 1 チャンク分です。また、失敗したチャンクのみ再試行されます。スクリーンショット/プレビューには既存のappScreenshotSet/appPreviewSetが必要です。必要に応じて、汎用ツールで作成してください。 - ページネーション。
appstore_listはデフォルトで 1 ページを返します。max_pages(最大 20)を指定すると、links.nextをたどってページを結合し、1 つの結果として返します。残りのデータがあるかどうかはmeta.hasMoreで確認できます。 - 分析データ。
request_analytics_report→list_analytics_reports→list_analytics_report_instances→list_analytics_report_segmentsの順に実行すると、署名付きセグメント URL が取得できます。download_analytics_segmentはその URL からデータを取得して gunzip し、行を JSON として返します。新しいリクエストの初回レポート生成には、Apple 側で最大 48 時間かかることがあります。 - 一覧にない項目には、
appstore_request(生のメソッド+パス+JSON:API ボディ)またはappstore_list(ページネーション対応の GET)でアクセスできます。例:appstore_request { "method": "GET", "path": "/v1/apps/123/customerReviews" }。 - 対象外: 売上/財務レポートのエンドポイントは gzip 圧縮された TSV を返し、JSON:API 形式ではないため、これらのツールの対象外です。
制限事項(Apple による制約)
- API 経由でアプリを作成することはできません。
appsリソースで許可されているのは GET と UPDATE のみです。POST /v1/appsは403 FORBIDDEN_ERRORを返します。App Store Connect のウェブサイト(Apps → ➕ → New App)でアプリのレコードを作成してください。create_bundle_idを使ってバンドル ID を事前に作成できます。それ以外のすべてのツールは、既存のアプリに対して動作します。 - 削除されたアプリ内課金の
productIdは Apple によって永久に予約され、再利用できません。
開発
cargo test # 200+ tests, no network or credentials needed
cargo clippy --all-targets -- -D warnings
cargo fmt --check
テストは 3 層で構成されています。リクエストボディービルダー、再試行の判断、レスポンス整形を対象とした純粋なユニットテスト、実際の HTTP クライアントをモック API に対して実行する wiremock テスト(再試行、タイムアウト、ページネーション、3 段階のアップロードプロトコル、セグメントのダウンロード)、そしてクライアントが実際に認識する内容の不変条件を検証する tests/tool_surface.rs です。ここでは、名前の一意性、実際の説明、オブジェクトスキーマ、正しいアノテーション、さらに ASC_TOOLS/ASC_READ_ONLY が宣言どおりの項目だけを除外することを確認します。
最低サポート Rust バージョンは 1.88 で、専用の CI ジョブで確認しています。
ツールを追加/変更した後は、ツールリファレンスを再生成してください(リリースバイナリが必要です。認証情報は不要です):
cargo build --release && python3 scripts/gen_tools_doc.py # rewrites docs/TOOLS.md
ライブ統合テスト
scripts/integration_test.py は、コンパイル済みサーバーを実際の API に対して実行します。デフォルトでは読み取り専用です。--write を指定すると、自動でクリーンアップされる IAP のライフサイクルテストが追加されます。
cargo build --release
# Credentials via env (ASC_ISSUER_ID/ASC_KEY_ID/ASC_PRIVATE_KEY_PATH) or local
# appstore-connect.txt + AuthKey_*.p8 in the repo root (both gitignored).
python3 scripts/integration_test.py --app <APP_ID> # read-only sweep
python3 scripts/integration_test.py --app <APP_ID> --write # + write lifecycle
ライセンス
MIT
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。