Pulling first is what changes the workflow: once the metadata and screenshots for every locale are on disk, rewriting a subtitle across twelve languages is an editing job rather than twelve trips through two web consoles. Use the dry run before every push — it reports exactly what would change without touching the live listing, which matters most on the image upload, the slowest and least reversible part. Register the apps first; the slug is what lets later calls skip bundle ids and package names entirely.
A store-metadata workflow that runs on your own machine. It talks to App Store Connect and Google Play directly with your credentials, keeps the pulled listing data in a local cache, and pushes changes back when you ask.
- Apps registered from the store APIs — the whole App Store account at once, or one app by bundle id or package name, with both stores checked automatically — and the registered set searched afterwards
- ASO data pulled from either store or both: on App Store the name, subtitle, description, keywords, promotional text and screenshots for iPhone 6.5", iPhone 6.1" and iPad 13" across every locale; on Google Play the title, short and full descriptions, phone and tablet screenshots and the feature graphic across every language
- The cache written into a predictable tree per app and store, with screenshots kept per locale, so listing copy can be diffed and reviewed like any other file
- The same data pushed back to the stores, with locale selection, optional image upload, and batching and timeout controls for the image step
- A dry run on both directions, which reports what would happen without saving or publishing
- The latest versions on each store checked, a new version created, and release notes pulled and updated for a version
- An authentication check that reports each store separately, showing the issuer and key it is using rather than a bare success
Credentials for whichever stores you use, in a config file under a directory in your home folder: for App Store Connect an API key .p8 file with its issuerId and keyId, and for Google Play a service account JSON key. The project has you create that directory with restrictive permissions, since the keys sit in it. Install with npm install -g pabal-store-api-mcp and run it over stdio. Registered apps are kept in a local JSON file created by the registration tools and used by everything downstream, which is why most tools accept a registered app slug in place of a bundle id or package name. Everything runs locally — store API calls go straight from your machine, so credentials and cached listing data stay there.
One command plus a key — npx -y pabal-store-api-mcp, then supply credentials
