pabal-web-mcp
The pabal-web-mcp server bridges ASO (App Store Optimization) and Web SEO data, enabling you to build and manage synced websites from App Store Connect and Google Play Console data.
ASO ā Web Conversion
Convert raw ASO pull data into structured public website format (locale JSONs, landing features, screenshot captions)
Prepare structured public data back into store-push-ready format with field length validation
ASO Optimization & Validation
AI-driven ASO optimization using saved keyword research data across primary and secondary locales (2-stage workflow)
Validate ASO metadata against App Store / Google Play field limits, detect duplicate keywords and invalid characters, with optional auto-fix
Keyword Research
Plan, execute, and persist keyword research per locale and platform (iOS/Android), storing results for use in optimization
Screenshot Localization & Processing
Translate app screenshot text into multiple languages using the Gemini API, with dimension validation
Resize and adapt screenshots for different device types (phone/tablet)
Content Creation
Generate static HTML blog posts with metadata, matching existing writing style, supporting multiple locales and app/developer categories
App Icon Generation
Generate app icon assets in required sizes
App & Project Management
Search registered apps by slug, bundleId, packageName, or name
Guide the full project initialization flow from ASO pull data to public product structure
Allows syncing and converting App Store Connect data for web SEO, including tools for keyword research and ASO (App Store Optimization) data management.
Enables the conversion of Google Play Console data for web SEO purposes, supporting the creation of synced websites and ASO data management.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@pabal-web-mcp Convert my App Store metadata into an SEO-optimized blog post"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
pabal-resource-mcp
MCP server for ASO ā Web SEO data conversion.
Build synced websites from App Store Connect and Google Play Console data.
š” Example: labs.quartz.best
Installation
npm install pabal-resource-mcpRequirements: Node.js >= 18, pabal-store-api-mcp
Related MCP server: aso-mcp
MCP Configuration
{
"mcpServers": {
"pabal-resource-mcp": {
"command": "npx",
"args": ["-y", "pabal-resource-mcp"]
}
}
}For keyword research, add mcp-appstore:
{
"mcp-appstore": {
"command": "node",
"args": ["/PATH/TO/external-tools/mcp-appstore/server.js"],
"cwd": "/PATH/TO/external-tools/mcp-appstore"
}
}Configuration
Set dataDir in ~/.config/pabal-mcp/config.json:
{
"dataDir": "/path/to/pabal-web"
}Tools
Category | Tools |
ASO |
|
Apps |
|
Screenshots |
|
App Icon |
|
Content |
|
See documentation for details.
License
MIT
Pabal Web

Unified ASO + SEO management interface. Visit ā
Available Tools
9 toolsaso-to-publicA
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.
Inputs: slug (required).
create-blog-htmlA
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
Inputs: topic (required), locale (required), content (required), description (required), +8 more.
improve-publicA
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 WORKS
This tool returns a PROMPT containing:
Saved keyword research data (Tier 1/2/3 keywords with traffic/difficulty scores)
Current locale data
Optimization instructions
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.
WORKFLOW
Stage 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
STAGES
Stage 1: Primary locale optimization using saved keyword research (ios + android combined)
Stage 2: Localize to other languages - each locale uses its OWN keyword research
KEYWORD 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.
Inputs: slug (required), locale, stage, optimizedPrimary, +2 more.
init-projectA
Guides the initialization flow: run pabal-store-api-mcp Init, then convert ASO pullData into public/products/[slug]/.
This tool is read-only and returns a checklist. It does not call pabal-store-api-mcp directly or write files.
Steps:
Ensure pabal-store-api-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-resource-mcp tools (aso-to-public, public-to-aso dry run)
Validate outputs and next actions
Inputs: slug.
keyword-researchA
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 Plan
MANDATORY 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)
Inputs: slug (required), locale (required), platform, country, +6 more.
localize-screenshotsA
Translate app screenshots to multiple languages using Gemini API.
IMPORTANT: This tool uses the search-app tool internally to validate the app. You can provide an approximate name, bundleId, or packageName.
This tool:
Validates the app exists in registered-apps.json
Reads supported locales from public/products/{slug}/locales/ directory
Scans screenshots from the primary locale's screenshots folder
Uses Gemini API (imagen-3.0-generate-002) to translate text in images
Validates output image dimensions match source and resizes if needed
Requirements:
GEMINI_API_KEY or GOOGLE_API_KEY environment variable must be set
Screenshots must be in: public/products/{slug}/screenshots/{locale}/phone/ and /tablet/
Locale files must exist in: public/products/{slug}/locales/
Example structure:
public/products/my-app/
āāā config.json
āāā locales/
ā āāā en-US.json (primary)
ā āāā ko-KR.json
ā āāā ja-JP.json
āāā screenshots/
āāā en-US/
āāā phone/
ā āāā 1.png
ā āāā 2.png
āāā tablet/
āāā 1.pngInputs: appName (required), targetLocales, deviceTypes, dryRun, +3 more.
public-to-asoA
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.
Inputs: slug (required), dryRun.
search-appB
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
Inputs: query, store.
validate-asoA
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 VALIDATES
Field 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):
Checks for duplicate keywords in comma-separated list
Invalid Characters:
Control characters, BOM, zero-width/invisible characters, variation selectors
WHEN TO USE
After 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
OPTIONS
locale: Validate specific locale only (e.g., "ko-KR")fix: Auto-fix issues where possible (removes invalid characters)
Inputs: slug (required), locale, fix.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelogā¦
TDQS
Scored across 9 tools
Most tools have distinct purposes, but there is some overlap between 'aso-to-public' and 'public-to-aso' as they handle opposite conversion directions, which could cause confusion if not carefully read. Tools like 'improve-public' and 'validate-aso' are clearly different, but the bidirectional conversion tools might be misselected without clear context.
Tool names mostly follow a consistent verb_noun or verb-noun pattern (e.g., 'aso-to-public', 'create-blog-html', 'improve-public'), with minor deviations like 'search-app' (verb_noun) and 'init-project' (verb-noun). The naming is readable and predictable, though not perfectly uniform.
With 9 tools, the count is well-scoped for the domain of ASO (App Store Optimization) and content management. Each tool serves a specific function in the workflow, from data conversion to validation, without being overly sparse or bloated.
The tool set provides comprehensive coverage for ASO workflows, including data initialization, conversion, optimization, validation, and localization. It supports full lifecycle management from pulling data to preparing for store uploads, with no obvious gaps that would hinder an agent.
Maintenance
Related MCP Connectors
ASOMobile MCP server: App Store Optimization data for the iOS App Store and Google Play inside AI agents. 29 tools: keyword research (traffic, competition, suggestions), app keyword indexing, competitors and keyword gaps, top charts and chart history, reviews with rating summaries, Apple Search Ads insights, organic download estimates and Keyword Monitor rank tracking, plus six ASO skills (app audit, keyword research, competitor audit, localization check, review analysis, ASA planning). Remote streamable HTTP with OAuth 2.1 (DCR + PKCE); sign in with your ASOMobile account.
SEO MCP server for keyword research, live SERPs, backlinks, site audits and AI visibility.
Your agent needs app-store data ā what an app looks like on the App Store and Google Play, what reviewers say, and what ranks for a search in a given country. **What you can ask for** ⢠"What does this app's store listing look like, and how is it rated?" ⢠"Pull recent reviews for this app and group the complaints." ⢠"What apps rank for this search term in Japan?" ⢠"List the top apps in this category on both stores." ⢠"Compare this app's listing on iOS and Android." **How to use it** Point any MCP client at https://mcp.aisa.one/seo-apps/mcp and sign in with OAuth ā there is no key to create or paste. 37 tools: Apple App Store and Google Play app info, app lists, category listings, reviews and store search results, in live and queued forms, with categories, languages and locations for each. **It is also a door to the rest** The same login reaches 26 sources and 580+ operations. Read the store listing here, then ask the same agent what the app's website ranks for ā without adding a second server. **What it costs** Finding and inspecting an operation is free. Running one is billed per call at API prices, with no seat and no monthly minimum, and every call takes max_price_usd so an agent cannot overspend by accident. **Where else it reaches** https://mcp.aisa.one/seo/mcp for all of it at once ā rankings, keywords, backlinks, site health and AI-answer visibility across DataForSEO, Semrush and Ahrefs.
SEO MCP server for keyword research, SERP analysis, audits, and Search Console workflows.
Related MCP Servers
- AlicenseAqualityCmaintenanceAn MCP server that provides comprehensive market intelligence by analyzing data from both the Apple App Store and Google Play Store, enabling users to research apps, track market trends, study competitors, and understand user feedback across mobile marketplaces.2049 npm26MIT
- AlicenseNot gradedqualityDmaintenanceAn MCP server for App Store Optimization that provides keyword research, competitor analysis, review sentiment, and metadata optimization using real App Store data without requiring an API key.44 npm5MIT
- AlicenseAqualityFmaintenanceAn MCP server that gives AI assistants structured access to App Store Connect data. Built for ASO analysis, download tracking, and performance monitoring.728 npm1MIT
- AlicenseNot gradedqualityDmaintenanceMCP server for managing App Store Optimization: add apps, track keywords, pull health reports, spy on competitors, find keyword opportunities, and write AI copy suggestions.8MIT