pabal-web-mcp 1.3.8 → 1.3.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2596,6 +2596,10 @@ var keywordResearchTool = {
2596
2596
 
2597
2597
  **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.
2598
2598
 
2599
+ **Locale coverage:** If the product ships multiple locales, run this tool SEPARATELY for EVERY locale (including non-primary markets). Do NOT rely on "template-only" coverage for secondary locales\u2014produce a full keyword research file per locale.
2600
+
2601
+ **Platform coverage:** Use search-app results to confirm supported platforms/locales (App Store + Google Play). Run this tool for EVERY supported platform/locale combination\u2014ios + android runs are separate.
2602
+
2599
2603
  Run this before improve-public. It gives a concrete MCP-powered research plan and a storage path under .aso/keywordResearch/products/[slug]/locales/[locale]/. Optionally writes a template or saves raw JSON from mcp-appstore tools.`,
2600
2604
  inputSchema: inputSchema7
2601
2605
  };
@@ -2728,8 +2732,16 @@ async function handleKeywordResearch(input) {
2728
2732
  const registeredApp = registeredApps.length > 0 ? registeredApps[0] : void 0;
2729
2733
  const { config, locales } = loadProductLocales(slug);
2730
2734
  const primaryLocale = resolvePrimaryLocale(config, locales);
2735
+ const productLocales = Object.keys(locales);
2736
+ const remainingLocales = productLocales.filter((loc) => loc !== locale);
2731
2737
  const primaryLocaleData = locales[primaryLocale];
2732
2738
  const { supportedLocales, path: supportedPath } = getSupportedLocalesForSlug(slug, platform);
2739
+ const appStoreLocales = registeredApp?.appStore?.supportedLocales || [];
2740
+ const googlePlayLocales = registeredApp?.googlePlay?.supportedLocales || [];
2741
+ const declaredPlatforms = [
2742
+ registeredApp?.appStore ? "ios" : null,
2743
+ registeredApp?.googlePlay ? "android" : null
2744
+ ].filter(Boolean);
2733
2745
  const autoSeeds = [];
2734
2746
  const autoCompetitors = [];
2735
2747
  if (primaryLocaleData?.aso?.title) {
@@ -2840,6 +2852,17 @@ Context around ${pos}: ${context}`
2840
2852
  lines.push(`# Keyword research plan (${slug})`);
2841
2853
  lines.push(`Locale: ${locale} | Platform: ${platform} | Country: ${resolvedCountry}`);
2842
2854
  lines.push(`Primary locale detected: ${primaryLocale}`);
2855
+ if (declaredPlatforms.length > 0) {
2856
+ lines.push(`Supported platforms (search-app): ${declaredPlatforms.join(", ")}`);
2857
+ } else {
2858
+ lines.push("Supported platforms (search-app): none detected\u2014update registered-apps.json");
2859
+ }
2860
+ if (appStoreLocales.length > 0) {
2861
+ lines.push(`Declared App Store locales: ${appStoreLocales.join(", ")}`);
2862
+ }
2863
+ if (googlePlayLocales.length > 0) {
2864
+ lines.push(`Declared Google Play locales: ${googlePlayLocales.join(", ")}`);
2865
+ }
2843
2866
  if (supportedLocales.length > 0) {
2844
2867
  lines.push(
2845
2868
  `Registered supported locales (${platform}): ${supportedLocales.join(
@@ -2856,6 +2879,24 @@ Context around ${pos}: ${context}`
2856
2879
  `Registered supported locales not found for ${platform} (checked: ${supportedPath}).`
2857
2880
  );
2858
2881
  }
2882
+ if (productLocales.length > 0) {
2883
+ lines.push(
2884
+ `Existing product locales (${productLocales.length}): ${productLocales.join(", ")}`
2885
+ );
2886
+ lines.push(
2887
+ "MANDATORY: Run FULL keyword research (mcp-appstore workflow) for EVERY locale above\u2014no template-only coverage for secondary markets."
2888
+ );
2889
+ if (remainingLocales.length > 0) {
2890
+ lines.push(
2891
+ `After finishing ${locale}, immediately queue runs for: ${remainingLocales.join(", ")}`
2892
+ );
2893
+ }
2894
+ if (declaredPlatforms.length > 1) {
2895
+ lines.push(
2896
+ "Also run separate FULL keyword research for each supported platform (e.g., ios + android) across all locales."
2897
+ );
2898
+ }
2899
+ }
2859
2900
  lines.push(
2860
2901
  `Seeds: ${resolvedSeeds.length > 0 ? resolvedSeeds.join(", ") : "(none set; add seedKeywords or ensure ASO keywords/title exist)"}`
2861
2902
  );
@@ -2931,9 +2972,14 @@ Context around ${pos}: ${context}`
2931
2972
  lines.push("- [ ] Locale-appropriate (not direct translations)");
2932
2973
  if (fileAction) {
2933
2974
  lines.push(`File: ${fileAction} at ${outputPath}`);
2975
+ if (writeTemplate && !researchData && !researchDataPath) {
2976
+ lines.push(
2977
+ "\u26A0\uFE0F Template is a placeholder\u2014replace with FULL mcp-appstore research results for this locale (no template-only coverage)."
2978
+ );
2979
+ }
2934
2980
  } else {
2935
2981
  lines.push(
2936
- `Tip: set writeTemplate=true to create the JSON skeleton at ${outputPath}`
2982
+ `Tip: set writeTemplate=true to create the JSON skeleton at ${outputPath} (still run full research per locale)`
2937
2983
  );
2938
2984
  }
2939
2985
  lines.push("");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pabal-web-mcp",
3
- "version": "1.3.8",
3
+ "version": "1.3.9",
4
4
  "type": "module",
5
5
  "description": "MCP server for ASO data management with shared types and utilities",
6
6
  "author": "skyu",