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.
- package/dist/bin/mcp-server.js +47 -1
- package/package.json +1 -1
package/dist/bin/mcp-server.js
CHANGED
|
@@ -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("");
|