Skip to main content
Glama

get_developer_info

Retrieve developer metadata and app details from iOS and Android app stores by specifying the developer ID, platform, and optional localization preferences.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
countryNoTwo-letter country code for store localization. Default 'us'.us
developerIdYesThe developer identifier. For Android: the name (e.g., 'Google LLC') or ID ('570031...'). For iOS: the numeric artist ID (e.g., '284882218') or the developer name ('Facebook'). If a name is provided for iOS, the tool will attempt to find the numeric ID.
includeAppsNoWhether to fetch and include details of the developer's apps in the response (up to 100 for Android, potentially more for iOS). Setting to false returns only developer metadata.
langNoLanguage code for results. Default 'en'.en
platformYesThe platform associated with the developer ('ios' or 'android').

Implementation Reference

  • The core handler function for the 'get_developer_info' tool. Fetches developer apps using platform-specific scrapers (gplay.developer for Android, appStore.developer for iOS), resolves developer IDs, aggregates portfolio metrics (installs, ratings), and optionally includes detailed app information.
    async ({ developerId, platform, country, lang, includeApps }) => { try { let developerInfo = { developerId, platform, name: "", website: null, email: null, address: null, privacyPolicy: null, supportContact: null, totalApps: 0, metrics: { totalInstalls: 0, averageRating: 0, totalRatings: 0 }, apps: [] }; if (platform === "android") { // Get developer's apps from Google Play Store const apps = await memoizedGplay.developer({ devId: developerId, country, lang, num: 100 // Get up to 100 apps }); if (apps && apps.length > 0) { // Get full details of the first app to extract developer info const firstApp = await memoizedGplay.app({ appId: apps[0].appId, country, lang }); // Set developer details developerInfo = { ...developerInfo, name: firstApp.developer || developerId, website: firstApp.developerWebsite || null, email: firstApp.developerEmail || null, address: firstApp.developerAddress || null, privacyPolicy: firstApp.privacyPolicy || null, totalApps: apps.length, metrics: { totalInstalls: 0, averageRating: 0, totalRatings: 0 } }; // Calculate metrics across all apps let totalRating = 0; let totalRatings = 0; let totalInstalls = 0; if (includeApps) { // Get full details for all apps const appDetailsPromises = apps.map(app => memoizedGplay.app({ appId: app.appId, country, lang }).catch(err => null) ); const appDetails = await Promise.all(appDetailsPromises); const validAppDetails = appDetails.filter(app => app !== null); validAppDetails.forEach(app => { if (app.score) totalRating += app.score; if (app.ratings) totalRatings += app.ratings; if (app.minInstalls) totalInstalls += app.minInstalls; }); developerInfo.metrics = { totalInstalls, averageRating: totalRating / validAppDetails.length, totalRatings }; // Add normalized app information developerInfo.apps = validAppDetails.map(app => ({ appId: app.appId, title: app.title, icon: app.icon, score: app.score, ratings: app.ratings, installs: app.minInstalls, price: app.price, free: app.free, category: app.genre, url: app.url })); } } } else { // For iOS, first get the numeric developer ID if not provided const isNumericId = /^\d+$/.test(developerId); let numericDevId = developerId; if (!isNumericId) { // Search for an app by this developer to get their numeric ID const searchResults = await memoizedAppStore.search({ term: developerId, num: 1, country }); if (searchResults && searchResults.length > 0) { const firstApp = await memoizedAppStore.app({ appId: searchResults[0].appId, country }); numericDevId = firstApp.developerId; } } // Get developer's apps from App Store const apps = await memoizedAppStore.developer({ devId: numericDevId, country, lang }); if (apps && apps.length > 0) { // Get full details of the first app to extract developer info const firstApp = await memoizedAppStore.app({ id: apps[0].id, country, lang }); // Set developer details developerInfo = { ...developerInfo, name: firstApp.developer || developerId, website: firstApp.developerWebsite || null, totalApps: apps.length, metrics: { totalInstalls: null, // App Store doesn't provide install numbers averageRating: 0, totalRatings: 0 } }; if (includeApps) { // Get full details for all apps const appDetailsPromises = apps.map(app => memoizedAppStore.app({ id: app.id, country, lang, ratings: true }).catch(err => null) ); const appDetails = await Promise.all(appDetailsPromises); const validAppDetails = appDetails.filter(app => app !== null); // Calculate metrics let totalRating = 0; let totalRatings = 0; validAppDetails.forEach(app => { if (app.score) totalRating += app.score; if (app.ratings) totalRatings += app.ratings; }); developerInfo.metrics = { totalInstalls: null, // Not available in App Store averageRating: totalRating / validAppDetails.length, totalRatings }; // Add normalized app information developerInfo.apps = validAppDetails.map(app => ({ appId: app.appId, title: app.title, icon: app.icon, score: app.score, ratings: app.ratings, price: app.price, free: app.free, category: app.primaryGenre, url: app.url })); } } } return { content: [{ type: "text", text: JSON.stringify(developerInfo, null, 2) }] }; } catch (error) { return { content: [{ type: "text", text: JSON.stringify({ error: error.message, developerId, platform }, null, 2) }], isError: true }; } }
  • Input validation schema using Zod for the get_developer_info tool parameters.
    developerId: z.string().describe("The developer identifier. For Android: the name (e.g., 'Google LLC') or ID ('570031...'). For iOS: the numeric artist ID (e.g., '284882218') or the developer name ('Facebook'). If a name is provided for iOS, the tool will attempt to find the numeric ID."), platform: z.enum(["ios", "android"]).describe("The platform associated with the developer ('ios' or 'android')."), country: z.string().length(2).optional().default("us").describe("Two-letter country code for store localization. Default 'us'."), lang: z.string().optional().default("en").describe("Language code for results. Default 'en'."), includeApps: z.boolean().optional().default(true).describe("Whether to fetch and include details of the developer's apps in the response (up to 100 for Android, potentially more for iOS). Setting to false returns only developer metadata.") },
  • server.js:1156-1378 (registration)
    Registration of the 'get_developer_info' tool on the MCP server using server.tool(), including inline schema and handler.
    server.tool( "get_developer_info", { developerId: z.string().describe("The developer identifier. For Android: the name (e.g., 'Google LLC') or ID ('570031...'). For iOS: the numeric artist ID (e.g., '284882218') or the developer name ('Facebook'). If a name is provided for iOS, the tool will attempt to find the numeric ID."), platform: z.enum(["ios", "android"]).describe("The platform associated with the developer ('ios' or 'android')."), country: z.string().length(2).optional().default("us").describe("Two-letter country code for store localization. Default 'us'."), lang: z.string().optional().default("en").describe("Language code for results. Default 'en'."), includeApps: z.boolean().optional().default(true).describe("Whether to fetch and include details of the developer's apps in the response (up to 100 for Android, potentially more for iOS). Setting to false returns only developer metadata.") }, async ({ developerId, platform, country, lang, includeApps }) => { try { let developerInfo = { developerId, platform, name: "", website: null, email: null, address: null, privacyPolicy: null, supportContact: null, totalApps: 0, metrics: { totalInstalls: 0, averageRating: 0, totalRatings: 0 }, apps: [] }; if (platform === "android") { // Get developer's apps from Google Play Store const apps = await memoizedGplay.developer({ devId: developerId, country, lang, num: 100 // Get up to 100 apps }); if (apps && apps.length > 0) { // Get full details of the first app to extract developer info const firstApp = await memoizedGplay.app({ appId: apps[0].appId, country, lang }); // Set developer details developerInfo = { ...developerInfo, name: firstApp.developer || developerId, website: firstApp.developerWebsite || null, email: firstApp.developerEmail || null, address: firstApp.developerAddress || null, privacyPolicy: firstApp.privacyPolicy || null, totalApps: apps.length, metrics: { totalInstalls: 0, averageRating: 0, totalRatings: 0 } }; // Calculate metrics across all apps let totalRating = 0; let totalRatings = 0; let totalInstalls = 0; if (includeApps) { // Get full details for all apps const appDetailsPromises = apps.map(app => memoizedGplay.app({ appId: app.appId, country, lang }).catch(err => null) ); const appDetails = await Promise.all(appDetailsPromises); const validAppDetails = appDetails.filter(app => app !== null); validAppDetails.forEach(app => { if (app.score) totalRating += app.score; if (app.ratings) totalRatings += app.ratings; if (app.minInstalls) totalInstalls += app.minInstalls; }); developerInfo.metrics = { totalInstalls, averageRating: totalRating / validAppDetails.length, totalRatings }; // Add normalized app information developerInfo.apps = validAppDetails.map(app => ({ appId: app.appId, title: app.title, icon: app.icon, score: app.score, ratings: app.ratings, installs: app.minInstalls, price: app.price, free: app.free, category: app.genre, url: app.url })); } } } else { // For iOS, first get the numeric developer ID if not provided const isNumericId = /^\d+$/.test(developerId); let numericDevId = developerId; if (!isNumericId) { // Search for an app by this developer to get their numeric ID const searchResults = await memoizedAppStore.search({ term: developerId, num: 1, country }); if (searchResults && searchResults.length > 0) { const firstApp = await memoizedAppStore.app({ appId: searchResults[0].appId, country }); numericDevId = firstApp.developerId; } } // Get developer's apps from App Store const apps = await memoizedAppStore.developer({ devId: numericDevId, country, lang }); if (apps && apps.length > 0) { // Get full details of the first app to extract developer info const firstApp = await memoizedAppStore.app({ id: apps[0].id, country, lang }); // Set developer details developerInfo = { ...developerInfo, name: firstApp.developer || developerId, website: firstApp.developerWebsite || null, totalApps: apps.length, metrics: { totalInstalls: null, // App Store doesn't provide install numbers averageRating: 0, totalRatings: 0 } }; if (includeApps) { // Get full details for all apps const appDetailsPromises = apps.map(app => memoizedAppStore.app({ id: app.id, country, lang, ratings: true }).catch(err => null) ); const appDetails = await Promise.all(appDetailsPromises); const validAppDetails = appDetails.filter(app => app !== null); // Calculate metrics let totalRating = 0; let totalRatings = 0; validAppDetails.forEach(app => { if (app.score) totalRating += app.score; if (app.ratings) totalRatings += app.ratings; }); developerInfo.metrics = { totalInstalls: null, // Not available in App Store averageRating: totalRating / validAppDetails.length, totalRatings }; // Add normalized app information developerInfo.apps = validAppDetails.map(app => ({ appId: app.appId, title: app.title, icon: app.icon, score: app.score, ratings: app.ratings, price: app.price, free: app.free, category: app.primaryGenre, url: app.url })); } } } return { content: [{ type: "text", text: JSON.stringify(developerInfo, null, 2) }] }; } catch (error) { return { content: [{ type: "text", text: JSON.stringify({ error: error.message, developerId, platform }, null, 2) }], isError: true }; } } );

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/appreply-co/mcp-appstore'

If you have feedback or need assistance with the MCP directory API, please join our Discord server