Mmcp.market

Appstoreconnect MCP server

by akoskomuves·io.github.akoskomuves/appstoreconnect-mcp·v1.0.1

App Store Connect for MCP clients: PPP pricing, subscriptions, TestFlight, reviews, reports & more

A92/100grade A
What users say
No reviews yet
Be the first
Safety scan
A92/100

full report

Adoption
Growing

5 stars1.7k downloads/wk

Reviews

Write one

Nobody has reviewed Appstoreconnect yet.

If you have run it, two minutes of your experience saves the next person an afternoon.

Appstoreconnect tools (100, 52 write)

write = sends, deletes, buys or posts

Read from the package source without running it. The installed server may list more.

  • asc_add_beta_group_testers

    Add existing BetaTester records to a beta group via POST /v1/betaGroups/{id}/relationships/betaTesters. Pass tester IDs (NOT emails — use asc_post_beta_tester to look up or create from an email). Idempotent on the wire (re-adding a member is a no-op). Apple does not push a fresh invite email on re-add.

  • asc_delete_accessibility_declarationwrite action

    DELETE /v1/accessibilityDeclarations/{id} — remove a DRAFT declaration. Published declarations are superseded by publishing a new draft (REPLACED), not deleted.

  • asc_delete_alternative_distribution_domainwrite action

    ⚠️ DELETE /v1/alternativeDistributionDomains/{id} — apps distributed from this domain stop being installable from it. Confirm intent first.

  • asc_delete_alternative_distribution_keywrite action

    ⚠️ DELETE /v1/alternativeDistributionKeys/{id} — artifacts signed against this key stop validating. Confirm intent first.

  • asc_delete_analytics_report_requestwrite action

    DELETE /v1/analyticsReportRequests/{id} — stop report generation for this request and drop access to its report chain. Recreating later starts fresh (ONGOING resumes from creation; ONE_TIME_SNAPSHOT re-backfills).

  • asc_delete_app_eventwrite action

    DELETE an AppEvent. Removes the event + every localization + every asset. Apple may refuse if the event is PUBLISHED or IN_REVIEW.

  • asc_delete_app_event_localizationwrite action

    DELETE an AppEventLocalization. Removes the per-locale copy + every event screenshot + video clip under it. Customers in this locale fall back to the event's primaryLocale.

  • asc_delete_app_event_screenshotwrite action

    DELETE an AppEventScreenshot. Removes the asset under its slot; if the slot goes empty Apple may reject the event for review with an asset-missing error.

  • asc_delete_app_event_video_clipwrite action

    DELETE an AppEventVideoClip. Removes the video asset; if both screenshot + video slot are emptied, Apple may reject the event for review with an asset-missing error.

  • asc_delete_app_info_localizationwrite action

    DELETE an AppInfoLocalization. The locale-specific app-level copy is removed (subtitle, privacy URLs, etc.). Customers in that locale fall back to the default locale's AppInfoLocalization. Apple may reject if the parent AppInfo is in a frozen state.

  • asc_delete_app_store_versionwrite action

    DELETE an App Store version. Allowed only when the version is in an editable state (PREPARE_FOR_SUBMISSION, *_REJECTED, INVALID_BINARY, DEVELOPER_REMOVED_FROM_SALE). The tool pre-checks the state with one GET and refuses client-side for frozen states (under review) or live states (READY_FOR_SALE — would orphan customers; release-pending — Apple rejects).

  • asc_delete_app_store_version_localizationwrite action

    DELETE an AppStoreVersionLocalization. The locale is removed for this version; users in that locale fall back to the default locale's copy on the product page. Doesn't affect other versions or other locales. Apple may reject if the version is in a state that locks localizations (e.g. in review).

  • asc_delete_beta_feedback_crash_submissionwrite action

    DELETE /v1/betaFeedbackCrashSubmissions/{id}. Permanently removes the crash feedback record (including its crash log) from App Store Connect. Irreversible; the tester is not notified.

  • asc_delete_beta_feedback_screenshot_submissionwrite action

    DELETE /v1/betaFeedbackScreenshotSubmissions/{id}. Permanently removes the feedback record and its screenshot images from App Store Connect — same as dismissing it in the TestFlight feedback UI. Irreversible; the tester is not notified.

  • asc_delete_beta_groupwrite action

    DELETE a beta group. Apple supports DELETE on this resource (unlike offer codes). All tester + build linkages are removed atomically. Testers themselves are NOT deleted — they remain as BetaTester records, just unassigned from this group. Builds are NOT affected.

  • asc_delete_marketplace_search_detailwrite action

    DELETE /v1/marketplaceSearchDetails/{id}.

  • asc_delete_marketplace_webhookwrite action

    DELETE /v1/marketplaceWebhooks/{id} — stop marketplace update notifications.

  • asc_download_analytics_report_segment

    Fetch a segment URL from asc_list_analytics_report_segments (pre-signed — fetched WITHOUT the ASC auth header; the signature lives in the URL) and gunzip the CSV. Returns header + row preview; saveTo writes the full decoded CSV to disk. Expired URL → re-list segments for a fresh one.

  • asc_end_app_availability_pre_orderwrite action

    POST an EndAppAvailabilityPreOrder resource carrying the list of TerritoryAvailability IDs in which to end pre-order. Apple stops accepting pre-orders in those territories — the app either goes live (if past releaseDate) or back to "not-yet-available". Relationships-only body (no attributes). Pass the opaque base64 IDs from asc_list_territory_availabilities (NOT bare 3-letter codes).

  • asc_get_app

    Fetch a single app by its App Store Connect ID.

  • asc_get_app_alternative_distribution_key

    GET /v1/apps/{id}/alternativeDistributionKey — the app's registered public key (to-one).

  • asc_get_app_availability_v2

    Fetch the current AppAvailabilityV2 for an app. Returns the master `availableInNewTerritories` flag (whether Apple auto-adds the app when new territories launch) + the linkage to the territoryAvailabilities the app is currently sold in. Use asc_list_territory_availabilities to enumerate the territories.

  • asc_get_app_event

    Fetch a single AppEvent by ID with its localizations expanded. Returns the full attribute surface including territorySchedules (writable per-territory schedule entries) and archivedTerritorySchedules (read-only history).

  • asc_get_app_event_localization

    Fetch a single AppEventLocalization by ID. Returns the locale + name + shortDescription + longDescription + the relationship IDs for any attached event screenshots and video clips.

  • asc_get_app_event_screenshot

    Fetch a single AppEventScreenshot by ID. Returns fileName / fileSize / appEventAssetType / assetDeliveryState / the imageAsset URLs once processed / the uploadOperations[] before commit.

  • asc_get_app_event_video_clip

    Fetch a single AppEventVideoClip by ID. Returns the upload metadata + previewFrameTimeCode + (post-ingest) videoUrl + previewImage. Wire-key gotcha: Apple emits `videoUrl` (camelCase) where Swift names it `videoURL`.

  • asc_get_app_info

    Fetch a single AppInfo with its category relationships + localizations expanded. The relationships block carries the IDs for primary/secondary categories + subcategories — use asc_list_app_categories to resolve those IDs to human-readable names.

  • asc_get_app_info_localization

    Fetch a single AppInfoLocalization by ID. Returns the full name + subtitle + privacy URLs/text for the locale.

  • asc_get_app_store_version

    Fetch a single App Store version with relationships expanded (app + appStoreVersionLocalizations + build). Use to see which locales already have copy and which still need localizing — the appStoreVersionLocalizations to-many relationship is the typical entry point for the v0.10 'translate release notes into N locales' workflow.

  • asc_get_app_store_version_localization

    Fetch a single App Store version localization by ID. Returns the full whatsNew + description + keywords + promotionalText + marketingUrl + supportUrl text. Use as the source-of-truth read before PATCH (so the LLM can diff before writing).

  • asc_get_beta_feedback_crash_log

    GET /v1/betaFeedbackCrashSubmissions/{id}/crashLog — returns the betaCrashLogs resource whose logText attribute is the full symbolicated-or-raw crash log. Logs can be large; output is capped at maxChars (default 200k) with a truncation note. Use after asc_list_beta_feedback_crash_submissions to drill into a specific crash. NOTE: Apple stores logs for a limited time — older submissions 404 here eve

  • asc_get_beta_feedback_crash_submission

    Fetch one crash feedback submission with full device context. include=build,tester for triage context. This returns the submission METADATA only — for the crash log text itself use asc_get_beta_feedback_crash_log.

  • asc_get_beta_feedback_screenshot_submission

    Fetch one screenshot feedback submission with full device context (connection type, battery, disk, uptime, screen size) and the screenshots array — each entry carries url + width + height + expirationDate. The URLs are time-limited Apple-signed download links; if one has expired, re-run this tool for fresh URLs. include=build,tester for triage context.

  • asc_get_beta_group

    Fetch a single beta group with relationships expanded (app + builds + betaTesters). Use to see the full membership before adding/removing testers or builds. Apple's tester list under a group can be large — paginate via asc_list_beta_testers with the group filter if you need the full list cleanly.

  • asc_get_marketplace_search_detail

    GET /v1/apps/{id}/marketplaceSearchDetail — the catalogUrl for a MARKETPLACE app (alternative app store). Observed live: calling this on a NON-marketplace app returns an Apple-side 500 UNEXPECTED_ERROR rather than a clean 404 — that 500 means "not a marketplace app", not an outage.

  • asc_get_version_alternative_distribution_package

    GET /v1/appStoreVersions/{id}/alternativeDistributionPackage — the to-one package record for a version (or an error when none was created).

  • asc_list_accessibility_declarations

    GET /v1/apps/{id}/accessibilityDeclarations — the per-device-family accessibility feature declarations ("Accessibility Nutrition Labels"). Filter by deviceFamily and/or state (DRAFT / PUBLISHED / REPLACED). The digest shows one row per declaration with the supported-feature flags.

  • asc_list_alternative_distribution_domains

    GET /v1/alternativeDistributionDomains — team-level registered website domains for EU web distribution. Entitlement-gated (403 = account not enrolled).

  • asc_list_alternative_distribution_keys

    GET /v1/alternativeDistributionKeys — the PUBLIC signing keys registered with Apple (the private halves never leave your infrastructure). Use asc_get_app_alternative_distribution_key for the to-one app linkage.

  • asc_list_alternative_distribution_package_deltas

    GET /v1/alternativeDistributionPackageVersions/{id}/deltas — update deltas (smaller downloads from prior versions) with pre-signed URLs. Raw JSON (URLs verbatim).

  • asc_list_alternative_distribution_package_variants

    GET /v1/alternativeDistributionPackageVersions/{id}/variants — per-device-thinning variants with pre-signed download URLs + key blobs. Raw JSON (URLs verbatim).

  • asc_list_alternative_distribution_package_versions

    GET /v1/alternativeDistributionPackages/{id}/versions — the dated builds of a package. State COMPLETED = downloadable via the pre-signed url (time-limited per urlExpirationDate — download promptly, re-list for fresh URLs, and NEVER send the ASC bearer to the download host). Variants/deltas per version via the dedicated list tools.

  • asc_list_analytics_report_instances

    GET /v1/analyticsReports/{id}/instances — the dated materializations of one report, one row per (granularity, processingDate). Filter granularity DAILY/WEEKLY/MONTHLY and/or processingDate (YYYY-MM-DD). Take an instance ID into asc_list_analytics_report_segments. Empty within ~48h of creating the request is normal.

  • asc_list_analytics_report_requests

    GET /v1/apps/{id}/analyticsReportRequests — the existing requests (at most one ONGOING + one ONE_TIME_SNAPSHOT). stoppedDueToInactivity=true on an ONGOING request means Apple auto-paused it; delete + recreate to resume.

  • asc_list_analytics_report_segments

    GET /v1/analyticsReportInstances/{id}/segments — the downloadable chunks of one instance: checksum, sizeInBytes, and a PRE-SIGNED TIME-LIMITED url. Download promptly with asc_download_analytics_report_segment (pass the URL through verbatim); if a URL expires, re-list segments for fresh ones.

  • asc_list_analytics_reports

    GET /v1/analyticsReportRequests/{id}/reports — the report catalog: one row per report name (e.g. "App Store Installation and Deletion Standard") within a category. Filter by category (COMMERCE for downloads/proceeds, APP_USAGE for sessions/crashes, APP_STORE_ENGAGEMENT for impressions/page views) or exact name. Take a report ID into asc_list_analytics_report_instances.

  • asc_list_app_categories

    List Apple's App Store category catalog with subcategories included. Read-only. Each category carries the platforms it applies to (IOS/MAC_OS/TV_OS/VISION_OS); subcategories are returned in `included[]` via the parent → subcategories relationship. Use to resolve human-readable category names to category IDs before calling asc_patch_app_info to set primary/secondary categories.

  • asc_list_app_event_localizations

    List AppEventLocalization records under an AppEvent. Each row carries locale + name + shortDescription length + longDescription length + the localization ID. Per (event, locale). Use to inspect existing per-locale copy before adding new locales or patching existing ones.

  • asc_list_app_event_screenshots

    List AppEventScreenshot records under an AppEventLocalization. Each row carries fileName + fileSize + the asset slot (EVENT_CARD / EVENT_DETAILS_PAGE) + assetDeliveryState (UPLOAD_COMPLETE / PROCESSING / COMPLETE / FAILED). Use to inspect upload progress or to enumerate IDs.

  • asc_list_app_event_video_clips

    List AppEventVideoClip records under an AppEventLocalization. Each row carries fileName + fileSize + previewFrameTimeCode + asset slot (EVENT_CARD / EVENT_DETAILS_PAGE) + the two delivery states (assetDeliveryState for the source file, videoDeliveryState for Apple-side transcode).

  • asc_list_app_events

    List AppEvent records for an app. Each row carries the referenceName, current eventState (DRAFT / READY_FOR_REVIEW / WAITING_FOR_REVIEW / IN_REVIEW / REJECTED / ACCEPTED / APPROVED / PUBLISHED / PAST / ARCHIVED), badge, purpose, priority, primaryLocale, and the count of territory schedules. Use to find the event ID before fetching its localizations or assets.

  • asc_list_app_info_localizations

    List AppInfoLocalization records under an AppInfo. Each row carries locale + name + subtitle + privacy URLs/text. Use to inspect existing per-locale copy before adding new locales or patching existing ones.

  • asc_list_app_infos

    List AppInfo records for an app. Apps typically have one AppInfo per distribution track — most apps have just one (the App Store track); macOS notarization can introduce a second. Each row shows the state, appStoreState (mirrored from the linked AppStoreVersion), and appStoreAgeRating. Use to find the AppInfo ID before patching categories or fetching localizations.

  • asc_list_app_price_points

    List the valid price points a paid app can be set to in a given territory. Apple rotates these IDs; cache only within a single run.

  • asc_list_app_prices

    List the current price schedule for a paid app across territories. Returns both manual (per-territory) overrides and automatic prices derived from the base territory. Auto-paginates; pass raw:true for the full JSON:API payload.

  • asc_list_app_store_version_localizations

    List App Store version localizations under one version. Each row carries locale + whatsNew length/preview + description length + keywords + promotionalText. Use to see which locales already have copy before adding/patching more. THIS IS THE LLM-WIN ENTRY POINT: list, pick a source locale, translate into target locales, patch each.

  • asc_list_app_store_versions

    List App Store versions for ONE app. appId is required — Apple's /v1/appStoreVersions collection is write-only on the GET side (returns FORBIDDEN_ERROR: "does not allow GET_COLLECTION"), so the only way to enumerate versions is via the per-app relationship path /v1/apps/{id}/appStoreVersions. Returns rows with platform, versionString, current state, and IDs in Apple's default order (no `sort` para

  • asc_list_app_tags

    List the AppTag membership for an app — Apple's structured-ASO tag surface. Each row shows the tag name and isVisibleInAppStore flag.

  • asc_list_apps

    List apps on the App Store Connect account. Returns a compact table by default; pass raw:true to get the full JSON:API response.

  • asc_list_beta_feedback_crash_submissions

    List crash feedback testers agreed to share from TestFlight via GET /v1/apps/{id}/betaFeedbackCrashSubmissions. Same filters as the screenshot list (build, tester, device, OS, platform). Each record has a crashLog relationship — pull the log text with asc_get_beta_feedback_crash_log. Read-only resource.

  • asc_list_beta_feedback_screenshot_submissions

    List screenshot feedback testers sent from TestFlight via GET /v1/apps/{id}/betaFeedbackScreenshotSubmissions. Each row shows created date, device, OS, comment preview, screenshot count, and build/tester linkage. Filter by build to triage feedback per release ("summarize feedback on build 132"). Read-only resource — testers create these from the device.

  • asc_list_beta_groups

    List beta groups. Pass appId to scope to a single app (the common case). Each row shows name, kind (INT/EXT), tester-count via the betaTesters relationship if requested, public-link state, and ID. Use to find a group before assigning a build or inviting testers.

  • asc_list_marketplace_webhooks

    GET /v1/marketplaceWebhooks — team-level webhooks Apple uses to notify a MARKETPLACE app about available app updates. Secret is write-only and never shown.

  • asc_list_search_keywords

    List Apple's aggregated AppKeyword records for an app — every keyword Apple has indexed across the app's localizations. Optional filter[platform] + filter[locale] to narrow. Read-only at this surface; actual keyword writes still happen via the per-version `keywords` field on AppStoreVersionLocalization (v0.10's asc_patch_app_store_version_localization).

  • asc_list_territory_availabilities

    List TerritoryAvailability records for an app. The digest TERR column shows the decoded 3-letter ISO territory code (e.g. USA / BRA / JPN), but the actual TERR_ID column is an Apple-opaque base64 composite — `{"s":<appId>,"t":<code>}`. Each row carries whether the app is currently `available`, releaseDate (soft-launch date if scheduled), preOrderEnabled, preOrderPublishDate. Pass the TERR_ID (not

  • asc_patch_accessibility_declarationwrite action

    ⚠️ publish=true is CUSTOMER-FACING: PATCH /v1/accessibilityDeclarations/{id} with publish=true puts the accessibility label live on the App Store product page (state → PUBLISHED; a previously published declaration for the family becomes REPLACED). Without publish, mutates the supports* flags on a DRAFT. Wire-key gotchas pinned by tests: `publish` (Swift isPublish) and the nine `supports*` flags (S

  • asc_patch_app_eventwrite action

    Update an AppEvent's attributes. Pre-check refuses for clearly frozen states (WAITING_FOR_REVIEW, IN_REVIEW). All attrs encodeIfPresent — only what you pass is sent. Tool refuses empty PATCH.

  • asc_patch_app_event_localizationwrite action

    Update name / shortDescription / longDescription on an existing AppEventLocalization. Locale is immutable (excluded from UpdateRequest). All three attrs are encodeIfPresent. Tool refuses empty PATCH.

  • asc_patch_app_event_screenshotwrite action

    RAW step 3 of the three-step upload flow. PATCH with uploaded=true to commit the reservation. Wire-key gotcha: Swift `isUploaded` → wire `uploaded` (same strip as v0.13 AppScreenshot). The composite asc_upload_app_event_screenshot handles this automatically.

  • asc_patch_app_event_video_clipwrite action

    RAW step 3 of the three-step upload flow + the only way to tweak previewFrameTimeCode on an existing clip. PATCH with uploaded=true to commit a reservation, or with previewFrameTimeCode alone to change the poster frame without re-uploading. Wire-key gotcha: Swift `isUploaded` → wire `uploaded`. Refuses empty PATCH.

  • asc_patch_app_infowrite action

    Set primary/secondary category + subcategory relationships on an AppInfo. AppInfoUpdateRequest is RELATIONSHIPS-ONLY (no mutable attributes). Each slot accepts a category ID (set/swap) or null (clear). All six slots are independently optional.

  • asc_patch_app_info_localizationwrite action

    Update name / subtitle / privacy fields on an existing AppInfoLocalization. All five attrs are encodeIfPresent (only what you pass is sent). Locale is immutable.

  • asc_patch_app_store_versionwrite action

    Mutate version-level attributes: versionString, copyright, reviewType, releaseType, earliestReleaseDate, downloadable. Plus the build relationship (attach/swap/clear). All attrs are encodeIfPresent (only what you pass is sent). Wire-key gotcha: Swift `isDownloadable` → wire `downloadable`.

  • asc_patch_app_store_version_localizationwrite action

    Update attrs on an existing AppStoreVersionLocalization.

  • asc_patch_app_tagwrite action

    Toggle whether an AppTag is shown in the App Store search/product page UI. Wire key `visibleInAppStore` (stripped from Swift `isVisibleInAppStore`). Setting false hides the tag without removing it from the app's tag list — flip true to re-show.

  • asc_patch_beta_groupwrite action

    Mutate a beta group's attributes. Apple PATCH on this resource accepts name, public-link state (publicLinkEnabled/publicLinkLimitEnabled/publicLinkLimit), feedbackEnabled, and the Apple Silicon Mac / Apple Vision build-availability flags.

  • asc_patch_marketplace_search_detailwrite action

    PATCH /v1/marketplaceSearchDetails/{id} — update the catalogUrl.

  • asc_patch_marketplace_webhookwrite action

    PATCH /v1/marketplaceWebhooks/{id} — update endpointUrl and/or rotate the secret (update the receiver first). Pass at least one.

  • asc_patch_territory_availabilitywrite action

    PATCH /v1/territoryAvailabilities/{id} — per-territory pre-order + release control: available (sell here or not), releaseDate (YYYY-MM-DD; with preOrderEnabled=true this is the announced release date customers pre-order against), preOrderEnabled (start taking pre-orders in this territory; end them with asc_end_app_availability_pre_order). The ID is the APPLE-OPAQUE composite from asc_list_territor

  • asc_post_accessibility_declarationwrite action

    POST /v1/accessibilityDeclarations — create a DRAFT declaration for one device family (required) with any subset of the nine supports* flags (omitted ≠ false: omitted flags are simply not declared). Drafts are invisible until published via asc_patch_accessibility_declaration publish=true. One DRAFT per device family at a time.

  • asc_post_alternative_distribution_domainwrite action

    POST /v1/alternativeDistributionDomains — register a website domain (e.g. "example.com") for EU web distribution. Both attributes required: domain + referenceName. Apple verifies domain ownership out-of-band (apple-developer-domain-association file). No PATCH exists — delete + re-create to change.

  • asc_post_alternative_distribution_keywrite action

    POST /v1/alternativeDistributionKeys — register the PUBLIC key (PEM string) used to verify your signed alternative-distribution artifacts. Optionally scope to one app via appId. The private key stays with you — never paste it anywhere; this tool takes the PUBLIC half only.

  • asc_post_alternative_distribution_packagewrite action

    POST /v1/alternativeDistributionPackages — start packaging an App Store Version for alternative distribution. Relationships-only body (appStoreVersion). Apple builds the signed package asynchronously; poll asc_list_alternative_distribution_package_versions until a version reaches COMPLETED.

  • asc_post_analytics_report_requestwrite action

    POST /v1/analyticsReportRequests — turn on analytics report generation for an app. accessType ONGOING (Apple keeps producing daily/weekly/monthly instances; may auto-pause after inactivity — stoppedDueToInactivity=true — delete + recreate to resume) or ONE_TIME_SNAPSHOT (single historical backfill). One request per (app, accessType); duplicates are rejected. Instances appear up to ~48h later — an

  • asc_post_app_availability_v2write action

    Create a new AppAvailabilityV2 for an app — Apple atomically swaps over to it. There is NO PATCH for this resource; you replace the whole availability by POSTing a new record. Required: appId + availableInNewTerritories + the FULL list of TerritoryAvailability IDs the app should be sold in (Apple-opaque base64 composites from asc_list_territory_availabilities; missing ones get removed). Wire-key g

  • asc_post_app_eventwrite action

    Create an AppEvent on an app. Required: appId + referenceName (internal-only, NOT customer-facing — set per-locale name via asc_post_app_event_localization). Optional: badge, deepLink, purchaseRequirement, primaryLocale, priority, purpose, territorySchedules. New events land in DRAFT. Add localizations + screenshots + video clips before submitting for review.

  • asc_post_app_event_localizationwrite action

    Create an AppEventLocalization for ONE (event, locale) pair. Required: appEventId + locale. Optional copy attrs: name (30 chars), shortDescription (50 chars), longDescription (120 chars). The (event, locale) pair must be unique — Apple rejects duplicates. Pre-check refuses for frozen parent-event states (WAITING_FOR_REVIEW, IN_REVIEW).

  • asc_post_app_event_screenshotwrite action

    RAW step 1 of the three-step upload flow (same shape as v0.13 AppScreenshot). Reserves an AppEventScreenshot under an event localization with fileName + fileSize + appEventAssetType (EVENT_CARD / EVENT_DETAILS_PAGE). Returns the resource with uploadOperations[] populated. Use asc_upload_asset_chunk to PUT each, then asc_patch_app_event_screenshot to commit. Most callers should use the composite as

  • asc_post_app_event_video_clipwrite action

    RAW step 1 of the three-step upload flow (same shape as v0.13 AppPreview). Reserves an AppEventVideoClip under an event localization with fileName + fileSize + appEventAssetType (+ optional previewFrameTimeCode for the poster frame). Returns the resource with uploadOperations[] populated. Most callers should use the composite asc_upload_app_event_video_clip instead.

  • asc_post_app_info_localizationwrite action

    Create an AppInfoLocalization for ONE AppInfo + ONE locale. Required: appInfoId + locale + name (30 chars). Optional: subtitle (30 chars), privacyPolicyUrl, privacyChoicesUrl (CCPA/CPRA flows), privacyPolicyText (inline text for territories that require it).

  • asc_post_app_price_schedulewrite action

    Replace the price schedule for a paid app.

  • asc_post_app_store_versionwrite action

    Create a new App Store version on an app. Required: appId + platform + versionString. The versionString must compare HIGHER than every prior version for this (app, platform) — Apple rejects duplicates or decreasing values. Optional: copyright, reviewType (APP_STORE default / NOTARIZATION for macOS notarization-only), releaseType (MANUAL / AFTER_APPROVAL / SCHEDULED), earliestReleaseDate (required

  • asc_post_app_store_version_localizationwrite action

    Create an AppStoreVersionLocalization for ONE version + ONE locale. Required: appStoreVersionId + locale. Optional: whatsNew (release notes, 4000), description (4000), keywords (100 TOTAL chars), promotionalText (170), marketingUrl, supportUrl. Apple requires supportUrl per locale for review; submissions without it are rejected. The (version, locale) pair must be unique — Apple rejects a duplicate

  • asc_post_beta_groupwrite action

    Create a beta group on an app. Required: name + appId. Optional: isInternalGroup (default false → external), hasAccessToAllBuilds (default false), public-link settings (external only), feedbackEnabled, and pre-seeded testers/builds.

  • asc_post_marketplace_search_detailwrite action

    POST /v1/marketplaceSearchDetails — set a MARKETPLACE app's catalogUrl (the catalog Apple's MarketplaceKit queries). Wire key catalogUrl (Swift catalogURL — pinned by tests). One per app; PATCH to change.

  • asc_post_marketplace_webhookwrite action

    POST /v1/marketplaceWebhooks — both attributes required: endpointUrl (wire key — Swift endpointURL, pinned by tests) + secret (HMAC signing key, WRITE-ONLY — store it on the receiving side first; rotatable via PATCH).

  • asc_remove_beta_group_testerswrite action

    Remove testers from a beta group via DELETE /v1/betaGroups/{id}/relationships/betaTesters. Pass only the IDs you want removed — Apple uses the body, not a "clear all" semantic. The BetaTester records themselves are NOT deleted (use asc_delete_beta_tester for that). Removed testers immediately lose access to the group's builds in TestFlight.

  • asc_upload_app_event_screenshotwrite action

    Composite tool. Reads localFilePath from disk, reserves an AppEventScreenshot under the given event localization for the given asset slot (EVENT_CARD / EVENT_DETAILS_PAGE), PUTs every uploadOperation chunk to Apple storage in sequence, then commits with uploaded=true. Returns the committed resource + per-chunk summary. Tilde paths (~/...) are expanded. Note: this resource has NO sourceFileChecksum

  • asc_upload_app_event_video_clipwrite action

    Composite tool. Reads localFilePath from disk (.mov H.264/HEVC recommended), reserves an AppEventVideoClip under the given event localization for the given asset slot (EVENT_CARD / EVENT_DETAILS_PAGE), PUTs every uploadOperation chunk to Apple storage in sequence, then commits with uploaded=true. Optionally sets previewFrameTimeCode (poster frame) at reserve. Returns the committed resource + per-c

  • asc_upload_asset_chunkwrite action

    RAW step 2 of the three-step screenshot / preview upload flow. Apple's reserve response returns uploadOperations[] — one per chunk, each with method (always PUT), url (Apple's pre-signed storage URL), length, offset, and requestHeaders. This tool executes ONE operation: reads localFilePath at [offset, offset+length), PUTs the bytes to url with all requestHeaders, and returns the HTTP status. Apple

Public scan report

scanner v0.1.9 · 2026-09-26 · same rubric, same numbers if you re-run it

no findings
  • Code scan116 source files scanned25/25
  • –Live reliabilityno gateway calls yet and no remote to proben/a
  • –Tool poisoningtools not inspected (local package is not executed); not countedn/a
  • Auth qualitylocal package, no credentials required12/15
  • Maintenancelast push 10 days ago15/15
  • Maintainer identityregistry namespace matches repository owner; GitHub account older than a year8/10
Overall 92/100. Components that don't apply are left out of the denominator. Any critical finding is an F.RubricAppeal a findingJSON

What the publisher says

From the Appstoreconnect repository's README, as published. We do not edit it. Read it on GitHub

appstoreconnect-mcp

A Model Context Protocol server for the Apple App Store Connect API. Drives apps, subscriptions, pricing, and more from any MCP-compatible client (Claude Code, Claude Desktop, Cursor, Windsurf).

The first published surface is subscription pricing — including a Purchasing Power Parity rebalance flow that's already been used to schedule 120 production price changes across 65 territories on a real iOS app. New ASC domains (TestFlight, sales, screenshots, IAPs) are designed to plug in one file at a time; see Roadmap.

Install (zero-config)

npx @akoskomuves/appstoreconnect-mcp init

The wizard:

  1. Opens App Store Connect → Keys so you can download a .p8 (skipped if you already have one).
  2. Copies the key to ~/.appstore/ with chmod 600.
  3. Asks for your Issuer ID and (auto-detected) Key ID.
  4. Verifies auth with a real API call before writing anything.
  5. Detects which MCP clients you have installed — Claude Code, Claude Desktop, Cursor, Windsurf — and registers itself in the ones you pick.

When something looks off later, run a read-only diagnostic:

npx @akoskomuves/appstoreconnect-mcp doctor

Manual install

If you'd rather wire it up by hand, add to ~/.claude.json (Claude Code), claudedesktopconfig.json (Claude Desktop), or your client's equivalent:

{
  "mcpServers": {
    "appstoreconnect": {
      "command": "npx",
      "args": ["-y", "@akoskomuves/appstoreconnect-mcp"],
      "env": {
        "ASC_ISSUER_ID": "...",
        "ASC_KEY_ID": "...",
        "ASC_PRIVATE_KEY_PATH": "~/.appstore/AuthKey_XXXXXXXXXX.p8"
      }
    }
  }
}

Or via Claude Code's CLI:

claude mcp add appstoreconnect \
  -e ASC_ISSUER_ID=... \
  -e ASC_KEY_ID=... \
  -e ASC_PRIVATE_KEY_PATH=~/.appstore/AuthKey_XXXXXXXXXX.p8 \
  -- npx -y @akoskomuves/appstoreconnect-mcp

Configure

Generate an App Store Connect API key at App Store Connect → Users and Access → Integrations → Keys. Pricing writes need the Admin role; read-only operations work with App Manager.

The .p8 file is a private key — never commit it. Recommended: ~/.appstore/AuthKey_XXXXXXXXXX.p8 outside any repo.

Optional: In-App Purchase signing key

Only needed for the ascsign tools (subscription offer redemption signing). Issue a second key at App Store Connect → Users and Access → Integrations → In-App Purchase — this is a separate key from the ASC API key above, generated on a different tab of the same page.

The server starts fine without these — only the ascsign tools refuse with a setup message if they're missing. Set one or two but not all three and the server rejects with a clear error. Run appstoreconnect-mcp doctor to verify the key loads as a valid ES256 PKCS#8.

Optional: vendor number (sales + finance reports)

Shortened. The full README is on GitHub.

Nothing above is checked by us. What we check is on the safety report.

Install directly

Runs npx -y @akoskomuves/appstoreconnect-mcp on your machine. Read the scan report first; the gateway never runs local packages.

claude mcp add appstoreconnect-mcp -- npx -y @akoskomuves/appstoreconnect-mcp
Add to Cursor

Appstoreconnect: common questions

Is Appstoreconnect MCP server safe?
Yes, by our scan: it is graded A (92/100). Read the Appstoreconnect safety report
How do I install Appstoreconnect?
It runs on your machine. Copy the Claude Code, Claude Desktop or Cursor config from the install section.
Does Appstoreconnect need an API key?
No secret keys are declared. It reads 4 settings from the environment.
Is Appstoreconnect maintained?
The last commit was 11 days ago (2026-09-16). The latest release is v1.0.1.
What can I use instead of Appstoreconnect?
Servers from other publishers that do the same job: Storelift MCP server, Shopify Multi Store MCP server and NinjaOne MCP server. Compare all Appstoreconnect alternatives.

Alternatives to Appstoreconnect

Same job from other publishers: the closest match first, then the best rated.

All Appstoreconnect alternatives →
  • Storelift
    App Store & Google Play keyword ranks, rivals, reviews, charts and AI visibility as an MCP server
    A
  • Shopify Multi Store
    Connect AI agents to multiple Shopify Admin stores for reports, comparisons, and guarded updates.
    A
  • NinjaOne MCP
    Every NinjaOne report, plus a local store that answers fleet-wide questions no single API call can
    B
  • Apify
    Extract data from any website with thousands of scrapers, crawlers, and automations on Apify Store ⚡
    A
  • Heimdall
    Every App Store Connect + StoreKit 2 endpoint. 890 tools in 13 profiles, narrow to 27.
    B

More from akoskomuves →