{"name":"io.github.akoskomuves/appstoreconnect-mcp","slug":"akoskomuves-appstoreconnect-mcp","title":null,"description":"App Store Connect for MCP clients: PPP pricing, subscriptions, TestFlight, reviews, reports & more","url":"https://mcp.market/server/akoskomuves-appstoreconnect-mcp","rating":null,"grade":"A","score":92,"certified":false,"status":"active","category":"ecommerce","tags":["ecommerce"],"presence":{"score":39,"stars":5,"forks":2,"downloads_week":1740,"last_push_at":"2026-09-16T16:06:40.000Z","license":"MIT"},"uptime":null,"claimed":false,"transport":"npm","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/akoskomuves/appstoreconnect-mcp","website":null,"version":"1.0.1","remotes":[],"packages":[{"registryType":"npm","identifier":"@akoskomuves/appstoreconnect-mcp","version":"1.0.1","transport":{"type":"stdio"},"environmentVariables":[{"description":"App Store Connect API issuer UUID (Users and Access > Integrations > Keys).","isRequired":true,"name":"ASC_ISSUER_ID"},{"description":"10-character App Store Connect API key ID.","isRequired":true,"name":"ASC_KEY_ID"},{"description":"Path to the downloaded .p8 private key file (~ is expanded).","isRequired":true,"name":"ASC_PRIVATE_KEY_PATH"},{"description":"Optional. Account-level vendor number for the sales/finance report tools.","name":"ASC_VENDOR_NUMBER"}]}],"tools":[{"name":"asc_add_beta_group_testers","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asc_delete_accessibility_declaration","description":"DELETE /v1/accessibilityDeclarations/{id} — remove a DRAFT declaration. Published declarations are superseded by publishing a new draft (REPLACED), not deleted.","write_action":true,"price_micros":0,"input_schema":null},{"name":"asc_delete_alternative_distribution_domain","description":"⚠️ DELETE /v1/alternativeDistributionDomains/{id} — apps distributed from this domain stop being installable from it. Confirm intent first.","write_action":true,"price_micros":0,"input_schema":null},{"name":"asc_delete_alternative_distribution_key","description":"⚠️ DELETE /v1/alternativeDistributionKeys/{id} — artifacts signed against this key stop validating. Confirm intent first.","write_action":true,"price_micros":0,"input_schema":null},{"name":"asc_delete_analytics_report_request","description":"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).","write_action":true,"price_micros":0,"input_schema":null},{"name":"asc_delete_app_event","description":"DELETE an AppEvent. Removes the event + every localization + every asset. Apple may refuse if the event is PUBLISHED or IN_REVIEW.","write_action":true,"price_micros":0,"input_schema":null},{"name":"asc_delete_app_event_localization","description":"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.","write_action":true,"price_micros":0,"input_schema":null},{"name":"asc_delete_app_event_screenshot","description":"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.","write_action":true,"price_micros":0,"input_schema":null},{"name":"asc_delete_app_event_video_clip","description":"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.","write_action":true,"price_micros":0,"input_schema":null},{"name":"asc_delete_app_info_localization","description":"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.","write_action":true,"price_micros":0,"input_schema":null},{"name":"asc_delete_app_store_version","description":"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).","write_action":true,"price_micros":0,"input_schema":null},{"name":"asc_delete_app_store_version_localization","description":"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).","write_action":true,"price_micros":0,"input_schema":null},{"name":"asc_delete_beta_feedback_crash_submission","description":"DELETE /v1/betaFeedbackCrashSubmissions/{id}. Permanently removes the crash feedback record (including its crash log) from App Store Connect. Irreversible; the tester is not notified.","write_action":true,"price_micros":0,"input_schema":null},{"name":"asc_delete_beta_feedback_screenshot_submission","description":"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.","write_action":true,"price_micros":0,"input_schema":null},{"name":"asc_delete_beta_group","description":"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.","write_action":true,"price_micros":0,"input_schema":null},{"name":"asc_delete_marketplace_search_detail","description":"DELETE /v1/marketplaceSearchDetails/{id}.","write_action":true,"price_micros":0,"input_schema":null},{"name":"asc_delete_marketplace_webhook","description":"DELETE /v1/marketplaceWebhooks/{id} — stop marketplace update notifications.","write_action":true,"price_micros":0,"input_schema":null},{"name":"asc_download_analytics_report_segment","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asc_end_app_availability_pre_order","description":"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).","write_action":true,"price_micros":0,"input_schema":null},{"name":"asc_get_app","description":"Fetch a single app by its App Store Connect ID.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asc_get_app_alternative_distribution_key","description":"GET /v1/apps/{id}/alternativeDistributionKey — the app's registered public key (to-one).","write_action":false,"price_micros":0,"input_schema":null},{"name":"asc_get_app_availability_v2","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asc_get_app_event","description":"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).","write_action":false,"price_micros":0,"input_schema":null},{"name":"asc_get_app_event_localization","description":"Fetch a single AppEventLocalization by ID. Returns the locale + name + shortDescription + longDescription + the relationship IDs for any attached event screenshots and video clips.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asc_get_app_event_screenshot","description":"Fetch a single AppEventScreenshot by ID. Returns fileName / fileSize / appEventAssetType / assetDeliveryState / the imageAsset URLs once processed / the uploadOperations[] before commit.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asc_get_app_event_video_clip","description":"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`.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asc_get_app_info","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asc_get_app_info_localization","description":"Fetch a single AppInfoLocalization by ID. Returns the full name + subtitle + privacy URLs/text for the locale.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asc_get_app_store_version","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asc_get_app_store_version_localization","description":"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).","write_action":false,"price_micros":0,"input_schema":null},{"name":"asc_get_beta_feedback_crash_log","description":"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","write_action":false,"price_micros":0,"input_schema":null},{"name":"asc_get_beta_feedback_crash_submission","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asc_get_beta_feedback_screenshot_submission","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asc_get_beta_group","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asc_get_marketplace_search_detail","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asc_get_version_alternative_distribution_package","description":"GET /v1/appStoreVersions/{id}/alternativeDistributionPackage — the to-one package record for a version (or an error when none was created).","write_action":false,"price_micros":0,"input_schema":null},{"name":"asc_list_accessibility_declarations","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asc_list_alternative_distribution_domains","description":"GET /v1/alternativeDistributionDomains — team-level registered website domains for EU web distribution. Entitlement-gated (403 = account not enrolled).","write_action":false,"price_micros":0,"input_schema":null},{"name":"asc_list_alternative_distribution_keys","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asc_list_alternative_distribution_package_deltas","description":"GET /v1/alternativeDistributionPackageVersions/{id}/deltas — update deltas (smaller downloads from prior versions) with pre-signed URLs. Raw JSON (URLs verbatim).","write_action":false,"price_micros":0,"input_schema":null},{"name":"asc_list_alternative_distribution_package_variants","description":"GET /v1/alternativeDistributionPackageVersions/{id}/variants — per-device-thinning variants with pre-signed download URLs + key blobs. Raw JSON (URLs verbatim).","write_action":false,"price_micros":0,"input_schema":null},{"name":"asc_list_alternative_distribution_package_versions","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asc_list_analytics_report_instances","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asc_list_analytics_report_requests","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asc_list_analytics_report_segments","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asc_list_analytics_reports","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asc_list_app_categories","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asc_list_app_event_localizations","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asc_list_app_event_screenshots","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asc_list_app_event_video_clips","description":"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).","write_action":false,"price_micros":0,"input_schema":null},{"name":"asc_list_app_events","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asc_list_app_info_localizations","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asc_list_app_infos","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asc_list_app_price_points","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asc_list_app_prices","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asc_list_app_store_version_localizations","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asc_list_app_store_versions","description":"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","write_action":false,"price_micros":0,"input_schema":null},{"name":"asc_list_app_tags","description":"List the AppTag membership for an app — Apple's structured-ASO tag surface. Each row shows the tag name and isVisibleInAppStore flag.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asc_list_apps","description":"List apps on the App Store Connect account. Returns a compact table by default; pass raw:true to get the full JSON:API response.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asc_list_beta_feedback_crash_submissions","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asc_list_beta_feedback_screenshot_submissions","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asc_list_beta_groups","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asc_list_marketplace_webhooks","description":"GET /v1/marketplaceWebhooks — team-level webhooks Apple uses to notify a MARKETPLACE app about available app updates. Secret is write-only and never shown.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asc_list_search_keywords","description":"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).","write_action":false,"price_micros":0,"input_schema":null},{"name":"asc_list_territory_availabilities","description":"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 ","write_action":false,"price_micros":0,"input_schema":null},{"name":"asc_patch_accessibility_declaration","description":"⚠️ 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","write_action":true,"price_micros":0,"input_schema":null},{"name":"asc_patch_app_event","description":"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.","write_action":true,"price_micros":0,"input_schema":null},{"name":"asc_patch_app_event_localization","description":"Update name / shortDescription / longDescription on an existing AppEventLocalization. Locale is immutable (excluded from UpdateRequest). All three attrs are encodeIfPresent. Tool refuses empty PATCH.","write_action":true,"price_micros":0,"input_schema":null},{"name":"asc_patch_app_event_screenshot","description":"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.","write_action":true,"price_micros":0,"input_schema":null},{"name":"asc_patch_app_event_video_clip","description":"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.","write_action":true,"price_micros":0,"input_schema":null},{"name":"asc_patch_app_info","description":"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.","write_action":true,"price_micros":0,"input_schema":null},{"name":"asc_patch_app_info_localization","description":"Update name / subtitle / privacy fields on an existing AppInfoLocalization. All five attrs are encodeIfPresent (only what you pass is sent). Locale is immutable.","write_action":true,"price_micros":0,"input_schema":null},{"name":"asc_patch_app_store_version","description":"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`.","write_action":true,"price_micros":0,"input_schema":null},{"name":"asc_patch_app_store_version_localization","description":"Update attrs on an existing AppStoreVersionLocalization.","write_action":true,"price_micros":0,"input_schema":null},{"name":"asc_patch_app_tag","description":"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.","write_action":true,"price_micros":0,"input_schema":null},{"name":"asc_patch_beta_group","description":"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.","write_action":true,"price_micros":0,"input_schema":null},{"name":"asc_patch_marketplace_search_detail","description":"PATCH /v1/marketplaceSearchDetails/{id} — update the catalogUrl.","write_action":true,"price_micros":0,"input_schema":null},{"name":"asc_patch_marketplace_webhook","description":"PATCH /v1/marketplaceWebhooks/{id} — update endpointUrl and/or rotate the secret (update the receiver first). Pass at least one.","write_action":true,"price_micros":0,"input_schema":null},{"name":"asc_patch_territory_availability","description":"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","write_action":true,"price_micros":0,"input_schema":null},{"name":"asc_post_accessibility_declaration","description":"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.","write_action":true,"price_micros":0,"input_schema":null},{"name":"asc_post_alternative_distribution_domain","description":"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.","write_action":true,"price_micros":0,"input_schema":null},{"name":"asc_post_alternative_distribution_key","description":"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.","write_action":true,"price_micros":0,"input_schema":null},{"name":"asc_post_alternative_distribution_package","description":"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.","write_action":true,"price_micros":0,"input_schema":null},{"name":"asc_post_analytics_report_request","description":"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 ","write_action":true,"price_micros":0,"input_schema":null},{"name":"asc_post_app_availability_v2","description":"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","write_action":true,"price_micros":0,"input_schema":null},{"name":"asc_post_app_event","description":"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.","write_action":true,"price_micros":0,"input_schema":null},{"name":"asc_post_app_event_localization","description":"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).","write_action":true,"price_micros":0,"input_schema":null},{"name":"asc_post_app_event_screenshot","description":"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","write_action":true,"price_micros":0,"input_schema":null},{"name":"asc_post_app_event_video_clip","description":"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.","write_action":true,"price_micros":0,"input_schema":null},{"name":"asc_post_app_info_localization","description":"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).","write_action":true,"price_micros":0,"input_schema":null},{"name":"asc_post_app_price_schedule","description":"Replace the price schedule for a paid app.","write_action":true,"price_micros":0,"input_schema":null},{"name":"asc_post_app_store_version","description":"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 ","write_action":true,"price_micros":0,"input_schema":null},{"name":"asc_post_app_store_version_localization","description":"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","write_action":true,"price_micros":0,"input_schema":null},{"name":"asc_post_beta_group","description":"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.","write_action":true,"price_micros":0,"input_schema":null},{"name":"asc_post_marketplace_search_detail","description":"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.","write_action":true,"price_micros":0,"input_schema":null},{"name":"asc_post_marketplace_webhook","description":"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).","write_action":true,"price_micros":0,"input_schema":null},{"name":"asc_remove_beta_group_testers","description":"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.","write_action":true,"price_micros":0,"input_schema":null},{"name":"asc_upload_app_event_screenshot","description":"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","write_action":true,"price_micros":0,"input_schema":null},{"name":"asc_upload_app_event_video_clip","description":"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","write_action":true,"price_micros":0,"input_schema":null},{"name":"asc_upload_asset_chunk","description":"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","write_action":true,"price_micros":0,"input_schema":null}],"scan":{"score":92,"grade":"A","scanned_at":"2026-09-26T21:22:54.506Z","report":{"scannerVersion":"0.1.9","scannedAt":"2026-09-26T21:22:54.516Z","components":{"code":{"score":25,"max":25,"notes":["116 source files scanned"]},"reliability":{"score":-1,"max":20,"notes":["no gateway calls yet and no remote to probe"]},"poisoning":{"score":-1,"max":15,"notes":["tools not inspected (local package is not executed); not counted"]},"auth":{"score":12,"max":15,"notes":["local package, no credentials required"]},"maintenance":{"score":15,"max":15,"notes":["last push 10 days ago"]},"identity":{"score":8,"max":10,"notes":["registry namespace matches repository owner","GitHub account older than a year"]}},"findings":[],"inputs":{"packages":[{"registryType":"npm","identifier":"@akoskomuves/appstoreconnect-mcp","version":"1.0.1","found":true,"license":"MIT","hasInstallScripts":false,"dependencyCount":6,"publishedAt":"2026-06-17T15:01:09.001Z","repositoryUrl":"git+https://github.com/akoskomuves/appstoreconnect-mcp.git","weeklyDownloads":1740}],"repo":{"found":true,"owner":"akoskomuves","repo":"appstoreconnect-mcp","archived":false,"pushedAt":"2026-09-16T16:06:40Z","stars":5,"forks":2,"openIssues":0,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/6740477?v=4","ownerCreatedAt":"2014-02-20T18:11:56Z","license":"MIT"},"icon":{"url":"https://avatars.githubusercontent.com/u/6740477?v=4&s=128","source":"github"},"presence":{"stars":5,"forks":2,"downloadsWeek":1740,"license":"MIT","lastPushAt":"2026-09-16T16:06:40.000Z","score":39}}}},"grade_history":[],"reviews":[]}