app-store-connect-mcp
app-store-connect-mcp
MCP-сервер для обоих коммерческих API Apple — App Store Connect (1263 операции) и App Store Server API / StoreKit 2 (30 операций) — реализованный через пять инструментов, с закрытым ключом в связке ключей macOS и блокировкой опасных запросов за явным подтверждением.
1,293 operations · 5 tools · key never on disk · verified against the live APIsПочему он устроен именно так
Существует несколько MCP-серверов для App Store Connect. Каждый решает часть задачи; этот берёт то, что каждый сделал правильно, и отбрасывает то, что сделано неправильно.
Подход | Сохранено | Отброшено | |
Ручная обёртка | Один MCP-инструмент на эндпоинт | Типизированные, обнаруживаемые аргументы | 70–900 определений инструментов, >100k токенов, устаревают при выходе версии Apple |
Code Mode | LLM пишет JS, сервер выполняет | Два инструмента, ~1k токенов, полное покрытие | Выполнение сгенерированного кода в процессе, содержащем ключ подписи |
Мета-инструменты |
| Тот же выигрыш в контексте, без выполнения кода | — |
Этот сервер использует третий вариант. Покрытие — свойство спецификации Apple, а не того, сколько эндпоинтов кто-то обернул; и модель никогда не получает возможности запускать код внутри процесса, который может изменить ваши цены.
О песочнице
Предпосылка Code Mode в том, что сгенерированный JavaScript безопасно выполняется внутри Node vm. Это не так. Документация Node сама говорит, что vm не является механизмом безопасности, и любой объект хоста, внедрённый как глобальный, возвращает среду хоста через свою собственную цепочку прототипов:
spec.constructor.constructor('return process.env.HOME')() // → /Users/youПроверено на точной репродукции этой песочницы: она возвращает среду хоста. Опция timeout тоже не помогает — она ограничивает только синхронное выполнение, поэтому асинхронный бесконечный цикл выполняется вечно и истощает цикл событий.
Параметризованная диспетчеризация даёт то же покрытие и ту же стоимость токенов без интерпретатора, из которого можно сбежать.
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 отклоняет токен Server API без утверждения bid.
Инструменты
Инструмент | Назначение |
| Проверить учётные данные, сообщить о доступности и оставшемся бюджете лимита запросов. Запускать первым при любых сбоях — он отделяет плохой ключ от плохого запроса. |
| Поиск по обоим API по ключевому слову, методу, тегу или уровню риска. Возвращает operationId и указывает, к какому инструменту относится каждый. |
| Параметры, схема тела запроса с реальными именами полей, уровень риска. |
| Чтение. Параметры пути и запроса, пагинация, оба API. |
| Всё, что изменяет данные. Подтверждение, |
Чтение и запись — отдельные инструменты, потому что Claude Code игнорирует стандартную аннотацию destructiveHint, но учитывает _meta["anthropic/requiresUserInteraction"] — и этот флаг устанавливается для каждого инструмента. Один диспетчер не мог бы варьировать его для каждой операции. asc_write несёт этот флаг, поэтому запрос на запись запрашивает подтверждение у пользователя даже при bypassPermissions. Это более сильная гарантия, чем внутрипроцессный шлюз, который можно отключить с помощью --no-confirm.
Ресурсы
Справочные материалы, которые модель может целенаправленно подгружать через @asc::
Ресурс | Содержимое |
| Случаи, когда Apple возвращает успешный ответ, означающий не то, чем кажется — пагинация, территории в формате alpha-3, отклонённый |
| Все 90 перечисляемых полей, сгенерированные из спецификации Apple, чтобы не устаревать |
| Что означает каждый уровень риска и насколько он обратим |
| Откуда взялось каждое описание API и когда |
| Хранилище для переполнения — см. ниже |
Результат, слишком большой для возврата в строке, не обрезается. Список сокращается до того, что помещается, указывается факт сокращения и способ сузить запрос, а полный ответ сохраняется как ресурс, который клиент может прочитать, не расходуя контекст. Обрезание сериализованного JSON посередине структуры даёт модели нечто неразбираемое; молчаливое обрезание ещё хуже, потому что частичный список воспринимается как полный.
Подсказки
Четыре рабочих процесса, доступные как /mcp__asc__<name>:
release-readiness · pricing-audit · review-triage · testflight-status
Каждый объединяет несколько вызовов — команда с косой чертой, оборачивающая один запрос, является синонимом, а не рабочим процессом — и каждый содержит ловушки, такие как отклонение sort для customerReviews и то, что текст отзыва является ненадёжным вводом.
Безопасность записи
HTTP-метод — плохой показатель последствий: PATCH /v1/subscriptionPrices и PATCH /v1/appInfos/{id} — оба являются записью, но только один меняет то, что платят клиенты, и ни один не отменяется повторением. Операции имеют уровень риска:
Уровень | Количество | Значение |
| 797 | Без изменений. |
| 238 | Изменяет данные. |
| 61 | Цены, подписки, права доступа. |
| 132 | Удаляет. |
| 12 | Сборки, отправки, что выходит. |
| 12 | Кто может получить доступ к аккаунту. |
| 11 | Сертификаты, идентификаторы, URL обратных вызовов. |
По умолчанию пять нижних уровней возвращают токен подтверждения вместо выполнения. Токен привязан хешем к точной операции, пути, запросу и телу, поэтому его нельзя получить для дешёвого вызова и потратить на дорогой. Он одноразовый и истекает через пять минут.
--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 и отказывается запускаться без bearer-токена. Этот процесс содержит ключ, который может изменить цены в App Store; он не должен слушать без аутентификации. Привязка не к loopback выдаёт предупреждение и лучше всего сочетается с прокси, завершающим 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. Он загружается и компилируется в компактный индекс (360 КБ против 3,3 МБ спецификации), чтобы поиск оставался быстрым, а полный документ открывался только для описания одной операции.
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 используют заведомо неверный идентификатор транзакции. Сигналом является форма ответа: структурированный errorCode от Apple доказывает, что запрос был аутентифицирован и направлен, тогда как 401 доказал бы обратное.
Надёжность
Тайм-ауты и повторные попытки. Чтение повторяется при 408/429/5xx; запись повторяется только при 429, когда Apple отклонила запрос до его обработки. Запись, которая завершилась неоднозначно, сообщается как неоднозначная и никогда не отправляется повторно — дублированный POST хуже, чем сообщённый сбой.
Ограничение скорости. Выполняется с учётом как документированного почасового лимита, так и недокументированного поминутного, и корректируется по собственному заголовку Apple
x-rate-limit, который учитывает других клиентов, использующих тот же ключ.x-request-idвыводится для поддержки Apple.Привязка хоста. Каждый URL, включая курсор пагинации
links.next, проверяется по белому списку трёх хостов API Apple. Курсор — это ввод, предоставленный сервером; слепое следование ему привело бы bearer-токен к любому хосту, который он называет.Формирование ответа.
linksиrelationships, содержащие только ссылки, удаляются,links.nextсохраняется — более чем на 60% меньше на реальном списке ценовых точек.Жизненный цикл. Сервер stdio завершает работу при EOF на stdin и по сигналам, а не остаётся висеть сиротой, удерживающим ключ подписи.
Известные ограничения
Ответы JWS декодируются, но не проверяются. Полезные нагрузки StoreKit приходят подписанными Apple; проверка цепочки требует корневых сертификатов Apple. Декодированные значения появляются в полях
*_decodedи помечаются как непроверенные. Не рассматривайте их как доказательство покупки без проверки подписи.Уровни риска определяются по шаблону из метода и пути. Они намеренно осторожны, но перед записью прочитайте
asc_describe_endpoint, а не полагайтесь только на уровень.Хранение в связке ключей работает только на macOS. В других системах используйте путь к файлу с ограничительными правами доступа.
--no-confirmполностью отключает шлюз. Он существует для CI; это плохой выбор по умолчанию для интерактивного агента.
Лицензия
MIT
Available Tools
13 toolsasc_analytics_reportARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| app | Yes | Bundle ID, store name, or numeric Apple ID. | |
| date | No | Processing date, YYYY-MM-DD. Omit for the newest instance. | |
| max_rows | No | Default 5000, cap 50000. | |
| list_only | No | List available reports without fetching one. | |
| granularity | No | ||
| report_name | No | Omit to list the available reports. |
TDQS
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.
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.
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.
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.
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.
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_setADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| app | Yes | Bundle ID, store name, or numeric Apple ID. | |
| state | Yes | on = downloadable, off = removed from sale. | |
| confirm | No | Confirmation token from a previous gated call. Not needed when the user is prompted directly. | |
| territories | No | ISO alpha-3 codes, e.g. ["USA","GBR"]. Omit for every territory the app has. |
TDQS
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.
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.
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.
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.
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.
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_callARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Query 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. | |
| paginate | No | Follow links.next and concatenate. | |
| max_pages | No | Default 10, cap 50. | |
| environment | No | StoreKit only; overrides the server default for this call. | |
| operationId | Yes | From asc_search_endpoints. | |
| path_params | No | Values for {placeholders}, e.g. {"id": "6763390896"}. |
TDQS
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.
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.
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.
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.
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.
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_endpointARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| operationId | Yes |
TDQS
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.
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.
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.
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.
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.
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_screenshotsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| app | Yes | Bundle ID, store name, or numeric Apple ID. | |
| locale | No | e.g. en-US. Omit to inspect the primary locale only. | |
| version | No | Version string. Omit for the newest. |
TDQS
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.
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.
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.
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.
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.
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_versionARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| app | Yes | Bundle ID, store name, or numeric Apple ID. | |
| version | No | Version string. Omit for the newest. |
TDQS
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.
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.
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.
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.
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.
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_getARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| app | Yes | Bundle ID, store name, or numeric Apple ID. | |
| territory | No | ISO alpha-3, e.g. USA. Omit for every territory. | |
| subscription | No | Product ID, name or id. Omit for all of them. |
TDQS
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.
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.
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.
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.
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.
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_setADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| app | Yes | Bundle ID, store name, or numeric Apple ID. | |
| confirm | No | Confirmation token from a previous gated call. Not needed when the user is prompted directly. | |
| territory | No | ISO alpha-3. Omit to apply to the price point’s own territory. | |
| start_date | No | YYYY-MM-DD. Omit to apply as soon as Apple allows. | |
| subscription | Yes | Product ID, name or id. | |
| price_point_id | Yes | From the subscription’s price points. | |
| preserve_current_price | Yes | REQUIRED. true = existing subscribers keep their price. false = they are moved to the new one. |
TDQS
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.
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.
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.
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.
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.
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_endpointsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| api | No | Default "both". | |
| tag | No | App Store Connect tag, e.g. "Apps", "Builds". | |
| risk | No | ||
| limit | No | Default 25, max 200. | |
| query | No | Keyword, e.g. "subscription price", "builds", "refund". | |
| method | No |
TDQS
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.
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.
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.
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.
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.
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_statusARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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_screenshotADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| iap | Yes | Numeric in-app purchase id. asc_pricing_get lists them. | |
| confirm | No | Confirmation token from a previous gated call. Not needed when the user is prompted directly. | |
| dry_run | No | Report what would be sent, including the checksum, without sending it. | |
| file_name | No | Name to store it under. Defaults to the file’s own name. | |
| file_path | Yes | Absolute path to the image on this machine. |
TDQS
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.
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.
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.
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.
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.
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_screenshotADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Confirmation token from a previous gated call. Not needed when the user is prompted directly. | |
| dry_run | No | Report what would be sent, including the checksum, without sending it. | |
| file_name | No | Name to store it under. Defaults to the file’s own name. | |
| file_path | Yes | Absolute path to the image on this machine. | |
| screenshot_set_id | Yes | From asc_listing_screenshots. |
TDQS
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.
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.
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.
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.
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.
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_writeADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | JSON:API request body. For binary uploads, a base64 string. | |
| query | No | Query 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. | |
| confirm | No | Confirmation token from a previous gated call. Not needed when the user is prompted directly. | |
| dry_run | No | Validate and report the request that would be sent, without sending it. | |
| environment | No | StoreKit only; overrides the server default for this call. | |
| operationId | Yes | From asc_search_endpoints. | |
| path_params | No | Values for {placeholders}, e.g. {"id": "6763390896"}. |
TDQS
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.
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.
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.
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.
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.
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.
13 tool updates
v1.2.0- First observed
asc_analytics_report - First observed
asc_availability_set - First observed
asc_call - First observed
asc_describe_endpoint - First observed
asc_listing_screenshots - First observed
asc_preflight_version - First observed
asc_pricing_get - First observed
asc_pricing_set - First observed
asc_search_endpoints - First observed
asc_status - First observed
asc_upload_iap_screenshot - First observed
asc_upload_screenshot - First observed
asc_write
TDQS
Scored across 13 tools
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.
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.
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.
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
Related MCP Connectors
Set up and inspect app paywalls, subscriptions, offerings and analytics from your AI agent.
- app-managerOAuthapp.lance
App Store Connect operator for AI agents: icons, TestFlight builds, listings, IAP, rejection fixes.
Analyze and manage Apple Ads from your AI assistant with RevenueCat insights and safety controls.
- metarunOAuthdev.metarun
Run App Store Connect from your IDE: pricing, listings, screenshots, releases, AI visibility.
Related MCP Servers
- AlicenseBqualityDmaintenanceEnables interaction with Apple's App Store Connect API through natural language to manage apps, beta testing, localizations, analytics, sales reports, and CI/CD workflows for iOS and macOS development.31104 npmMIT
- AlicenseNot gradedqualityDmaintenanceEnables management of App Store Connect apps including registration, listing, IPA upload, store listing updates, and in-app purchase creation via natural language.MIT
- AlicenseAqualityCmaintenanceEnables AI assistants to manage Apple App Store Connect resources like apps, builds, TestFlight, and reviews through natural language.2014 npmMIT
- AlicenseNot gradedqualityDmaintenanceEnables managing your iOS app's entire lifecycle with natural language through App Store Connect, offering 48 tools across 14 categories for ASO, reviews, analytics, subscriptions, pricing, and more.6MIT