Skip to main content
Glama

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

Documentation ķ•œźµ­ģ–“

Installation

npm install pabal-resource-mcp

Requirements: 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

aso-to-public, public-to-aso, improve-public, validate-aso, keyword-research

Apps

init-project, search-app

Screenshots

translate-screenshots, resize-screenshots, phone-to-tablet

App Icon

generate-app-icons

Content

create-blog-html

See documentation for details.

License

MIT


Pabal Web

Pabal Web

Unified ASO + SEO management interface. Visit →

Available Tools

9 tools
aso-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:

  1. Loads ASO data from .aso/pullData/products/[slug]/store/ (path from ~/.config/pabal-mcp/config.json dataDir)

  2. Generates per-locale conversion prompts to map fullDescription into structured locale JSON (template intro/outro + landing features/screenshots captions)

  3. 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:

  1. Read existing blog posts from public/blogs//*/.html (use findExistingBlogPosts utility or read files directly)

  2. Analyze the writing style, tone, and format from 2 existing posts in the same locale

  3. Match that exact writing style when generating the new blog post content and description

  4. Maintain consistency in: paragraph structure, heading usage, tone, formality level, and overall format

IMPORTANT REQUIREMENTS:

  1. 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.).

  2. 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.

  3. The 'description' parameter is REQUIRED. You (the LLM) must generate this based on the topic, locale, AND the writing style of existing blog posts.

  4. 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:

  1. Read existing posts in that locale to understand the writing style

  2. Generate appropriate content in that locale's language

  3. 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:

  1. Read the returned prompt carefully

  2. EXECUTE the optimization instructions (create the optimized JSON)

  3. 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:

  1. Ensure pabal-store-api-mcp 'init' ran and .aso/pullData/products/[slug]/ exists (path from ~/.config/pabal-mcp/config.json dataDir)

  2. Convert pulled ASO data -> public/products/[slug]/ using pabal-resource-mcp tools (aso-to-public, public-to-aso dry run)

  3. 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:

  1. Plan: Call keyword-research(slug, locale, platform) with writeTemplate=false → get research plan

  2. Research: Execute COMPLETE mcp-appstore workflow (all 16 steps) for that locale

  3. Save: Call keyword-research again with researchData or researchDataPath → persist actual data

  4. 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:

  1. Validates the app exists in registered-apps.json

  2. Reads supported locales from public/products/{slug}/locales/ directory

  3. Scans screenshots from the primary locale's screenshots folder

  4. Uses Gemini API (imagen-3.0-generate-002) to translate text in images

  5. 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.png

Inputs: 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:

  1. Loads ASO data from public/products/[slug]/config.json + locales/

  2. Converts to store-compatible format (removes screenshots from metadata, sets contactWebsite/marketingUrl)

  3. Saves metadata to .aso/pushData/products/[slug]/store/ (path from ~/.config/pabal-mcp/config.json dataDir)

  4. Copies/downloads screenshots to .aso/pushData/products/[slug]/store/screenshots/

  5. 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

  1. 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

  2. Keyword Duplicates (App Store only):

    • Checks for duplicate keywords in comma-separated list

  3. 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

    A4.1/5.0

    Scored across 9 tools

    Disambiguation4/5

    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.

    Naming Consistency4/5

    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.

    Tool Count5/5

    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.

    Completeness5/5

    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

    ActivityNo data
    ResponsivenessOutdated data

    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.

      https://mcp.asomobile.net/mcp
    • SEO MCP server for keyword research, live SERPs, backlinks, site audits and AI visibility.

      https://seoclar.com/mcp
    • 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.

      https://mcp.calmseo.com/mcp

    Related MCP Servers

    • A
      license
      A
      quality
      C
      maintenance
      An 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.
      20
      49 npm
      26
      MIT
    • A
      license
      Not graded
      quality
      D
      maintenance
      An 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 npm
      5
      MIT
    • A
      license
      Not graded
      quality
      D
      maintenance
      MCP server for managing App Store Optimization: add apps, track keywords, pull health reports, spy on competitors, find keyword opportunities, and write AI copy suggestions.
      8
      MIT