npx skills add ...
npx skills add rorkai/app-store-connect-cli-skills --skill asc-aso-audit
Run an offline ASO audit on canonical App Store metadata under `./metadata` and surface keyword gaps using Astro MCP. Use after pulling metadata with `asc metadata pull`.
npx skills add rorkai/app-store-connect-cli-skills --skill asc-aso-audit
Run a two-phase ASO audit: offline checks against local metadata files, then keyword gap analysis via Astro MCP. When available, include Apple-generated app tags as a discoverability signal.
asc metadata pull --app "APP_ID" --version "1.2.3" --dir "./metadata".asc migrate export or asc localizations download, normalize it into the canonical ./metadata layout before running this skill.asc app-tags list --app "APP_ID" --output json works when the API returns tags for the app.references/aso_rules.md to understand the rules each check enforces.metadata/version/ (highest semantic version number). Use this for all version-level fields.en-US unless the user specifies otherwise.subtitle): metadata/app-info/{locale}.jsonkeywords, description, whatsNew): metadata/version/{latest-version}/{locale}.jsonname is missing from the app-info JSON, fetch it via asc apps info list or ask the user. Do not flag it as a missing-field error.Run these 5 checks against the local metadata directory. No network calls required.
Tokenize the subtitle field (and name if available). Flag any token that also appears in the keywords field — it is already indexed and wastes keyword budget.
How to check:
metadata/app-info/{locale}.json for subtitle (and name if present)metadata/version/{latest-version}/{locale}.json for keywords、 , , or iterate characters — each character or character-group is a token. Whitespace tokenization does not work for CJK.App tags are Apple-generated labels that can appear in search results and product pages. They are not editable ASO metadata, but they are useful evidence for whether Apple's classification matches the intended positioning.
Use tags as context only:
When both App Store Connect and Apple Ads credentials are configured, use the experimental, read-only plan to join the selected metadata with official paid search evidence:
asc auth and Apple Ads separately with
asc ads auth login; the two credential sets are independent.Flag fields using less than their recommended minimum:
| Field | Minimum | Limit | Rationale |
|---|---|---|---|
| Keywords | 90 chars | 100 | 90%+ usage maximizes indexing |
| Subtitle | 20 chars | 30 | 65%+ usage recommended |
Flag empty or missing required fields: subtitle, keywords, description, whatsNew.
Note: name may not be in the export — only flag it if the app-info JSON explicitly contains a name key with an empty value.
Check the keywords field for formatting issues:
quran, recitation)quran;recitation)quran|recitation)Compare keywords fields across all available locales. Flag locales where keywords are identical to the primary locale (en-US by default) — this usually means they were not localized.
How to check:
Check whether keywords appear naturally in the description field. While Apple does not index descriptions for search, users who see their search terms reflected in the description are more likely to download — this improves conversion rate, which indirectly boosts rankings.
How to check:
keywords and description for each localeIf Astro MCP is available and the app is tracked, run keyword gap analysis. Run this per store/locale, not just for the US store — keyword popularity varies dramatically across markets.
Get current keywords: Call get_app_keywords with the app ID to retrieve tracked keywords and their current rankings.
Check multi-store tracking: Query existing tracking for each locale's App Store territory. Report untracked stores as unavailable and continue the audit. Use add_keywords only when the user separately authorizes tracking setup; empty rankings for an untracked store do not prove poor performance.
Extract competitor keywords: Call extract_competitors_keywords with 3-5 top competitor app IDs to find keyword gaps. This is the highest-value Astro tool — it reveals keywords competitors rank for that you don't. Run this per store when possible.
Get suggestions: Call get_keyword_suggestions with the app ID for additional recommendations based on category analysis.
Check current rankings: Call search_rankings to see where the app currently ranks for tracked keywords in each store.
Diff against metadata: Compare suggested and competitor keywords against the tokens present in subtitle, name (if available), and keywords fields from the local metadata.
Surface gaps: Report all gaps ranked by popularity score (highest first). Include the source (competitor analysis vs. suggestion).
When recommending keyword additions, consider how single words combine across indexed fields (title + subtitle + keywords). For example:
Flag high-value combos in recommendations.
mcp__astro__add_app for gap analysis"Present results as a single audit report. The report covers only the latest version directory.
asc metadata pull to ensure canonical metadata files are current.asc metadata keywords diff --app "APP_ID" --version "1.2.3" --dir "./metadata"asc metadata keywords apply --app "APP_ID" --version "1.2.3" --dir "./metadata" --confirmasc metadata keywords sync --app "APP_ID" --version "1.2.3" --dir "./metadata" --input "./keywords.csv" when importing external keyword researchasc optimize search plan \
--app "APP_ID" \
--version "1.2.3" \
--ad-account "AD_ACCOUNT_ID" \
--country "US" \
--genre "PRODUCTIVITY_UTILITIES" \
--locale "en-US" \
--out-dir ".asc/optimization/1.2.3" \
--output markdownSeverity: ⚠️ Warning
Example: keywords is 62/100 characters (62%) — 38 characters of indexing opportunity unusedSeverity: ❌ Error
Example: subtitle is empty for locale en-USSeverity: ❌ Error
Example: keywords contain spaces after commas — wastes 3 charactersSeverity: ⚠️ Warning
Example: ar keywords identical to en-US — likely not localized for Arabic marketSeverity: 💡 Info
Example: 3 of 16 keywords not found in description: namaz, tarteel, adhan### ASO Audit Report
**App:** [name] | **Primary Locale:** [locale]
**Metadata source:** [path including version number]
#### Field Utilization
| Field | Value | Length | Limit | Usage |
|-------|-------|--------|-------|-------|
| Name | ... | X | 30 | X% |
| Subtitle | ... | X | 30 | X% |
| Keywords | ... | X | 100 | X% |
| Promotional Text | ... | X | 170 | X% |
| Description | (first 50 chars)... | X | 4000 | X% |
#### Offline Checks
| # | Check | Severity | Field | Locale | Detail |
|---|-------|----------|-------|--------|--------|
| 1 | Keyword waste | ⚠️ | keywords | en-US | "quran" duplicated in subtitle |
**Summary:** X errors, Y warnings across Z locales
#### Keyword Gap Analysis (Astro MCP)
| Keyword | Popularity | In Metadata? | Suggested Action |
|---------|-----------|--------------|-----------------|
| quran recitation | 72 | ❌ | Add to keywords |
#### Recommendations
1. [Highest priority action — errors first]
2. [Next priority — keyword waste]
3. [Utilization improvements]
4. [Keyword gap opportunities]