Skip to main content
Glama

app-store-connect-mcp

두 Apple 상거래 API — App Store Connect(1,263개 작업)와 App Store Server API / StoreKit 2(30개 작업) — 를 다섯 개의 도구 뒤에 제공하는 MCP 서버입니다. 개인 키는 macOS 키체인에 보관되며, 결과를 변경하는 쓰기 작업은 명시적 확인을 거쳐야 실행됩니다.

1,293 operations · 5 tools · key never on disk · verified against the live APIs

이렇게 구축한 이유

여러 App Store Connect MCP 서버가 있습니다. 각각 문제의 일부를 해결하지만, 이 서버는 각각이 제대로 해결한 부분은 취하고 잘못된 부분은 버렸습니다.

접근 방식

유지한 부분

거부한 부분

수동으로 감싼 도구

엔드포인트당 하나의 MCP 도구

타입이 지정되고 검색 가능한 인수

70–900개의 도구 정의, 100k 토큰 초과, Apple이 버전을 출시하는 즉시 구식화됨

코드 모드

LLM이 JS를 작성, 서버가 eval

두 개의 도구, ~1k 토큰, 전체 커버리지

서명 키를 보유한 프로세스에서 생성된 코드 실행

메타 도구

search → call (매개변수 포함)

동일한 컨텍스트 이점, 코드 실행 없음

—

이 서버는 세 번째 방식을 사용합니다. 커버리지는 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을 구조 중간에서 자르면 모델이 구문 분석할 수 없는 것을 제공합니다. 조용히 자르는 것은 더 나쁩니다. 부분 목록이 완전한 목록으로 읽히기 때문입니다.

프롬프트

네 가지 워크플로우, /mcp__asc__<name>으로 사용 가능:

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

각각 여러 호출을 연결합니다. 하나의 요청을 감싼 슬래시 명령어는 동의어일 뿐 워크플로우가 아닙니다. 각각은 customerReviews에서 sort가 거부되는 것과 같은 함정과 리뷰 텍스트가 신뢰할 수 없는 입력이라는 것을 인코딩합니다.

쓰기 안전성

HTTP 메서드는 결과의 심각성을 반영하기에 부적절합니다: PATCH /v1/subscriptionPrices와 PATCH /v1/appInfos/{id}는 둘 다 쓰기이지만, 하나만 고객이 청구되는 금액을 변경하며, 반복한다고 해도 취소되지 않습니다. 작업에는 위험 등급이 있습니다:

등급

개수

의미

READ

797

변경 없음.

WRITE

238

데이터 변경.

REVENUE

61

가격, 구독, 자격.

DESTRUCTIVE

132

삭제.

RELEASE

12

빌드, 제출, 출시되는 것.

ACCESS

12

계정에 접근할 수 있는 사람.

INFRASTRUCTURE

11

인증서, 식별자, 콜백 URL.

기본적으로 아래 다섯 등급은 실행 대신 확인 토큰을 반환합니다. 토큰은 해시로 정확한 작업, 경로, 쿼리 및 본문에 바인딩되므로, 저렴한 호출에 대해 발급받아 비싼 호출에 사용할 수 없습니다. 일회용이며 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

두 API는 필요에 따라 다른 방식으로 소스에서 가져옵니다:

  • App Store Connect — Apple은 실제 OpenAPI 3.0 문서를 게시합니다. 다운로드하여 간결한 인덱스(360KB, 3.3MB 스펙 대비)로 컴파일하여 검색이 빠르게 유지되고, 전체 문서는 하나의 작업을 설명할 때만 열립니다.

  • App Store Server — Apple은 OpenAPI 문서를 게시하지 않습니다. 문서는 산문 형식입니다. 권위 있는 기계 판독 가능한 설명은 Apple 자체 클라이언트인 apple/app-store-server-library-node이며, 모든 엔드포인트는 문자 그대로의 makeRequest 호출입니다. fetch:specs는 고정된 릴리스 태그에서 해당 소스에서 엔드포인트 집합을 구문 분석하고, verify는 src/storekit.ts의 카탈로그와 비교합니다.

해당 카탈로그의 두 가지 세부 사항은 문서가 암시하는 것과 모순되며, 둘 다 중요합니다:

  • 호스트는 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의 세 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

ActivityStale
ResponsivenessNo recent community issues

Related MCP Connectors

Related MCP Servers