mcpField
A
App Store Connect

App Store Connect

ローカル
github.com/forgeopslabs開発ツール23 週間前に更新

App Store Connect について

AI エージェントに Apple App Store Connect API を提供する、Rust 製の MCP サーバーです。ライフサイクル向けのツールに加え、汎用 JSON:API アクセスを備え、領域別の絞り込みや読み取り専用モードに対応しています。

主な機能

  1. 01注釈付きの 114 個のツール
  2. 02他の API エンドポイントへの汎用アクセス
  3. 03領域別または読み取り専用の絞り込み
  4. 04ツールの検索と入力スキーマの確認
  5. 05アプリ、TestFlight、レビュー、分析の管理

活用シーン

  1. 01アプリのメタデータ更新と審査提出
  2. 02TestFlight のビルドとテスターの管理
  3. 03レビュー、サブスクリプション、分析の確認
  4. 04エージェントの操作を読み取り専用に制限

MCP 対応

Apple App Store Connect の操作を MCP ツールとして公開します。注釈で安全性を示し、任意のフィルターでクライアントに公開するツールを制御できます。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

インストール方法は未掲載です

このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。

リポジトリ
パッケージ
mcpbappstore-mcp.mcpb

ツール

ツール一覧はまだ取得されていません

ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。

詳細

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
TestFlightlist_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 Cloudlist_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_TOOLSall提供するツールグループをカンマ区切りで指定するか、プリセット core を指定します。
ASC_READ_ONLY0アカウントを変更できないツールのみを提供します。
ASC_TOOL_DISCOVERY0search_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_SECS60リクエスト全体のタイムアウトです。0 で無効になります。
ASC_CONNECT_TIMEOUT_SECS10接続タイムアウトです。0 で無効になります。
ASC_TRANSFER_TIMEOUT_SECS300アセットのアップロードとレポートのダウンロードのタイムアウトです。
ASC_MAX_RETRIES3最初の試行後の再試行回数です。0 で無効になります。
ASC_MAX_RESPONSE_BYTES60000ツール結果のサイズ上限です。0 で無効になります。
ASC_COMPACT_RESPONSES1応答から冗長な 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

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。