app-store-connect-mcp
app-store-connect-mcp
Apple の2つのコマースAPI ― App Store Connect(1,263 操作)と App Store Server API / StoreKit 2(30 操作)― を、5つのツールの背後で、秘密鍵は macOS キーチェーンに保管し、結果に影響を与える書き込みは明示的な確認を経て実行する MCP サーバーです。
1,293 operations · 5 tools · key never on disk · verified against the live APIsこのように構築した理由
App Store Connect の MCP サーバーはいくつか存在します。それぞれが問題の一部を解決しています。本サーバーは、それぞれの正しかった部分を取り入れ、間違っていた部分を排除しました。
アプローチ | 保持したもの | 却下したもの | |
手作業でラップされたツール | エンドポイントごとに1つの MCP ツール | 型付けされ、発見可能な引数 | 70~900 のツール定義、>100k トークン、Apple のバージョン更新時に即座に陳腐化 |
コードモード | LLM が JS を書き、サーバーが | 2つのツール、約1k トークン、全カバレッジ | 署名鍵を保持するプロセス内で生成コードを実行 |
メタツール |
| 同じコンテキスト上の利点、コード実行なし | — |
本サーバーは3つ目の方法を採用しています。カバレッジは Apple の仕様の性質に依存し、誰かが何個のエンドポイントをラップしたかには依存しません。また、モデルは価格を変更できるプロセス内でコードを実行することは決してありません。
サンドボックスについて
コードモードの前提は、生成された JavaScript が Node の vm 内で安全に実行されるというものです。しかし、それは正しくありません。Node 自身のドキュメントでは、vm はセキュリティ機構ではないと述べており、グローバルとして注入されたホストオブジェクトは、自身のプロトタイプチェーンを介してホストレルムを戻してしまいます。
spec.constructor.constructor('return process.env.HOME')() // → /Users/youそのサンドボックスの忠実な再現に対して検証した結果、ホスト環境を返すことが確認されました。timeout オプションも役に立ちません。これは同期的な実行のみを制限するため、async のビジーループは永久に実行され、イベントループを枯渇させます。
パラメータ化されたディスパッチは、同じカバレッジとトークンコストを実現し、エスケープされるインタプリタを必要としません。
Related MCP server: App Store Connect MCP Server
認証情報
秘密鍵はキーチェーンに属します。Apple は .p8 を一度だけダウンロードさせます。ディスク上の平文のコピーは漏洩の可能性があるコピーです。
ASC_KEY=keychain:my-asc-key # recommended
ASC_KEY=/path/to/AuthKey.p8 # works, but plaintext
ASC_PRIVATE_KEY='-----BEGIN…' # discouraged: `ps -E` exposes itキーチェーンアイテムは、裸の PEM または base64 JSON を保持できます。
{ "issuerID": "…", "keyID": "…", "privateKeyPEM": "-----BEGIN PRIVATE KEY-----\n…" }エンベロープ形式が推奨されます。識別子が鍵素材と一緒に移動するため、ASC_KEY_ID がそれが示す鍵と同期しなくなることがありません。この不一致は、不透明な 401 としてのみ表面化します。
security add-generic-password -s my-asc-key -a api -w "$(
jq -nc --arg i "$ISSUER" --arg k "$KEYID" --arg p "$(cat AuthKey.p8)" \
'{issuerID:$i,keyID:$k,privateKeyPEM:$p}' | base64
)"インストール
git clone https://github.com/abd3lraouf-studios/app-store-connect-mcp
cd app-store-connect-mcp
npm install && npm run build{
"mcpServers": {
"app-store-connect": {
"command": "node",
"args": ["/path/to/app-store-connect-mcp/dist/index.js"],
"env": {
"ASC_KEY": "keychain:my-asc-key",
"ASC_BUNDLE_ID": "com.example.app"
}
}
}
}ASC_BUNDLE_ID は、App Store Server API 呼び出しにのみ必要です。Apple は bid クレームなしの Server API トークンを拒否します。
ツール
ツール | 目的 |
| 認証情報を検証し、到達可能性と残りのレート制限予算を報告します。何かが失敗したときに最初に実行してください。不良な鍵と不良なリクエストを区別します。 |
| 両方の API をキーワード、メソッド、タグ、またはリスク階層で検索します。operationId を返し、各操作がどのツールに属するかを示します。 |
| パラメータ、実際のフィールド名を持つリクエストボディスキーマ、リスク階層。 |
| 読み取り。 パスおよびクエリパラメータ、ページネーション、両方の API。 |
| データを変更するすべての操作。 確認、 |
読み取りと書き込みは別々のツールです。なぜなら、Claude Code は標準の destructiveHint アノテーションを無視しますが、_meta["anthropic/requiresUserInteraction"] は尊重するからです。そして、そのフラグはツールごとに設定されます。単一のディスパッチャでは操作ごとにこれを変えることができません。asc_write はこのフラグを持つため、bypassPermissions 下でもユーザーにプロンプトを表示します。これは、--no-confirm でオフにできるプロセス内ゲートよりも強力な保証です。
リソース
モデルが @asc: を使って意図的に取得できる参考資料:
リソース | 内容 |
| Apple が成功レスポンスを返すが、見た目とは異なる意味を持つケース ― ページネーション、アルファ3の地域、拒否された |
| すべての90 の列挙フィールド。Apple の仕様から生成されているため、陳腐化しません |
| 各リスク階層の意味と、その可逆性 |
| 各 API 記述の出所と日時 |
| オーバーフローストレージ ― 以下参照 |
インラインで返すには大きすぎる結果は切り捨てられません。リストは収まるサイズにトリミングされ、その切り捨てがリクエストの絞り方とともに明示され、完全なレスポンスはクライアントがコンテキストを消費せずに読み取れるリソースとして保持されます。JSON 構造を途中で切断すると、モデルは解析不能なデータを受け取ります。静かに切り捨てるのはさらに悪いです。なぜなら、部分的なリストは完全なものとして読み取られるからです。
プロンプト
4つのワークフローで、/mcp__asc__<name> として利用可能です:
release-readiness · pricing-audit · review-triage · testflight-status
それぞれが複数の呼び出しを連鎖させます(スラッシュコマンドでラップされた1つのリクエストは同義語であり、ワークフローではありません)。また、sort が customerReviews で拒否される、レビューテキストが信頼できない入力であるなどのトラップをエンコードしています。
書き込みの安全性
HTTP メソッドは結果の重大性の貧弱な代理指標です。PATCH /v1/subscriptionPrices と PATCH /v1/appInfos/{id} はどちらも書き込みですが、顧客への請求額を変更するのは前者のみであり、どちらも繰り返しても元に戻りません。操作にはリスク階層が付与されます:
階層 | 件数 | 意味 |
| 797 | 変更なし |
| 238 | データを変更 |
| 61 | 価格設定、サブスクリプション、権利 |
| 132 | 削除 |
| 12 | ビルド、提出、公開されるもの |
| 12 | アカウントにアクセスできる者 |
| 11 | 証明書、識別子、コールバックURL |
デフォルトでは、下位5つの階層は実行せずに確認トークンを返します。トークンはハッシュによって正確な操作、パス、クエリ、ボディにバインドされるため、安価な呼び出しで取得して高価な呼び出しに使用することはできません。1回限りの使用で、5分で期限切れになります。
--read-only block every write --confirm confirm every write
--no-confirm never confirm (default) confirm the five tiers aboveクライアントがelicitationをサポートしている場合、asc_writeは直接ユーザーに確認を求め、メソッド、パス、ボディ、階層を表示します。それ以外の場合は、ハッシュによって正確な操作、パス、クエリ、ボディにバインドされた確認トークンにフォールバックするため、安価な呼び出しに対して発行されたトークンを高価な呼び出しに使用することはできません。elicitationを宣言しても提供できないクライアントは、そのまま通過せずにフォールバックします。dry_run はリクエストを送信せずに正確に報告します。
トランスポート
node dist/index.js # stdio (default)
node dist/index.js --transport http --http-token "$(openssl rand -hex 32)"HTTP は 127.0.0.1 にバインドし、ベアラトークンなしでは起動を拒否します。このプロセスは App Store の価格を変更できる鍵を保持しています。認証なしでリッスンすべきではありません。ループバック以外にバインドすると警告が表示され、TLS 終端プロキシまたは SSH トンネルとの組み合わせが最適です。
Apple の更新への追随
npm run fetch:specs # re-download both descriptions
npm run build # recompile the operation index
npm run verify # drift check + live calls against both APIs2つの API は、必要に応じて異なる方法でソースが取得されています:
App Store Connect — Apple は実際の OpenAPI 3.0 ドキュメントを公開しています。これはダウンロードされ、スリムなインデックス(360KB、元の仕様は3.3MB)にコンパイルされるため、検索は高速で、完全なドキュメントは1つの操作を説明するためだけに開かれます。
App Store Server — Apple は OpenAPI ドキュメントを公開していません。ドキュメントは散文です。信頼できる機械可読記述は Apple 自身のクライアントである
apple/app-store-server-library-nodeで、すべてのエンドポイントはリテラルなmakeRequest呼び出しです。fetch:specsは、固定されたリリースタグでそのソースからエンドポイントセットを解析し、verifyはそれをsrc/storekit.tsのカタログと差分比較します。
そのカタログの2つの詳細は、ドキュメントが示唆するものと矛盾しており、どちらも動作に影響します:
ホストは
api.storekit.apple.com/api.storekit-sandbox.apple.comです。古いapi.storekit.itunes.apple.comという名前はこの API を提供しなくなりました。一括更新延長ステータスのパスは、セグメントを
{productId}/{requestIdentifier}の順序に配置します。逆順ではありません。
検証
npm run verify は読み取り専用で、実際の呼び出しを行います。最終実行日:
1. Catalogue drift — src/storekit.ts vs Apple’s client
✓ all 30 Apple endpoints present in the catalogue
✓ no endpoints in the catalogue that Apple does not define
2. App Store Connect API — live
✓ apps_getCollection → 2 apps
✓ apps_getInstance / builds / appStoreVersions → HTTP 200
✓ pagination walked 3 pages
✓ bogus id → structured 404
3. App Store Server API (StoreKit 2) — live
✓ storekit token carries bid; connect token correctly omits it
✓ getTransactionInfo / getAllSubscriptionStatuses / getTransactionHistory v2
→ authenticated and routed (Apple errorCode 4000006)
✓ getNotificationHistory (30d window) → HTTP 200
14 passed, 0 failedStoreKit プローブは意図的に無効なトランザクション ID を使用します。シグナルは応答の形状です。構造化された Apple の errorCode は、リクエストが認証されルーティングされたことを証明します。一方、401 は認証されていないことを証明します。
堅牢性
タイムアウトとリトライ。 読み取りは 408/429/5xx でリトライします。書き込みは 429 のみでリトライします。この場合、Apple は処理前にリクエストを拒否しています。あいまいに失敗した書き込みはあいまいとして報告され、再送されることはありません。重複した POST は報告された失敗よりも悪影響です。
レート制限。 文書化された時間あたりの制限と文書化されていない分あたりの制限の両方に対してペーシングされ、Apple 自身の
x-rate-limitヘッダー(鍵を共有する他のクライアントを考慮)によって補正されます。x-request-idは Apple サポート向けに公開されます。ホストピン留め。 すべての URL は、
links.nextページネーションカーソルを含め、Apple の3つの API ホストの許可リストに対してチェックされます。カーソルはサーバーから提供された入力です。それを盲目的にたどると、ベアラトークンが指定されたホストに渡されてしまいます。レスポンス整形。
linksとリンクのみのrelationshipsは削除され、links.nextは保持されます。実際の価格ポイント一覧では 60% 以上小さくなります。ライフサイクル。 stdio サーバーは stdin EOF およびシグナルで終了し、署名鍵を保持したまま孤立して残ることはありません。
既知の制限
JWS レスポンスはデコードされますが、検証されません。 StoreKit ペイロードは Apple によって署名されて到着します。チェーンを検証するには Apple のルート証明書が必要です。デコードされた値は
*_decodedフィールドに表示され、未検証とラベル付けされます。署名を確認せずに購入の証明として扱わないでください。リスク階層はパターンマッチングによってメソッドとパスから決定されます。意図的に慎重になっていますが、書き込みの前に階層だけを信頼せず、
asc_describe_endpointを読んでください。キーチェーンストレージは macOS のみです。 他の環境では、制限されたパーミッションを持つファイルパスを使用してください。
--no-confirmはゲートを完全に無効にします。CI 向けに存在しますが、インタラクティブエージェントのデフォルトとしては不適切です。
ライセンス
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.
Related MCP Servers
- AlicenseBqualityCmaintenanceEnables interaction with Apple's App Store Connect API through natural language to manage apps, beta testing, localizations, analytics, sales reports, and CI/CD workflows for iOS and macOS development.3182MIT
- Flicense-qualityDmaintenanceEnables management of App Store Connect apps including registration, listing, IPA upload, store listing updates, and in-app purchase creation via natural language.
- AlicenseAqualityCmaintenanceEnables AI assistants to manage Apple App Store Connect resources like apps, builds, TestFlight, and reviews through natural language.2018MIT
- Alicense-qualityDmaintenanceEnables managing your iOS app's entire lifecycle with natural language through App Store Connect, offering 48 tools across 14 categories for ASO, reviews, analytics, subscriptions, pricing, and more.6MIT
Related MCP Connectors
Let ChatGPT, Claude & Cursor use your Mac: email, calendar, iMessage, Teams, files. Local, free.
Search, read, and write your Apple Notes from ChatGPT/Claude via a local Mac agent + MCP relay.
Manage your NanoCart store from any AI agent: products, orders, coupons, subscribers, reports.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/abd3lraouf-studios/app-store-connect-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server