| aso-to-public | Converts ASO data from pullData to public/products/[slug]/ structure. IMPORTANT: Always use 'search-app' tool first to resolve the exact slug before calling this tool. The user may provide an approximate name, bundleId, or packageName - search-app will find and return the correct slug. Never pass user input directly as slug. This tool: Loads ASO data from .aso/pullData/products/[slug]/store/ (path from ~/.config/pabal-mcp/config.json dataDir) Generates per-locale conversion prompts to map fullDescription into structured locale JSON (template intro/outro + landing features/screenshots captions) Next steps (manual): paste converted JSON into public/products/[slug]/locales/[locale].json and copy screenshots from .aso/pullData if needed
The conversion from unstructured to structured format is performed by Claude based on the conversion prompt. |
| public-to-aso | Prepares ASO data from public/products/[slug]/ to pushData format. IMPORTANT: Always use 'search-app' tool first to resolve the exact slug before calling this tool. The user may provide an approximate name, bundleId, or packageName - search-app will find and return the correct slug. Never pass user input directly as slug. This tool: Loads ASO data from public/products/[slug]/config.json + locales/ Converts to store-compatible format (removes screenshots from metadata, sets contactWebsite/marketingUrl) Saves metadata to .aso/pushData/products/[slug]/store/ (path from ~/.config/pabal-mcp/config.json dataDir) Copies/downloads screenshots to .aso/pushData/products/[slug]/store/screenshots/ Validates text field lengths against docs/aso/ASO_FIELD_LIMITS.md (fails if over limits)
Before running, review docs/aso/ASO_FIELD_LIMITS.md for per-store limits. This prepares data for pushing to stores without actually uploading. |
| improve-public | Returns ASO optimization instructions with keyword research data. You MUST execute the returned instructions. IMPORTANT: Use 'search-app' tool first to resolve the exact slug. HOW THIS TOOL WORKSThis tool returns a PROMPT containing: YOU MUST: Read the returned prompt carefully EXECUTE the optimization instructions (create the optimized JSON) Save results using 'save-locale-file' tool
DO NOT just report the instructions back to the user - you must perform the optimization yourself. WORKFLOWStage 1: improve-public(slug, stage="1") → Returns keyword data + instructions → You create optimized primary locale JSON → save-locale-file
Stage 2: improve-public(slug, stage="2", optimizedPrimary=) → Returns per-locale instructions → You optimize each locale → save-locale-file for each STAGESKEYWORD SOURCES (Per Locale)Priority 1: Uses each locale's SAVED keyword research from .aso/keywordResearch/products/[slug]/locales/[locale]/ Priority 2 (Fallback): If locale-specific research is missing, falls back to en-US/en keywords and TRANSLATES them iOS and Android research are automatically combined per locale (iOS prioritized)
CRITICAL: Only processes existing locale files. Does NOT create new files. |
| init-project | Guides the initialization flow: run pabal-mcp Init, then convert ASO pullData into public/products/[slug]/. This tool is read-only and returns a checklist. It does not call pabal-mcp directly or write files. Steps: Ensure pabal-mcp 'init' ran and .aso/pullData/products/[slug]/ exists (path from ~/.config/pabal-mcp/config.json dataDir) Convert pulled ASO data -> public/products/[slug]/ using pabal-web-mcp tools (aso-to-public, public-to-aso dry run) Validate outputs and next actions
|
| create-blog-html | Generate HTML blog posts under public/blogs///.html with a BLOG_META block. CRITICAL: WRITING STYLE CONSISTENCY
Before generating content, you MUST: Read existing blog posts from public/blogs//*/.html (use findExistingBlogPosts utility or read files directly) Analyze the writing style, tone, and format from 2 existing posts in the same locale Match that exact writing style when generating the new blog post content and description Maintain consistency in: paragraph structure, heading usage, tone, formality level, and overall format
IMPORTANT REQUIREMENTS: The 'locale' parameter is REQUIRED. If the user does not provide a locale, you MUST ask them to specify which language/locale they want to write the blog in (e.g., 'en-US', 'ko-KR', 'ja-JP', etc.). The 'content' parameter is REQUIRED. You (the LLM) must generate the HTML content based on the 'topic' and 'locale' provided by the user. The content should be written in the language corresponding to the locale AND match the writing style of existing blog posts for that locale. The 'description' parameter is REQUIRED. You (the LLM) must generate this based on the topic, locale, AND the writing style of existing blog posts. The 'appSlug' parameter: If the user explicitly requests "developer category", "developer blog", "personal category", "my category", or similar, you MUST set appSlug to "developer". If the user mentions a specific app/product, use that app's slug. If not specified, defaults to "developer".
Slug rules: slug = slugify(English title, kebab-case ASCII) path: public/blogs///.html appSlug: Use "developer" when user requests developer/personal category. Defaults to "developer" if not specified. coverImage default: /products//og-image.png (relative paths are rewritten under /blogs///) overwrite defaults to false (throws when file exists)
HTML Structure (follows public/en-US.html pattern): BLOG_META block at the top with JSON metadata HTML body content: paragraphs (), headings (, ), images (), lists (, ), horizontal rules (), etc. You must generate the HTML content based on the topic, making it relevant and engaging for the target locale's language, while maintaining consistency with existing blog posts.
Supports multiple locales when locales[] is provided. Each locale gets its own HTML file. For each locale, you must: Read existing posts in that locale to understand the writing style Generate appropriate content in that locale's language Match the writing style and format of existing posts
|
| keyword-research | Prep + persist keyword research ahead of improve-public using mcp-appstore outputs. IMPORTANT: Always use 'search-app' tool first to resolve the exact slug before calling this tool. The user may provide an approximate name, bundleId, or packageName - search-app will find and return the correct slug. Never pass user input directly as slug. CRITICAL: Multi-Locale Execution PlanMANDATORY WORKFLOW - Complete each locale fully before moving to next: For EACH locale+platform combination, execute this cycle: Plan: Call keyword-research(slug, locale, platform) with writeTemplate=false → get research plan Research: Execute COMPLETE mcp-appstore workflow (all 16 steps) for that locale Save: Call keyword-research again with researchData or researchDataPath → persist actual data Next: Move to next locale+platform and repeat steps 1-3
IMPORTANT: Research → Save → Next pattern Complete ONE locale fully (research + save) before starting the next This prevents data loss if the session is interrupted Each locale's data is persisted immediately after research
FORBIDDEN: ❌ Using writeTemplate=true as final output ❌ Skipping secondary locales ❌ Researching multiple locales then saving all at once at the end ❌ Stopping before all locale+platform combinations are done
REQUIRED: ✅ Research locale → Save locale → Move to next (one at a time) ✅ Run for EVERY platform (ios AND android separately) ✅ Use researchData or researchDataPath to save (NOT writeTemplate)
|
| search-app | Search registered apps from registered-apps.json. Called without query: Returns all app list Called with query: Search by slug, bundleId, packageName, name Use store filter to narrow results to appStore or googlePlay only
|
| validate-aso | Validates ASO data against App Store / Google Play field limits and rules. IMPORTANT: Use 'search-app' tool first to resolve the exact slug. WHAT IT VALIDATESField Length Limits (docs/aso/ASO_FIELD_LIMITS.md): App Store: name ≤30, subtitle ≤30, keywords ≤100, description ≤4000 Google Play: title ≤50, shortDescription ≤80, fullDescription ≤4000
Keyword Duplicates (App Store only): Invalid Characters:
WHEN TO USEAfter running improve-public Stage 1/2 to verify optimization results Before running public-to-aso to ensure data is valid Anytime you want to check ASO data validity
OPTIONSlocale: Validate specific locale only (e.g., "ko-KR")
fix: Auto-fix issues where possible (removes invalid characters)
|