Skip to main content
Glama

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 を書き、サーバーが eval する

2つのツール、約1k トークン、全カバレッジ

署名鍵を保持するプロセス内で生成コードを実行

メタツール

search → call(パラメータ付き)

同じコンテキスト上の利点、コード実行なし

—

本サーバーは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 トークンを拒否します。

ツール

ツール

目的

asc_status

認証情報を検証し、到達可能性と残りのレート制限予算を報告します。何かが失敗したときに最初に実行してください。不良な鍵と不良なリクエストを区別します。

asc_search_endpoints

両方の API をキーワード、メソッド、タグ、またはリスク階層で検索します。operationId を返し、各操作がどのツールに属するかを示します。

asc_describe_endpoint

パラメータ、実際のフィールド名を持つリクエストボディスキーマ、リスク階層。

asc_call

読み取り。 パスおよびクエリパラメータ、ページネーション、両方の API。

asc_write

データを変更するすべての操作。 確認、dry_run、両方のAPI。

読み取りと書き込みは別々のツールです。なぜなら、Claude Code は標準の destructiveHint アノテーションを無視しますが、_meta["anthropic/requiresUserInteraction"] は尊重するからです。そして、そのフラグはツールごとに設定されます。単一のディスパッチャでは操作ごとにこれを変えることができません。asc_write はこのフラグを持つため、bypassPermissions 下でもユーザーにプロンプトを表示します。これは、--no-confirm でオフにできるプロセス内ゲートよりも強力な保証です。

リソース

モデルが @asc: を使って意図的に取得できる参考資料:

リソース

内容

asc://cookbook

Apple が成功レスポンスを返すが、見た目とは異なる意味を持つケース ― ページネーション、アルファ3の地域、拒否された sort、gzip 圧縮レポート

asc://enums

すべての90 の列挙フィールド。Apple の仕様から生成されているため、陳腐化しません

asc://risk

各リスク階層の意味と、その可逆性

asc://sources

各 API 記述の出所と日時

asc-response://…

オーバーフローストレージ ― 以下参照

インラインで返すには大きすぎる結果は切り捨てられません。リストは収まるサイズにトリミングされ、その切り捨てがリクエストの絞り方とともに明示され、完全なレスポンスはクライアントがコンテキストを消費せずに読み取れるリソースとして保持されます。JSON 構造を途中で切断すると、モデルは解析不能なデータを受け取ります。静かに切り捨てるのはさらに悪いです。なぜなら、部分的なリストは完全なものとして読み取られるからです。

プロンプト

4つのワークフローで、/mcp__asc__<name> として利用可能です:

release-readiness · pricing-audit · review-triage · testflight-status

それぞれが複数の呼び出しを連鎖させます(スラッシュコマンドでラップされた1つのリクエストは同義語であり、ワークフローではありません)。また、sort が customerReviews で拒否される、レビューテキストが信頼できない入力であるなどのトラップをエンコードしています。

書き込みの安全性

HTTP メソッドは結果の重大性の貧弱な代理指標です。PATCH /v1/subscriptionPrices と PATCH /v1/appInfos/{id} はどちらも書き込みですが、顧客への請求額を変更するのは前者のみであり、どちらも繰り返しても元に戻りません。操作にはリスク階層が付与されます:

階層

件数

意味

READ

797

変更なし

WRITE

238

データを変更

REVENUE

61

価格設定、サブスクリプション、権利

DESTRUCTIVE

132

削除

RELEASE

12

ビルド、提出、公開されるもの

ACCESS

12

アカウントにアクセスできる者

INFRASTRUCTURE

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 APIs

2つの 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 failed

StoreKit プローブは意図的に無効なトランザクション 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

Available Tools

13 tools
asc_analytics_reportA
Read-only

Fetch an analytics report as rows. Walks request → report → instance → every segment, downloads the signed URLs, gunzips the TSV and returns parsed rows. Reading only the first segment — the obvious mistake — yields a plausible subset with nothing marking it partial. Call without report_name to list what exists. Never creates a report request: accessType ONGOING is a standing commitment on the account, not a query.

NameRequiredDescriptionDefault
appYesBundle ID, store name, or numeric Apple ID.
dateNoProcessing date, YYYY-MM-DD. Omit for the newest instance.
max_rowsNoDefault 5000, cap 50000.
list_onlyNoList available reports without fetching one.
granularityNo
report_nameNoOmit to list the available reports.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Although annotations declare readOnlyHint and openWorldHint, the description adds substantial behavioral detail: it walks request → report → instance → every segment, downloads signed URLs, gunzips TSV, returns parsed rows, and warns that reading only the first segment yields a plausible but partial result. It also clarifies the account-level semantics of ONGOING accessType, going far beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded, with the core purpose in the first sentence. Every subsequent sentence contributes distinct information: the retrieval mechanics, the partial-data pitfall, the list mode, and the non-creating side-effect warning. There is no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given there is no output schema, the description sufficiently explains what the tool returns (parsed rows from TSV), how it traverses all data segments, how to use list mode, and that it never creates report requests. An agent has enough information to invoke the tool correctly and understand its scope and limitations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is high at 83%, with app, date, max_rows, list_only, and report_name already explained in the schema. The description reinforces the report_name list behavior but does not add meaningful semantics for granularity or the other parameters, so it meets the baseline without exceeding it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Fetch an analytics report as rows', giving a specific verb and resource. It then describes the full retrieval pipeline and explicitly distinguishes this tool from report-creating operations with 'Never creates a report request', which separates it from write-oriented siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear operational guidance: omit report_name to list available reports, and never use this to create a report request because ONGOING accessType is a standing commitment. It does not explicitly name sibling alternatives for report creation, so it falls just short of the most explicit alternative-routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

asc_availability_setA
Destructive

Turn an app’s App Store availability on or off, territory by territory. Apple offers no bulk endpoint — appAvailabilities answers 403 "does not allow UPDATE" once the record exists — so this is one PATCH per territory, up to 175 of them. Territories already in the target state are skipped, a failure part-way does not abandon the rest, and every territory is re-read afterwards and compared against the request, because a loop that finishes is not evidence that the store matches what was asked for. Cannot set availableInNewTerritories: that is web-UI only.

NameRequiredDescriptionDefault
appYesBundle ID, store name, or numeric Apple ID.
stateYeson = downloadable, off = removed from sale.
confirmNoConfirmation token from a previous gated call. Not needed when the user is prompted directly.
territoriesNoISO alpha-3 codes, e.g. ["USA","GBR"]. Omit for every territory the app has.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the destructiveHint/openWorldHint annotations, the description discloses important behavioral traits: territories already in the target state are skipped, a partial failure does not abandon the remaining territories, and every territory is re-read and compared afterwards. This is exactly the kind of operational nuance an agent needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence earns its place: purpose, technical constraint, failure semantics, verification behavior, and a known limitation. The main action is front-loaded and the supporting details follow a logical order.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the operation, scale, failure handling, verification process, and a key limitation. There is no output schema, so return-value details are not required; the confirmation token is already documented in the input schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

All parameters already have schema descriptions with 100% coverage, so the description does not need to restate them. It adds little parameter-specific meaning beyond what the schema already provides, which is acceptable but not exceptional.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a precise verb and resource: 'Turn an app's App Store availability on or off, territory by territory.' It clearly establishes the tool's scope and mechanical nature (one PATCH per territory, up to 175), leaving no doubt about what the tool accomplishes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains why bulk usage is impossible ('Apple offers no bulk endpoint') and explicitly calls out a limitation ('Cannot set availableInNewTerritories: that is web-UI only'). It would be stronger with an explicit mention of sibling alternatives, but the conditions and constraints are clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

asc_callA
Read-only

Read from Apple. Handles both APIs, path and query parameters, and pagination. READ operations only — anything that changes data goes through asc_write. A short list may just be one page: if the result says truncated, say so rather than treating it as complete.

NameRequiredDescriptionDefault
queryNoQuery parameters. Arrays are sent as repeated keys. Filters look like {"filter[bundleId]": "com.x"}; sparse fieldsets like {"fields[apps]": "name,bundleId"}; "limit" caps at 200. Territories are ISO alpha-3 (USA, not US) — the two-letter form returns an empty list, not an error.
paginateNoFollow links.next and concatenate.
max_pagesNoDefault 10, cap 50.
environmentNoStoreKit only; overrides the server default for this call.
operationIdYesFrom asc_search_endpoints.
path_paramsNoValues for {placeholders}, e.g. {"id": "6763390896"}.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark readOnlyHint=true; the description reinforces this and adds genuinely new behavior: it handles both API styles, follows/concatenates pagination, and warns that short lists may be one page where 'truncated' should not be treated as complete. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, each earns its place: role, capabilities, and a pagination caveat. The phrase 'both APIs, path and query parameters' is slightly awkward/ambiguous, but the description remains compact and front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a generic read call with six parameters and no output schema, the description covers the crucial behavior: read-only safety, pagination/truncation, and routing writes to asc_write. It does not describe error handling or return shapes, but the schema covers parameter semantics and the tool's generic nature makes exhaustive return documentation impractical.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with detailed parameter documentation for query, paginate, max_pages, environment, operationId, and path_params. The description itself adds no parameter-level meaning beyond the schema, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description states a clear verb and scope: 'Read from Apple' and explicitly says 'READ operations only', with writes routed to asc_write. It also names core capabilities (both APIs, path/query params, pagination), so the generic name asc_call does not leave the agent guessing.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives an explicit exclusion: 'anything that changes data goes through asc_write', and it gives operational guidance about truncated pages. It does not name alternative read-only siblings like asc_pricing_get or asc_analytics_report, so it is clear but not fully exhaustive.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

asc_describe_endpointA
Read-only

Full detail for one operation: every parameter, the request body schema with real field names, and its risk tier. Call this before any write.

NameRequiredDescriptionDefault
operationIdYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With readOnlyHint=true, the safety profile is already known, but the description adds value by disclosing the output content (parameters, request body schema, risk tier). This is especially useful because there is no output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact, front-loaded, and every sentence earns its place. The core value is stated first, followed by a clear usage directive.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter, read-only tool with no output schema, the description adequately covers what the tool returns and when to call it. Minor omissions are the source of operationId and a definition of the risk tier, but these are not critical.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate for the parameter semantics. It implies operationId selects the operation, but it does not explain where to get an operationId or what format it takes. The parameter is simple and self-describing, but the gap prevents a higher score.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool returns full detail for one operation: every parameter, request body schema, and risk tier. This is specific and distinguishable from siblings like asc_search_endpoints (search/discovery) and asc_write/asc_call (execution).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The instruction 'Call this before any write' explicitly states when the tool should be used. It does not name alternatives explicitly, but the reference to write operations effectively excludes the sibling write tools and provides a clear usage context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

asc_listing_screenshotsA
Read-only

List the screenshot sets and screenshots on a version, with each asset’s delivery state. Uses included resources to turn what is otherwise a request per locale per set into a handful.

NameRequiredDescriptionDefault
appYesBundle ID, store name, or numeric Apple ID.
localeNoe.g. en-US. Omit to inspect the primary locale only.
versionNoVersion string. Omit for the newest.

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the read-only nature is covered. The description adds value beyond that by revealing that the tool baches requests via 'included resources' and that it returns delivery state, which is behavioral/payload context not present in the schema or annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two concise sentences. The primary action and resource are front-loaded in the first sentence, and the second sentence provides a valuable efficiency context without fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a low-complexity read-only list tool, this description is complete: it names the resource, the scope ('on a version'), the included output detail ('delivery state'), and the batching behavior. The schema covers all three parameters, and annotations cover the read-only safety profile, so nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema fully documents app, locale, and version. The description only loosely references locale and version ('per locale per set', 'on a version') without adding format or relationship details, so it does not meaningfully improve on the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('List') and a specific resource ('screenshot sets and screenshots on a version'), and adds the useful detail that each asset's delivery state is included. It is clearly distinguishable from sibling tools like asc_upload_screenshot and asc_pricing_get because the action and resource are explicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit guidance on when to prefer this tool over alternatives, nor any statement of when not to use it. The efficiency note about included resources implies a bulk-listing use case, but it does not tell an agent 'use this to inspect current screenshots' or 'use asc_upload_screenshot to modify them.'

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

asc_preflight_versionA
Read-only

Answer "can this version actually be submitted?" across build state, export compliance, every localisation, screenshots, review contact details and any open submission. Returns GO or NO-GO with each gap naming the operation that fixes it. Catches the states that stall a release without explaining themselves — a build still PROCESSING, or an unanswered export-compliance question that parks the version at WAITING_FOR_EXPORT_COMPLIANCE.

NameRequiredDescriptionDefault
appYesBundle ID, store name, or numeric Apple ID.
versionNoVersion string. Omit for the newest.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint/openWorldHint annotations already signal a read-only external-facing check; the description goes further by disclosing the specific states inspected and the outcome format (GO or NO-GO, with each gap naming a fixing operation). It reveals the tool can catch ambiguous states like PROCESSING builds or WAITITNG_FOR_EXPORT_COMPLIANCE, so there are no surprises in behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences: the first defines scope and output, the second illustrates the hidden states it catches. No filler or redundant restatement of the schema. The key question is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's multi-dimensional check and no output schema, the description is complete: it names the return type, the categories evaluated, and the action-oriented gap reporting. An agent can decide when to call it and what to expect without further documentation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already documents both parameters at 100% coverage: app is a Bundle ID/store name/numeric Apple ID, version is an optional version string. The description does not add anything about parameter formats or defaults beyond the schema, so it sits at the baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states the tool's purpose with a specific verb ('Answer... can this version actually be submitted?') and a clear resource ('a version'). It enumerates the dimensions checked (build state, export compliance, localisations, screenshots, review contact details, open submission), which differentiates it from sibling status or write tools. The GO/NO-GO return is explicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It establishes a clear use case: determine submission readiness before release. It implies this is a diagnostic to run before acting, and notes it catches non-obvious blocking states, but it does not explicitly name alternatives or when not to use it. Context is clear enough, though exclusions and sibling routing are left to the agent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

asc_pricing_getA
Read-only

Read subscription pricing across every territory for an app, with the currency resolved and territories grouped by price so outliers stand out. Collapses a four-hop walk and ~175 lookups into a handful of requests. The currency lives on the territory, not the price row, which is why reading prices by hand tends to produce ambiguous numbers.

NameRequiredDescriptionDefault
appYesBundle ID, store name, or numeric Apple ID.
territoryNoISO alpha-3, e.g. USA. Omit for every territory.
subscriptionNoProduct ID, name or id. Omit for all of them.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark readOnly and openWorld. The description goes further by explaining the underlying multi-hop data model, the currency-ons-territory quirk, and the collapse of ~175 lookups into a few requests. This is genuinely useful behavioral context beyond structured annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences with the purpose front-loaded. Each sentence earns its place: scope/result organization, efficiency/scale, and a domain gotcha. No filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 100% parameter schema coverage and readOnly/openWorld annotations, the definition covers what is read, how results are organized, and why this tool is preferable to manual lookups. A formal response shape is not specified, and alternatives are not directly named, but the description is strong enough for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already covers all three parameters explicitly, including examples and 'omit for all' guidance, so the baseline is 3. The description adds related context about currency resolution but does not add new syntactic or constraint-level param details.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Starts with a specific verb and resource: 'Read subscription pricing...'. It also specifies scope (every territory, per app), output behavior (currency resolved, territories grouped by price), and the read-versus-write distinction is clear against the asc_pricing_set sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description makes the intended use clear: efficiently reading pricing across territories and spotting outliers, while avoiding manual multi-hop lookups. It doesn't explicitly name alternatives or state when not to use it, but the read framing and performance benefit supply enough context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

asc_pricing_setA
Destructive

Change a subscription price. preserve_current_price is required and has no default: true keeps existing subscribers on what they pay now, false moves them at their next renewal. Apple defaults it to false, so leaving it implicit silently re-prices your existing base. Find a price point id with asc_call subscriptions_pricePoints_getToManyRelated.

NameRequiredDescriptionDefault
appYesBundle ID, store name, or numeric Apple ID.
confirmNoConfirmation token from a previous gated call. Not needed when the user is prompted directly.
territoryNoISO alpha-3. Omit to apply to the price point’s own territory.
start_dateNoYYYY-MM-DD. Omit to apply as soon as Apple allows.
subscriptionYesProduct ID, name or id.
price_point_idYesFrom the subscription’s price points.
preserve_current_priceYesREQUIRED. true = existing subscribers keep their price. false = they are moved to the new one.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnlyHint=false, destructiveHint=true), the description discloses the exact destructive consequence: Apple defaults preserve_current_price to false, so omitting it silently re-prices existing subscribers at renewal. This is precisely the kind of behavioral warning an agent needs before invoking a mutation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, each earning its place: the action, the critical required-parameter behavior, and the prerequisite lookup. The warning is front-loaded immediately after the action, so an agent is unlikely to miss the risk.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive 7-parameter write with no output schema, it covers the core behavior, the dangerous default, and the prerequisite lookup. It does not contextualize the gated confirm field or territory/start_date semantics, though those are documented in the schema, so the description is strong but not exhaustive.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3; the description adds real value by explaining the boolean semantics of preserve_current_price and by telling the agent where price_point_id comes from. It does not need to repeat the schema's existing parameter descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb and resource — 'Change a subscription price' — and the rest of the description sharpens the action by explaining the preserve_current_price effect. This is clearly distinct from the sibling asc_pricing_get (read) and asc_write (generic write) tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

States the clear use case: changing a subscription price and choosing whether existing subscribers keep or migrate their price. It also gives a concrete prerequisite step for obtaining a price point id, but it does not explicitly name when to prefer this over asc_write or call out when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

asc_search_endpointsA
Read-only

Find operations across the App Store Connect API (1263 operations, v4.4.1) and the App Store Server API / StoreKit 2 (30). Search by keyword, method, tag or risk tier; returns operationIds for asc_call and asc_write. Start here rather than guessing a path — some resources are not where the URL pattern implies.

NameRequiredDescriptionDefault
apiNoDefault "both".
tagNoApp Store Connect tag, e.g. "Apps", "Builds".
riskNo
limitNoDefault 25, max 200.
queryNoKeyword, e.g. "subscription price", "builds", "refund".
methodNo

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, and the description aligns with that by presenting this as a search/find operation. It adds useful context beyond the annotations: API versions, operation counts, and the warning that some resources are not where the URL pattern implies. No side effects are claimed, so there is no contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences and every clause earns its place: scope, API versions, search dimensions, output use, and a routing heuristic. Key information is front-loaded, with no filler or redundant restating of the tool name.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a search tool with no output schema, the description covers the essential return contract ('returns operationIds for asc_call and asc_write'), the targeted APIs, and valid search dimensions. It is slightly light on how filters combine and what response metadata accompanies the operationIds, but an agent has enough context to invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 67%, so the description partially carries the burden for undocumented parameters. 'Search by keyword, method, tag or risk tier' maps query, method, tag, and risk to their intended roles, and api/limit have schema descriptions with defaults. However, the risk tier values are not explained, and the combination semantics of multiple filters are left implicit, so the description only partially compensates for the schema gaps.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with an unambiguous verb and resource: 'Find operations across the App Store Connect API... and the App Store Server API / StoreKit 2.' It also states the search dimensions and the concrete output: 'returns operationIds for asc_call and asc_write.' This clearly differentiates the tool from siblings like asc_call and asc_describe_endpoint.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The instruction 'Start here rather than guessing a path' establishes when this tool should be used before calling or writing operations, and naming asc_call and asc_write as consumers of the returned operationIds gives the agent a natural next step. It does not explicitly enumerate when to skip this tool and go directly to a sibling, so it stops short of a full 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

asc_statusA
Read-only

Verify credentials and report what this server can reach, including the remaining rate-limit budget. Run this first when anything fails — it distinguishes a bad key from a bad request.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark readOnlyHint=true, so the read-only nature is known. The description adds meaningful context beyond that: it verifies credentials, reports server reachability, and includes rate-limit budget. These details clarify what the tool actually does during execution and what kind of information it surfaces.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tightly packed sentences with no filler. The primary action is front-loaded in the first sentence, and the diagnostic use case follows in the second. Every word contributes meaning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, read-only status tool with no output schema, this description is complete. It explains what the tool does, what it reports (reachability, rate-limit budget), and when to invoke it. Nothing essential is missing for an agent to select and call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is no parameter burden. With 100% schema description coverage (vacuously) and no parameters to explain, the baseline of 4 applies. The description needs to add no parameter detail and appropriately focuses on behavior.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Verify credentials and report what this server can reach.' It clearly identifies a status/health-check operation distinct from sibling tools like asc_call, asc_write, or asc_pricing_get. The purpose is unambiguous and action-oriented.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit guidance: 'Run this first when anything fails — it distinguishes a bad key from a bad request.' This tells the agent when to use the tool and what diagnostic value it provides. It doesn't name alternatives or when-not-to-use, but the conditional use case is strong and practical.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

asc_upload_iap_screenshotA
Destructive

Upload the App Store review screenshot for an in-app purchase, performing Apple’s reserve → upload → commit sequence. This is a different resource from a listing screenshot and is the usual reason an in-app purchase stays in MISSING_METADATA when everything else about it is complete — it is the one required field with no text to type. Apple rejects non-standard aspect ratios: a window capture at 1706x1610 fails IMAGE_BAD_ASPECT_RATIO, while 2880x1800 passes. Validation is asynchronous, so a rejected image commits cleanly and only then reports FAILED.

NameRequiredDescriptionDefault
iapYesNumeric in-app purchase id. asc_pricing_get lists them.
confirmNoConfirmation token from a previous gated call. Not needed when the user is prompted directly.
dry_runNoReport what would be sent, including the checksum, without sending it.
file_nameNoName to store it under. Defaults to the file’s own name.
file_pathYesAbsolute path to the image on this machine.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond annotations, the description discloses the reserve→upload→commit sequence, asynchronous validation, and the surprising behavior that a rejected image commits cleanly and only then reports FAILED. The aspect-ratio example adds concrete failure context. No contradiction with the annotations exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences, each dense and non-redundant: the action, the resource distinction, a concrete validation constraint, and the async failure model. It is appropriately sized for the complexity and front-loads the main purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with destructive annotations and no output schema, the description covers the operation's side-effect sequence, validation behavior, and failure mode well. It could add what success returns or how confirm interacts with gating, but overall it is strong and nearly complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and parameter descriptions already document iap, file_path, confirm, dry_run, and file_name, so the baseline is 3. The aspect-ratio guidance adds useful context for file_path, but the description does not substantially extend parameter semantics beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: uploading the App Store review screenshot for an in-app purchase, and names the reserve→upload→commit sequence. It also differentiates this from a listing screenshot, which helps disambiguate against sibling tools like asc_upload_screenshot.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives a clear use case: this is the usual reason an in-app purchase stays in MISSING_METADATA when everything else is complete, so an agent knows when it is needed. It also explicitly says this resource is different from a listing screenshot, but it does not name the sibling tool to use as an alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

asc_upload_screenshotA
Destructive

Upload a screenshot image, performing Apple’s full reserve → upload → commit sequence: reserve a slot, PUT each byte range to Apple’s asset host with the headers Apple supplies, then commit with an MD5 checksum. The raw API cannot do this in one call, and a wrong checksum or offset does not error — it leaves the asset stuck, which looks like nothing happened.

NameRequiredDescriptionDefault
confirmNoConfirmation token from a previous gated call. Not needed when the user is prompted directly.
dry_runNoReport what would be sent, including the checksum, without sending it.
file_nameNoName to store it under. Defaults to the file’s own name.
file_pathYesAbsolute path to the image on this machine.
screenshot_set_idYesFrom asc_listing_screenshots.

TDQS

A4.1/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses a non-obvious failure mode: a wrong checksum or offset silently leaves the asset stuck, appearing as if nothing happened. This goes well beyond the annotations (destructiveHint=true, openWorldHint=true) by explaining the side-effectful behavior and exact sequencing.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with a clear structure: the first defines the core workflow, the second explains why it exists and what can go wrong. Every clause contributes meaningful operational detail without repetition or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description fully conveys the multi-step process, the dependence on Apple-supplied headers, and the critical silent-failure risk, giving an agent the operational context needed to invoke it correctly. It does not cover the return value or prerequisites in detail, but the schema and annotations already handle parameter and safety context, and no output schema exists to constrain expectations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all five parameters already have meaningful schema-level descriptions. The tool description mentions checksum and offset concepts but does not map them to specific input parameters, adding little parameter-level value beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Upload') and resource ('screenshot image') and adds the concrete reserve → upload → commit workflow, making the tool's unique function clear. However, it does not explicitly distinguish itself from the sibling asc_upload_iap_screenshot, so it lacks direct sibling differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for when to use the tool: it exists because the raw API cannot perform the full upload sequence in one call. It does not mention alternative sibling tools or explicit when-not conditions, but the underlying rationale effectively guides usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

asc_writeA
Destructive

Change something in App Store Connect: create, update or delete. Consequential tiers (REVENUE, DESTRUCTIVE, INFRASTRUCTURE, ACCESS, RELEASE) ask the user to confirm before anything is sent. Use dry_run first when you are unsure what a call will do — it validates and reports the exact request without sending it. Read asc_describe_endpoint first to get the body schema right.

NameRequiredDescriptionDefault
bodyNoJSON:API request body. For binary uploads, a base64 string.
queryNoQuery parameters. Arrays are sent as repeated keys. Filters look like {"filter[bundleId]": "com.x"}; sparse fieldsets like {"fields[apps]": "name,bundleId"}; "limit" caps at 200. Territories are ISO alpha-3 (USA, not US) — the two-letter form returns an empty list, not an error.
confirmNoConfirmation token from a previous gated call. Not needed when the user is prompted directly.
dry_runNoValidate and report the request that would be sent, without sending it.
environmentNoStoreKit only; overrides the server default for this call.
operationIdYesFrom asc_search_endpoints.
path_paramsNoValues for {placeholders}, e.g. {"id": "6763390896"}.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

While annotations already flag readOnly=false and destructive=true, the description adds meaningful behavioral context: consequential tiers (REVENUE, DESTRUCIVE, INFRASRUCTURE, ACCESS, RELEASE) prompt for user confirmation, and dry_run validates without sending. This helps an agent anticipate side effects and safety gating beyond the raw annotation booleans.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences with no wasted words. The purpose is front-loaded, consequential behaviors are stated next, and the dry_run and schema-discovery guidance are packed into the final two sentences. Every sentence justifies its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex write tool with no output schema, the description covers the key operational concerns: mutation scope, user confirmation gates, dry-run safety, and where to find the correct body schema. It does not describe return values or error behavior, but given that the response depends on the endpoint and the agent is pointed to asc_describe_endpoint, this is a reasonable completeness level.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already documents all 7 parameters thoroughly (100% coverage), including JSON:API body, base64 uploads, query filter syntax, and the confirm token. The description adds value only by directing the agent to asc_describe_endpoint for the operation-specific body schema and recommending dry_run, but it does not substantially expand parameter meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb-plus-resource statement: 'Change something in App Store Connect: create, update or delete,' which clearly identifies the tool as a writ operation and differentiates it from read-oriented siblings like asc_call and asc_status. It is immediately clear what the tool does and what category of operations it covers.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit guidance to 'Use dry_run first when you are unsure what a call will do' and to 'Read asc_descibe_endpoint first to get the body schema right,' which are concrete stepps for safe and correct usage. It also explains that consequential tiers require user confirmation before anything is sent. However, it does not explicitly state when not to use asc_write in favor of a read-only sibling like asc_call.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 13 tool updatesv1.2.0
    • First observedasc_analytics_report
    • First observedasc_availability_set
    • First observedasc_call
    • First observedasc_describe_endpoint
    • First observedasc_listing_screenshots
    • First observedasc_preflight_version
    • First observedasc_pricing_get
    • First observedasc_pricing_set
    • First observedasc_search_endpoints
    • First observedasc_status
    • First observedasc_upload_iap_screenshot
    • First observedasc_upload_screenshot
    • First observedasc_write

TDQS

A4.2/5.0

Scored across 13 tools

Disambiguation5/5

Each tool has a clearly distinct role: generic read/write, endpoint discovery, pricing, submission readiness, screenshot uploads, analytics, and availability. Even the two upload tools are explicitly differentiated by resource type, and the specialized tools are described as collapsing multi-step workflows rather than duplicating asc_call/asc_write.

Naming Consistency3/5

All tools share the asc_ prefix and use snake_case, but the pattern after the prefix varies: some are verb-noun (asc_search_endpoints, asc_upload_screenshot), some are noun-verb (asc_pricing_get, asc_availability_set), and some are bare or noun-like (asc_call, asc_status, asc_analytics_report). The set remains readable, but the naming convention is not uniform.

Tool Count5/5

Thirteen tools is well within the ideal range for a cohesive server. The generic asc_call and asc_write cover the huge underlying API surface, while the specialized tools earn their place by handling complex, multi-step workflows that would otherwise be error-prone.

Completeness5/5

The generic read/write tools plus endpoint discovery and schema description provide full lifecycle coverage for the App Store Connect API, with no obvious dead ends. The high-level tools deliberately cover the most painful real-world flows like pricing, submission readiness, screenshot uploads, analytics, and availability.

Maintenance

ActivityNo data
ResponsivenessSyncing

Related MCP Connectors

Related MCP Servers