Skip to main content
Glama

App Store Connect MCP

The entire App Store Connect API for Claude Code, Claude Desktop and Cursor. All 1,303 operations in Apple's OpenAPI spec (v4.5.1): apps, builds, TestFlight, metadata and screenshots, pricing, in-app purchases and subscriptions, customer reviews, Game Center, Xcode Cloud, provisioning, analytics and sales/finance reports.

Built and maintained by iHux.

CI npm License: MIT GitHub stars

Install

Claude Desktop: one-click extension

  1. Download appstore-connect.mcpb from the latest release.

  2. Double-click it, or drag it into Claude Desktop → Settings → Extensions, and click Install.

  3. In a chat, ask Claude to "open the App Store Connect settings" and add your API key there (how to get one).

No terminal and no Node.js install needed; Claude Desktop runs the extension itself.

Claude Code, Cursor (or Claude Desktop without the extension)

Needs Node.js 20 or later. Run:

npx -y @ihux/appstore-connect-mcp settings

A settings page opens in your browser. Add your API key, choose what Claude may do, then click Install next to each app you use. Restart Claude Desktop or Cursor afterwards; Claude Code picks it up immediately.

Get an API key

  1. In App Store Connect, open Users and Access → Integrations → App Store Connect API.

  2. Create a Team Key. Its role sets what the server can do: Developer is enough for reading, App Manager for most writes, Finance for financial reports.

  3. Download the AuthKey_XXXXXXXXXX.p8 file (Apple only lets you download it once) and note the Issuer ID shown above the keys list.

Then ask Claude: "Check my App Store Connect connection" and "List my apps".

Related MCP server: appstore-connect-mcp

What you get

Exposing 1,303 tools would overload any MCP client, so the server uses a small set of tools instead:

Tool

What it does

asc_search_operations

Finds the right operation among all 1,303 by keyword ("customer reviews", "testflight testers", "subscription prices")

asc_describe_operation

Shows an operation's parameters, filters, fields[...] options and full request-body schema

asc_call_operation

Calls any operation, checking parameters against Apple's spec first, and can follow pagination

asc_fetch_url

Follows a nextUrl or related link from an earlier response

asc_list_resource_groups

Lists the 204 resource groups so you can browse the API

asc_upload_asset

Uploads screenshots, previews, IAP images and similar files with Apple's reserve, upload and commit flow (write mode)

On top of those, shortcuts for common jobs return compact, flattened results:

  • Read: asc_check_connection, asc_list_apps, asc_app_overview, asc_list_builds, asc_list_customer_reviews, asc_list_beta_groups, asc_list_version_localizations, asc_list_app_info, asc_list_media, asc_download_sales_report, asc_download_finance_report, asc_list_analytics_reports, asc_download_analytics_report

  • Write (only in write or full mode): asc_reply_to_customer_review, asc_invite_beta_tester, asc_distribute_build, asc_update_version_localization, asc_update_app_info, asc_create_app_store_version, asc_attach_build_to_version, asc_upload_screenshots, asc_upload_previews, asc_submit_for_review, asc_release_version, asc_phased_release, asc_analytics_setup

Releases and TestFlight

  • asc_release_version releases an approved version that's waiting for a manual release. It refuses any other state.

  • asc_phased_release turns on a 7-day phased release, and can pause, resume, complete or show it. Removing one needs full mode. asc_app_overview shows the current day.

  • asc_distribute_build gives a build to TestFlight groups. It can also set the "What to Test" notes per language and submit the build for beta review, which external groups need. It never submits a build twice. Groups that already receive every build automatically are skipped with a note, and each group's result is reported separately.

  • asc_update_app_info changes the app's name, subtitle or privacy URLs for one language. It only edits the app info being prepared for the next version, never the live one.

Analytics reports

Apple's App Store analytics (impressions, page views, downloads, sessions, crashes, and more) come as reports that Apple prepares once you ask for them:

  1. asc_analytics_setup asks Apple to start producing reports for an app. You only do this once per app, and the first reports appear after a day or two.

  2. asc_list_analytics_reports lists the reports by category (App Store engagement, commerce, app usage, framework usage, performance), and the dates each one is available for.

  3. asc_download_analytics_report downloads a report by name for a date range (daily, weekly or monthly). It checks each part against Apple's checksum, unzips and merges the parts, and returns the rows or saves them as a TSV file.

Report files are fetched only from the links Apple's API returns in that same call, over HTTPS, without your API key.

Ratings and reviews

asc_list_customer_reviews returns each review's star rating, title, text, country and your reply. It filters by rating, by country, or to reviews you haven't answered. asc_reply_to_customer_review posts a reply.

Apple's App Store Connect API doesn't provide an app's overall average rating or the number of ratings, so this server can't show them either.

Screenshots and app previews

asc_upload_screenshots and asc_upload_previews handle the whole job in one call. You give an app, a version, one or more languages (or * for all), and the files or a folder; files in a folder are taken in name order. Each call then:

  • finds or creates the screenshot or preview set for the device size

  • uploads the files, reading them from disk in chunks, 4 at a time

  • waits for Apple's processing, including video processing for previews

  • keeps the files in the order you gave

Before uploading anything, it checks:

  • The device size. Screenshot sizes are matched against Apple's specifications. A size that belongs to a different device (an iPad image in an iPhone set, say) is refused. If you omit the device size, it's detected from the images.

  • Apple's limits: 10 screenshots and 3 previews per set.

  • That the version can still be edited.

Localized screenshots in one call: point folder at a folder with one subfolder per language. Each language gets its own files, and locales isn't needed:

shots/
  en-US/  1.png 2.png 3.png
  de-DE/  1.png 2.png 3.png

Before anything uploads, the tool checks every language: that it exists on the version, that its images fit the device size, and that it stays within Apple's per-set limit. If any language fails a check, nothing is uploaded.

By default new files are added after the existing ones. replace: true swaps them out, but only after every new file has processed successfully, so a failed upload never leaves your product page empty. Replacing needs the full access mode, because it removes files.

Apple usually processes screenshots within seconds, but preview videos often take several minutes: about 7 minutes for a 16-second clip in testing. The upload tools wait up to waitSeconds (2 minutes by default for videos), then report anything unfinished as PROCESSING instead of blocking. Ask Claude to check again later, or pass a longer waitSeconds.

asc_list_media shows what's on a version, per language and device size, including Apple's processing state and any errors. Custom product pages and product page optimization treatments work too: pass target and localizationIds.

Sales and finance reports arrive gzipped. The server decompresses them and returns the rows; pass saveTo to write the full TSV to a file.

How it works on your machine

Claude Code / Claude Desktop / Cursor
        │  launch the server as a background process and talk to it over stdin/stdout
        ▼
appstore-connect-mcp  ── reads ~/.config/appstore-connect-mcp/  (key ID, issuer ID, mode, .p8 key)
        │  signs a 20-minute token with your key; the key itself never leaves your machine
        ▼
api.appstoreconnect.apple.com

All three clients share one settings folder. Their own config files only hold the command that launches the server, never secrets.

The settings page

Open it with npx -y @ihux/appstore-connect-mcp settings, or by asking Claude to "open the App Store Connect settings". On it you:

  1. Add your key. Drop the .p8 file; the Key ID is read from its name and you enter the Issuer ID. The page tests the key against Apple and saves it only if Apple accepts it. The key is copied into the settings folder, readable only by you.

  2. Choose what Claude may do: Read-only, Write or Full (see Access modes).

  3. Add the server to your apps: one click each for Claude Code, Claude Desktop and Cursor. Each config file is backed up before it changes.

Claude can open the page, but only you can change anything on it. The page only listens on 127.0.0.1, needs the one-time token in the URL it opens, and shuts down after 15 minutes idle or when you click Done.

Prefer the terminal?

npx -y @ihux/appstore-connect-mcp set-key --key-file ~/Downloads/AuthKey_2X9R4HXF34.p8 --issuer-id <issuer-id>
npx -y @ihux/appstore-connect-mcp mode write   # readonly | write | full
npx -y @ihux/appstore-connect-mcp install      # every app found; or: install claude-code | claude-desktop | cursor
npx -y @ihux/appstore-connect-mcp status       # what is set, where it comes from, which apps have it

Access modes

Mode

Allowed

readonly (default)

GET requests only. Write shortcuts and the upload tool are hidden

write

Also creates and updates (POST and PATCH): metadata, TestFlight, review replies, submissions, uploads

full

Also deletes

Fine-tune by area

On top of the overall mode, each area can be set to Off, Read or Write, either on the settings page or in the terminal:

Area

What it covers

testflight

Builds and beta groups; inviting testers and distributing builds

listing

Version text, app name and subtitle, screenshots and preview videos

release

Creating versions, attaching builds, submitting for review, releasing, phased release

reviews

Reading customer reviews and replying

sales

Sales and finance reports (read only)

analytics

Analytics reports and turning analytics on

api

The generic tools that can call any of Apple's operations

npx -y @ihux/appstore-connect-mcp access                # show every area
npx -y @ihux/appstore-connect-mcp access reviews off    # hide the review tools
npx -y @ihux/appstore-connect-mcp access reset          # every area follows the mode again

The mode is always the ceiling: in readonly mode no area can write, and deleting still needs full. An area that isn't set follows the mode, so nothing changes until you customize. Checking the connection, listing apps, the app overview and opening settings always stay available.

api (Full API access) reaches every area, because it can call Apple's API directly. To make an Off area airtight, set api to Off or Read as well. With api on Read, the generic tool can only read.

Changing the mode or an area takes effect within about a second: running servers watch the settings file and tell the client its tool list has changed. If a client doesn't support that notification, restart it.

What "only you can change it" means. No MCP tool can change settings, and the settings page's token never reaches the model. An agent that can run shell commands, such as Claude Code, could still edit files in your settings folder. Claude Code asks for your permission before running those commands, so approve shell commands with care.

Safety

  • Writes and deletes need the matching access mode, and only you can change it (see above).

  • Files Claude saves (saveTo on reports and API calls) are always new files. Existing files are never overwritten, and saves only allow .json, .tsv, .txt, .csv, .gz and .zip. Nothing is written inside hidden folders (such as ~/.ssh or ~/.config) or ~/Library. A bare file name goes to ~/Downloads/appstore-connect/.

  • Files Claude uploads must be media, documents or builds that Apple accepts (images, videos, PDF, .ipa and similar), and can't come from hidden folders or ~/Library. That keeps keys and keychains from ever being sent.

  • Text from the public, such as customer reviews and TestFlight feedback, is labelled as untrusted. Claude is told never to act on instructions inside it.

Advanced: environment variables

Environment variables override the settings file field by field. They are useful in CI or for a different key per client. Set them in the client's env block:

Variable

Value

ASC_KEY_ID, ASC_ISSUER_ID

Key ID and Issuer ID

ASC_PRIVATE_KEY_PATH / ASC_PRIVATE_KEY

Path to the .p8, or its PEM contents (\n escapes are fine)

ASC_MODE

readonly, write or full. If set, it pins the mode for that client; the settings page warns when it detects this

ASC_CONFIG_DIR

Use a different settings folder

ASC_MAX_RESPONSE_CHARS

Largest response returned inline (default 60000)

Claude Desktop doesn't load your shell profile, so the installer writes the absolute path to node. If you install by hand and use nvm, fnm or asdf, use the full path that which node prints.

Example prompts

  • "Which of my apps have a version waiting for review?"

  • "Show the 1- and 2-star reviews from the last month for MyApp that have no reply yet, and draft replies."

  • "List the TestFlight builds of version 2.3 and which are still processing."

  • "Invite jane@example.com to the External Testers group."

  • "Update the What's New text for en-US and de-DE on version 2.4."

  • "Upload the screenshots in ~/Desktop/shots/iphone to version 2.4 for every language, replacing the current ones."

  • "Add ~/Desktop/promo.mov as the iPhone app preview for en-US, with the poster frame at 3 seconds."

  • "Give build 412 to the Beta Testers group with 'Try the new export flow' as What to Test, and submit it for beta review."

  • "Version 3.0 is approved: turn on phased release, then release it."

  • "Change the en-US subtitle to 'Edit photos in seconds'."

  • "Upload the localized screenshots in ~/Desktop/shots (one folder per language) to version 2.4."

  • "Turn on analytics for MyApp." Then, a couple of days later: "How many App Store impressions and downloads did MyApp get last week?"

  • "Download last month's sales summary for vendor 8xxxxxxx and total the units by country."

  • "Which Xcode Cloud workflows failed this week?" (uses the generic tools)

Development

git clone https://github.com/iHux-LLC/appstore-connect-mcp.git
cd appstore-connect-mcp
npm install            # also builds dist/
node dist/index.js settings

Keeping up with Apple

When Apple publishes a new API version:

npm run update-spec   # downloads the latest spec and regenerates catalog/catalog.json
npm run build

New endpoints become available through asc_search_operations and asc_call_operation without any code changes.

A weekly workflow (.github/workflows/spec-update.yml) does this automatically. When Apple's spec has changed, it regenerates the catalog, runs the tests, and opens a pull request listing the added, removed and changed operations. You can also run it by hand from the Actions tab.

Commands

npm test           # unit and integration tests, with Apple's API mocked
npm run typecheck
npm run generate   # rebuild the catalog from spec/openapi.oas.json
npm run bundle     # build the Claude Desktop extension into build/appstore-connect.mcpb

Code layout

Path

Purpose

scripts/generate.ts

Turns Apple's spec into catalog/catalog.json (operations, parameters and request schemas with refs resolved)

src/auth.ts

ES256 JWT signing; tokens are cached and re-signed before the 20-minute limit

src/client.ts

HTTP client: mode checks, retries on 429 and 5xx, Apple error formatting, pagination; only sends the token to api.appstoreconnect.apple.com

src/validate.ts

Checks path, query and body against the spec before each request

src/format.ts

Strips JSON:API links, keeps responses within the size budget, decodes gzipped TSV reports

src/upload.ts

Generic asset upload for all 27 upload-capable resource types

src/settings/store.ts

The settings folder: atomic writes with owner-only permissions

src/settings/web.ts, assets/settings.html

The local settings page and its API

src/settings/clients.ts

Detects Claude Code, Claude Desktop and Cursor, and installs the server with backups

manifest.json, scripts/bundle.ts

Claude Desktop extension: manifest and build script (fills in version and tool list)

src/index.ts

CLI: settings, status, mode, install, uninstall, set-key; with no command it runs the MCP server

src/tools/

MCP tool definitions

Releasing

  1. Bump version in package.json and commit.

  2. Tag and push: git tag v0.3.0 && git push origin v0.3.0.

  3. The release workflow runs the tests, attaches appstore-connect.mcpb to a new GitHub Release, and publishes @ihux/appstore-connect-mcp to npm.

If a step fails, fix the cause and re-run the workflow; it skips what already succeeded. To publish an existing tag to npm on its own, run Actions → Publish to npm with the tag. The NPM_TOKEN secret must be a granular token with publish rights to @ihux and Bypass 2FA enabled.

Security

See SECURITY.md for how to report a vulnerability privately, and a summary of how keys, files and permissions are protected.

Not covered

  • The App Store Server API (transactions, refunds, server notifications). It is a separate API with its own keys.


If this saves you time in App Store Connect, a ⭐ on GitHub helps other developers find it. Built by iHux.

License

MIT © 2026 iHux LLC. Not affiliated with or endorsed by Apple. App Store Connect is a trademark of Apple Inc.

Available Tools

19 tools
asc_app_overviewApp overviewB
Read-only

One-call status of an app: its details, the latest App Store versions with their review/release state and phased-release progress, and the most recent builds with processing state.

NameRequiredDescriptionDefault
appIdYes

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so safety and external-data exposure are covered. The description adds useful scope detail by naming the three data groups included and signaling that builds are limited ('most recent'), but it says nothing about how many builds/versions are returned, whether version data is truncated, or what happens for an app with no releases.

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?

A single tightly-packed sentence with the aggregate scope front-loaded and the three result groups enumerated in order. No filler, no restatement 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?

With no output schema, the description usefully documents what comes back (details, versions with review/release and phased-release progress, recent builds with processing state), which is the critical information for an agent deciding whether one call suffices. The only meaningful omission is any guidance on the required appId parameter.

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

Parameters2/5

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

There is one required parameter (appId) with 0% schema description coverage, so the description carries the full burden of explaining it. The description never mentions appId at all — no format, no source, no id-type distinction (numeric App Store ID vs. resource id). This is a real gap for a required parameter.

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 names a specific verb ('one-call status') and resource (an app) and enumerates exactly which sub-resources are returned: app details, latest versions with review/release/phased-release state, and recent builds with processing state. This clearly distinguishes it from single-resource siblings like asc_list_builds or asc_list_app_info, though it never names those siblings explicitly.

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

Usage Guidelines3/5

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

The phrase 'one-call status' implies the aggregation use case, so an agent can infer it should be preferred over several individual list calls. However, there is no explicit 'use this when...' statement, no mention of alternatives like asc_list_app_info or asc_list_builds, and no exclusion for when a targeted list is better.

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

asc_call_operationCall any App Store Connect API operationA
Destructive

Execute any App Store Connect API operation by operationId. Inputs are validated against Apple's OpenAPI spec before sending. Query keys use Apple's exact names, e.g. {"filter[app]": "123", "sort": "-uploadedDate", "fields[builds]": ["version","processingState"], "include": "preReleaseVersion", "limit": 50}. Bodies use JSON:API form: {"data": {"type": "...", "attributes": {...}, "relationships": {...}}}. Responses are compacted (resource links removed); follow nextUrl with asc_fetch_url or pass fetchAll. Creates and updates need the write access mode and deletes need full; a blocked call explains how the user can enable them.

NameRequiredDescriptionDefault
rawNoReturn the response without removing links (default false)
bodyNoJSON:API request body for POST/PATCH
queryNo
saveToNoSave the full response as a new file instead of returning it: a bare name goes to ~/Downloads/appstore-connect; .json/.tsv/.txt/.csv/.gz/.zip only; never overwrites
fetchAllNoFollow pagination and merge all pages (GET collections only)
maxItemsNoStop paginating once this many items are fetched (default 1000)
pathParamsNoe.g. {"id": "1234567890"}
operationIdYes

TDQS

A4.4/5.0
Behavior4/5

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

Goes well beyond the annotations by disclosing that inputs are validated against Apple's OpenAPI spec, that responses are compacted with resource links removed (and that `raw` restores them), and that blocked calls explain how to enable the required access mode. It doesn't cover rate limiting or how the blanket destructiveHint maps to individual operations.

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 purpose is the first clause, followed by dense, example-driven payload syntax and then access-mode constraints. Every sentence carries non-redundant information; no filler or restatement of the title.

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 schema-less-return, generic dispatch tool this covers validation, payload shapes, pagination, compaction, and auth gating. The one remaining gap is how an agent discovers a valid operationId, which is left entirely to the unmentioned asc_search_operations/asc_describe_operation siblings.

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 coverage is 75%, and the description compensates by spelling out query key syntax with Apple's exact names (filter[app], sort, fields[builds], include, limit) and the JSON:API body envelope shape. Only pathParams and maxItems are left to the schema, which documents them adequately.

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 ('Execute any App Store Connect API operation by operationId') and makes clear this is the generic escape hatch versus the dedicated siblings like asc_list_builds or asc_app_overview. An agent can tell instantly that this tool requires an operationId rather than a resource-shaped parameter set.

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?

Gives concrete routing rules: follow nextUrl with asc_fetch_url or pass fetchAll, and use write/full access mode for creates/updates/deletes. However it never states when to prefer a dedicated sibling (e.g. asc_list_builds) over this generic call, nor points to asc_search_operations/asc_describe_operation for finding the operationId.

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

asc_check_connectionCheck App Store Connect connectionA
Read-only

Verify the API key works and show the server's mode (readonly/write/full), spec version and rate-limit status. Run this first when setting up or when calls fail with auth errors.

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 declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds meaningful behavioral context by stating exactly what the check reveals: API key validity, server mode (readonly/write/full), spec version, and rate-limit status.

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 states what the tool does and what it returns, the second gives usage guidance. No filler, and the primary purpose 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?

For a zero-parameter diagnostic tool with no output schema, the description fully covers what an agent needs: what the tool checks, what information it returns, and when to invoke it.

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 the baseline is 4. The description correctly does not discuss parameter syntax, as there are none.

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 ('Verify') and resource ('API key') plus concrete outputs (server mode, spec version, rate-limit status). It is clearly distinguishable from all sibling tools, which are data-listing or operation-calling 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?

Explicitly says to run this first when setting up or when calls fail with auth errors, giving clear trigger conditions. It does not name alternatives or state when not to use it, but no alternative diagnostic tool exists among the siblings.

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

asc_describe_operationDescribe an App Store Connect API operationA
Read-only

Show everything needed to call one operation: path params, query params (filters, sort, include, limit), sparse fieldsets (fields[type] -> attribute names), and the full JSON request-body schema for creates and updates. Call this before asc_call_operation for any operation you haven't used yet.

NameRequiredDescriptionDefault
operationIdYese.g. apps_getCollection or betaTesters_createInstance

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds valuable behavioral context by detailing exactly what content is returned (params, sparse fieldsets, body schema), which matters because there is no output schema. It does not mention response format or whether results are cached, leaving a small gap.

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 sentences, both earning their place: the first enumerates the return payload, the second gives the routing instruction. Return content is front-loaded and the alternative tool is placed last.

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 discovery/describe tool with no output schema, the description adequately conveys what an agent will get back and when to call it. It stops just short of describing return shape or error behavior, but nothing essential for correct invocation 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?

There is a single parameter with 100% schema description coverage, and the schema itself provides example operation IDs (apps_getCollection). The description adds no additional meaning about operationId beyond what the schema already conveys, so the baseline of 3 is correct.

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?

Specific verb (describe/show) applied to a well-defined resource (one App Store Connect API operation), with an explicit enumeration of the payload: path params, query params, sparse fieldsets, and request-body schema. This clearly distinguishes it from the sibling asc_call_operation.

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

Usage Guidelines5/5

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

Explicitly states when to use it ('Call this before asc_call_operation for any operation you haven't used yet'), naming both the companion tool and the condition that triggers use. No inference required.

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

asc_download_analytics_reportDownload an App Store analytics reportA
Read-only

Download one analytics report (e.g. "App Store Discovery and Engagement Detailed", "App Sessions Standard") for a date range and return its rows. All parts are downloaded from Apple's links, checked against Apple's checksums, unzipped and merged. Find report names with asc_list_analytics_reports.

NameRequiredDescriptionDefault
appIdNoNeeded with reportName
saveToNoSave all rows as a new .tsv file; a bare name goes to ~/Downloads/appstore-connect; never overwrites
endDateNoLatest processing date, YYYY-MM-DD
maxRowsNoRows to return inline (default 200)
reportIdNo
startDateNoEarliest processing date, YYYY-MM-DD
reportNameNoFull or partial report name
granularityNoDefault DAILY
maxInstancesNoHow many dates to download at most, newest first (default 7)

TDQS

A3.9/5.0
Behavior4/5

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

Annotations only declare readOnlyHint and openWorldHint, so the description carries real added value: it discloses the download pipeline (fetched from Apple's links, checksum-verified, unzipped, merged) and that rows are returned inline. It omits rate-limit/error behavior and how partial failures across multiple dates (maxInstances) are handled.

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, front-loaded with the action, then the processing behavior, then the name-discovery pointer. No redundant restatement of the title or schema fields.

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

Completeness3/5

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

With nine optional parameters, no output schema, and only annotations covering the safety profile, the description should clarify the valid parameter combinations (reportId path vs appId+reportName path) and what truncated/inline rows mean. It covers the return shape at a high level ('its rows') but leaves the invocation strategy ambiguous.

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 coverage is high (89%), so the schema already documents dates, maxRows, maxInstances, saveTo and granularity. The description adds only that the date range scopes the download and that rows are returned inline; it says nothing about when reportId alone suffices versus the appId+reportName combination, which is the least obvious part of the parameter set.

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?

States a specific verb and resource ('Download one analytics report ... for a date range and return its rows') with concrete report-name examples. It distinguishes itself from asc_list_analytics_reports by routing name discovery there, but does not explicitly separate itself from the sibling download tools for sales and finance reports.

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?

Gives a clear prerequisite workflow: 'Find report names with asc_list_analytics_reports' before calling this tool. There are no explicit exclusions or negative cases (e.g., when to prefer the sales/finance downloaders), so it stops short of full when/when-not guidance.

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

asc_download_finance_reportDownload finance reportA
Read-only

Download a monthly financial report (proceeds by region) and return it as parsed rows. Region codes include US, EU, JP, AU, CA, GB, WW (all regions, FINANCE_DETAIL only), ZZ (consolidated).

NameRequiredDescriptionDefault
saveToNoSave the full decoded report as a new .tsv file; a bare name goes to ~/Downloads/appstore-connect; never overwrites
maxRowsNoRows to return inline (default 200)
regionCodeYese.g. US, EU, ZZ, WW
reportDateYesFiscal month as YYYY-MM
reportTypeNoDefault FINANCIAL
vendorNumberYes

TDQS

A3.8/5.0
Behavior4/5

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

The annotations already state readOnlyHint=true and openWorldHint=true, so the safety profile of this tool is already covered. The description adds substantial behavior information: it returns parsed rows rather than an opaque file, and it says how the special region codes work, including the WW/FINANCE_DETAIL coupling. Auth needs and rate limits are unstated.

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?

It has two sentences and no wasted words: the core action is front-loaded, and the region-code detail follows in the second sentence. Every clause carries information.

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 six-parameter download tool with no output schema, the description explains what is returned (parsed rows) and which regions are valid. Two gaps remain: it doesn't say what happens when the data exceeds maxRows, and it doesn't cover what authentication the tool needs for the open-world request.

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 description coverage is 83%, so the schema already documents all six parameters, which sets the baseline score at 3. The description expands regionCode beyond the schema's terse examples, listing every valid region and the semantics of ZZ and WW. It adds nothing for vendorNumber, reportDate, maxRows, or saveTo.

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 definition names a specific verb and resource ('Download a monthly financial report') plus the domain concept ('proceeds by region'), which clearly separates it from asc_download_sales_report and asc_download_analytics_report. It never names those siblings outright, so the differentiation depends on the agent inferring from the word 'finance'.

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

Usage Guidelines3/5

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

It gives useful context (region codes, consolidated ZZ, WW restricted to FINANCE_DETAIL) that limits how the tool can be used. However, it never states when to pick this tool over the sibling download tools, and it doesn't explain any prerequisites.

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

asc_download_sales_reportDownload sales and trends reportA
Read-only

Download a Sales and Trends report (sales, subscriptions, subscription events, installs, ...) and return it as parsed rows. The vendor number is under Payments and Financial Reports in App Store Connect. Reports are usually available a day after the reporting date.

NameRequiredDescriptionDefault
saveToNoSave the full decoded report as a new .tsv file; a bare name goes to ~/Downloads/appstore-connect; never overwrites
maxRowsNoRows to return inline (default 200)
versionNoReport format version, e.g. 1_0 (sales) or 1_4 (subscription). Usually omit it: if Apple requires one, the right version is filled in automatically.
frequencyYes
reportDateNoYYYY-MM-DD for daily/weekly, YYYY-MM for monthly, YYYY for yearly. Defaults to the latest available.
reportTypeNoDefault SALES
vendorNumberYes
reportSubTypeNoDefault SUMMARY

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered. The description adds real operational context beyond that: the result is returned as parsed rows, the vendor number's location in App Store Connect, and the one-day availability lag that affects reportDate choices.

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 short sentences, each carrying distinct information: what is returned, how to obtain the required vendor number, and the freshness constraint. Nothing is redundant and the core action is 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 an eight-parameter tool with no output schema, the definition covers the essentials: parsed rows as output, saveTo/maxRows documented in schema, and the timing caveat. It stops short of describing what the parsed rows contain or how to interpret an empty report, which is a minor gap.

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 coverage is 75%, so the description needs to add some meaning, and it does for the undocumented vendorNumber by saying where to find it, plus a timing note relevant to reportDate defaults. It does not explain the reportType/reportSubType interactions, but those enums are documented in 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 gives a specific verb ('Download') and a well-defined resource ('a Sales and Trends report'), and parenthetically enumerates the report families it covers. It distinguishes itself from asc_download_finance_report by naming the Sales and Trends report domain, though it never explicitly routes to or away from that sibling.

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

Usage Guidelines3/5

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

Usage context is implied rather than stated: it explains where to find the vendor number and notes that reports usually appear a day after the reporting date, which implicitly guides timing. But there is no explicit when-to-use/when-not guidance and no mention of the finance or analytics report siblings as alternatives.

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

asc_fetch_urlFetch an App Store Connect API URLA
Read-only

GET a full api.appstoreconnect.apple.com URL, such as a nextUrl from a previous response or a relationship's related link. Only Apple's API host is allowed.

NameRequiredDescriptionDefault
urlYes
saveToNoSave the full response as a new file instead of returning it: a bare name goes to ~/Downloads/appstore-connect; .json/.tsv/.txt/.csv/.gz/.zip only; never overwrites

TDQS

A3.9/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so safety is covered. The description adds one genuinely useful constraint not in structured data: only Apple's API host is allowed. It does not mention the saveTo side effect of writing a file to disk, nor response/pagination 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 sentences, front-loaded with the action and input, then the host restriction. No filler and nothing redundant with the schema.

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 simple read-only fetch with annotations covering safety and a well-described second parameter, this is largely complete. Minor gaps: it doesn't say whether the response's own nextUrl can be re-fed to paginate, and it doesn't flag that saveTo writes a file.

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 coverage is 50%; the url param has only format=uri in the schema, and the description supplies its real meaning (must be an absolute api.appstoreconnect.apple.com URL, typically a nextUrl or related link). The fully documented saveTo param needs no repetition in the description.

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?

States a specific verb (GET) and resource (a full api.appstoreconnect.apple.com URL), and clarifies the input shape versus the sibling operation tools that take operation names/paths. It does not explicitly name a sibling, but the concrete examples (nextUrl, relationship related link) make the boundary clear enough to select it without opening the schema.

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?

Gives clear invocation context: use it when you already hold an absolute URL from a prior response or a relationship link. No explicit exclusions or named alternatives are given, so an agent must infer that asc_call_operation is for constructing calls rather than replaying URLs.

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

asc_list_analytics_reportsList App Store analytics reportsA
Read-only

List the analytics reports Apple produces for an app (App Store engagement, commerce, app usage, framework usage, performance), or, with reportId, the dates each report is available for. Reports exist only after asc_analytics_setup has been run for the app.

NameRequiredDescriptionDefault
appIdYes
categoryNo
reportIdNoShow the available dates (daily, weekly, monthly) of this report

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered. The description adds meaningful behavioral context beyond that: the setup dependency and the dual-mode behavior (listing reports vs. listing dates for one report). It does not describe pagination, auth, or output shape.

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?

A single efficiently structured sentence front-loads the primary action and uses a parenthetical to enumerate categories without waste. The precondition sentence is short and earns 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 read-only listing tool with no output schema, the description covers purpose, modes, and the setup prerequisite. Return-value details and pagination behavior are unstated, but the core information needed to invoke it correctly is present.

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 coverage is only 33%, with reportId being the sole documented parameter. The description partially compensates by enumerating the category families and explaining the reportId mode, but appId's format/role and the category's default behavior are left implicit.

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 resource (analytics reports for an app), enumerates the report families, and explains the second mode triggered by reportId. This clearly distinguishes it from download-oriented siblings such as asc_download_analytics_report.

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 a concrete precondition — reports only exist after asc_analytics_setup has run — and explains the reportId branch for retrieving available dates. It does not explicitly name alternative tools or state when not to use it, keeping it below a 5.

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

asc_list_app_infoList app name and subtitleA
Read-only

Show the app-level store details per language: name, subtitle, privacy policy and privacy choices URLs. Lists both the live app info and the one being edited for the next version, and says which can be changed.

NameRequiredDescriptionDefault
appIdYes

TDQS

A3.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, and the description still adds real behavioral context: it returns both the live app info and the in-progress next-version info, and flags which fields are editable. That dual live/edit result shape is not derivable from the annotations or 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?

Two sentences, front-loaded with the field list and closed with the live-vs-edit distinction. No filler and nothing repeated from the title alone.

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 read-only single-parameter listing tool with no output schema, the description covers what comes back, in which variants (live and pending version), and editability. The only real gap is the unmentioned appId scoping.

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

Parameters2/5

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

The single required parameter appId has 0% schema description coverage, and the description never mentions it, so nothing explains that the tool is scoped to one app. 'Per language' hints at a locale dimension that does not even appear in the schema, which could mislead.

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?

States a specific verb (show/list) and resource (app-level store details per language) and enumerates the fields returned: name, subtitle, privacy policy and privacy choices URLs. The 'app-level' qualifier implicitly separates it from version-scoped siblings such as asc_list_version_localizations, though no sibling is named.

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

Usage Guidelines3/5

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

Usage is only implied: a reader infers you call this to inspect app-level metadata rather than version localizations or app overview. There is no explicit when-to-use, no stated prerequisites, and no named alternative among the many listing siblings.

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

asc_list_appsList appsA
Read-only

List the apps in the App Store Connect account with their ids, names, bundle ids and SKUs. App ids are needed by most other tools.

NameRequiredDescriptionDefault
nameNoFilter by exact app name
limitNoDefault 100
bundleIdNoFilter by bundle id, e.g. com.example.app

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description usefully discloses the shape of the result (ids, names, bundle ids, SKUs), but says nothing about pagination behavior or how the default limit of 100 affects a large account.

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 short sentences with zero waste; the primary purpose is front-loaded and the prerequisite note follows. Nothing could be trimmed without losing information.

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?

With no output schema, the description sensibly compensates by listing the returned fields, and annotations cover the read-only/open-world nature. The one gap is pagination and limit handling, which an agent listing a large account would want to know.

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% – each of the three filter parameters is documented in the schema itself. The description adds no filter semantics, syntax, or matching behavior beyond what the schema provides, so the baseline 3 applies.

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?

States a specific verb (List) and resource (apps in the App Store Connect account) and even enumerates the fields returned (ids, names, bundle ids, SKUs). It does not, however, distinguish itself from the sibling asc_app_overview, which plausibly overlaps as an app-information tool.

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

Usage Guidelines3/5

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

'App ids are needed by most other tools' implies this is a prerequisite discovery call, which is useful implied guidance. It names no explicit alternative and gives no when-not-to-use condition, so usage is only implied rather than stated.

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

asc_list_beta_groupsList TestFlight beta groupsA
Read-only

List an app's TestFlight beta groups (internal and external) with their ids, whether they receive every build automatically (hasAccessToAllBuilds), and public link settings.

NameRequiredDescriptionDefault
appIdYes

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 and openWorldHint=true, so the safety profile is covered. The description goes beyond them by naming the concrete fields returned (ids, hasAccessToAllBuilds, public link settings), which is real added value given there is no output schema. It stops short of stating pagination or return-format behavior.

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?

A single front-loaded sentence with no filler; the resource and its scope come first, followed by returned fields. The nested parentheticals make it slightly dense but nothing is wasted.

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 one-parameter read tool with annotations and no output schema, this is largely complete: it identifies the resource, scope, and returned fields. Remaining gaps (appId format, pagination, whether public links only apply to external groups) are minor but real.

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% for the single appId parameter, so the description should compensate. 'An app's' implies appId identifies the app but gives no format guidance (numeric App Store ID vs. bundle ID) or scoping notes, leaving the agent to infer 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?

States a specific verb ('List') and a precisely scoped resource ('an app's TestFlight beta groups (internal and external)'). No sibling tool covers beta groups, so an agent can distinguish it from asc_list_builds or asc_list_app_info without opening a schema.

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

Usage Guidelines3/5

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

Usage is only implied: an agent infers it should call this when it needs beta group data for a given app. There is no explicit when-to-use, no prerequisites, and no named alternative or follow-up tool.

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

asc_list_buildsList buildsB
Read-only

List an app's builds, newest first, with build number, marketing version, platform, processing state and expiry.

NameRequiredDescriptionDefault
appIdYes
limitNoDefault 25
versionNoMarketing version (CFBundleShortVersionString), e.g. 2.3.0
buildNumberNoBuild number (CFBundleVersion)
processingStateNo

TDQS

B3.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered. The description adds useful behavior (newest-first ordering and the shape of each returned record), but says nothing about pagination behavior beyond the schema's default-25 limit or about how the optional filters narrow results.

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?

One front-loaded sentence that names the resource, the ordering, and the payload. No filler and nothing buried.

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

Completeness3/5

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

With no output schema, the description usefully previews the returned fields, but for a 5-parameter list tool it omits the filtering semantics of version, buildNumber, and processingState and does not mention pagination, leaving gaps an agent must guess at.

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 coverage is 60%, so appId and processingState lack descriptions. The description enumerates returned fields rather than explaining the filter parameters, and 'platform'/'expiry' are not even inputs, so it adds only marginal meaning over the schema. Baseline 3 for partially covered parameters.

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?

States a specific verb and resource ('List an app's builds') plus ordering ('newest first') and the returned field set. It is unmistakably distinct from the other asc_list_* siblings, though it never names an alternative to route between them.

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?

No when-to-use guidance, no mention of alternatives such as asc_app_overview, and no indication that the optional version/buildNumber/processingState parameters act as filters. The agent is left to infer that this is the raw build-list call.

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

asc_list_customer_reviewsList customer reviewsA
Read-only

List an app's App Store customer reviews with rating, title, body, territory and any developer response. Use unansweredOnly to find reviews that still need a reply.

NameRequiredDescriptionDefault
sortNoDefault -createdDate (newest first)
appIdYes
limitNoDefault 25
ratingNoOnly these star ratings, e.g. [1, 2]
territoryNoISO territory codes such as USA, GBR, DEU
unansweredOnlyNo

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety and external-data profile are covered. The description adds useful return-content context by naming rating, title, body, territory, and developer response, but it does not disclose pagination behavior or other operational traits beyond what the schema provides.

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 tight sentences with no filler. The primary listing behavior is front-loaded, and the filter tip follows immediately.

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 read-only list tool with no output schema, the description is mostly complete: it names the returned review fields and explains the key unansweredOnly filter. The main remaining gap is that pagination and sorting behavior are left entirely to the 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?

Schema description coverage is 67%, so the schema documents several parameters already. The description adds meaning specifically for unansweredOnly by explaining its purpose, but it does not clarify sort defaults, rating filtering, territory codes, or limit behavior beyond the schema text.

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 gives a specific verb and resource: list an app's App Store customer reviews. It also names returned fields, so the agent can tell this is a review-listing tool rather than a generic app/build/resource lister. It does not explicitly contrast with sibling tools, which keeps it below a 5.

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

Usage Guidelines3/5

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

The description states one useful usage condition: use unansweredOnly to find reviews that still need a reply. That is helpful but narrow; it does not say when to use this tool versus alternatives or describe 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_list_mediaList screenshots and app previewsA
Read-only

Show the screenshots and app preview videos of an App Store version, per language and device size: file names in display order, sizes, and Apple's processing state or errors. Use it before and after uploading.

NameRequiredDescriptionDefault
appIdNoApp id from asc_list_apps
targetNoWhere the media goes: the version's product page (default), a custom product page, or a product page optimization treatment
localesNoOnly these locales, e.g. ["en-US", "de-DE"]; default all
platformNoNeeded only when the app ships on several platforms
versionIdNoappStoreVersion id, instead of appId + versionString
versionStringNoe.g. 2.4.0; defaults to the newest version
localizationIdsNoFor customProductPage / experimentTreatment: the localization ids to update (find them with asc_search_operations)

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered. The description adds meaningful context beyond that: results carry Apple's processing state or errors, which tells the agent that returned media may not yet be live and that failures surface here. Pagination and volume/rate behavior are still unstated.

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 sentences, no filler, with the resource and returned fields front-loaded and the usage hint last. Every clause earns 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?

With 7 optional parameters and no output schema, the description does the needed work of enumerating the return shape so an agent can interpret results. It stops short of explaining the target/localizationIds relationship for custom product pages and experiment treatments, which is the one part of the input contract left implicit.

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 baseline is 3 and every parameter is already self-documented. The description's 'per language and device size' framing reinforces the locales grouping but adds no syntax or precedence detail, e.g. it doesn't say how versionId, appId, and versionString interact when several are supplied.

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: screenshots and app preview videos of an App Store version, scoped per language and device size. It also previews the returned payload (file names in display order, sizes, processing state or errors), so an agent knows exactly what it gets back without opening anything else.

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

Usage Guidelines3/5

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

The line 'Use it before and after uploading' gives a timing hint (verify state before/after a media upload), which is real guidance. However, it names no alternative tool or condition for choosing between targets such as version vs customProductPage vs experimentTreatment, so selection still has to be inferred from the schema enums.

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

asc_list_resource_groupsList App Store Connect API resource groupsA
Read-only

List every resource group (tag) in the App Store Connect API with its operation count, e.g. Apps, Builds, BetaGroups, Subscriptions, GameCenterLeaderboards. Use it to browse the API when you don't know what to search for; then call asc_search_operations with a tag.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds real value by disclosing the return content (each group plus its operation count) and that this is a no-parameter enumeration of the whole API surface, though it says nothing about result size, ordering, or caching.

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 sentences, no filler. The enumeration purpose is front-loaded, and the follow-up action is appended only after the primary purpose is established.

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?

With no parameters and no output schema, the description must carry the return-value explanation itself, and it does ('resource group with its operation count', plus examples). Purpose, usage trigger, and follow-up path are all present, so nothing an agent needs in order to invoke it is missing.

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 the baseline is 4 and there is no parameter semantics to add. The description correctly signals that the call is argument-free and that the tag it produces is consumed by asc_search_operations.

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 ('List every resource group (tag) in the App Store Connect API') and immediately clarifies the returned payload ('with its operation count'), with concrete examples (Apps, Builds, BetaGroups). It is clearly distinguishable from sibling tools like asc_search_operations, which it names.

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

Usage Guidelines5/5

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

It gives an explicit condition for use ('browse the API when you don't know what to search for') and routes the agent to the follow-up tool with the required argument ('then call asc_search_operations with a tag'). The inverse case (you already know the tag) is implied strongly enough that no alternative is left ambiguous.

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

asc_list_version_localizationsList App Store version localizationsA
Read-only

List the per-locale App Store metadata of a version: description, keywords, what's new, promotional text, marketing and support URLs. Get version ids from asc_app_overview.

NameRequiredDescriptionDefault
versionIdYesappStoreVersion id

TDQS

A4.2/5.0
Behavior3/5

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

The readOnlyHint=true annotation already establishes this is a safe read, and the description adds the useful scope note that results are per-locale and lists the returned metadata fields. It says nothing about pagination, locale coverage limits, or the openWorldHint implication that data may change between calls.

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 compact sentences with no filler, and the field enumeration comes before the id-provenance hint so the agent gets the payoff first.

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?

With no output schema, the description compensates by naming the returned fields, so the agent knows the shape of the response. What remains unstated is pagination behavior and whether all locales are always present, which for an openWorldHint list tool would be worth one more sentence.

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 single parameter is fully documented in the schema at 100% coverage, so the schema baseline already applies. The description earns credit above baseline by explaining the provenance of versionId, which the schema only labels as 'appStoreVersion id'.

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?

A specific verb plus resource ('List the per-locale App Store metadata of a version') followed by an enumeration of the exact fields returned. The agent can distinguish this from siblings such as asc_app_overview, which the description explicitly positions as the source of version ids.

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 tells the agent where version ids come from ('Get version ids from asc_app_overview'), which is the key precondition for calling it. What is missing is any statement of when not to use it or which sibling covers adjacent needs, so it stays below a 5.

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

asc_open_settingsOpen App Store Connect settingsA
Read-only

Open the local settings page in the user's browser, where they add or replace their API key, choose the access mode (read-only, write, full) and add this server to Claude Code, Claude Desktop or Cursor. Use it when credentials are missing or rejected, or when the user wants writes enabled. Only the user can change settings there.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, but the description adds the crucial context that explains this: the tool merely opens a browser page and the user performs any mutation, which is why a 'settings' tool is non-destructive. It also enumerates what the page exposes (API key, access mode, client setup), which goes 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?

Three sentences, front-loaded with the action, then the page contents, then the trigger conditions and the constraint. Each sentence carries distinct information with no repetition of the name or title.

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, no-output-schema tool, the description covers what happens, why it is safe despite touching credentials, and when to invoke it. An agent has everything needed to decide to call it and to explain the outcome to the user.

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 schema has zero parameters, so the baseline is 4; there is no parameter semantics for the description to compensate for. Nothing in the text conflicts with the empty input contract.

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 — opening the local settings page in the user's browser — and immediately scopes it with what the page is for (API key, access mode, client registration). This clearly separates it from every sibling, which are all data-retrieval or operation-invocation tools.

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

Usage Guidelines5/5

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

Explicitly names the triggering conditions: credentials missing or rejected, or the user wanting writes enabled. It also sets the boundary that only the user can change settings there, so the agent knows this is a hand-off, not a programmatic fix.

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

asc_search_operationsSearch App Store Connect API operationsA
Read-only

Search all 1,300+ App Store Connect API operations by keywords (e.g. 'customer reviews', 'testflight testers', 'subscription prices', 'xcode cloud builds'). Returns operationIds to pass to asc_describe_operation and asc_call_operation. Prefer a curated asc_* tool when one fits the task.

NameRequiredDescriptionDefault
tagNoOnly return operations in this resource group (see asc_list_resource_groups)
limitNoMaximum results (default 15)
queryYesKeywords, a resource name, a path like /v1/apps/{id}/builds, or an operationId
methodNoOnly return operations with this HTTP method
includeDeprecatedNo

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered; the description adds the corpus size (1,300+) and, importantly, the return contract (operationIds) plus how they chain into describe/call. It omits pagination/result-cap behavior and deprecation handling, but nothing is contradicted and the added workflow context is genuinely useful.

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, front-loaded with what the tool does, then the return contract, then the sibling preference. Every sentence carries distinct information and there is no redundancy.

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?

No output schema exists, and the description compensates by stating what is returned (operationIds) and the next-step tools, which is the key integration detail. Minor gaps remain around result limits and deprecated-operation behavior, which are left entirely to the schema.

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 coverage is 80%, so the baseline is 3, and the description adds meaning by giving concrete query examples ('customer reviews', 'testflight testers', 'subscription prices', 'xcode cloud builds') that illustrate the keyword style the query parameter expects. It adds nothing for tag/method/includeDeprecated, which the schema already documents.

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 concrete verb+resource with scope ('Search all 1,300+ App Store Connect API operations') and distinguishes itself from curated siblings by positioning itself as the fallback for non-curated operations. It also names the downstream tools (asc_describe_operation, asc_call_operation), so an agent can place it in the workflow without reading any schema.

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?

Gives a clear usage rule: 'Prefer a curated asc_* tool when one fits the task,' which is an explicit when-not-to-use signal with a named alternative class. It doesn't spell out when to pick search over asc_list_resource_groups or when a keyword search is preferred over a direct describe, so it stops short of full routing guidance.

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. 8 tool updatesv0.6.0
    • Changedasc_call_operation1 field changed
      • changedInput schema / properties / saveTo / description
        Previous value: -"Write the full response to this file path instead of returning it (useful for big lists and reports)"New value: +"Save the full response as a new file instead of returning it: a bare name goes to ~/Downloads/appstore-connect; .json/.tsv/.txt/.csv/.gz/.zip only; never overwrites"
    • Addedasc_download_analytics_report
    • Changedasc_download_finance_report1 field changed
      • changedInput schema / properties / saveTo / description
        Previous value: -"Write the full decoded TSV report to this file path"New value: +"Save the full decoded report as a new .tsv file; a bare name goes to ~/Downloads/appstore-connect; never overwrites"
    • Changedasc_download_sales_report2 fields changed
      • changedInput schema / properties / saveTo / description
        Previous value: -"Write the full decoded TSV report to this file path"New value: +"Save the full decoded report as a new .tsv file; a bare name goes to ~/Downloads/appstore-connect; never overwrites"
      • changedInput schema / properties / version / description
        Previous value: -"Report format version, e.g. 1_0 (sales) or 1_4 (subscription). Omit for Apple's default."New value: +"Report format version, e.g. 1_0 (sales) or 1_4 (subscription). Usually omit it: if Apple requires one, the right version is filled in automatically."
    • Changedasc_fetch_url1 field changed
      • addedInput schema / properties / saveTo / description
        Added value: +"Save the full response as a new file instead of returning it: a bare name goes to ~/Downloads/appstore-connect; .json/.tsv/.txt/.csv/.gz/.zip only; never overwrites"
    • Addedasc_list_analytics_reports
    • Addedasc_list_app_info
    • Addedasc_list_media
  2. 15 tool updatesv0.2.0
    • First observedasc_app_overview
    • First observedasc_call_operation
    • First observedasc_check_connection
    • First observedasc_describe_operation
    • First observedasc_download_finance_report
    • First observedasc_download_sales_report
    • First observedasc_fetch_url
    • First observedasc_list_apps
    • First observedasc_list_beta_groups
    • First observedasc_list_builds
    • First observedasc_list_customer_reviews
    • First observedasc_list_resource_groups
    • First observedasc_list_version_localizations
    • First observedasc_open_settings
    • First observedasc_search_operations

TDQS

A3.9/5.0

Scored across 19 tools

Disambiguation4/5

Most tools target a distinct resource (apps, builds, beta groups, reviews, localizations, media, settings) and the read/curated set is clearly separated from the generic escape hatch (search_operations -> describe_operation -> call_operation), which is well signposted. Minor overlap remains between asc_fetch_url and asc_call_operation/nextUrl handling, and the three download_*_report tools plus list_analytics_reports vs download_analytics_report could be momentarily confused, though descriptions disambiguate.

Naming Consistency5/5

All 19 tools use a uniform asc_ prefix with snake_case and a leading verb (list_, download_, search_, describe_, call_, check_, open_, fetch_). The sole nominal name, asc_app_overview, is an intentional one-call aggregate and still reads predictably within the pattern.

Tool Count4/5

19 tools sits at the upper edge of a comfortable set; the curated tools cover the highest-value App Store Connect workflows while search/describe/call_operation collapse the 1,300+ API operations into three tools rather than exploding the surface. It is slightly heavy but each tool has a defensible reason to exist.

Completeness4/5

Read coverage is strong (apps, builds, versions, localizations, media, reviews, beta groups, sales/finance/analytics reports) and writes/deletes are reachable via asc_call_operation with the access-mode gating explained. The one visible dead end is media: asc_list_media references uploading 'before and after' but no upload tool is offered, and there are no curated create/update helpers for common write flows.

Maintenance

ActivityNo data
ResponsivenessSyncing

Related MCP Connectors

Related MCP Servers