App Store Connect MCP server: analytics, sales, reviews, ratings, metadata.
Server has 29 tools with consistent naming (verb_noun pattern) and descriptions present for all. However, critical gaps exist: (1) Input schemas are largely absent or minimal, most tools show empty {} or single-param schemas without type/description details in the visible code; (2) Output schemas are undocumented, no structured response format specified for any tool; (3) Parameter descriptions exist in docstrings but lack formal JSON Schema type declarations; (4) Error handling is minimal, no recovery guidance or actionable error messages visible; (5) Several tools (create_app_version, submit_for_review, cancel_submission) have empty input schemas despite being high-risk operations. Tool names are clear (list_apps, get_sales, respond_to_review), but schema completeness is the primary blocker for LLM reliability.
Add a beta tester to a beta group by email.
Cancel the current version submission. CAUTION: irreversible.
Create a new app version for submission.
Delete an existing developer review response. response_id: from get_reviews → data[].relationships.response.data.id. After deleting, call respond_to_review to post a new response.
Show the currently selected app (name, bundle ID, numeric ID). Returns null if no app is selected and APPSTORE_APP_ID is not set.
Get App Store engagement analytics: impressions, page views, app units, conversion rate, sessions, active devices, crashes. Returns daily breakdown and totals via Apple Analytics Reports API. days: 1–365, default 30. Status may be 'pending' while Apple prepares data.
Missing or empty input schemas for 12+ tools (create_app_version, submit_for_review, cancel_submission, get_phased_release, list_app_versions, list_builds, list_beta_groups, list_custom_product_pages, list_subscription_groups, list_app_events, get_ratings, get_active_app). Tools show Input: {} with no type/description details. LLMs cannot validate parameters or understand constraints.
No output schemas documented for any tool. Responses are JSON-serialized but structure is opaque to LLMs. Cannot plan downstream tool calls or extract required fields (e.g., app_id from list_apps for use in select_app). Violates response-shaper and tool-chain patterns.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 67 | <=2025-11-25 | v2 |
Get details of a specific custom product page.
Get monthly financial report (proceeds, payouts, etc.) for a specific month.
Get financial summary across multiple months.
Get full ASO metadata for a single locale: name, subtitle, keywords, description, whatsNew. locale: locale code from get_locales, e.g. 'en-US', 'tr', 'de-DE', 'fr-FR', 'ja'. Returns appInfo (always editable) and versions (READY_FOR_SALE + PREPARE_FOR_SUBMISSION).
List all available localizations with their IDs — lightweight, call first. Returns appInfoLocalizations (for name/subtitle edits via update_info) and versionLocalizations (for keywords/description edits via update_version). Use the IDs and locale codes here to target specific locales.
Get phased release state for the current version (if any).
Get app rating summary: average rating, total review count, and sample size. Note: average is computed from the most recent 200 reviews when total > 200.
Get customer reviews sorted by newest first. Returns rating, title, body, reviewer nickname, territory, and developer response (if any). limit: 1–200 (default 50). When rating filter is used, fetches 200 reviews to maximize results. rating: filter by star rating 1–5 (e.g. rating=1 for only 1-star reviews). Optional.
Get App Store sales: downloads, redownloads, updates, subscriptions, revenue. Returns daily breakdown and totals for the last N days (default 30, max 365). Warnings field is set if any day failed to fetch (network error, rate-limit).
List all in-app events (promotional events) with their localizations. Returns eventState (DRAFT/LIVE/ARCHIVED), badge, purpose, and per-locale name/shortDescription. Use for monitoring active promotions.
List all app versions with their state, release date, and build info.
List all apps in your App Store Connect account (name, bundle ID, numeric ID). Call this first if APPSTORE_APP_ID is not set in the environment.
List all beta test groups (internal, external, etc.).
List all builds for the app, sorted by build number (newest first).
List all custom product pages (CPP) for the app.
List all subscription groups and their individual subscriptions. Returns referenceName for each group and per-subscription: name, productId, state (APPROVED/WAITING_FOR_REVIEW/etc), subscriptionPeriod, groupLevel.
Remove a beta tester from a beta group.
Post a new developer response to a customer review that has no response yet. review_id: the review ID from get_reviews → data[].id. response_body: response text, max 5900 characters. To edit an existing response: call delete_review_response first, then call this again.
Select the active app for all subsequent tool calls. app_id: numeric App Store ID (e.g. '6502225088') or bundle ID (e.g. 'com.example.app'). All tools operate on this app until select_app is called again.
Submit the current version for App Store review. CAUTION: irreversible.
Update app name and/or subtitle. Always editable regardless of version state. localization_id: appInfo localization ID from get_locales → appInfoLocalizations[].id. name: new app name (optional). subtitle: new subtitle, max 30 chars (optional). Provide at least one of name or subtitle.
Edit an existing developer review response in-place (PATCH). response_id: from get_reviews → data[].relationships.response.data.id. response_body: updated text, max 5900 characters. Use this instead of delete + respond_to_review when you want to edit without losing the original response timestamp.
Update keywords, description, or what's new text. Requires the version to be in PREPARE_FOR_SUBMISSION state. localization_id: version localization ID from get_locales → versionLocalizations[].id where state == 'PREPARE_FOR_SUBMISSION'. keywords: comma-separated, max 100 chars total. description: full app description. whats_new: release notes. Provide at least one.
Irreversible operations (submit_for_review, cancel_submission, delete_review_response) lack confirmation or dry-run support. No error recovery guidance. Descriptions warn 'CAUTION: irreversible' but provide no mechanism to prevent accidental execution or guide recovery.
Minimal error handling visible. No actionable error messages, recovery guidance, or error classification (retryable vs. fatal). Tools return JSON but no error schema or guidance for LLM recovery paths.
Parameter descriptions in docstrings lack formal JSON Schema type/format/enum declarations. E.g., 'days' parameter described as '1-365, default 30' but no minValue/maxValue in schema. LLMs cannot enforce constraints programmatically.