app-publish-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| APPLE_KEY_ID | Yes | Apple App Store Connect API Key ID | |
| APPLE_P8_PATH | Yes | Local file path to the Apple App Store Connect .p8 private key file | |
| APPLE_ISSUER_ID | Yes | Apple App Store Connect Issuer ID | |
| GOOGLE_SERVICE_ACCOUNT_PATH | Yes | Local file path to the Google Play Service Account JSON key file |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| prompts | {
"listChanged": true
} |
| resources | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| apple_get_asset_libraryC | Get the reusable App Asset Library for an app before uploading screenshots, previews, or creative assets |
| apple_get_asset_specsB | Read Apple’s current asset specifications, placement types, device groups, and limits; use the returned IDs instead of hard-coded device sizes |
| apple_list_assetsA | List all image or video assets in an App Asset Library, following every page; use this to reuse files and find interrupted uploads |
| apple_get_assetC | Read an image or video asset’s processing state, matched specId, and delivery errors without exposing presigned upload URLs |
| apple_wait_for_assetB | Resume waiting for an uploaded asset to become ready; optionally check that Apple matched the intended specification |
| apple_upload_assetA | Upload an image or video once to the App Asset Library, commit uploaded=true, and verify processing against a specId from apple_get_asset_specs. Create placements separately to reuse it across localizations. |
| apple_list_asset_placementsA | List every placement that uses an image or video, including other localizations, before deleting or replacing that asset |
| apple_list_placementsC | List all placements for a localization in display order, including their image/video assets |
| apple_create_placementA | Place a ready library asset on an editable localization using a placement type and group from apple_get_asset_specs. Reuses an existing identical placement. |
| apple_reorder_placementsA | Set the complete display order for one localization and placement group, then read back and verify the order. In-app event localizations are not orderable. |
| apple_delete_placementB | Remove a placement from its localization; the reusable library asset and its other placements remain intact |
| apple_delete_assetA | Delete an unplaced image or video from the library. Refuses to delete if any localization still uses it; delete the intended placements first. |
| apple_list_appsB | List all apps in App Store Connect |
| apple_get_next_pageA | Fetch the next App Store Connect page using the exact links.next URL returned by another Apple list tool |
| apple_get_appB | Get detailed info about an app including latest version state |
| apple_update_appC | Update app-level submission settings: the content-rights declaration and primary locale |
| apple_get_app_infoC | Get app info (categories, age rating, etc) |
| apple_update_categoryA | Update app primary/secondary category |
| apple_list_bundle_idsC | List registered bundle IDs |
| apple_create_bundle_idC | Register a new bundle ID |
| apple_list_versionsC | List all App Store versions for an app |
| apple_create_versionC | Create a new App Store version for submission |
| apple_update_versionC | Update an existing App Store version's version, copyright, or release timing |
| apple_list_version_localizationsB | List all localizations for a version |
| apple_create_version_localizationC | Create a new localization for a version |
| apple_update_version_localizationC | Update localization fields (description, keywords, whatsNew, etc) |
| apple_list_app_info_localizationsA | List app info localizations (app name, subtitle, privacy policy URL) |
| apple_update_app_info_localizationB | Update app name, subtitle, or privacy policy URL for a locale |
| apple_list_screenshot_setsA | Legacy: list screenshot sets for a localization. Apple deprecated this API in 4.5.1; use apple_list_placements for Asset Library media. |
| apple_create_screenshot_setA | Legacy: create a screenshot set for a specific display type. Deprecated by Apple; prefer apple_upload_asset and apple_create_placement. |
| apple_upload_screenshotA | Legacy: upload and commit a screenshot while preserving its ID for recovery. Deprecated by Apple; prefer apple_upload_asset and apple_create_placement. |
| apple_delete_screenshotA | Legacy: delete a screenshot from the deprecated screenshot-set API. Use apple_delete_placement and apple_delete_asset for Asset Library media. |
| apple_list_buildsC | List builds uploaded to App Store Connect |
| apple_get_build_uploadA | Get the current state of a Build Uploads API operation, including the imported build when available |
| apple_delete_build_uploadA | Explicitly discard an AWAITING_UPLOAD or FAILED Build Upload after checking it with apple_get_build_upload; do not use for PROCESSING or COMPLETE uploads |
| apple_wait_for_build_uploadB | Wait until a Build Uploads API operation completes or fails, returning the imported build relationship on success |
| apple_upload_buildA | Upload a signed IPA through the App Store Connect Build Uploads API: verify its SHA-256 locally, reserve the upload and file, send every presigned range, commit its MD5 transfer checksum, and optionally wait for import |
| apple_set_build_encryptionA | Set a processed build's usesNonExemptEncryption answer before submission; true may also require an app encryption declaration or supporting export-compliance documentation |
| apple_assign_buildC | Assign a build to an App Store version |
| apple_get_age_ratingB | Get age rating declaration for an app info |
| apple_update_age_ratingC | Update the current App Store age-rating questionnaire. Prefer NONE, INFREQUENT, or FREQUENT for frequency fields; legacy values remain accepted by Apple for compatibility. |
| apple_update_review_detailC | Update app review info (contact info, notes, demo account for reviewer) |
| apple_submit_for_reviewB | Create or resume an App Store review submission, attach the version idempotently, and submit it while preserving the submission ID for safe recovery |
| apple_cancel_submissionA | Cancel an in-review submission (if still possible). Operates on the reviewSubmissions resource created by apple_submit_for_review — sets attributes.canceled=true via PATCH. The legacy appStoreVersionSubmissions DELETE endpoint only applied to submissions created through the retired create-submission flow and does not accept reviewSubmissions IDs. |
| apple_release_versionA | Irreversibly request release of an approved version that is in PENDING_DEVELOPER_RELEASE |
| apple_get_phased_releaseA | Get phased-release status and progress for an App Store version |
| apple_create_phased_releaseB | Enable a seven-day phased release for an app update; phased release is unavailable for an app's first version |
| apple_update_phased_releaseA | Pause, resume, or complete an existing phased release; COMPLETE immediately releases the update to all users |
| apple_delete_phased_releaseA | Cancel a phased release configuration before the phased release has started |
| apple_get_pricingB | Get the app price schedule plus complete, fully paginated manual and automatic price collections |
| apple_list_app_price_pointsA | List current App Price Points for an app in a base territory; use an ID from this response with apple_set_price |
| apple_set_priceA | Replace the complete manual app price schedule. Call apple_get_pricing first and include every current and future manual price entry that must be preserved. |
| apple_list_availabilityC | List current App Availability and all related territory availability records |
| apple_create_availabilityA | Create initial app availability with explicit territory settings; use available=true and preOrderEnabled=false for a normal release |
| apple_update_territory_availabilityA | Change availability, release date, or pre-order state for one existing territory availability record returned by apple_list_availability |
| apple_list_reviewsC | List customer reviews for an app |
| apple_respond_to_reviewC | Respond to a customer review |
| apple_list_bundle_id_capabilitiesB | List capabilities for a bundle ID |
| apple_enable_capabilityC | Enable a capability on a bundle ID |
| apple_disable_capabilityC | Disable a capability on a bundle ID |
| apple_list_certificatesC | List certificates |
| apple_create_certificateC | Create a certificate |
| apple_revoke_certificateC | Revoke a certificate |
| apple_list_profilesC | List provisioning profiles |
| apple_create_profileC | Create a provisioning profile |
| apple_delete_profileB | Delete a provisioning profile |
| apple_list_devicesC | List registered devices |
| apple_register_deviceB | Register a new device |
| apple_update_deviceC | Update device name or status |
| apple_list_beta_groupsC | List beta groups |
| apple_create_beta_groupC | Create a beta group |
| apple_delete_beta_groupB | Delete a beta group |
| apple_add_beta_testers_to_groupC | Add beta testers to a group |
| apple_remove_beta_testers_from_groupB | Remove beta testers from a group |
| apple_list_beta_testersC | List beta testers |
| apple_invite_beta_testerC | Invite a beta tester |
| apple_delete_beta_testerC | Delete a beta tester |
| apple_list_iapA | List in-app purchases for an app |
| apple_create_iapC | Create an in-app purchase |
| apple_get_iapC | Get in-app purchase details |
| apple_delete_iapC | Delete an in-app purchase |
| apple_list_subscription_groupsC | List subscription groups for an app |
| apple_create_subscription_groupC | Create a subscription group |
| apple_delete_subscription_groupC | Delete a subscription group |
| apple_list_accessibility_declarationsB | List accessibility nutrition label declarations for an app, one per device family |
| apple_create_accessibility_declarationC | Create an accessibility nutrition label declaration for an app on a specific device family (Accessibility Nutrition Labels) |
| apple_update_accessibility_declarationC | Update an existing accessibility nutrition label declaration |
| apple_delete_accessibility_declarationC | Delete an accessibility nutrition label declaration |
| apple_get_subscription_price_pointsA | List available price points for a subscription, per territory. Use the returned IDs (with a territory ID) to build the prices for apple_create_subscription_offer_code. |
| apple_get_iap_price_pointsA | List available price points for an in-app purchase, per territory. Use the returned IDs (with a territory ID) to build the prices for apple_create_iap_offer_code. |
| apple_list_subscription_offer_codesB | List custom/one-time-use offer codes configured for a subscription |
| apple_get_subscription_offer_codeC | Get details of a subscription offer code |
| apple_create_subscription_offer_codeA | Create a subscription offer code (custom or one-time-use codes distributed outside the App Store). Requires per-territory prices — look them up first with apple_get_subscription_price_points. |
| apple_list_iap_offer_codesB | List custom/one-time-use offer codes configured for an in-app purchase |
| apple_get_iap_offer_codeC | Get details of an in-app purchase offer code |
| apple_create_iap_offer_codeA | Create an offer code for a consumable/non-consumable/non-renewing-subscription in-app purchase. Requires per-territory prices — look them up first with apple_get_iap_price_points. |
| apple_list_win_back_offersA | List win-back offers configured for a subscription (offers to bring back churned/expired subscribers) |
| apple_get_win_back_offerC | Get details of a win-back offer |
| apple_list_custom_product_pagesB | List custom product pages for an app, with their versions (state, deep link) and the page URL to use in ad campaigns |
| apple_get_custom_product_pageC | Get a custom product page with its versions |
| apple_create_custom_product_pageA | Create a custom product page with its first version and localizations in one request. Optionally copy screenshots and text from an App Store version or another custom page. Add visuals afterwards with the Asset Library placement tools. |
| apple_update_custom_product_pageB | Rename a custom product page or switch its visibility (a hidden page stops serving its URL) |
| apple_delete_custom_product_pageB | Delete a custom product page; its URL stops working in campaigns |
| apple_list_custom_product_page_versionsC | List versions of a custom product page |
| apple_create_custom_product_page_versionC | Start a new editable version of an approved custom product page |
| apple_update_custom_product_page_versionB | Change the deep link of an editable custom product page version |
| apple_list_custom_product_page_localizationsA | List localizations of a custom product page version; their IDs are the targets for apple_create_placement |
| apple_create_custom_product_page_localizationB | Add a locale to an editable custom product page version |
| apple_update_custom_product_page_localizationC | Change the promotional text of a custom product page localization |
| apple_delete_custom_product_page_localizationC | Remove a locale from an editable custom product page version |
| apple_list_experimentsB | List product page optimization tests (A/B tests of icon, screenshots and visuals) for an app, with state and dates |
| apple_get_experimentC | Get a product page optimization test with its treatments |
| apple_create_experimentC | Create a product page optimization test. trafficProportion is the percentage of visitors sent to the treatments (split evenly); the rest see the original page. |
| apple_update_experimentA | Rename a test, change its traffic share, or start it (started=true). New visuals in a test go through App Review before it runs. |
| apple_delete_experimentB | Delete a product page optimization test that has not run |
| apple_list_experiment_treatmentsC | List the treatments (variants) of a product page optimization test |
| apple_create_experiment_treatmentC | Add a treatment (variant) to a test. appIconName selects an alternate icon shipped in the binary. |
| apple_update_experiment_treatmentC | Rename a treatment or change its alternate icon |
| apple_delete_experiment_treatmentB | Delete a treatment from a test that has not started |
| apple_list_treatment_localizationsB | List localizations of a treatment; their IDs are the targets for apple_create_placement |
| apple_create_treatment_localizationC | Add a locale to a treatment so it can get its own screenshots and visuals |
| apple_delete_treatment_localizationC | Remove a locale from a treatment |
| apple_get_sales_reportA | Download a Sales and Trends report (units, installs, proceeds by territory/device) as rows. Needs the vendor number; data for a day usually appears the next day. reportSubType and version must suit the reportType (SALES uses SUMMARY); Apple names the accepted values in its error. |
| apple_get_finance_reportC | Download a monthly financial report (earnings by region) as rows |
| apple_list_analytics_report_requestsB | List App Analytics report requests for an app. Apple generates analytics reports only after a request exists. |
| apple_create_analytics_report_requestA | Ask Apple to start generating App Analytics reports (impressions, product page views, downloads, sessions, retention). ONGOING keeps producing daily data; the first reports take 1-2 days. Only one request per access type is allowed. |
| apple_list_analytics_reportsC | List the reports available for an analytics report request, e.g. "App Store Discovery and Engagement" or "App Downloads" |
| apple_list_analytics_report_instancesC | List generated instances (one per processing date) of an analytics report |
| apple_download_analytics_reportC | Download every segment of an analytics report instance, decompress and merge them into rows |
| apple_list_analytics_report_segmentsA | List the segment files of an analytics report instance (size and checksum, without download URLs) |
| apple_list_review_submissionsB | List review submissions for an app and platform, including drafts to resume after an interrupted request |
| apple_get_review_submissionB | Inspect a review submission and all item IDs before adding an asset/custom page/test or explicitly submitting it |
| apple_create_review_submissionA | Create an empty review draft; does not submit it. For asset-only, custom product page or product page optimization review. Existing drafts must be explicitly resumed, not replaced. |
| apple_add_review_submission_itemA | Attach an Asset Library image/video, custom product page version, v2 experiment or app version to a draft, without submitting. For an initial app release include the app version; assigned assets are reviewed with their owning item. Retries reconcile an already attached item. |
| apple_submit_review_submissionA | Submit an inspected review draft containing assets, custom pages or experiments. itemIds must exactly match all review item IDs returned by apple_get_review_submission, to avoid submitting unexpected items. This starts App Review; saving or attaching an item does not. |
| google_create_editA | Create a new edit session. Required before making any changes to a Google Play listing. |
| google_get_editB | Get an edit session, including its ID and expiry time, before resuming pending work |
| google_commit_editA | Commit all pending changes. By default, fail safely instead of canceling changes that are already in review. |
| google_validate_editA | Validate an edit session without committing. Useful to check for errors before commit. |
| google_delete_editB | Discard an edit session without committing changes |
| google_get_detailsA | Get app details (default language, contact email/phone/website) |
| google_update_detailsB | Update app details (default language, contact email/phone/website) |
| google_list_listingsA | List all store listings (all languages) for an app |
| google_get_listingB | Get store listing for a specific language |
| google_update_listingC | Update store listing for a specific language (title, descriptions, promo video) |
| google_delete_listingB | Delete a store listing for a specific language |
| google_get_country_availabilityB | Get country availability for a specific track |
| google_get_testersC | Get tester configuration for a track |
| google_update_testersC | Update tester Google Groups for a track |
| google_list_imagesC | List uploaded images of a specific type |
| google_upload_imageB | Upload an image (screenshot, icon, feature graphic, etc) |
| google_delete_imageB | Delete a specific uploaded image |
| google_delete_all_imagesB | Delete all images of a specific type for a language |
| google_list_tracksA | List all release tracks, including custom closed-test and form-factor tracks |
| google_get_trackC | Get details of a specific release track |
| google_create_releaseB | Create or update one release with an explicit version-code set. Google Play retains fallback releases; send only the desired change. |
| google_promote_releaseB | Promote a release from one track to another (e.g. beta → production) |
| google_halt_releaseA | Halt an exact in-progress or completed release; halting a completed production release rolls users back to the previous completed release |
| google_list_release_statusesA | List non-obsolete releases and their review/publishing lifecycle states for a track after an edit is committed |
| google_list_bundlesA | List Android App Bundles already available in an edit, including version codes and hashes |
| google_upload_bundleB | Upload an Android App Bundle (.aab) |
| google_list_apksB | List APKs already available in an edit, including version codes and hashes |
| google_upload_apkC | Upload an APK file |
| google_update_data_safetyA | Submit a user-reviewed Data Safety declaration from an up-to-date Google Play CSV export. Google does not provide a corresponding read endpoint. |
| google_list_reviewsA | List production-app reviews with comments created or modified within the last 7 days. Ratings without comments and alpha/beta feedback are excluded. Requires Reply to reviews permission. pageToken pages only within that 7-day window; use Play Console CSV export for older history. An empty result alone does not indicate missing permission. |
| google_get_reviewB | Get a specific review with details |
| google_reply_to_reviewC | Reply to a user review |
| google_list_iapB | List all in-app products (managed products) for an app |
| google_get_iapB | Get details of a specific in-app product |
| google_create_iapC | Create a new in-app product (managed product) |
| google_update_iapB | Update an existing in-app product |
| google_delete_iapB | Delete an in-app product |
| google_list_subscriptionsC | List all subscriptions for an app |
| google_get_subscriptionC | Get details of a specific subscription |
| google_create_subscriptionA | Create a new subscription on Google Play (monetization API). Pass the full subscription body — including listings and at least one base plan with billing details and per-region pricing. Base plans are created in DRAFT state; call google_activate_subscription_base_plan to make them purchasable. |
| google_activate_subscription_base_planA | Activate a subscription base plan so it becomes purchasable. Base plans default to DRAFT after creation; this is required to make them ACTIVE. |
| google_deactivate_subscription_base_planA | Deactivate a base plan for new subscribers while existing subscribers retain their subscription. Use this instead of the unsupported subscription archive operation. |
| google_list_one_time_productsC | List all one-time products (non-subscription purchases, buy or rent) for an app |
| google_get_one_time_productB | Get details of a specific one-time product |
| google_create_one_time_productA | Create a new one-time product (buy or rent) on Google Play. Inspect the returned purchase-option state and call google_activate_purchase_option when it is DRAFT. |
| google_update_one_time_productB | Update an existing one-time product. Pass the full desired listings/purchaseOptions state plus an updateMask (e.g. "listings,purchaseOptions"). |
| google_delete_one_time_productC | Delete a one-time product |
| google_activate_purchase_optionB | Activate a one-time product purchase option so it becomes available for purchase |
| google_deactivate_purchase_optionB | Deactivate a one-time product purchase option so it stops being available for purchase |
| google_query_vitalsA | Query Android vitals (crash, ANR, slow start, slow rendering, wakeups, wakelocks, LMK, memory, error counts) by day, optionally split by versionCode, countryCode, deviceModel or apiLevel. Defaults to the last 28 days that Google has data for. Rates are returned exactly as the API reports them. Google judges its bad-behavior thresholds on the user-perceived 28-day rates, which the crash and ANR defaults include. |
| google_list_vitals_anomaliesC | List anomalies Google detected in Android vitals (sudden crash/ANR spikes) with the affected metric and dimensions |
| google_search_vitals_error_issuesA | Search crash and ANR clusters (error issues) with counts, affected versions, cause and location, most frequent first. Read the stack trace with google_search_vitals_error_reports. |
| google_search_vitals_error_reportsA | Fetch individual crash/ANR reports with the full stack trace (reportText), device and app version. Filter by issue with errorIssueId from google_search_vitals_error_issues. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| app_release_checklist | Guided checklist for releasing an app update on iOS and/or Android, from signed artifact upload through review and release status. |
| app_store_optimization | App Store Optimization (ASO) review — analyzes current listing metadata and provides actionable improvement recommendations for both iOS and Android. |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| config | Current server configuration — shows which platform accounts (Apple / Google) are connected and their auth method. |
| supported-platforms | List of all supported tools grouped by platform and category with their descriptions. |
TDQS
Scored across 188 tools
Platform prefixes and detailed descriptions separate most Apple vs Google and resource/action pairs. However, the set contains confusing overlaps: deprecated screenshot tools alongside the Asset Library/placement tools, and two Apple review-submission paths (`apple_submit_for_review` vs. `apple_create_review_submission` + `apple_add_review_submission_item` + `apple_submit_review_submission`). These overlaps make misselection plausible without careful reading.
Tool names consistently follow a platform-prefixed snake_case verb_noun pattern (`apple_list_*`, `google_create_*`, etc.), including wait/search/query variants. The minor legacy exceptions still fit the same predictable convention.
188 tools is far beyond a manageable set for an MCP server, even for a broad app-publishing domain. This harms discoverability and tool selection; the rubric treats 50+ tools as an extreme mismatch.
The surface covers app metadata, versions/builds/uploads, assets/placements, pricing/availability, IAP/subscriptions/offer codes, reviews, beta testing, analytics/finance, certificates/profiles/devices, and Google edit/release/vitals workflows. Some lifecycle gaps remain, such as Apple IAP update and subscription-group get/update, but core workflows are well covered.