Skip to main content
Glama

App Store MCP

Manage App Store Connect releases, metadata, TestFlight, screenshots, and reviews from an AI agent.

Node.js 20+ 38 MCP tools MIT license

Quick start · Capabilities · Apple credentials · MCP clients · Tool reference

App Store MCP is a stdio Model Context Protocol server using the official App Store Connect API. Its shape follows the sibling Play Store MCP project, but uses Apple's resources and publishing workflow. It does not scrape the App Store Connect website. Tools return Apple's JSON:API response, including resource IDs and links.next for pagination.

Quick start

  1. Install Node.js 20 or newer and create an App Store Connect API key.

  2. Configure the server in your MCP client. For a package installed from npm after publication:

    codex mcp add app-store \
      --env APP_STORE_CONNECT_KEY_ID=YOUR_KEY_ID \
      --env APP_STORE_CONNECT_ISSUER_ID=YOUR_ISSUER_UUID \
      --env APP_STORE_CONNECT_PRIVATE_KEY_PATH=/absolute/path/to/AuthKey_YOUR_KEY_ID.p8 \
      -- npx -y app-store-connect-mcp
    codex mcp list

    The package is currently local and has not been published. For local use, replace npx -y app-store-connect-mcp with node /absolute/path/to/app-store-mcp/dist/index.js after npm install && npm run build.

  3. Ask your agent to call list_apps, then use the returned app id in other tools. The App Store Connect app ID is an opaque resource ID, not the bundle ID.

Related MCP server: mcp-appstore-connect

Capabilities

Area

Tools

Apps and builds

Discover apps and versions; upload IPA binaries; inspect upload status and processed builds.

Reviews

Read customer reviews and publish or replace developer replies.

Metadata

Read and edit app-level name/subtitle and version-level descriptions, keywords, URLs, and release notes.

Screenshots

Create screenshot sets, upload local PNG/JPEG files with Apple's reserve/upload/commit workflow, and list screenshots.

TestFlight

List and create beta groups and testers, then assign processed builds and existing testers to groups.

Publishing

Create a version, attach a processed build, create a review submission, add the version, submit it, and manually release an approved version.

Apple does not use Google Play's transactional app edits. Metadata changes affect App Store Connect immediately, subject to the version state. Sending a review submission starts Apple's review process; it does not guarantee approval. release_version is only for an approved version in PENDING_DEVELOPER_RELEASE and cannot be canceled. Apple's manual release documentation

The upload_ipa tool uses Apple's Build uploads API: it creates a build upload, reserves the IPA file, uploads Apple-specified byte ranges, and commits an MD5 checksum. Provide the version and build number found inside the IPA; the server does not inspect the archive. Apple processes uploads asynchronously. Poll get_build_upload, then list_builds, and attach only a processed build. Xcode and Transporter remain alternatives for binary delivery.

Tool reference

Tool

Action

list_apps

List apps; optionally filter by bundle ID.

get_app

Read one app.

list_versions

List an app's App Store versions, optionally by platform.

get_version

Read a version and its assigned build.

list_builds

List processed builds for an app.

get_build

Read a build and processing state.

list_build_uploads

List build upload records for an app.

get_build_upload

Read upload processing state.

upload_ipa

Uploads: send a local iOS IPA via Apple Build uploads API.

list_reviews

List an app's reviews, optionally by rating.

get_review

Read one customer review.

get_review_response

Read the developer response for a review.

reply_to_review

Publishes: create or replace a public review response.

list_localizations

List version-level metadata localizations.

get_localization

Read a version localization.

create_localization

Changes metadata: add a version localization.

update_localization

Changes metadata: edit description, keywords, release notes, and URLs.

list_app_infos

List app-level information records.

list_app_info_localizations

List localized names, subtitles, and privacy URLs.

create_app_info_localization

Changes metadata: add an app-level locale.

update_app_info_localization

Changes metadata: edit localized name, subtitle, or privacy URLs.

list_screenshot_sets

List screenshot sets for a version locale.

create_screenshot_set

Changes metadata: create a display-type screenshot set.

list_screenshots

List screenshots in a set.

upload_screenshot

Uploads: add a local PNG or JPEG to a screenshot set.

list_beta_groups

List an app's TestFlight groups.

create_beta_group

Changes TestFlight access: create a group.

list_beta_testers

List an app's TestFlight testers.

create_beta_tester

Changes TestFlight access: add a tester to a group.

add_build_to_beta_group

Changes TestFlight access: give a group access to a build.

add_tester_to_beta_group

Changes TestFlight access: add an existing tester to a group.

create_version

Creates draft: create an App Store version.

assign_build_to_version

Changes draft: attach a processed build.

list_review_submissions

List App Review submissions.

create_review_submission

Creates draft: create a submission container.

add_version_to_submission

Changes draft: add a version to a submission.

submit_review

Submits: send the submission and all its items to App Review; requires confirmSubmit: true.

release_version

Publishes: manually release an approved version; requires confirmPublish: true.

List tools accept limit and the links.next URL returned by Apple. Use resource IDs from prior responses. Adding a new locale requires both create_localization and create_app_info_localization; Apple rejects submissions when those locale sets differ. Screenshot display types are Apple's values, such as APP_IPHONE_67 and APP_IPAD_PRO_3GEN_129. The screenshot upload uses Apple's appScreenshots flow; Apple also offers newer asset library APIs, which this package does not yet expose. Localization requirements, screenshot upload workflow

Apple credentials

The Account Holder must request access to the App Store Connect API before keys can be used. Create either a team key under Users and Access → Integrations → App Store Connect API → Team Keys, or an individual key from your profile. Team keys apply to all apps in the account; individual keys inherit the user's app access. Choose the narrowest role that supports your intended tools. Apple key and role documentation, role permissions

Download the .p8 private key once and keep it outside this repository. Set:

  • APP_STORE_CONNECT_KEY_ID: the 10-character key ID.

  • APP_STORE_CONNECT_PRIVATE_KEY_PATH: absolute path to the .p8 file.

  • APP_STORE_CONNECT_ISSUER_ID: issuer UUID for a team key. Omit this for an individual key.

The server signs short-lived ES256 JWTs with aud=appstoreconnect-v1; team tokens use iss, individual tokens use sub=user. It refreshes tokens automatically. Apple token specification

The key's role controls what works. App Manager is a practical role for version metadata and publishing; Customer Support covers review response work. TestFlight access depends on the assigned role and app permissions. Verify the least-privilege role against a test app before production use. The server does not print keys, tokens, or raw Apple error bodies.

MCP clients

After publication, the command is npx -y app-store-connect-mcp. Until then, build locally and use node /absolute/path/to/app-store-mcp/dist/index.js in place of that command.

Codex CLI or app

codex mcp add app-store \
  --env APP_STORE_CONNECT_KEY_ID=YOUR_KEY_ID \
  --env APP_STORE_CONNECT_ISSUER_ID=YOUR_ISSUER_UUID \
  --env APP_STORE_CONNECT_PRIVATE_KEY_PATH=/absolute/path/to/AuthKey_YOUR_KEY_ID.p8 \
  -- npx -y app-store-connect-mcp
codex mcp list

For an individual key, omit the issuer environment option. Replace npx -y app-store-connect-mcp with the local node command until publication.

Claude CLI (Claude Code)

claude mcp add \
  --env APP_STORE_CONNECT_KEY_ID=YOUR_KEY_ID \
  --env APP_STORE_CONNECT_ISSUER_ID=YOUR_ISSUER_UUID \
  --env APP_STORE_CONNECT_PRIVATE_KEY_PATH=/absolute/path/to/AuthKey_YOUR_KEY_ID.p8 \
  --transport stdio app-store \
  -- npx -y app-store-connect-mcp
claude mcp get app-store

For an individual key, omit the issuer option. Until publication, replace the npx command with node /absolute/path/to/app-store-mcp/dist/index.js. Claude CLI saves the server for the current project by default; add --scope user before app-store to use it across projects. See Claude Code MCP setup.

Claude Desktop

Add this entry under the existing mcpServers object, keeping any other servers:

{
  "app-store": {
    "command": "npx",
    "args": ["-y", "app-store-connect-mcp"],
    "env": {
      "APP_STORE_CONNECT_KEY_ID": "YOUR_KEY_ID",
      "APP_STORE_CONNECT_ISSUER_ID": "YOUR_ISSUER_UUID",
      "APP_STORE_CONNECT_PRIVATE_KEY_PATH": "/absolute/path/to/AuthKey_YOUR_KEY_ID.p8"
    }
  }
}

For local use, set command to node and args to ["/absolute/path/to/app-store-mcp/dist/index.js"]. For an individual key, remove the issuer field.

License

MIT. See LICENSE.

Available Tools

38 tools
add_build_to_beta_groupC
Destructive

MUTATES TestFlight access: assign a processed build to a beta group.

NameRequiredDescriptionDefault
buildIdYes
groupIdYes

TDQS

C2.9/5.0
Behavior3/5

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

Annotations already declare destructiveHint=true, idempotentHint=false, and openWorldHint=true, so the 'MUTATES' framing largely restates what structured data provides. The description does add the useful precondition that the build must be processed, but it says nothing about whether existing group membership is affected, whether re-adding is a no-op, or what authorization is required.

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 the mutation warning first and the effect second; no filler, though the all-caps 'MUTATES' is stylistic rather than informative.

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

Completeness2/5

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

For a non-idempotent destructive mutation with two undocumented required IDs and no output schema, the description omits expected outcomes, error conditions, and how the IDs are sourced. Only the 'processed build' precondition is covered.

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?

Schema description coverage is 0% for both required parameters (buildId, groupId) and the description supplies no meaning for either. It doesn't clarify identifier format or where to obtain the IDs, so it fails to compensate for the coverage gap.

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 ('assign') and resource ('a processed build to a beta group') scoped to TestFlight access, so an agent can tell it apart from add_tester_to_beta_group or create_beta_group 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 Guidelines2/5

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

There is no explicit when-to-use or when-not-to-use guidance, no mention of alternatives such as assign_build_to_version, and no statement of prerequisites beyond the parenthetical 'processed build'. The agent is left to infer context.

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

add_tester_to_beta_groupA
Destructive

MUTATES TestFlight access: add an existing tester to a beta group.

NameRequiredDescriptionDefault
groupIdYes
testerIdYes

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare destructiveHint=true, idempotentHint=false and openWorldHint=true, so the 'MUTATES' emphasis is largely redundant with structured data. The description does add useful scope ('TestFlight access' and the existing-tester precondition) but says nothing about whether duplicate adds fail, whether testers get notified, or what permissions are required.

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 sentence with the mutation warning front-loaded, followed immediately by the action and target. 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?

For a two-required-parameter mutation with no output schema, the essentials (what changes, which entities are involved, that it is a mutation) are present and annotations cover the safety profile. What is missing is failure behavior on duplicates and the prerequisite that the tester already exists in the account, which matters for correct invocation.

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

Parameters3/5

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

Schema coverage is 0% and neither parameter has a description, so the description must carry the load; it does so only minimally by naming the two entities (tester, beta group) that map to testerId and groupId. It adds no format, source-of-id, or cross-argument constraint information beyond the property names.

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+resource: add an existing tester to a beta group, and prefixes it with the domain scope (TestFlight access). The word 'existing' implicitly distinguishes it from create_beta_tester, but no sibling is named explicitly, keeping it just short of 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 phrase 'an existing tester' implies the precondition that the tester must already exist (i.e., use create_beta_tester first otherwise), but this is inference rather than explicit guidance. There is no statement of when to prefer add_build_to_beta_group or how to handle a tester that isn't yet registered.

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

add_version_to_submissionB
Destructive

MUTATES App Review draft state: add an App Store version to a review submission.

NameRequiredDescriptionDefault
versionIdYes
submissionIdYes

TDQS

B3.3/5.0
Behavior3/5

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

Annotations already declare destructiveHint=true, idempotentHint=false, and openWorldHint=true, so the risky/mutating profile is structured data; the description's 'MUTATES ... draft state' is consistent reinforcement rather than new information. It does not disclose what happens on a non-draft submission, whether the operation is reversible, or what errors/preconditions apply, which is the extra context that would raise this score.

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 front-loaded sentence with the mutation warning first and the action second; there is no filler or redundancy.

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?

For a two-parameter, non-idempotent, destructive mutation with no output schema, the definition covers what it does but omits prerequisites (submission must be draft), failure behavior, and post-call state. Adequate to attempt the call, insufficient to call it confidently.

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?

Both required parameters (submissionId, versionId) have 0% schema description coverage, so the schema carries no meaning beyond type and length constraints. The description merely restates the concept of 'a version' and 'a submission' without stating ID formats, where to obtain them, or whether versionId must belong to the same app as the submission.

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 and resource combination (add an App Store version to a review submission) and opens with a mutation marker, so the effect is unambiguous. It is reasonably distinguishable from siblings like create_review_submission and assign_build_to_version, though it never explicitly contrasts itself with them.

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 'App Review draft state' implies the submission must already exist and be in draft, which is useful implied guidance, but there is no explicit when-to-use rule and no routing away from submit_review, create_review_submission, or assign_build_to_version.

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

assign_build_to_versionB
Destructive

MUTATES app draft state: attach a processed build to an App Store version.

NameRequiredDescriptionDefault
buildIdYes
versionIdYes

TDQS

B3.1/5.0
Behavior3/5

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

Annotations already declare destructiveHint=true, idempotentHint=false and openWorldHint=true, so the safety profile is covered. The description adds real context by requiring a 'processed' build and scoping the mutation to draft state, but it omits the critical behavioral question for a destructive, non-idempotent call: what happens to a build already attached to the version, and whether it is replaced or rejected.

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?

One sentence, front-loaded with the mutation warning and zero filler. It is efficient, though the brevity borders on under-specification rather than tightness.

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

Completeness2/5

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

For a destructive, non-idempotent, open-world mutation with two required undocumented parameters and no output schema, the description is too thin. An agent still cannot tell whether attaching replaces an existing build, what failure modes exist, or what the call returns.

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?

Schema description coverage is 0% and neither parameter carries a description, so the description carries the full burden. It adds nothing about versionId or buildId — no indication of what kind of IDs these are, where to obtain them (list_versions / list_builds), or what happens if the build belongs to a different app than the version.

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: attach a processed build to an App Store version. The phrase 'app draft state' scopes it apart from the beta-group sibling add_build_to_beta_group and from add_version_to_submission, though it never names those alternatives 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?

Usage is only implied: 'processed build' hints that the build must have finished processing first, and 'draft state' hints this is pre-submission work. There is no explicit when-to-use/when-not guidance and no mention of the sibling tools that handle the nearby cases (beta groups, review submissions).

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

create_app_info_localizationB
Destructive

MUTATES app-level metadata: add a locale with name and optional subtitle. Add the same locale to the version before submission.

NameRequiredDescriptionDefault
nameYes
localeYes
subtitleNo
appInfoIdYes
privacyPolicyUrlNo

TDQS

B3.1/5.0
Behavior3/5

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

The annotations already declare destructiveHint=true, idempotentHint=false and openWorldHint=true, and the description is consistent with them ('MUTATES'). It adds real value by disclosing the submission prerequisite, but says nothing about what happens on a duplicate locale, whether existing values are overwritten, or what authorization is needed.

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?

Two short sentences with the mutation warning front-loaded and no filler. It is efficient, though the second sentence reads as an imperative instruction rather than clear usage context.

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

Completeness2/5

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

For a five-parameter mutation with zero schema description coverage and no output schema, the description is missing too much: the required appInfoId is never explained, privacyPolicyUrl is unmentioned, and no return or error behavior is described.

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?

Schema description coverage is 0% across five parameters, so the description carries the full burden. It names name, subtitle and implicitly locale, but never mentions the required appInfoId or privacyPolicyUrl, leaving the two most opaque parameters undocumented anywhere.

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?

Uses a specific verb+resource ('MUTATES app-level metadata: add a locale') and scopes it to app-level rather than version-level metadata, which distinguishes it from siblings such as create_localization and update_app_info_localization. It never names those siblings explicitly, so the differentiation is implicit rather than stated.

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?

Provides a workflow hint ('Add the same locale to the version before submission') that implies when this tool belongs in a sequence. However, it gives no explicit guidance on when to use this versus update_app_info_localization or create_localization, and no preconditions or failure modes are stated.

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

create_beta_groupC
Destructive

MUTATES TestFlight: create an internal or external beta group for an app.

NameRequiredDescriptionDefault
nameYes
appIdYes
isInternalGroupYes

TDQS

C2.8/5.0
Behavior2/5

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

Annotations already declare destructiveHint=true, idempotentHint=false, and openWorldHint=true; the description's 'MUTATES' mostly restates that. It adds no details about side effects beyond the annotations, such as whether duplicate names are allowed, whether existing groups are affected, or what permissions are required.

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 front-loaded sentence with no filler. It immediately tells the agent the mutation and target, though it is terse.

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

Completeness2/5

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

For a destructive mutation with three required, undocumented parameters and no output schema, the description is too thin. Annotations cover the safety profile, but the agent still lacks parameter guidance and operational context.

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?

Schema coverage is 0% for three required parameters, so the description should compensate but does not. It only loosely hints at appId and isInternalGroup via 'for an app' and 'internal or external', and says nothing about name.

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

Purpose4/5

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

The description states a specific verb 'create' and resource 'beta group', plus scope 'internal or external' and 'for an app', so the action is clear. It does not explicitly differentiate from siblings such as list_beta_groups or add_tester_to_beta_group, so it stops short of 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 Guidelines2/5

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

No when-to-use guidance, alternatives, or prerequisites are given. The only cue is 'create', which implies usage but does not help an agent choose between this and add_build_to_beta_group or add_tester_to_beta_group.

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

create_beta_testerA
Destructive

MUTATES TestFlight: create a beta tester and assign them to a beta group. Apple may send an invitation.

NameRequiredDescriptionDefault
emailYes
groupIdYes
lastNameNo
firstNameNo

TDQS

A3.5/5.0
Behavior4/5

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

Beyond the annotations (destructiveHint, openWorldHint, non-idempotent), the description discloses the outbound side effect that "Apple may send an invitation" to the tester, which is meaningful external behavior an agent should anticipate. It still does not say what happens when the email already belongs to a tester, which matters given the non-idempotent hint.

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, front-loaded with the mutation flag and the core action, with zero filler. Every clause contributes information.

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?

For a destructive, non-idempotent create tool with no output schema, the description covers the action, the assignment, and the invitation side effect, which is decent. But it omits required-parameter framing and duplicate-tester handling, leaving real ambiguity for an agent to resolve on its own.

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?

Schema description coverage is 0% and all four parameters (email, groupId, firstName, lastName) are undocumented in the schema, so the description carries the full burden — yet it mentions no parameters, not even that email and groupId are required or that names are optional. It adds essentially no semantic meaning.

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+resource ("create a beta tester") plus the side action of assigning to a group, and the "MUTATES TestFlight" prefix flags the domain. It does not explicitly differentiate from the overlapping sibling add_tester_to_beta_group, so it falls short of 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?

There is an implicit use case (provisioning a brand-new tester into a group), but the description never says when to prefer this over add_tester_to_beta_group, which adds an already-existing tester to a group. With such a close sibling, the missing routing guidance is a real gap.

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

create_localizationB
Destructive

MUTATES version metadata: add a locale to an App Store version. Add the same locale to app info before submission.

NameRequiredDescriptionDefault
localeYes
versionIdYes
attributesNo

TDQS

B3.3/5.0
Behavior3/5

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

Annotations already declare destructiveHint=true, idempotentHint=false and openWorldHint=true, and the description mostly echoes that with 'MUTATES version metadata'. The useful addition is the submission-ordering requirement, but it does not say what happens on a duplicate locale, whether existing fields are overwritten, or what the response contains.

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?

Two short sentences, mutation warning front-loaded, no filler. The second sentence is slightly compressed and requires inference to link 'app info' to the sibling tool.

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

Completeness2/5

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

For a destructive mutation with a nested attributes object of six undocumented fields and no output schema, the description is thin. It needs at least minimal guidance on what attributes may be set and whether providing them overwrites existing localization content.

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?

Schema description coverage is 0%, so the schema documents names and constraints only. The description never explains versionId, the locale pattern, or the six-field nested attributes object (keywords, whatsNew, supportUrl, description, marketingUrl, promotionalText), leaving a large semantic gap for a nested-object 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?

States a specific verb and resource: 'add a locale to an App Store version', and flags it as a mutation up front. The reference to 'app info' hints that the sibling create_app_info_localization covers the app-info side, though it never names that tool explicitly.

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 concrete prerequisite: the same locale must also be added to app info before submission, which is real workflow context an agent can act on. It lacks explicit when-not-to-use guidance or a named alternative for the app-info half of the workflow.

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

create_review_submissionB
Destructive

MUTATES App Review draft state: create a submission container for an app.

NameRequiredDescriptionDefault
appIdYes

TDQS

B3/5.0
Behavior3/5

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

Annotations already declare destructiveHint=true, idempotentHint=false and openWorldHint=true, so the safety profile is known. The description's 'MUTATES' wording reinforces the write nature but adds little beyond that, and it does not say what state is lost, whether an existing draft is replaced, or what permissions are needed. With annotations covering the basics, this is adequate but thin.

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 short sentence with the mutation intent front-loaded and nothing redundant. The all-caps 'MUTATES' is effective emphasis but slightly informal for a technical definition.

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?

For a one-parameter mutation with no output schema, an agent still lacks two things: what the created submission looks like or returns, and how non-idempotent duplicate behavior manifests (error vs. new container). The description does not address either, leaving a meaningful gap.

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 a single required parameter (appId) with 0% schema description coverage, and the description never mentions it. The agent gets no meaning for appId from either source, so the description fails to compensate for the coverage gap.

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: 'create a submission container for an app.' The prefix 'MUTATES App Review draft state' scopes it to draft-stage state, which helps distinguish it from submit_review and release_version, though it never names a sibling explicitly.

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

Usage Guidelines2/5

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

There is no when-to-use or when-not-to-use guidance. An agent must infer that this precedes add_version_to_submission and submit_review from the phrase 'draft state' alone, and nothing says what to do if a draft submission already exists.

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

create_screenshot_setC
Destructive

MUTATES version metadata: create a screenshot set for a locale and display type.

NameRequiredDescriptionDefault
localizationIdYes
screenshotDisplayTypeYes

TDQS

C2.9/5.0
Behavior2/5

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

The annotations already declare destructiveHint=true, idempotentHint=false, and openWorldHint=true, so 'MUTATES version metadata' largely restates the safety profile rather than extending it. The description says nothing about what is overwritten, whether an existing set for the same locale/display type is replaced, or what error conditions occur on conflict.

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 short sentence that front-loads the most important signal ('MUTATES') before naming the resource. No filler, though the all-caps emphasis is doing work that a fuller behavioral sentence could do more usefully.

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

Completeness2/5

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

For a destructive, non-idempotent mutation with no output schema and no documented parameters in the schema, the definition is thin: it omits prerequisites, conflict/replacement behavior, and any indication of what the call returns. An agent could call it, but not confidently predict the side effects.

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?

With 0% schema description coverage, the description does add meaning by mapping the two required parameters to their roles: localizationId is the locale and screenshotDisplayType is the display type. However, it does not clarify the display-type pattern, the valid platform prefixes, or where localizationId comes from, so it only partially compensates for the schema gap.

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 ('create a screenshot set') plus the scope that defines it ('for a locale and display type'), which clearly separates it from list_screenshot_sets and upload_screenshot. It stops short of naming a sibling or explaining the create-then-upload workflow, so it is clear but not fully differentiated.

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

Usage Guidelines2/5

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

There is no when-to-use or when-not-to-use guidance, and no mention of the related tools (list_screenshot_sets, upload_screenshot) or of the prerequisite that the target localization must already exist. The agent must infer the workflow entirely from the name and the 'MUTATES' prefix.

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

create_versionC
Destructive

MUTATES app draft state: create a new App Store version for an app and platform.

NameRequiredDescriptionDefault
appIdYes
platformYes
releaseTypeNo
versionStringYes

TDQS

C2.9/5.0
Behavior3/5

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

Annotations already declare destructiveHint=true, idempotentHint=false, and openWorldHint=true, so the safety profile is covered. The description adds a genuinely useful qualifier by framing the mutation as affecting 'app draft state', which tells the agent the change is to pre-release data, but it says nothing about duplicate-version errors, permission needs, or the releaseType default.

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 the mutation warning first and the resource second; every clause carries information. The all-caps 'MUTATES' is defensible emphasis but borders on redundant given the destructiveHint annotation.

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

Completeness2/5

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

For a four-parameter mutation with zero schema description coverage and no output schema, the description is thin: it never addresses the two enum parameters, the required versionString, or what the agent receives on success. It answers 'what' but leaves too much of 'how' and 'with what effect' unstated.

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?

Schema description coverage is 0% across four parameters, so the description must carry the burden and does not. It mentions the app and platform inputs only obliquely and never explains versionString format or what releaseType (MANUAL vs AFTER_APPROVAL) actually changes about publication behavior.

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

Purpose4/5

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

The description states a specific verb plus resource ('create a new App Store version') and scopes it to an app and platform, which clearly separates it from read siblings like list_versions and get_version. It stops short of naming the nearest alternative among the many create_* siblings, so it is clear but not fully differentiated.

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

Usage Guidelines2/5

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

There is no guidance on when to create a version versus using assign_build_to_version, submit_review, or release_version, nor any stated prerequisites such as the app already existing or a version string format. The agent gets no when-not-to-use conditions and no ordering context in the release workflow.

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

get_appB
Read-only

Read an App Store Connect app by its resource ID.

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 the safety profile is covered. The description adds only the ID-based lookup framing; it says nothing about behavior when the ID does not exist, error semantics, or the scope of data returned.

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 short sentence, front-loaded with the verb and resource and with no filler. Nothing could be removed 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?

A simple single-parameter read tool with annotations covering the safety profile and no output schema to explain. The description is nearly sufficient, with only minor gaps around failure behavior and how to obtain an appId.

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 carries the burden. It clarifies that appId is a "resource ID" of an App Store Connect app, which is meaningful but minimal — no format, source, or validity hints.

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 ("Read") and resource ("App Store Connect app") plus the lookup key ("resource ID"). This implicitly contrasts with the sibling list_apps, though it never names the alternative explicitly.

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 guidance on when to use this versus list_apps or the other get_* siblings, and no prerequisites or preconditions stated. The agent must infer that a known appId is required before calling.

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

get_buildB
Read-only

Read a processed build and its processing state.

NameRequiredDescriptionDefault
buildIdYes

TDQS

B3/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 adds that builds have a processing state, hinting at asynchronous processing, but it does not say what states exist or what happens when a build is not yet processed.

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?

One short sentence, front-loaded with the verb and resource, with no filler. It is efficient, though its brevity comes at the cost of the gaps noted above.

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?

For a one-parameter read tool whose annotations already cover safety, this is close to adequate. However, with no output schema and no mention of buildId or the relationship to build uploads, an agent still lacks enough to call it confidently in ambiguous cases.

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?

Schema description coverage is 0%, and the single required parameter buildId is never mentioned in the description, so its meaning, format, or accepted identifier type is undocumented anywhere. The description fails to compensate for the coverage gap.

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?

"Read a processed build and its processing state" gives a specific verb (read) and resource (build) plus the extra dimension of processing state, which separates it from list_builds. It never names the sibling get_build_upload, so an agent must infer whether a build and a build upload are different objects.

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

Usage Guidelines2/5

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

There is no statement of when to call this versus list_builds or get_build_upload, and no prerequisites (e.g. whether the build must already be processed). Usage is only implied by the word "processed".

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

get_build_uploadB
Read-only

Read a build upload record and its processing state.

NameRequiredDescriptionDefault
buildUploadIdYes

TDQS

B3/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 adds that the record's 'processing state' is included in the response, which is useful context, but says nothing about failure modes (unknown ID), eventual consistency of processing state, or authorization needs.

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 or repetition. It is efficient, but its brevity leaves the gaps noted in the other dimensions rather than being cut for conciseness.

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?

For a simple one-parameter read with no output schema, the description gives a rough return value ('record and its processing state'). It is still missing how to obtain the ID and what states to expect, which an agent needs to call and interpret it confidently.

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?

Schema description coverage is 0% and the description never mentions buildUploadId, its format, or where to obtain it (presumably from list_build_uploads). With one required, undocumented identifier parameter, the description does not compensate for the schema gap.

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 ('Read') and resource ('build upload record') plus the scope of what comes back ('its processing state'). It is distinguishable from list_build_uploads and upload_ipa, but never names or explicitly contrasts with 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?

There is no when-to-use guidance and no mention of alternatives such as list_build_uploads for enumerating uploads or get_build for the final build. The single-record retrieval intent is only implied by the verb 'Read'.

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

get_localizationC
Read-only

Read one version localization.

NameRequiredDescriptionDefault
localizationIdYes

TDQS

C2.4/5.0
Behavior2/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 nothing beyond that: no statement about error behavior for unknown IDs, no indication of what locale or version data comes back.

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

Conciseness3/5

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

A single short sentence with no filler, but it is under-specified rather than efficient — the brevity costs the reader the information needed to call the tool correctly.

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

Completeness2/5

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

The tool is simple, but with no output schema the description should indicate what a localization record contains or how it differs from app-info localizations. As written, an agent knows only that it reads something called a version localization.

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?

Schema description coverage is 0% for the single required localizationId parameter, so the description must compensate and does not. It never says the ID is a localization resource identifier, nor that it should come from list_localizations output.

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

Purpose3/5

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

"Read one version localization" states a verb and resource and adds the version-scoping that the name get_localization lacks, but it is close to restating the tool name and never mentions the identifier-based lookup that actually defines the operation.

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 guidance on when to use this versus list_localizations or list_app_info_localizations, and no note that an ID is required or where to obtain one. The agent must infer the singular-vs-list choice purely from sibling naming.

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

get_reviewB
Read-only

Read a customer review by its resource ID.

NameRequiredDescriptionDefault
reviewIdYes

TDQS

B3.3/5.0
Behavior2/5

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

The annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered and the description needs to add context beyond that. It adds none: nothing about behavior when the ID is unknown (error vs. empty result), whether reviews can disappear, or what a returned review includes. For a lookup tool the annotations carry most of the burden, but the description contributes essentially nothing extra.

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 short sentence, front-loaded with the verb and resource, with no filler or redundancy. Every word carries meaning and 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.

Completeness3/5

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

For a simple single-parameter read tool with annotations covering safety and no output schema to explain, the definition is minimally sufficient to call correctly. It is nonetheless thin on failure behavior and on the difference from list_reviews and get_review_response, which an agent choosing among 35 siblings would benefit from.

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

Parameters3/5

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

Schema description coverage is 0%, so the single reviewId parameter is documented only as a constrained string (1-200 chars) with no format hints. The phrase "resource ID" gives a small amount of meaning, telling the agent it is an identifier obtained elsewhere rather than a name, but it does not specify the ID format or where to obtain one.

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

Purpose4/5

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

The description states a specific verb and resource ("Read a customer review") plus the lookup key ("by its resource ID"), which distinguishes it from the sibling list_reviews by singular/ID-based access. However, it never names list_reviews or get_review_response as the alternatives, so the differentiation is only implicit.

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 implied rather than stated: "by its resource ID" suggests calling it when you already hold a review ID (e.g., from list_reviews), while the listing tool covers discovery. There is no explicit when-to-use, when-not-to-use, or named alternative, so an agent must infer the routing.

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

get_review_responseC
Read-only

Read the developer response for a customer review.

NameRequiredDescriptionDefault
reviewIdYes

TDQS

C2.7/5.0
Behavior2/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 structurally; the description only echoes 'Read'. It does not say what happens when a review has no developer response (empty result vs. error), nor whether the response includes metadata such as timestamps or author.

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?

One short, front-loaded sentence with no filler and no repetition of the title. It is efficient, though its terseness borders on under-specification rather than being optimally sized for the context.

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

Completeness2/5

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

For a retrieval tool with no output schema, the description should at minimum convey the shape of the returned response and the no-response case. Neither is covered, and with 0% schema description coverage the gap is compounded.

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?

Schema description coverage is 0% for the single parameter, so the description carries the burden and fails: it never explains what reviewId refers to, its expected format, or whether it must come from list_reviews/get_review. It adds no meaning beyond the property name.

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 ('Read') and a specific resource ('the developer response for a customer review'), which is distinguishable from get_review and reply_to_review by the mention of the response. It does not explicitly name those siblings, so the differentiation is only implied by wording.

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 is given, and the description never mentions the obvious alternatives (get_review for the review body, reply_to_review for writing a response, list_reviews for enumeration). The agent must infer the routing from the tool name alone.

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

get_versionC
Read-only

Read an App Store version, optionally including its assigned build.

NameRequiredDescriptionDefault
versionIdYes

TDQS

C2.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 the safety profile is covered. The description adds one behavioral detail, that the assigned build can be included in the read, but says nothing about permissions, errors, or what happens if the version has no build.

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?

One front-loaded sentence with no filler, which is right for a simple read tool. The second clause is the weak point: it is compact but describes an option that is not in the schema, so the brevity hides a mismatch rather than resolving it.

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

Completeness2/5

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

For a one-parameter read with no output schema, the description should at minimum identify what versionId is and roughly what comes back. Neither is present, and the only distinguishing detail it offers (including the build) is unbacked by the schema.

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?

Schema description coverage is 0% and the single parameter versionId (maxLength 200) is never explained, so the agent cannot tell whether it takes an opaque ID or something like '1.2.0'. Worse, the claimed optional build inclusion has no corresponding parameter in the schema, so the description points at a capability the input schema does not expose.

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: 'Read an App Store version'. That is enough to separate it from list_versions (plural listing) and get_build (different resource) without opening either schema. It stops short of a 5 because it never says what a 'version' is keyed by, an ID or a version string.

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 or when-not-to-use guidance is given. The agent is left to infer that list_versions is for discovery and this tool for fetching one already-known version, and nothing tells it how this differs from get_build for the build relationship.

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

list_app_info_localizationsC
Read-only

List app-level localized names, subtitles, and privacy URLs.

NameRequiredDescriptionDefault
nextNo
limitNo
appInfoIdYes

TDQS

C2.7/5.0
Behavior2/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 only the shape of returned fields (names, subtitles, privacy URLs) and says nothing about pagination behavior despite the presence of a 'next' parameter, nor about auth or rate limits.

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 zero filler, which is efficient and readable. However, given the total absence of schema descriptions, the extreme brevity is under-specification rather than true conciseness.

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

Completeness2/5

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

There is no output schema and no parameter documentation, and the description does not cover the required appInfoId, the pagination cursor, or result limits. For a paginated list tool with three undocumented parameters, this leaves the agent without enough information to call it correctly on the first try.

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?

Schema description coverage is 0% across three parameters, so the description carries the full burden and does not meet it. It never mentions that appInfoId is required, nor explains the limit (1-200) or next cursor parameters, leaving pagination semantics entirely undocumented.

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 ('List') and a specific resource scope ('app-level localized names, subtitles, and privacy URLs'), which distinguishes it from the sibling list_localizations (version-scoped) by the 'app-level' qualifier. It does not explicitly name list_localizations or list_app_infos as alternatives, so the differentiation is implied rather than stated.

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

Usage Guidelines2/5

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

There is no explicit when-to-use guidance, no prerequisites, and no named alternative such as list_localizations for version-level data. The 'app-level' qualifier hints at scope but leaves the agent to infer when this tool is preferred over its siblings.

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

list_app_infosC
Read-only

List app-level information records, including the editable next-version record.

NameRequiredDescriptionDefault
nextNo
appIdYes
limitNo

TDQS

C2.9/5.0
Behavior3/5

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

The annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds useful scope information by noting that results include the editable next-version record, but it omits pagination behavior, the role of next/limit, and what records are returned beyond that one special case.

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 a single front-loaded sentence with no filler. Every clause contributes either scope ('app-level information records') or a meaningful detail ('editable next-version record').

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

Completeness2/5

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

For a list tool with pagination parameters, no output schema, and zero schema parameter descriptions, the definition is too thin. It identifies the resource but does not explain return shape, pagination, or how this differs from the many sibling list and get tools.

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

Parameters1/5

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

Schema description coverage is 0%, so the description must compensate for undocumented parameters. It says nothing about appId, next, or limit, leaving all three parameters to be understood only from their names and types 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 uses a specific verb ('List') and resource ('app-level information records') and clarifies that the results include the editable next-version record. It does not explicitly distinguish this tool from close siblings such as list_app_info_localizations or get_app, so it falls short of 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 Guidelines2/5

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

The description gives no when-to-use guidance, prerequisites, or alternatives. With many sibling list/get tools available, an agent is left to infer that this is the app-info listing endpoint rather than, for example, app-info localizations or app versions.

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

list_appsB
Read-only

List apps accessible to the API key. Follow links.next for more pages.

NameRequiredDescriptionDefault
nextNo
limitNo
bundleIdNo

TDQS

B3.2/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 structurally. The description adds one genuinely useful behavior — pagination via links.next — but says nothing about default/maximum page size, ordering, or what happens when the cursor is stale.

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, both front-loaded and both earning their place: one declares scope, one declares pagination. There is no filler or redundancy.

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

Completeness2/5

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

With no output schema and no parameter descriptions, the definition should at minimum explain how to use the pagination cursor and what a page returns. For a 3-parameter list tool with a required continuation mechanism, the description leaves too much for the agent to guess.

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?

Schema description coverage is 0% across all three parameters, so the description must carry the burden and largely does not. It never explains that `next` is an opaque cursor taken from a prior response's links.next, and it is silent on the `limit` bounds (1-200) and the `bundleId` filter, leaving two of three parameters with no meaning anywhere.

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 apps") plus a scope qualifier ("accessible to the API key"), which cleanly separates it from the singular get_app sibling. It does not name any sibling explicitly, so it stops short of 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?

"Accessible to the API key" implies the discovery use case and the pagination instruction hints at iterative calls, but there is no explicit when-to-use versus get_app, and no mention of when to filter with bundleId rather than paging through everything.

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

list_beta_groupsC
Read-only

List TestFlight beta groups for an app.

NameRequiredDescriptionDefault
nextNo
appIdYes
limitNo

TDQS

C2.9/5.0
Behavior2/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 only the domain noun 'TestFlight beta groups' and says nothing about pagination, result ordering, or what an empty response means — despite a `next` cursor parameter implying paginated results.

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 zero filler or redundancy. Its brevity is efficient, though it borders on under-specification rather than tightness.

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

Completeness2/5

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

This is a paginated list tool with three parameters, no output schema, and no parameter descriptions, yet the description does not explain pagination, the shape of returned groups, or how to iterate. For a tool whose return contract is entirely undocumented, one sentence is not enough.

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

Parameters3/5

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

Schema description coverage is 0%, so the description must compensate; 'for an app' does imply that appId identifies the parent app and is required, which is useful. However, it says nothing about `limit` or the `next` pagination cursor, leaving two of three parameters entirely unexplained in both schema and 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 (list) and resource (TestFlight beta groups) scoped to an app, which cleanly separates it from sibling mutations such as create_beta_group or add_build_to_beta_group. It is clear but does not mention any scope qualifiers or how it differs from list_beta_testers, the nearest read sibling.

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

Usage Guidelines2/5

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

There is no when-to-use guidance, no mention of prerequisites (e.g., needing an appId from list_apps), and no reference to alternatives. The agent must infer from the name alone that this is the read path paired with create_beta_group.

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

list_beta_testersC
Read-only

List TestFlight testers for an app.

NameRequiredDescriptionDefault
nextNo
appIdYes
limitNo

TDQS

C2.6/5.0
Behavior2/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 nothing beyond that: it does not mention that results are paginated, what fields a tester record contains, or whether results cover all beta groups or only app-level testers.

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

Conciseness3/5

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

A single short sentence with zero filler and the resource front-loaded. It is concise to the point of under-specification rather than wasteful, which fits a 3.

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

Completeness2/5

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

For a paginated read tool with three parameters, 0% schema coverage, and no output schema, the definition should explain cursor pagination and what a tester object represents. As written, an agent cannot tell how to page through results or what it will receive.

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?

Schema description coverage is 0%, so all three parameters (appId, next, limit) are undocumented. The description only implies appId via "for an app" and gives no hint that `next` is a pagination cursor or that `limit` caps page size up to 200, leaving the pagination contract entirely opaque.

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 TestFlight testers") scoped to a single app, which clearly separates it from list_beta_groups or list_apps. It stops short of naming any sibling or clarifying how it differs from the tester-creation siblings, so it is clear but not maximally differentiated.

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

Usage Guidelines2/5

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

There is no when-to-use guidance, no prerequisites, and no mention of alternatives such as list_beta_groups when the agent wants testers grouped rather than listed per app. The agent must infer usage entirely from the name.

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

list_buildsB
Read-only

List processed builds for an app. Uploaded binaries may take time to appear.

NameRequiredDescriptionDefault
nextNo
appIdYes
limitNo

TDQS

B3.1/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 adds genuine behavioral context: only processed builds appear, and newly uploaded binaries lag before showing up. However, it says nothing about pagination behavior even though a 'next' parameter exists, and does not qualify how long the delay is.

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?

Two short sentences, front-loaded with the purpose, and no filler. The second sentence earns its place by flagging eventual consistency, though it could be more specific about the delay.

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

Completeness2/5

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

For a paginated list tool with no output schema and zero-described parameters, the description omits the essentials: what a build record contains, how pagination via 'next' works, and default/max limits. The timing hint is useful but does not compensate for these gaps.

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?

Schema description coverage is 0% across three parameters (appId, next, limit), so the description bears the full explanatory burden. It mentions none of them, leaving the agent to infer that appId scopes the listing and that next/limit drive pagination.

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 processed builds') scoped to an app, and the word 'processed' implicitly separates it from sibling list_build_uploads. It does not explicitly name that sibling, but an agent can distinguish the two from the text alone.

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: 'processed builds' plus 'Uploaded binaries may take time to appear' hints that this tool returns builds after processing, whereas list_build_uploads covers pending uploads. There is no explicit when-to-use/when-not guidance and no mention of get_build as an alternative for a single build.

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

list_build_uploadsB
Read-only

List build upload records for an app, including upload processing states.

NameRequiredDescriptionDefault
nextNo
appIdYes
limitNo

TDQS

B3.2/5.0
Behavior3/5

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

The readOnlyHint and openWorldHint annotations already establish that this is a non-mutating operation interacting with an external system. "Including upload processing states" adds modest result-content context, but the description does not address ordering, pagination behavior, possible state values, permissions, or empty 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?

The single sentence is front-loaded with the action and resource, then adds app scope and processing-state context without redundant wording. Its brevity does not obscure the core purpose; missing documentation is assessed in the other dimensions.

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

Completeness2/5

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

An agent can make a basic call using appId, but the absence of both parameter descriptions and an output schema leaves important gaps around next, limit, and result pagination. The lack of sibling-selection guidance and further result or processing-state detail makes the definition only minimally sufficient for reliable use.

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?

With 0% schema description coverage, the description needed to compensate more for the three parameters. "For an app" only indirectly clarifies the required appId, while next and limit receive no explanation of their pagination roles, defaults, or interaction beyond what their names and schema types suggest.

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 build upload records"—and scopes the operation to an app while mentioning processing states. It does not explicitly distinguish this listing operation from siblings such as get_build_upload, list_builds, or upload_ipa.

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 wording implies using the tool when an agent needs the upload records and processing states for an app. It provides no explicit selection guidance, such as choosing get_build_upload for a known upload or upload_ipa to initiate an upload, and states no prerequisites or exclusions.

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

list_localizationsB
Read-only

List version-level App Store metadata localizations.

NameRequiredDescriptionDefault
nextNo
limitNo
versionIdYes

TDQS

B3.1/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 adds only the version-level scoping detail; it says nothing about pagination behavior (the next/limit params imply paged results) or result ordering, which is what an agent would still need.

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 zero filler. It is efficient, though the brevity comes at the cost of the parameter and pagination detail noted elsewhere.

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

Completeness2/5

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

For a list tool with three undocumented parameters, no output schema, and paginated results, one sentence is not enough. An agent cannot tell from the description what a returned localization contains or how to page through results.

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?

Schema description coverage is 0% for three parameters, so the description carries the full burden and mostly fails: it never mentions that versionId is required, nor explains limit (1-200) or the next pagination cursor. The phrase 'version-level' only weakly hints at versionId, leaving two of three params entirely unaddressed.

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 (App Store metadata localizations) with a scope qualifier ('version-level') that distinguishes it from the sibling list_app_info_localizations. It stops short of naming the sibling or contrasting the two explicitly, so it is clear but not fully differentiating.

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 'version-level' qualifier implies when to use this over the app-info-level localization tools, but there is no explicit when-to-use or when-not statement, and no mention of what must exist first (a version, a valid versionId). Usage is inferable rather than stated.

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

list_reviewsC
Read-only

List customer reviews for an app, with Apple pagination.

NameRequiredDescriptionDefault
nextNo
appIdYes
limitNo
ratingNo

TDQS

C2.6/5.0
Behavior2/5

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

Annotations already declare readOnlyHint and openWorldHint, so safety is covered. The description adds only the vague phrase 'Apple pagination', without saying whether 'next' is an opaque cursor, whether results are sorted, whether results are scoped to territories or ratings, or how to detect the end of the list.

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

Conciseness3/5

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

The single sentence is front-loaded and free of wasted words, which is good. However, the brevity reflects under-specification rather than economy, since key behavior for a four-parameter list tool is simply absent.

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, so return-shape expectations would have to come from the description and do not. For a read-only list tool this is a moderate gap rather than a critical one, since the agent can still call it with an appId and see what comes back.

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?

Schema description coverage is 0% across four parameters, so the description must carry the burden and does not. It never explains that 'next' is a pagination cursor, that 'limit' caps results at 200, or that 'rating' filters reviews by star value, leaving the agent to guess from bare property names.

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

Purpose3/5

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

The description states a specific verb and resource ('List customer reviews for an app'), which is clearer than the bare name. It does not distinguish this from the sibling get_review, so the list-vs-fetch boundary is left to inference.

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

Usage Guidelines2/5

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

There is no guidance on when to call this versus get_review or get_review_response, and no mention of prerequisites such as needing an appId from list_apps. The only contextual phrase, 'with Apple pagination', hints at continuation but never explains when or how to paginate.

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

list_review_submissionsC
Read-only

List recent and current App Review submissions for an app.

NameRequiredDescriptionDefault
nextNo
appIdYes
limitNo

TDQS

C2.7/5.0
Behavior2/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. Beyond that, the description adds almost nothing: it does not explain pagination behavior despite the 'next' parameter, nor ordering, result size, or what 'current' means. For a paginated list tool, that is a notable gap.

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?

One short sentence with zero waste, and the resource is front-loaded. It is arguably under-written rather than padded, so brevity here is close to terseness.

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

Completeness2/5

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

A three-parameter paginated list tool with no output schema and 0% schema coverage needs the description to explain cursor pagination and the required appId. The description covers only the bare purpose, leaving an agent unable to page through results from the definition alone.

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?

Schema description coverage is 0% across three parameters, so the description must carry the burden and it does not. It never mentions appId, limit, or how the 'next' cursor should be used, leaving all three parameters semantically bare.

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

Purpose4/5

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

The description states a specific verb ('List') and resource ('App Review submissions'), scoped to a single app. It implicitly distinguishes itself from the mutation sibling create_review_submission, but the phrase 'recent and current' is somewhat vague about the exact time window.

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

Usage Guidelines2/5

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

There is no guidance on when to use this versus alternatives, and the sibling list includes both 'list_reviews' (customer reviews) and 'get_review', which an agent could easily confuse with App Review submissions. The description does not state any preconditions or exclusions.

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

list_screenshotsC
Read-only

List screenshots in a screenshot set.

NameRequiredDescriptionDefault
nextNo
limitNo
screenshotSetIdYes

TDQS

C2.6/5.0
Behavior2/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. Beyond that, the description adds nothing: it does not disclose pagination behavior despite a next cursor parameter, does not state ordering of results, and says nothing about what happens with an invalid set id. With annotation coverage the bar is lower, but this adds essentially no behavioral context.

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

Conciseness3/5

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

A single front-loaded sentence with zero filler, so it is efficient. However, the terseness reads as under-specification rather than discipline, given three undocumented parameters and no return-value context.

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

Completeness2/5

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

For a paginated list tool with no output schema and no parameter documentation, the description should at minimum explain the cursor/limit pagination model. None of that is present, leaving the agent to guess how to page through results or what the response shape is.

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?

Schema description coverage is 0%, so the description carries the full burden. It implies the screenshotSetId scoping ('in a screenshot set') but explains nothing about next (a URI cursor) or limit (1-200), both of which are undocumented in the schema as well. The description fails to compensate for the coverage gap.

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 with scope: 'List screenshots in a screenshot set.' This distinguishes it from the sibling list_screenshot_sets, which enumerates sets rather than the screenshots inside one. It stops short of naming the sibling relationship explicitly, so it is clear but not maximally differentiating.

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?

The description gives no guidance on when to use this tool versus alternatives, no prerequisite that a valid screenshotSetId must come from list_screenshot_sets, and no mention of the related upload_screenshot tool. Usage is only implied by the name, so an agent must infer everything.

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

list_screenshot_setsC
Read-only

List display-type screenshot sets for a version localization.

NameRequiredDescriptionDefault
nextNo
limitNo
localizationIdYes

TDQS

C2.9/5.0
Behavior3/5

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

Annotations already declare readOnlyHint and openWorldHint, so safety is covered. The description adds the meaningful scope constraint that only display-type sets are returned for a localization, but says nothing about pagination behavior, ordering, or what happens with large result sets.

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. It is efficient, though slightly terse given everything it leaves unsaid.

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

Completeness2/5

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

For a paginated list tool with no output schema and no parameter documentation, the description should explain paging and the shape of returned sets. It omits both, leaving the agent to guess at how to iterate results.

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?

Schema description coverage is 0% across three parameters, and the description only implies that localizationId is required. The limit and next pagination parameters get no explanation of semantics, defaults, or how paging should be driven.

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 ... screenshot sets") and narrows scope to display-type sets within a version localization, which differentiates it from siblings like list_screenshots and create_screenshot_set. The term "display-type" is unexplained, but the core operation is unambiguous.

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 guidance on when to use this versus list_screenshots, create_screenshot_set, or other listing tools, and no stated prerequisites beyond the implicit need for a localization. The agent must infer the use case from the name and description alone.

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

list_versionsC
Read-only

List App Store versions and states for an app.

NameRequiredDescriptionDefault
nextNo
appIdYes
limitNo
platformNo

TDQS

C2.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 the agent knows this is a safe, external read operation. The description adds that returned versions include states, but it does not mention pagination behavior via limit/next or platform filtering, leaving meaningful behavioral gaps.

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?

The description is a single front-loaded sentence with no wasted wording. Its terseness is efficient, though it borders on under-specification for a tool with pagination and filter parameters.

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

Completeness2/5

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

This is a list tool with four parameters, no output schema, and low schema description coverage, so the description should explain pagination, platform filtering, and how it differs from get_version. It omits all of these, making the definition incomplete for correct agent selection and invocation.

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?

Schema description coverage is 0%, so the description must compensate for four undocumented parameters. It only indirectly implies appId and says nothing about next, limit, or platform, leaving most parameter meaning unexplained.

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

Purpose4/5

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

The description states a specific verb and resource: "List App Store versions and states for an app." This distinguishes it reasonably well from get_version (single version) and create_version, but it does not explicitly name siblings or clarify scope boundaries.

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

Usage Guidelines2/5

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

There is no explicit when-to-use guidance, no mention of alternatives such as get_version for one version, and no exclusions or prerequisites. Usage is only implied by the name and the phrase "for an app."

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

release_versionA
Destructive

PUBLISHES an approved version in PENDING_DEVELOPER_RELEASE state. This cannot be canceled. Requires confirmPublish=true.

NameRequiredDescriptionDefault
versionIdYes
confirmPublishYes

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and idempotentHint=false, but the description adds genuinely new behavioral facts: the action is irreversible ('cannot be canceled') and requires an explicit confirmPublish=true acknowledgement. It does not disclose the resulting state after publishing or any permission/rate-limit constraints, which keeps it from a 5.

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, front-loaded with the action and state constraint, then the irreversibility warning, then the confirmation requirement. No filler and nothing that could be cut without losing information.

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?

For an irreversible, non-idempotent publishing action with no output schema, the description covers the essential warning and the confirm flag but omits the outcome (what state the version or app enters after success) and error behavior when the version is not in PENDING_DEVELOPER_RELEASE. Adequate to call safely, but not fully complete.

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

Parameters3/5

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

Schema description coverage is 0%, so the description must carry parameter meaning. It explains confirmPublish as a required confirmation gate, which adds intent beyond the const:true constraint, but versionId is never characterized (allowed formats, where to obtain it, what states are valid), leaving one of two parameters semantically thin.

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 (PUBLISHES) and resource (an approved version) and adds a precondition state (PENDING_DEVELOPER_RELEASE), which separates it from create_version, submit_review and assign_build_to_version. It stops short of naming those siblings explicitly, so the differentiation is inferable rather than stated.

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 through the state precondition: an agent can infer this call applies to versions already approved and sitting in PENDING_DEVELOPER_RELEASE. There is no explicit when-to-use versus alternatives, and no guidance on what to do if the version is in a different state.

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

reply_to_reviewA
Destructive

MUTATES public App Store content: create or replace the developer response to a customer review.

NameRequiredDescriptionDefault
reviewIdYes
responseBodyYes

TDQS

A3.5/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true, openWorldHint=true and idempotentHint=false, so the safety profile is partly covered. The description adds genuinely useful context the annotations lack: the mutation affects PUBLIC App Store content (reputational exposure) and the operation is upsert-style ('create or replace'), meaning any existing developer response is overwritten. There is a mild tension between 'replace' semantics and idempotentHint=false, but not a clear contradiction.

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

Conciseness5/5

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

A single sentence with the mutation warning front-loaded, followed by the operation semantics. Nothing redundant and no filler.

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?

For a two-parameter mutation with annotations and no output schema, the essential shape is conveyed, but gaps remain: whether an existing response is destroyed, whether the caller needs specific credentials, and what the parameters mean. Adequate, not complete.

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?

Schema description coverage is 0%, so the description carries the burden, yet it never mentions reviewId or responseBody. Only indirect inference is available (the addressed review and the response text). It also does not explain the notable 5970-character response body limit or the 200-character id constraint.

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

Purpose4/5

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

The description states a concrete verb pair ('create or replace') and a concrete resource ('the developer response to a customer review'), which clearly separates it from read-side siblings like get_review_response and list_reviews. It stops short of naming those siblings, so it is clear but not fully differentiated.

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: you respond to a review when you want a developer response published. There is no explicit when-to-use versus get_review_response, no statement about whether an existing response must exist first, and no permission or prerequisite guidance. The 'MUTATES public App Store content' framing hints at caution but gives no decision rule.

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

submit_reviewB
Destructive

SUBMITS all items in a review submission to Apple for review. Requires confirmSubmit=true.

NameRequiredDescriptionDefault
submissionIdYes
confirmSubmitYes

TDQS

B3.3/5.0
Behavior3/5

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

Annotations already declare destructiveHint=true, idempotentHint=false, and openWorldHint=true, so the irreversible external nature is partly covered structurally. The description adds that the target is Apple and that submission is a deliberate act, but it does not say what state the submission moves to, whether it can be withdrawn, or what happens if Apple rejects it.

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, zero filler, and the core action is front-loaded before the precondition. Nothing extraneous is included.

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?

For a destructive, non-idempotent, externally-visible submission with no output schema, the definition omits the outcome (what the submission becomes after submission) and any failure or retry semantics. What is present is accurate but thin for the risk profile of this call.

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?

Schema description coverage is 0%, so the description must carry parameter meaning and largely does not. It restates confirmSubmit=true (already enforced by the const in the schema) and says nothing about submissionId — where it comes from, its format, or that it identifies a draft submission built via create_review_submission.

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 ('SUBMITS') plus the resource and effect ('all items in a review submission to Apple for review'), which is concrete and differentiates it from siblings like add_version_to_submission or create_review_submission by making clear this is the final submit action. No sibling is named explicitly, so it stops short of the top mark.

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?

Only a prerequisite is given ('Requires confirmSubmit=true'); there is no explicit when-to-use versus when-not guidance relative to add_version_to_submission (must versions be added first?) or list_review_submissions (how to obtain a submissionId). The final-step nature is implied but left to inference.

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

update_app_info_localizationC
Destructive

MUTATES localized app-level metadata such as name and subtitle.

NameRequiredDescriptionDefault
attributesYes
localizationIdYes

TDQS

C2.7/5.0
Behavior2/5

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

Annotations already declare destructiveHint=true, idempotentHint=false and openWorldHint=true; the description's 'MUTATES' agrees with them rather than adding new information. It does not disclose the single most important behavioral question for a non-idempotent partial-update tool: whether the attributes object is a merge/patch (unspecified fields preserved) or a full replace (unspecified fields cleared).

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 an explicit scope marker, no filler, and the mutation nature stated first. It is efficient but so terse that the brevity costs information the agent needs.

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

Completeness2/5

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

For a destructive, non-idempotent mutation with a nested attributes object, 0% schema coverage and no output schema, the definition is under-specified: no merge-vs-replace semantics, no permission or constraint notes, and no indication of which fields are actually updatable. What exists is accurate but far short of what an agent needs to call this safely.

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?

Schema description coverage is 0% and there are two parameters including a nested object, so the description must compensate. It names only two of the four attribute fields ('name and subtitle') and completely ignores privacyPolicyUrl, privacyChoicesUrl and localizationId, and says nothing about the 1-30 character bounds or URI formats.

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

Purpose4/5

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

The description states a specific verb ('MUTATES') and a specific resource class ('localized app-level metadata') and gives examples of the fields touched. It is distinguishable from the read siblings (get_localization, list_app_info_localizations) and from create_app_info_localization, though it never explicitly contrasts with update_localization, which handles a similarly named resource.

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

Usage Guidelines2/5

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

There is no guidance on when to choose this over update_localization or create_app_info_localization, and no prerequisites are stated. Critically, localizationId is required but the description never says where to obtain it or what it scopes the write to.

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

update_localizationB
Destructive

MUTATES App Store version metadata for a localization. Apple may restrict edits based on version state.

NameRequiredDescriptionDefault
attributesYes
localizationIdYes

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare destructiveHint=true, idempotentHint=false and openWorldHint=true; the description usefully adds the external constraint that Apple gates edits on version state, which is context the annotations cannot convey. It does not clarify the more consequential behavior implied by destructiveHint — whether omitted keys in 'attributes' are cleared versus preserved, and whether the mutation is revertible.

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, mutation warning front-loaded, zero filler. Nothing is wasted or buried.

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

Completeness2/5

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

This is a destructive, non-idempotent mutation with a nested payload, zero schema descriptions and no output schema, so the description carries a heavy burden. It omits partial-update semantics, whether the call returns the updated localization, and how to recover from a version-state rejection — the gaps an agent would most likely hit when invoking it.

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?

Schema description coverage is 0% for two required parameters, including a nested 'attributes' object with six properties, and the description adds no meaning to either localizationId or any attribute field. Given the nested, partially-specified payload, the description should at minimum indicate that 'attributes' is a partial set of localizable fields and what happens to fields left out.

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 (MUTATES) and a specific resource (App Store version metadata for a localization), which is enough to separate it from create_localization and update_app_info_localization in principle. It stops short of explicitly naming those siblings or saying 'version localization, not app-info localization', so an agent must infer the distinction from the phrase 'version metadata'.

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?

'Apple may restrict edits based on version state' gives a useful precondition for when the call will succeed. However, it gives no guidance on choosing this tool over update_app_info_localization or create_localization, and no instruction on what to do when the edit is rejected (e.g. check version state first via get_version).

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

upload_ipaA
Destructive

MUTATES App Store Connect: upload a local iOS .ipa through Apple Build uploads API. Provide the IPA version and build number. Returns upload IDs; processing is asynchronous, so poll get_build_upload and list_builds before assigning the build.

NameRequiredDescriptionDefault
appIdYes
versionYes
filePathYes
buildNumberYes

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true, idempotentHint=false and openWorldHint=true, so the safety profile is covered. The description adds behavior the annotations cannot convey: the operation is asynchronous, returns upload IDs, and the build must not be assigned until polling with get_build_upload/list_builds succeeds. It omits auth requirements and what happens on a failed/partial upload.

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 compact sentences, front-loaded with the mutating nature of the call, then inputs, then the async follow-up workflow. No filler or redundant restatement of the tool name.

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?

There is no output schema, and the description usefully explains that the return is upload IDs consumed asynchronously, which is the key missing piece. However, for a four-parameter destructive mutation with zero schema documentation, the undefined appId and filePath semantics leave an agent guessing before invocation.

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?

Schema description coverage is 0% across four required parameters, so the description carries the full burden. It only clarifies 'version' and 'buildNumber' by naming them; 'appId' and 'filePath' are left undefined, with no indication of path format, absolute vs relative, or whether the file must be pre-staged locally.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'MUTATES App Store Connect: upload a local iOS .ipa through Apple Build uploads API.' That is unambiguous and clearly separable from upload_screenshot or the create_* siblings in the same namespace.

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 states the prerequisite inputs ('Provide the IPA version and build number') and gives explicit downstream routing: 'poll get_build_upload and list_builds before assigning the build.' It does not state when not to use this tool or any auth/permission prerequisites, so it falls short of a full when/when-not/alternatives treatment.

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

upload_screenshotA
Destructive

MUTATES App Store version metadata: upload a local PNG or JPEG to an existing screenshot set. The server follows Apple asset reservation, byte upload, and commit steps.

NameRequiredDescriptionDefault
filePathYes
screenshotSetIdYes

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare destructiveHint=true, idempotentHint=false, and openWorldHint=true, so the safety profile is covered. The description adds genuinely new context by disclosing the three-step Apple flow (asset reservation, byte upload, commit), which explains why the call may be slow or partially fail. It does not clarify what 'destructive' means here — e.g. whether an existing screenshot is replaced or a new one appended.

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 with the mutation warning front-loaded and the protocol detail second. No redundant restatement of the name or 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 two-parameter mutation with no output schema, the definition covers purpose, prerequisite, file type, and server-side flow, which is close to sufficient. It omits what the call returns (e.g. the created screenshot object or ID) and any failure/retry guidance for a non-idempotent multi-step operation.

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 0%, so the description carries the burden: it constrains filePath to a local PNG or JPEG and screenshotSetId to an existing set, which is meaningful added semantics. However, it gives no detail on path form (absolute vs relative), ID format, or size/dimension limits, leaving both parameters only partially characterized.

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 names a specific verb (upload) and resource (a local PNG/JPEG into an existing screenshot set), and the leading 'MUTATES App Store version metadata' frames the operation's category. It is clearly distinguishable from siblings such as create_screenshot_set and list_screenshots.

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?

Saying the upload targets an 'existing screenshot set' implicitly tells the agent a set must exist first (via create_screenshot_set or list_screenshot_sets), which is real usage context. It does not explicitly name those alternatives or state exclusions, so it falls short of a 5.

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. 38 tool updatesv0.1.0
    • First observedadd_build_to_beta_group
    • First observedadd_tester_to_beta_group
    • First observedadd_version_to_submission
    • First observedassign_build_to_version
    • First observedcreate_app_info_localization
    • First observedcreate_beta_group
    • First observedcreate_beta_tester
    • First observedcreate_localization
    • First observedcreate_review_submission
    • First observedcreate_screenshot_set
    • First observedcreate_version
    • First observedget_app
    • First observedget_build
    • First observedget_build_upload
    • First observedget_localization
    • First observedget_review
    • First observedget_review_response
    • First observedget_version
    • First observedlist_app_info_localizations
    • First observedlist_app_infos
    • First observedlist_apps
    • First observedlist_beta_groups
    • First observedlist_beta_testers
    • First observedlist_build_uploads
    • First observedlist_builds
    • First observedlist_localizations
    • First observedlist_review_submissions
    • First observedlist_reviews
    • First observedlist_screenshot_sets
    • First observedlist_screenshots
    • First observedlist_versions
    • First observedrelease_version
    • First observedreply_to_review
    • First observedsubmit_review
    • First observedupdate_app_info_localization
    • First observedupdate_localization
    • First observedupload_ipa
    • First observedupload_screenshot

TDQS

B3.1/5.0

Scored across 38 tools

Disambiguation4/5

Most tools target a distinct resource+action, and the MUTATES/SUBMITS prefixes plus hints like 'poll get_build_upload before assigning the build' clarify sequencing and side effects. A few pairs remain easy to confuse: list_builds vs list_build_uploads, create_localization vs create_app_info_localization, and add_build_to_beta_group vs assign_build_to_version, where the target (beta group vs version) must be read carefully.

Naming Consistency5/5

All names use consistent snake_case verb_noun form (list_apps, get_build, create_beta_tester, upload_screenshot, add_tester_to_beta_group, submit_review). Verb choice tracks semantics predictably (list/get for reads, create/update/upload for writes, add_* for membership), so an agent can infer behavior from the name alone.

Tool Count3/5

At 38 tools the surface is heavy, sitting well above the comfortable 3-15 range, though this reflects a genuinely large domain (apps, versions, builds, TestFlight, metadata assets, review submission). Each tool maps to a real App Store Connect operation, but the breadth makes discovery and correct selection harder than it needs to be.

Completeness3/5

The happy path from upload_ipa through assign_build_to_version to submit_review and release_version is fully covered, including TestFlight and screenshot/localization metadata. However, the surface has no delete or remove operations at all (no delete_screenshot, delete_localization, remove build/tester from a beta group, cancel review submission), and there is no update_app_info for app-level fields like privacy URLs, leaving agents with dead ends.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers