Atlas / MCP servers / mikusnuz / App Publish

App PublishSAFE

mcp/mikusnuz/app-publish

Unified MCP server for App Store Connect & Google Play Console — 91 tools for listings, screenshots, releases, reviews & submissions

Verdict
SAFE
Grade
B
Trust score
89 /100
Exposed tools
146 68r · 59w · 19d
Transport
stdio
License
MIT
Stars
35
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

English | 한국어 | 中文 | 日本語

[](https://www.npmjs.com/package/app-publish-mcp)

A unified MCP (Model Context Protocol) server for App Store Connect and Google Play Console. Manage app listings, screenshots, releases, reviews and submissions — all from your AI assistant.

Publishing Boundary

You provide a release-ready, correctly signed Android .aab / .apk or Apple .ipa. The MCP handles supported store-side work from upload through metadata, testing, review submission, and release. It does not compile the app, own signing keys, or replace Xcode, Gradle, or CI.

The first release of a new app still requires manual setup in App Store Connect or Play Console, including developer enrollment, agreements, app records where required, API access, signing, tax and banking details, and policy, privacy, or content declarations. For an existing, fully configured Android app, a signed AAB is usually enough to let the MCP run the update workflow. A Google edit commit only commits the requested changes; store review, managed publishing, or a staged rollout can delay public availability.

When to Use

Use this MCP when you need to:

  • "Update my app's App Store description and keywords" — modify version localizations, app info localizations
  • "Upload new screenshots for iPhone 16 Pro" — upload to the Asset Library and place images on the version localization
  • "Submit a new version for review" — create version, assign build, set review info, submit
  • "Check the status of my app review" — list versions and check review state
  • "Respond to a user review on Google Play" — list reviews and reply
  • "Create a phased release on Google Play" — create edit, create release on a track, commit
  • "Manage TestFlight beta testers" — create groups, invite testers, manage access
  • **"Set up
Read from source at commit 22a036ab3010OBSERVED · 2026-10-09
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.

claude-code (npm)
claude mcp add app-publish-mcp --env APPLE_KEY_ID=${APPLE_KEY_ID} --env APPLE_ISSUER_ID=${APPLE_ISSUER_ID} --env GOOGLE_CLIENT_SECRET=${GOOGLE_CLIENT_SECRET} --env GOOGLE_REFRESH_TOKEN=${GOOGLE_REFRESH_TOKEN} -- npx -y [email protected]
03

Exposed tools (146)

68 read · 59 write · 19 destructive. Blast radius: 19 tools can delete or overwrite — an agent that can be talked into calling a tool can be talked into calling this one.

ToolRiskDescription
apple_add_beta_testers_to_groupwriteAdd beta testers to a group
apple_assign_buildreadAssign a build to an App Store version
apple_create_accessibility_declarationwriteCreate an accessibility nutrition label declaration for an app on a specific device family (Accessibility Nutrition Labels)
apple_create_availabilitywriteCreate initial app availability with explicit territory settings; use available=true and preOrderEnabled=false for a normal release
apple_create_beta_groupwriteCreate a beta group
apple_create_bundle_idwriteRegister a new bundle ID
apple_create_certificatewriteCreate a certificate
apple_create_iapwriteCreate an in-app purchase
apple_create_iap_offer_codewriteCreate 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_create_phased_releasewriteEnable a seven-day phased release for an app update; phased release is unavailable for an app\
apple_create_placementwritePlace 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_create_profilewriteCreate a provisioning profile
apple_create_screenshot_setwriteLegacy: create a screenshot set for a specific display type. Deprecated by Apple; prefer apple_upload_asset and apple_create_placement.
apple_create_subscription_groupwriteCreate a subscription group
apple_create_subscription_offer_codewriteCreate 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_create_versionwriteCreate a new App Store version for submission
apple_create_version_localizationwriteCreate a new localization for a version
apple_delete_accessibility_declarationdestructiveDelete an accessibility nutrition label declaration
apple_delete_assetdestructiveDelete an unplaced image or video from the library. Refuses to delete if any localization still uses it; delete the intended placements first.
apple_delete_beta_groupdestructiveDelete a beta group
apple_delete_beta_testerdestructiveDelete a beta tester
apple_delete_build_uploaddestructiveExplicitly 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_delete_iapdestructiveDelete an in-app purchase
apple_delete_phased_releasedestructiveCancel a phased release configuration before the phased release has started
apple_delete_placementdestructiveRemove a placement from its localization; the reusable library asset and its other placements remain intact
apple_delete_profiledestructiveDelete a provisioning profile
apple_delete_screenshotdestructiveLegacy: delete a screenshot from the deprecated screenshot-set API. Use apple_delete_placement and apple_delete_asset for Asset Library media.
apple_delete_subscription_groupdestructiveDelete a subscription group
apple_disable_capabilitywriteDisable a capability on a bundle ID
apple_enable_capabilitywriteEnable a capability on a bundle ID
apple_get_age_ratingreadGet age rating declaration for an app info
apple_get_appreadGet detailed info about an app including latest version state
apple_get_app_inforeadGet app info (categories, age rating, etc)
apple_get_assetreadRead an image or video asset’s processing state, matched specId, and delivery errors without exposing presigned upload URLs
apple_get_asset_libraryreadGet the reusable App Asset Library for an app before uploading screenshots, previews, or creative assets
apple_get_asset_specsreadRead Apple’s current asset specifications, placement types, device groups, and limits; use the returned IDs instead of hard-coded device sizes
apple_get_build_uploadwriteGet the current state of a Build Uploads API operation, including the imported build when available
apple_get_iapreadGet in-app purchase details
apple_get_iap_offer_codereadGet details of an in-app purchase offer code
apple_get_iap_price_pointsreadList 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_get_next_pagereadFetch the next App Store Connect page using the exact links.next URL returned by another Apple list tool
apple_get_phased_releasereadGet phased-release status and progress for an App Store version
apple_get_pricingwriteGet the app price schedule plus complete, fully paginated manual and automatic price collections
apple_get_subscription_offer_codereadGet details of a subscription offer code
apple_get_subscription_price_pointsreadList 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_win_back_offerreadGet details of a win-back offer
apple_invite_beta_testerreadInvite a beta tester
apple_list_accessibility_declarationsreadList accessibility nutrition label declarations for an app, one per device family
apple_list_app_info_localizationsreadList app info localizations (app name, subtitle, privacy policy URL)
apple_list_app_price_pointsreadList current App Price Points for an app in a base territory; use an ID from this response with apple_set_price
apple_list_appsreadList all apps in App Store Connect
apple_list_asset_placementsreadList every placement that uses an image or video, including other localizations, before deleting or replacing that asset
apple_list_assetsreadList all image or video assets in an App Asset Library, following every page; use this to reuse files and find interrupted uploads
apple_list_availabilityreadList current App Availability and all related territory availability records
apple_list_beta_groupsreadList beta groups
apple_list_beta_testersreadList beta testers
apple_list_buildsreadList builds uploaded to App Store Connect
apple_list_bundle_id_capabilitiesreadList capabilities for a bundle ID
apple_list_bundle_idsreadList registered bundle IDs
apple_list_certificatesreadList certificates
apple_list_devicesreadList registered devices
apple_list_iapreadList in-app purchases for an app
apple_list_iap_offer_codesreadList custom/one-time-use offer codes configured for an in-app purchase
apple_list_placementswriteList all placements for a localization in display order, including their image/video assets
apple_list_profilesreadList provisioning profiles
apple_list_reviewsreadList customer reviews for an app
apple_list_screenshot_setsreadLegacy: list screenshot sets for a localization. Apple deprecated this API in 4.5.1; use apple_list_placements for Asset Library media.
apple_list_subscription_groupsreadList subscription groups for an app
apple_list_subscription_offer_codesreadList custom/one-time-use offer codes configured for a subscription
apple_list_version_localizationsreadList all localizations for a version
apple_list_versionsreadList all App Store versions for an app
apple_list_win_back_offersreadList win-back offers configured for a subscription (offers to bring back churned/expired subscribers)
apple_register_devicereadRegister a new device
apple_release_versionreadIrreversibly request release of an approved version that is in PENDING_DEVELOPER_RELEASE
apple_remove_beta_testers_from_groupdestructiveRemove beta testers from a group
apple_reorder_placementswriteSet 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_respond_to_reviewreadRespond to a customer review
apple_revoke_certificatedestructiveRevoke a certificate
apple_set_build_encryptionwriteSet a processed build\
apple_set_pricewriteReplace 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_submit_for_reviewwriteCreate or resume an App Store review submission, attach the version idempotently, and submit it while preserving the submission ID for safe recovery
apple_update_accessibility_declarationwriteUpdate an existing accessibility nutrition label declaration
apple_update_age_ratingwriteUpdate 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_appwriteUpdate app-level submission settings: the content-rights declaration and primary locale
apple_update_app_info_localizationwriteUpdate app name, subtitle, or privacy policy URL for a locale
apple_update_categorywriteUpdate app primary/secondary category
apple_update_devicewriteUpdate device name or status
apple_update_phased_releasewritePause, resume, or complete an existing phased release; COMPLETE immediately releases the update to all users
apple_update_review_detailwriteUpdate app review info (contact info, notes, demo account for reviewer)
apple_update_territory_availabilitywriteChange availability, release date, or pre-order state for one existing territory availability record returned by apple_list_availability
apple_update_versionwriteUpdate an existing App Store version\
apple_update_version_localizationwriteUpdate localization fields (description, keywords, whatsNew, etc)
apple_upload_assetwriteUpload 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_upload_buildwriteUpload a signed IPA through the App Store Connect Build Uploads API: reserve the upload and file, send every presigned range, commit its SHA-256 checksum, and optionally wait for import
apple_upload_screenshotwriteLegacy: upload and commit a screenshot while preserving its ID for recovery. Deprecated by Apple; prefer apple_upload_asset and apple_create_placement.
apple_wait_for_assetreadResume waiting for an uploaded asset to become ready; optionally check that Apple matched the intended specification
apple_wait_for_build_uploadwriteWait until a Build Uploads API operation completes or fails, returning the imported build relationship on success
google_activate_purchase_optionreadActivate a one-time product purchase option so it becomes available for purchase
google_activate_subscription_base_planreadActivate a subscription base plan so it becomes purchasable. Base plans default to DRAFT after creation; this is required to make them ACTIVE.
google_commit_editwriteCommit all pending changes. By default, fail safely instead of canceling changes that are already in review.
google_create_editwriteCreate a new edit session. Required before making any changes to a Google Play listing.
google_create_iapwriteCreate a new in-app product (managed product)
google_create_one_time_productwriteCreate 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_create_releasewriteCreate or update one release with an explicit version-code set. Google Play retains fallback releases; send only the desired change.
google_create_subscriptionwriteCreate 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_deactivate_purchase_optionreadDeactivate a one-time product purchase option so it stops being available for purchase
google_deactivate_subscription_base_planreadDeactivate a base plan for new subscribers while existing subscribers retain their subscription. Use this instead of the unsupported subscription archive operation.
google_delete_all_imagesdestructiveDelete all images of a specific type for a language
google_delete_editdestructiveDiscard an edit session without committing changes
google_delete_iapdestructiveDelete an in-app product
google_delete_imagedestructiveDelete a specific uploaded image
google_delete_listingdestructiveDelete a store listing for a specific language
google_delete_one_time_productdestructiveDelete a one-time product
google_get_country_availabilityreadGet country availability for a specific track
google_get_detailsreadGet app details (default language, contact email/phone/website)
google_get_editwriteGet an edit session, including its ID and expiry time, before resuming pending work
google_get_iapreadGet details of a specific in-app product
google_get_listingreadGet store listing for a specific language
google_get_one_time_productreadGet details of a specific one-time product
google_get_reviewreadGet a specific review with details
google_get_subscriptionreadGet details of a specific subscription
google_get_testersreadGet tester configuration for a track
google_get_trackreadGet details of a specific release track
google_halt_releasereadHalt an exact in-progress or completed release; halting a completed production release rolls users back to the previous completed release
google_list_apkswriteList APKs already available in an edit, including version codes and hashes
google_list_bundleswriteList Android App Bundles already available in an edit, including version codes and hashes
google_list_iapreadList all in-app products (managed products) for an app
google_list_imagesreadList uploaded images of a specific type
google_list_listingsreadList all store listings (all languages) for an app
google_list_one_time_productsreadList all one-time products (non-subscription purchases, buy or rent) for an app
google_list_release_statusesreadList non-obsolete releases and their review/publishing lifecycle states for a track after an edit is committed
google_list_reviewsreadList user reviews for an app. Note: the Play Developer API reviews.list endpoint only surfaces recent reviews and requires the
google_list_subscriptionsreadList all subscriptions for an app
google_list_tracksreadList all release tracks, including custom closed-test and form-factor tracks
google_promote_releasereadPromote a release from one track to another (e.g. beta → production)
google_reply_to_reviewreadReply to a user review
google_update_data_safetywriteSubmit a user-reviewed Data Safety declaration from an up-to-date Google Play CSV export. Google does not provide a corresponding read endpoint.
google_update_detailswriteUpdate app details (default language, contact email/phone/website)
google_update_iapwriteUpdate an existing in-app product
google_update_listingwriteUpdate store listing for a specific language (title, descriptions, promo video)
google_update_one_time_productwriteUpdate an existing one-time product. Pass the full desired listings/purchaseOptions state plus an updateMask (e.g.
google_update_testerswriteUpdate tester Google Groups for a track
google_upload_apkwriteUpload an APK file
google_upload_bundlewriteUpload an Android App Bundle (.aab)
google_upload_imagewriteUpload an image (screenshot, icon, feature graphic, etc)
google_validate_editwriteValidate an edit session without committing. Useful to check for errors before commit.
04

Trust audit

SAFEgrade B · trust 89/100 Nothing in the source contradicts what it says it does. Grade A is reserved for packages that have also passed the behavioural sandbox.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codePASS
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfaceWARN
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (1 observation(s))
Network
declared (3 observation(s))
Shell
none-observed
Dependencies
not all pinned
Secrets in source
none-found

Findings (4)

MEDIUMFilesystem / path · mcp.destructive_tools · CWE-22, CWE-59
apple_delete_accessibility_declaration, apple_delete_asset, apple_delete_beta_group, apple_delete_beta_tester, apple_delete_build_upload, apple_delete_iap, apple_delete_phased_release, apple_delete_pl
Why it matters. 19 tool(s) can delete or overwrite
Fix. prefer a read-only mode or scoped tokens; the page states the blast radius
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
src/apple/tools.ts:662
const sourceFileChecksum = createHash('md5')
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
tests/apple-release.test.ts:1361
const checksum = createHash('md5').update(bytes).digest('hex');
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
package.json
@modelcontextprotocol/sdk, google-auth-library, googleapis, jsonwebtoken, zod, @types/jsonwebtoken, @types/node, tsx
Why it matters. 9 dependency range(s) float
Fix. pin exact versions or ship a lockfile

Gates applied: no_behavioural_pass.

Audited 2026-10-09 · audit v0.4.1 · source sha 22a036ab3010full audit observations/trust-audit/mcp-server/mikusnuz__app-publish.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-0922a036ab3010SAFEB89first audit
06

Questions

What is the App Publish MCP server?

Unified MCP server for App Store Connect & Google Play Console — 91 tools for listings, screenshots, releases, reviews & submissions

What tools does App Publish expose?

146 in total: 68 read-only, 59 that write, and 19 that can delete or overwrite (apple_delete_accessibility_declaration, apple_delete_asset, apple_delete_beta_group, apple_delete_beta_tester, apple_delete_build_upload). Every one is listed on this page with its risk.

Is App Publish safe to connect to an agent?

The audit found nothing in the source that contradicts what it says it does, and graded it B (89/100). Grade A is held back for packages that have also passed a sandboxed behavioural run, which is why a clean server reads B. Separately from the audit: 19 of its tools can destroy data, so scope the token you give it to what you actually need.

What credentials does App Publish need?

It reads APPLE_ISSUER_ID, APPLE_KEY_ID, APPLE_KEY_TYPE, GOOGLE_CLIENT_SECRET and GOOGLE_REFRESH_TOKEN from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How does App Publish run?

It speaks stdio, so it runs as a local process your client starts. It is published on npm as app-publish-mcp at 0.6.0.

How current is this page?

The grade is for one exact copy of the source (22a036ab3010), read on 2026-10-09. The repository is watched and re-audited when it changes.

Advertisement