gp_categories
Retrieve available app categories from Google Play Store to organize and filter app discovery.
Instructions
[Google Play] Get list of available categories
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Implementation Reference
- src/server.js:867-895 (handler)Main handler function for 'gp_categories' tool. Fetches the Google Play apps page using buildCategoriesUrl, parses categories with parseCategories, and returns JSON with categories list and count.async function handleGPCategories(args) { try { const url = buildCategoriesUrl(); const html = await fetchText(url); const categories = parseCategories(html); return { content: [ { type: 'text', text: JSON.stringify({ categories, count: categories.length, }, null, 2), }, ], }; } catch (error) { return { content: [ { type: 'text', text: JSON.stringify({ error: error.message }, null, 2), }, ], isError: true, }; } }
- src/server.js:1405-1411 (schema)Tool schema definition in the list of tools, specifying name, description, and empty input schema (no parameters required).name: 'gp_categories', description: '[Google Play] Get list of available categories', inputSchema: { type: 'object', properties: {}, }, },
- src/server.js:1482-1483 (registration)Dispatch registration in the CallToolRequestSchema switch statement that maps 'gp_categories' tool calls to the handleGPCategories handler.case 'gp_categories': return await handleGPCategories(args);
- Helper function that parses HTML from Google Play to extract category IDs using regex on links and scripts, with fallback to a hardcoded list of common categories.export function parseCategories(html) { if (!html || typeof html !== 'string') { return []; } const categories = []; try { // Google Play categories are in navigation/dropdown menus // Look for category links const categoryLinkMatches = html.matchAll(/<a[^>]*href=["'][^"']*\/store\/apps\/category\/([^/"']+)["'][^>]*>/gi); for (const match of categoryLinkMatches) { const category = match[1]; if (category && !categories.includes(category)) { categories.push(category); } } // Also try extracting from script tags with category data const scriptMatches = html.matchAll(/<script[^>]*>([\s\S]*?)<\/script>/gi); for (const match of scriptMatches) { const scriptContent = match[1]; if (scriptContent.includes('category') || scriptContent.includes('CATEGORY')) { try { // Try to find category arrays const categoryArrayMatch = scriptContent.match(/categories["']?\s*:\s*\[([\s\S]*?)\]/i); if (categoryArrayMatch) { const categoryData = categoryArrayMatch[1]; const categoryMatches = categoryData.matchAll(/"([^"]+)"/g); for (const catMatch of categoryMatches) { const category = catMatch[1]; if (category && !categories.includes(category)) { categories.push(category); } } } } catch (e) { // Continue } } } // If no categories found, return common ones if (categories.length === 0) { return [ 'APPLICATION', 'GAME', 'ART_AND_DESIGN', 'AUTO_AND_VEHICLES', 'BEAUTY', 'BOOKS_AND_REFERENCE', 'BUSINESS', 'COMICS', 'COMMUNICATION', 'DATING', 'EDUCATION', 'ENTERTAINMENT', 'EVENTS', 'FINANCE', 'FOOD_AND_DRINK', 'HEALTH_AND_FITNESS', 'HOUSE_AND_HOME', 'LIBRARIES_AND_DEMO', 'LIFESTYLE', 'MAPS_AND_NAVIGATION', 'MEDICAL', 'MUSIC_AND_AUDIO', 'NEWS_AND_MAGAZINES', 'PARENTING', 'PERSONALIZATION', 'PHOTOGRAPHY', 'PRODUCTIVITY', 'SHOPPING', 'SOCIAL', 'SPORTS', 'TOOLS', 'TRAVEL_AND_LOCAL', 'VIDEO_PLAYERS', 'WEATHER', ]; } return categories.sort(); } catch (error) { console.error('Error parsing Google Play categories:', error); return []; } }
- src/endpoints/googlePlay.js:180-182 (helper)Helper function that builds the URL for the Google Play apps store page to scrape categories from.export function buildCategoriesUrl() { return `${GOOGLE_PLAY_BASE}/store/apps`; }