Hybrid CLI + MCP tool to manage App Store and Play Store listing data.
Project description
perfectdeckcli
perfectdeckcli manages App Store Connect and Google Play listing data from a
single local source of truth.
It supports:
- Command-line operations through
perfectdeckcli - MCP server tools through
perfectdeck-mcp - Structured listing edits through dotted key paths
- Version tracking for language updates and release note workflows
- Regional pricing generation for one-time products
Related docs:
- MCP client setup:
docs/mcp-client-setup.md - Authentication and credential storage:
docs/authentication.md - Regional pricing policy:
docs/pricing-policy.md
Installation
With uv
uv tool install .
In a local checkout
uv venv
uv pip install -e ".[dev]"
Quick start
Initialize a project file:
perfectdeckcli init \
--app prod \
--stores play,app_store \
--locales en-US,fr-FR \
--baseline-locale en-US
Update a localized field:
perfectdeckcli set \
--app prod \
--store play \
--locale fr-FR \
--key title \
--value "Docteur des plantes IA"
Inspect the current locale payload:
perfectdeckcli list --app prod --store play --locale fr-FR
Track translation status:
perfectdeckcli status --app prod --store play
perfectdeckcli mark-language-updated --app prod --store play --locale fr-FR
perfectdeckcli bump-version --app prod --store play --reason "new feature copy update" --source-locale en-US
Data model
The default file is listings.yaml with this shape:
apps:
prod:
play:
global: {}
locales: {}
release_notes: {}
products: {}
subscriptions: {}
app_store:
global: {}
locales: {}
release_notes: {}
products: {}
subscriptions: {}
Authentication
Store credentials are kept in a sibling .listing_credentials.yaml file, which
is intentionally gitignored. The tool can persist credentials per app and store
so you do not need to pass them on every command.
Play Store typically needs:
package_namecredentials_path
App Store Connect typically needs:
app_idkey_idissuer_idprivate_key_path
See docs/authentication.md for the exact fields and storage behavior.
MCP usage
Run the server locally:
perfectdeck-mcp --root-folder .
For multi-project usage, pass project_path in each MCP tool call relative to
--root-folder.
Example:
project_path: "aiplantdoctor"project_path: "perfectdeck/mobile-app"
Primary MCP tools:
perfectdeck_init_listingperfectdeck_sync_listingperfectdeck_diff_listingperfectdeck_init_from_existingperfectdeck_add_languageperfectdeck_list_languagesperfectdeck_get_elementperfectdeck_set_elementperfectdeck_delete_elementperfectdeck_upsert_localeperfectdeck_list_sectionperfectdeck_list_appsperfectdeck_list_storesperfectdeck_set_baseline_languageperfectdeck_bump_versionperfectdeck_mark_language_updatedperfectdeck_get_update_status
Development
Install dev dependencies and run the validation steps used in CI:
uv pip install -e ".[dev]"
pytest
python -m build
See CONTRIBUTING.md for the contribution workflow.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file perfectdeckcli-0.1.0.tar.gz.
File metadata
- Download URL: perfectdeckcli-0.1.0.tar.gz
- Upload date:
- Size: 112.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5b83287f9d0bef66e2298e09f52e43ffad6784f982ce3f07c7fad8c262c11827
|
|
| MD5 |
ad5d945039ea045534599a5af243b2ff
|
|
| BLAKE2b-256 |
25aecfec8bbd18e50c9ab775b77b8e79545bcc9a5504c5040816234719287984
|
Provenance
The following attestation bundles were made for perfectdeckcli-0.1.0.tar.gz:
Publisher:
publish.yml on xjodoin/perfectdeckcli
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
perfectdeckcli-0.1.0.tar.gz -
Subject digest:
5b83287f9d0bef66e2298e09f52e43ffad6784f982ce3f07c7fad8c262c11827 - Sigstore transparency entry: 1209455659
- Sigstore integration time:
-
Permalink:
xjodoin/perfectdeckcli@bac39b5d129b84be36f1e439a3707a1b4d0037ca -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/xjodoin
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@bac39b5d129b84be36f1e439a3707a1b4d0037ca -
Trigger Event:
push
-
Statement type:
File details
Details for the file perfectdeckcli-0.1.0-py3-none-any.whl.
File metadata
- Download URL: perfectdeckcli-0.1.0-py3-none-any.whl
- Upload date:
- Size: 73.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
70e309fb3ef325f183856a6f896db0b9de42e1f157827a34d13c54035328c639
|
|
| MD5 |
a718efc58e358e8d90a0ea40e31b934d
|
|
| BLAKE2b-256 |
fccb65d883a44574bbee9987e8ee43a675f589b554ff3dcd626658bbbc088688
|
Provenance
The following attestation bundles were made for perfectdeckcli-0.1.0-py3-none-any.whl:
Publisher:
publish.yml on xjodoin/perfectdeckcli
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
perfectdeckcli-0.1.0-py3-none-any.whl -
Subject digest:
70e309fb3ef325f183856a6f896db0b9de42e1f157827a34d13c54035328c639 - Sigstore transparency entry: 1209455742
- Sigstore integration time:
-
Permalink:
xjodoin/perfectdeckcli@bac39b5d129b84be36f1e439a3707a1b4d0037ca -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/xjodoin
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@bac39b5d129b84be36f1e439a3707a1b4d0037ca -
Trigger Event:
push
-
Statement type: