Skip to main content
Glama
appreply-co

mcp-appstore

by appreply-co

App Store Scraper MCP Server

This is an MCP (Model Context Protocol) server that provides tools for searching and analyzing apps from both the Google Play Store and Apple App Store.

Perfect for ASO (App Store Search Optimization).

Built by AppReply.co. For more information, see our MCP documentation.

Installation

# Clone the repository
git clone https://github.com/appreply-co/mcp-appstore.git
cd mcp-appstore

# Install dependencies
npm install

Related MCP server: mcp-store-scraper

Running the Server

npm start

This will start the server in studio mode, which is compatible with MCP clients.

Claude Code: Add to .mcp.json or your MCP config (path must be absolute; on Windows you can use forward slashes):

{
  "mcpServers": {
    "mcp-appstore": {
      "command": "node",
      "args": ["/absolute/path/to/mcp-appstore/server.js"]
    }
  }
}

Or: claude mcp add --transport stdio mcp-appstore -- node /absolute/path/to/mcp-appstore/server.js

Claude Desktop: Same mcpServers entry in claude_desktop_config.json (see Claude’s docs for the file path on your OS).

Available Tools

The server provides the following tools:

1. search_app

Search for apps by name and platform.

Parameters:

  • term: The search term to look up

  • platform: The platform to search on (ios or android)

  • num (optional): Number of results to return (default: 10, max: 250)

  • country (optional): Two-letter country code (default: "us")

Example usage:

const result = await client.callTool({
  name: "search_app",
  arguments: {
    term: "spotify",
    platform: "android",
    num: 5
  }
});

Response:

{
  "query": "spotify",
  "platform": "android",
  "results": [
    {
      "id": "com.spotify.music",
      "appId": "com.spotify.music",
      "title": "Spotify: Music and Podcasts",
      "developer": "Spotify AB",
      "developerId": "Spotify+AB",
      "icon": "https://play-lh.googleusercontent.com/...",
      "score": 4.3,
      "scoreText": "4.3",
      "price": 0,
      "free": true,
      "platform": "android",
      "url": "https://play.google.com/store/apps/details?id=com.spotify.music"
    },
    // Additional results...
  ],
  "count": 5
}

2. get_app_details

Get detailed information about an app by ID.

Parameters:

  • appId: The unique app ID (com.example.app for Android or numeric ID/bundleId for iOS)

  • platform: The platform of the app (ios or android)

  • country (optional): Two-letter country code (default: "us")

  • lang (optional): Language code for the results (default: "en")

Example usage:

const result = await client.callTool({
  name: "get_app_details",
  arguments: {
    appId: "com.spotify.music",
    platform: "android"
  }
});

Response:

{
  "appId": "com.spotify.music",
  "platform": "android",
  "details": {
    "id": "com.spotify.music",
    "appId": "com.spotify.music",
    "title": "Spotify: Music and Podcasts",
    "description": "With Spotify, you can play millions of songs and podcasts for free...",
    "summary": "Listen to songs, podcasts, and playlists for free...",
    "developer": "Spotify AB",
    "developerId": "Spotify+AB",
    "developerEmail": "androidapp@spotify.com",
    "developerWebsite": "https://www.spotify.com/",
    "icon": "https://play-lh.googleusercontent.com/...",
    "headerImage": "https://play-lh.googleusercontent.com/...",
    "screenshots": ["https://play-lh.googleusercontent.com/...", "..."],
    "score": 4.3,
    "scoreText": "4.3",
    "ratings": 15678956,
    "reviews": 4567890,
    "histogram": {
      "1": 567890,
      "2": 234567,
      "3": 890123,
      "4": 2345678,
      "5": 11640698
    },
    "price": 0,
    "free": true,
    "currency": "USD",
    "categories": [
      { "name": "Music & Audio", "id": "MUSIC_AND_AUDIO" }
    ],
    "genre": "Music & Audio",
    "genreId": "MUSIC_AND_AUDIO",
    "contentRating": "Teen",
    "updated": 1648234567890,
    "version": "8.7.30.1356",
    "size": "30M",
    "recentChanges": "We're always making changes and improvements to Spotify...",
    "platform": "android"
  }
}

3. analyze_top_keywords

Analyze top keywords for apps including brand analysis and competition metrics.

Parameters:

  • keyword: The keyword to analyze

  • platform: The platform to analyze (ios or android)

  • country (optional): Two-letter country code (default: "us")

  • lang (optional): Language code for the results (default: "en")

  • num (optional): Number of apps to analyze (default: 10, max: 50)

Example usage:

const result = await client.callTool({
  name: "analyze_top_keywords",
  arguments: {
    keyword: "fitness tracker",
    platform: "ios",
    num: 10
  }
});

Response:

{
  "keyword": "fitness tracker",
  "platform": "ios",
  "topApps": [
    {
      "appId": "com.fitbit.FitbitMobile",
      "title": "Fitbit: Health & Fitness",
      "developer": "Fitbit, Inc.",
      "developerId": "347935733",
      "score": 4.5,
      "ratings": 238456,
      "free": true,
      "price": 0,
      "currency": "USD",
      "category": "Health & Fitness",
      "url": "https://apps.apple.com/us/app/fitbit/id...",
      "icon": "https://is1-ssl.mzstatic.com/..."
    },
    // Additional apps...
  ],
  "brandPresence": {
    "topBrands": ["Fitbit, Inc.", "Garmin"],
    "brandDominance": 0.45,
    "competitionLevel": "Medium - mix of major brands and independents"
  },
  "metrics": {
    "totalApps": 10,
    "averageRating": 4.2,
    "paidAppsPercentage": 30.0,
    "categoryDistribution": {
      "Health & Fitness": 8,
      "Lifestyle": 2
    }
  }
}

4. analyze_reviews

Analyze app reviews and ratings to extract user sentiment and key insights.

Parameters:

  • appId: The unique app ID (com.example.app for Android or numeric ID/bundleId for iOS)

  • platform: The platform of the app (ios or android)

  • country (optional): Two-letter country code (default: "us")

  • lang (optional): Language code for the results (default: "en")

  • sort (optional): How to sort the reviews (newest, rating, helpfulness) (default: "newest")

  • num (optional): Number of reviews to analyze (default: 100, max: 1000)

Example usage:

const result = await client.callTool({
  name: "analyze_reviews",
  arguments: {
    appId: "com.spotify.music",
    platform: "android",
    sort: "helpfulness",
    num: 200
  }
});

Response:

{
  "appId": "com.spotify.music",
  "platform": "android",
  "totalReviewsAnalyzed": 200,
  "analysis": {
    "sentimentBreakdown": {
      "positive": 62.5,
      "somewhat positive": 15.0,
      "neutral": 10.0,
      "somewhat negative": 7.5,
      "negative": 5.0
    },
    "keywordFrequency": {
      "music": 89,
      "playlist": 76,
      "premium": 65,
      "offline": 43,
      "podcasts": 38,
      "shuffle": 27,
      "recommend": 25,
      "interface": 21,
      "free": 19,
      "account": 18
    },
    "ratingDistribution": {
      "1": 10,
      "2": 15,
      "3": 20,
      "4": 55,
      "5": 100
    },
    "commonThemes": [
      {
        "theme": "User Experience",
        "description": "Users are commenting on the app's design or usability"
      },
      {
        "theme": "Pricing Concerns",
        "description": "Users are discussing price or subscription costs"
      }
    ],
    "recentIssues": {
      "premium": 12,
      "account": 8,
      "login": 7,
      "crash": 5,
      "error": 4
    },
    "topPositiveKeywords": {
      "music": 65,
      "playlist": 48,
      "recommend": 22,
      "discover": 18,
      "variety": 15
    },
    "topNegativeKeywords": {
      "premium": 18,
      "shuffle": 12,
      "advertisements": 10,
      "connect": 8,
      "subscription": 7
    }
  }
}

5. fetch_reviews

Fetches raw reviews without analysis, including developer responses for Android apps.

Parameters:

  • appId: The unique app ID (com.example.app for Android or numeric ID/bundleId for iOS)

  • platform: The platform of the app (ios or android)

  • country (optional): Two-letter country code (default: "us")

  • lang (optional): Language code for the results (default: "en")

  • sort (optional): How to sort the reviews (newest, rating, helpfulness) (default: "newest")

  • num (optional): Number of reviews to fetch (default: 100, max: 1000)

Example usage:

const result = await client.callTool({
  name: "fetch_reviews",
  arguments: {
    appId: "com.spotify.music",
    platform: "android",
    sort: "helpfulness",
    num: 50
  }
});

Response for Android:

{
  "appId": "com.spotify.music",
  "platform": "android",
  "count": 50,
  "reviews": [
    {
      "id": "gp:AOqpTOFmAVORqfWGcaqfF39ftwFjGkjecjvjXnC3g_uL0NtVGlrrqm8X2XUWx0WydH3C9afZlPUizYVZAfARLuk",
      "userName": "John Smith",
      "userImage": "https://lh3.googleusercontent.com/-hBGvzn3XlhQ/AAAAAAAAAAI/AAAAAAAAOw0/L4GY9KrQ-DU/w96-c-h96/photo.jpg",
      "score": 4,
      "scoreText": "4",
      "title": "Great app but one issue",
      "text": "Love the app but please fix the offline mode issue.",
      "date": "2023-01-15T18:31:42.174Z",
      "url": "https://play.google.com/store/apps/details?id=com.spotify.music&reviewId=...",
      "version": "8.7.30.1356",
      "thumbsUp": 56,
      "replyDate": "2023-01-16T10:22:33.174Z",
      "replyText": "Thanks for your feedback! We're working on a fix for the offline mode issue.",
      "hasDeveloperResponse": true
    },
    // Additional reviews...
  ]
}

Response for iOS:

{
  "appId": "324684580",
  "platform": "ios",
  "count": 50,
  "reviews": [
    {
      "id": "6934893147",
      "userName": "SpotifyUser2023",
      "userUrl": "https://itunes.apple.com/us/reviews/id324568166",
      "score": 5,
      "title": "Best music app ever!",
      "text": "I've been using Spotify for years and it keeps getting better.",
      "date": "2023-02-10T14:23:17-07:00",
      "version": "8.8.12",
      "url": "https://itunes.apple.com/us/review?id=324684580&type=Purple%20Software",
      "hasDeveloperResponse": false
    },
    // Additional reviews...
  ]
}

6. get_similar_apps

Returns a list of similar or related apps ("Customers also bought" for iOS, "Similar apps" for Android).

Parameters:

  • appId: The unique app ID (com.example.app for Android or numeric ID/bundleId for iOS)

  • platform: The platform of the app (ios or android)

  • country (optional): Two-letter country code (default: "us")

  • lang (optional): Language code for the results (default: "en")

  • num (optional): Number of similar apps to return (default: 20)

Example usage:

const result = await client.callTool({
  name: "get_similar_apps",
  arguments: {
    appId: "com.spotify.music",
    platform: "android",
    num: 10
  }
});

Response:

{
  "appId": "com.spotify.music",
  "platform": "android",
  "count": 10,
  "similarApps": [
    {
      "id": "com.pandora.android",
      "appId": "com.pandora.android",
      "title": "Pandora: Music & Podcasts",
      "summary": "Listen to your favorite music and podcasts anywhere",
      "developer": "Pandora",
      "developerId": "Pandora+Media%2C+Inc.",
      "icon": "https://play-lh.googleusercontent.com/b3MuISSUiJ7mzJAb4GnwgVc8AH-Lj1iXZC-JqU8Bh-OlzXHRqOUkXmhdrLzGUgUVqA4=s180",
      "score": 4.3,
      "scoreText": "4.3",
      "price": 0,
      "free": true,
      "currency": "USD",
      "platform": "android",
      "url": "https://play.google.com/store/apps/details?id=com.pandora.android&hl=en&gl=us"
    },
    {
      "id": "deezer.android.app",
      "appId": "deezer.android.app",
      "title": "Deezer: Music & Podcast Player",
      "summary": "Stream music, create playlists and enjoy podcasts",
      "developer": "Deezer",
      "developerId": "Deezer+Mobile",
      "icon": "https://play-lh.googleusercontent.com/mOkjDMwP8I79j8jFZ9nP88tRpZrPGwOoFxJC9pWQj1_vR8M4JM_wR7-8UBWwdOUGgw=s180",
      "score": 4.1,
      "scoreText": "4.1",
      "price": 0,
      "free": true,
      "currency": "USD",
      "platform": "android", 
      "url": "https://play.google.com/store/apps/details?id=deezer.android.app&hl=en&gl=us"
    },
    // Additional apps...
  ]
}

7. get_pricing_details

Get detailed pricing information and monetization model for an app.

Parameters:

  • appId: The unique app ID (com.example.app for Android or numeric ID/bundleId for iOS)

  • platform: The platform of the app (ios or android)

  • country (optional): Two-letter country code (default: "us")

  • lang (optional): Language code for the results (default: "en")

Example usage:

const result = await client.callTool({
  name: "get_pricing_details",
  arguments: {
    appId: "com.spotify.music",
    platform: "android"
  }
});

Response:

{
  "appId": "com.spotify.music",
  "platform": "android",
  "basePrice": {
    "amount": 0,
    "currency": "USD",
    "formattedPrice": "Free",
    "isFree": true
  },
  "inAppPurchases": {
    "offers": true,
    "priceRange": "$0.99 - $14.99",
    "items": [
      {
        "type": "unknown",
        "price": "$9.99",
        "isSubscription": true
      },
      {
        "type": "unknown",
        "price": "$4.99",
        "isSubscription": false
      }
    ]
  },
  "subscriptions": {
    "offers": true,
    "items": [
      {
        "period": "monthly",
        "price": "$9.99"
      },
      {
        "period": "yearly",
        "price": "$99.99"
      }
    ]
  },
  "adSupported": true,
  "monetizationModel": "Freemium with ads and subscriptions"
}

8. get_developer_info

Get comprehensive information about a developer/publisher and their portfolio of apps.

Parameters:

  • developerId: The developer ID to get information for

  • platform: The platform of the developer (ios or android)

  • country (optional): Two-letter country code (default: "us")

  • lang (optional): Language code for the results (default: "en")

  • includeApps (optional): Whether to include the developer's apps in the response (default: true)

Example usage:

const result = await client.callTool({
  name: "get_developer_info",
  arguments: {
    developerId: "Spotify AB",
    platform: "android"
  }
});

Response:

{
  "developerId": "Spotify AB",
  "platform": "android",
  "name": "Spotify AB",
  "website": "https://www.spotify.com",
  "email": "android-support@spotify.com",
  "address": "Regeringsgatan 19, Stockholm 111 53, Sweden",
  "privacyPolicy": "https://www.spotify.com/legal/privacy-policy/",
  "supportContact": "android-support@spotify.com",
  "totalApps": 3,
  "metrics": {
    "totalInstalls": 1000000000,
    "averageRating": 4.3,
    "totalRatings": 22000000
  },
  "apps": [
    {
      "appId": "com.spotify.music",
      "title": "Spotify: Music and Podcasts",
      "icon": "https://play-lh.googleusercontent.com/...",
      "score": 4.3,
      "ratings": 15000000,
      "installs": 1000000000,
      "price": 0,
      "free": true,
      "category": "Music & Audio",
      "url": "https://play.google.com/store/apps/details?id=com.spotify.music"
    },
    // Additional apps...
  ]
}

9. get_version_history

Get version history and changelogs for an app. Note: Currently only provides the latest version for both platforms due to API limitations.

Parameters:

  • appId: The unique app ID (com.example.app for Android or numeric ID/bundleId for iOS)

  • platform: The platform of the app (ios or android)

  • country (optional): Two-letter country code (default: "us")

  • lang (optional): Language code for the results (default: "en")

Example usage:

const result = await client.callTool({
  name: "get_version_history",
  arguments: {
    appId: "com.spotify.music",
    platform: "ios"
  }
});

Response for iOS:

{
  "appId": "com.spotify.music",
  "platform": "ios",
  "platformCapabilities": {
    "fullHistoryAvailable": true,
    "description": "Full version history available"
  },
  "currentVersion": {
    "versionNumber": "8.8.40",
    "releaseDate": "2024-03-28T14:52:32Z",
    "changelog": "Bug fixes and improvements",
    "isCurrentVersion": true
  },
  "history": [
    {
      "versionNumber": "8.8.40",
      "releaseDate": "2024-03-28T14:52:32Z",
      "changelog": "Bug fixes and improvements",
      "isCurrentVersion": true
    },
    {
      "versionNumber": "8.8.38",
      "releaseDate": "2024-03-14T10:23:15Z",
      "changelog": "New features and performance improvements",
      "isCurrentVersion": false
    }
    // Additional version history...
  ],
  "metadata": {
    "retrievalDate": "2024-03-31T12:34:56Z",
    "totalVersions": 50,
    "limitations": []
  }
}

Response for Android:

{
  "appId": "com.spotify.music",
  "platform": "android",
  "platformCapabilities": {
    "fullHistoryAvailable": false,
    "description": "Only latest version available due to Google Play Store limitations"
  },
  "currentVersion": {
    "versionNumber": "8.8.40.480",
    "releaseDate": "2024-03-28T14:52:32Z",
    "changelog": "We're always making changes and improvements to Spotify",
    "isCurrentVersion": true
  },
  "history": [
    {
      "versionNumber": "8.8.40.480",
      "releaseDate": "2024-03-28T14:52:32Z",
      "changelog": "We're always making changes and improvements to Spotify",
      "isCurrentVersion": true
    }
  ],
  "metadata": {
    "retrievalDate": "2024-03-31T12:34:56Z",
    "totalVersions": 1,
    "limitations": [
      "Only latest version available",
      "Historical data not accessible via Google Play Store API"
    ]
  }
}

10. get_android_categories

Retrieves a full list of all available app categories from the Google Play Store.

Parameters: This tool doesn't require any parameters.

Example usage:

const result = await client.callTool({
  name: "get_android_categories",
  arguments: {}
});

Response:

{
  "platform": "android",
  "count": 1,
  "categories": [
    "APPLICATION"
  ]
}

Note: The specific category list returned may vary depending on the Google Play Store API version and region. In the current implementation, only the "APPLICATION" category is typically returned, despite the Google Play Store having many more categories visible on the web interface. This is a limitation of the underlying API.

11. get_keyword_scores

Analyzes a keyword for App Store Optimization (ASO) and returns difficulty and traffic scores to evaluate its potential.

Parameters:

  • keyword: The keyword to analyze for App Store Optimization.

  • platform: The platform to analyze the keyword for (ios or android).

  • country (optional): Two-letter country code for localization. Default 'us'.

Example usage:

const result = await client.callTool({
  name: "get_keyword_scores",
  arguments: {
    keyword: "music streaming",
    platform: "android"
  }
});

Response:

{
  "keyword": "music streaming",
  "platform": "android",
  "country": "us",
  "scores": {
    "difficulty": {
      "score": 8.56,
      "components": {
        "titleMatches": { 
          "exact": 8, 
          "broad": 1, 
          "partial": 1, 
          "none": 0, 
          "score": 9.3 
        },
        "competitors": { 
          "count": 42, 
          "score": 7.35 
        },
        "installs": { 
          "avg": 12500000, 
          "score": 9.9 
        },
        "rating": { 
          "avg": 4.5, 
          "score": 9.0 
        },
        "age": { 
          "avgDaysSinceUpdated": 48.2, 
          "score": 5.8 
        }
      },
      "interpretation": "Difficult to rank for"
    },
    "traffic": {
      "score": 7.82,
      "components": {
        "suggest": { 
          "length": 2, 
          "index": 1, 
          "score": 8.5 
        },
        "ranked": { 
          "count": 7, 
          "avgRank": 12.3, 
          "score": 7.9 
        },
        "installs": { 
          "avg": 12500000, 
          "score": 9.9 
        },
        "length": { 
          "length": 15, 
          "score": 5.0 
        }
      },
      "interpretation": "High search traffic"
    }
  }
}

Each score has a human-readable interpretation to help understand its significance.

Note: The current implementation simulates ASO scores based on keyword length and other heuristics rather than using real-time data. This approach was chosen due to compatibility issues between the aso package and current versions of the Google Play and App Store scrapers. The scores follow the same structure and interpretation guidelines as actual ASO metrics but should be considered approximations.

12. suggest_keywords_by_category

Get keyword suggestions based on apps in the same category as the target app.

Parameters:

  • appId: The unique app ID (com.example.app for Android or numeric ID/bundleId for iOS)

  • platform: The platform of the app (ios or android)

  • num (optional): Number of keyword suggestions to return (default: 30)

  • country (optional): Two-letter country code (default: "us")

  • lang (optional): Language code for the results (default: "en")

Example usage:

const result = await client.callTool({
  name: "suggest_keywords_by_category",
  arguments: {
    appId: "com.spotify.music",
    platform: "android",
    num: 20
  }
});

Response:

{
  "appId": "com.spotify.music",
  "platform": "android",
  "strategy": "category",
  "description": "Keywords commonly used by apps in the same category as the target app",
  "suggestions": [
    "music", 
    "audio", 
    "player", 
    "listen", 
    "songs"
  ],
  "count": 5
}

13. suggest_keywords_by_similarity

Get keyword suggestions based on similar apps (for Android) or "customers also bought" apps (for iOS).

Parameters:

  • appId: The unique app ID (com.example.app for Android or numeric ID/bundleId for iOS)

  • platform: The platform of the app (ios or android)

  • num (optional): Number of keyword suggestions to return (default: 30)

  • country (optional): Two-letter country code (default: "us")

  • lang (optional): Language code for the results (default: "en")

Example usage:

const result = await client.callTool({
  name: "suggest_keywords_by_similarity",
  arguments: {
    appId: "com.spotify.music",
    platform: "android",
    num: 20
  }
});

Response:

{
  "appId": "com.spotify.music",
  "platform": "android",
  "strategy": "similarity",
  "description": "Keywords commonly used by apps marked as 'similar' to the target app in Google Play",
  "suggestions": [
    "music", 
    "streaming", 
    "player", 
    "audio", 
    "playlist"
  ],
  "count": 5
}

14. suggest_keywords_by_competition

Get keyword suggestions based on apps that target the same keywords as the target app.

Parameters:

  • appId: The unique app ID (com.example.app for Android or numeric ID/bundleId for iOS)

  • platform: The platform of the app (ios or android)

  • num (optional): Number of keyword suggestions to return (default: 30)

  • country (optional): Two-letter country code (default: "us")

  • lang (optional): Language code for the results (default: "en")

Example usage:

const result = await client.callTool({
  name: "suggest_keywords_by_competition",
  arguments: {
    appId: "com.spotify.music",
    platform: "android",
    num: 20
  }
});

Response:

{
  "appId": "com.spotify.music",
  "platform": "android",
  "strategy": "competition",
  "description": "Keywords commonly used by apps that target the same keywords as the target app",
  "suggestions": [
    "music", 
    "streaming", 
    "songs", 
    "playlist", 
    "audio"
  ],
  "count": 5
}

15. suggest_keywords_by_apps

Get keyword suggestions based on an arbitrary list of apps.

Parameters:

  • apps: Array of app IDs to analyze (package names for Android, numeric IDs or bundle IDs for iOS)

  • platform: The platform of the apps (ios or android)

  • num (optional): Number of keyword suggestions to return (default: 30)

  • country (optional): Two-letter country code (default: "us")

  • lang (optional): Language code for the results (default: "en")

Example usage:

const result = await client.callTool({
  name: "suggest_keywords_by_apps",
  arguments: {
    apps: ["com.spotify.music", "com.pandora.android", "deezer.android.app"],
    platform: "android",
    num: 20
  }
});

Response:

{
  "apps": ["com.spotify.music", "com.pandora.android", "deezer.android.app"],
  "platform": "android",
  "strategy": "arbitrary_apps",
  "description": "Keywords commonly used by the specified list of apps",
  "suggestions": [
    "music", 
    "streaming", 
    "player", 
    "audio", 
    "songs"
  ],
  "count": 5
}

16. suggest_keywords_by_seeds

Get keyword suggestions based on seed keywords, by looking at apps that target these keywords.

Parameters:

  • keywords: Array of seed keywords to find related keywords

  • platform: The platform to analyze (ios or android)

  • num (optional): Number of keyword suggestions to return (default: 30)

  • country (optional): Two-letter country code (default: "us")

  • lang (optional): Language code for the results (default: "en")

Example usage:

const result = await client.callTool({
  name: "suggest_keywords_by_seeds",
  arguments: {
    keywords: ["music streaming", "playlist", "podcasts"],
    platform: "android",
    num: 20
  }
});

Response:

{
  "keywords": ["music streaming", "playlist", "podcasts"],
  "platform": "android",
  "strategy": "seed_keywords",
  "description": "Keywords commonly used by apps that target the provided seed keywords",
  "suggestions": [
    "music", 
    "audio", 
    "player", 
    "streaming", 
    "podcast"
  ],
  "count": 5
}

Get keyword suggestions based on search completion results for seed keywords. This strategy often works better for iOS than Android.

Parameters:

  • keywords: Array of seed keywords to use for search completion suggestions

  • platform: The platform to analyze (ios or android)

  • num (optional): Number of keyword suggestions to return (default: 30)

  • country (optional): Two-letter country code (default: "us")

  • lang (optional): Language code for the results (default: "en")

Example usage:

const result = await client.callTool({
  name: "suggest_keywords_by_search",
  arguments: {
    keywords: ["music streaming", "playlist", "podcasts"],
    platform: "ios",
    num: 20
  }
});

Response:

{
  "keywords": ["music streaming", "playlist", "podcasts"],
  "platform": "ios",
  "strategy": "search_hints",
  "description": "Keywords based on App Store search completion results and apps targeting those keywords (works best for iOS)",
  "suggestions": [
    "music", 
    "streaming", 
    "music player", 
    "free music", 
    "podcast player"
  ],
  "count": 5
}

Connecting with MCP Clients

You can connect to this server using any MCP client. Here's an example using the MCP TypeScript SDK:

import { Client } from "@modelcontextprotocol/sdk/dist/esm/client/index.js";
import { StdioClientTransport } from "@modelcontextprotocol/sdk/dist/esm/client/stdio.js";

const transport = new StdioClientTransport({
  command: "node",
  args: ["server.js"]
});

const client = new Client(
  {
    name: "app-store-client",
    version: "1.0.0"
  },
  {
    capabilities: {
      tools: {}
    }
  }
);

await client.connect(transport);

// Call a tool
const result = await client.callTool({
  name: "search_app",
  arguments: {
    term: "spotify",
    platform: "android",
    num: 5
  }
});

console.log(JSON.parse(result.content[0].text));

Performance Considerations

  • The server uses memoization to cache API responses for 10 minutes to reduce external API calls

  • For large numbers of reviews or extensive keyword analysis, expect longer response times

  • The server includes rate limiting protection to avoid triggering API restrictions

Dependencies

This server uses the following libraries:

License

MIT

Available Tools

11 tools
analyze_reviewsD
ParametersJSON Schema
NameRequiredDescriptionDefault
appIdYesThe unique identifier for the app (Android package name, iOS numeric ID or bundle ID).
platformYesThe platform of the app ('ios' or 'android').
numNoTarget number of reviews to analyze (1-1000, default 100). Note: Actual number may be less due to API limitations or available reviews. For iOS, fetching requires multiple requests and is capped at page 10.
countryNoTwo-letter country code for reviews localization. Default 'us'.us
langNoLanguage code for filtering reviews (results may be less accurate if language doesn't match review content). Default 'en'.en
sortNoSorting order for reviews: 'newest', 'rating' (highest/lowest first, platform dependent), 'helpfulness'. Default 'newest'.newest

TDQS

D1/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Tool has no description.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness1/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Tool has no description.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness1/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Tool has no description.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Tool has no description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose1/5

Does the description clearly state what the tool does and how it differs from similar tools?

Tool has no description.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines1/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Tool has no description.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

analyze_top_keywordsD
ParametersJSON Schema
NameRequiredDescriptionDefault
keywordYesThe keyword or search term to analyze (e.g., 'meditation app', 'puzzle games').
platformYesThe platform (app store) to analyze ('ios' for Apple App Store, 'android' for Google Play Store).
numNoNumber of top apps ranking for the keyword to analyze (1-50, default 10). These apps will be fetched with full details to provide comprehensive analysis.
countryNoTwo-letter country code for store localization. Default 'us'.us
langNoLanguage code for results. Default 'en'.en

TDQS

D1/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Tool has no description.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness1/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Tool has no description.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness1/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Tool has no description.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Tool has no description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose1/5

Does the description clearly state what the tool does and how it differs from similar tools?

Tool has no description.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines1/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Tool has no description.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fetch_reviewsD
ParametersJSON Schema
NameRequiredDescriptionDefault
appIdYesThe unique identifier for the app (Android package name, iOS numeric ID or bundle ID).
platformYesThe platform of the app ('ios' or 'android').
numNoNumber of reviews to fetch (1-1000, default 100). Note: Actual number may be less due to API limitations. For iOS, limited to 10 pages max.
countryNoTwo-letter country code for the App Store/Play Store region. Default 'us'.us
langNoLanguage code for reviews. Default 'en'.en
sortNoSorting order for reviews: 'newest', 'rating', 'helpfulness'. Default 'newest'.newest

TDQS

D1/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Tool has no description.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness1/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Tool has no description.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness1/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Tool has no description.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Tool has no description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose1/5

Does the description clearly state what the tool does and how it differs from similar tools?

Tool has no description.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines1/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Tool has no description.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_android_categoriesD
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

D1/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Tool has no description.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness1/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Tool has no description.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness1/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Tool has no description.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Tool has no description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose1/5

Does the description clearly state what the tool does and how it differs from similar tools?

Tool has no description.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines1/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Tool has no description.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_app_detailsD
ParametersJSON Schema
NameRequiredDescriptionDefault
appIdYesThe unique identifier for the app. For Android: the package name (e.g., 'com.google.android.gm'). For iOS: the numeric ID (e.g., '553834731') or the bundle ID (e.g., 'com.midasplayer.apps.candycrushsaga').
platformYesThe platform of the app ('ios' or 'android').
countryNoTwo-letter country code for store localization (e.g., 'us', 'de'). Affects availability and potentially some metadata. Default 'us'.us
langNoLanguage code for the results (e.g., 'en', 'de'). If not provided, defaults to the 'country' code. If 'country' is also missing, defaults to 'en'. Determines the language of text fields like description and recent changes.en

TDQS

D1/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Tool has no description.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness1/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Tool has no description.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness1/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Tool has no description.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Tool has no description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose1/5

Does the description clearly state what the tool does and how it differs from similar tools?

Tool has no description.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines1/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Tool has no description.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_developer_infoD
ParametersJSON Schema
NameRequiredDescriptionDefault
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.
platformYesThe platform associated with the developer ('ios' or 'android').
countryNoTwo-letter country code for store localization. Default 'us'.us
langNoLanguage code for results. Default 'en'.en
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.

TDQS

D1/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Tool has no description.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness1/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Tool has no description.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness1/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Tool has no description.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Tool has no description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose1/5

Does the description clearly state what the tool does and how it differs from similar tools?

Tool has no description.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines1/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Tool has no description.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_keyword_scoresD
ParametersJSON Schema
NameRequiredDescriptionDefault
keywordYesThe keyword to analyze for App Store Optimization.
platformYesThe platform to analyze the keyword for ('ios' or 'android').
countryNoTwo-letter country code for localization. Default 'us'.us

TDQS

D1/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Tool has no description.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness1/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Tool has no description.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness1/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Tool has no description.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Tool has no description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose1/5

Does the description clearly state what the tool does and how it differs from similar tools?

Tool has no description.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines1/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Tool has no description.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_pricing_detailsD
ParametersJSON Schema
NameRequiredDescriptionDefault
appIdYesThe unique identifier for the app (Android package name, iOS numeric ID or bundle ID).
platformYesThe platform of the app ('ios' or 'android').
countryNoTwo-letter country code for store localization (affects currency and price). Default 'us'.us
langNoLanguage code for results. Default 'en'.en

TDQS

D1/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Tool has no description.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness1/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Tool has no description.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness1/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Tool has no description.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Tool has no description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose1/5

Does the description clearly state what the tool does and how it differs from similar tools?

Tool has no description.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines1/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Tool has no description.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_similar_appsD
ParametersJSON Schema
NameRequiredDescriptionDefault
appIdYesThe unique identifier for the app (Android package name, iOS numeric ID or bundle ID).
platformYesThe platform of the app ('ios' or 'android').
countryNoTwo-letter country code for the App Store/Play Store region. Default 'us'.us
langNoLanguage code for the results. Default 'en'.en
numNoNumber of similar apps to return (default 20).

TDQS

D1/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Tool has no description.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness1/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Tool has no description.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness1/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Tool has no description.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Tool has no description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose1/5

Does the description clearly state what the tool does and how it differs from similar tools?

Tool has no description.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines1/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Tool has no description.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_version_historyD
ParametersJSON Schema
NameRequiredDescriptionDefault
appIdYesThe unique identifier for the app (Android package name, iOS numeric ID or bundle ID).
platformYesThe platform of the app. Note: Due to current API limitations, **only the latest version details are reliably returned for both platforms.**
countryNoTwo-letter country code for store localization. Default 'us'.us
langNoLanguage code for the results (e.g., changelog text). Default 'en'.en

TDQS

D1/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Tool has no description.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness1/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Tool has no description.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness1/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Tool has no description.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Tool has no description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose1/5

Does the description clearly state what the tool does and how it differs from similar tools?

Tool has no description.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines1/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Tool has no description.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_appD
ParametersJSON Schema
NameRequiredDescriptionDefault
termYesThe search term to look up (e.g., 'panda', 'spotify', 'photo editor'). This is required.
platformYesThe platform to search on ('ios' for Apple App Store, 'android' for Google Play Store).
numNoNumber of results to return (1-250, default 10). For Android max is 250, for iOS typically defaults to 50.
countryNoTwo-letter country code for the App Store/Play Store region (e.g., 'us', 'de', 'gb'). Affects ranking and availability. Default 'us'.us

TDQS

D1/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Tool has no description.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness1/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Tool has no description.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness1/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Tool has no description.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Tool has no description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose1/5

Does the description clearly state what the tool does and how it differs from similar tools?

Tool has no description.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines1/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Tool has no description.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 1 tool updatev1.0.0
    • Changedget_android_categories1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
  2. 11 tool updates
    • First observedanalyze_reviews
    • First observedanalyze_top_keywords
    • First observedfetch_reviews
    • First observedget_android_categories
    • First observedget_app_details
    • First observedget_developer_info
    • First observedget_keyword_scores
    • First observedget_pricing_details
    • First observedget_similar_apps
    • First observedget_version_history
    • First observedsearch_app

TDQS

C2.1/5.0
Disambiguation4/5

Most tools have clearly distinct purposes targeting different app store data aspects like reviews, keywords, app details, developer info, pricing, similar apps, and version history. However, 'analyze_reviews' and 'analyze_top_keywords' could potentially overlap with 'fetch_reviews' and 'get_keyword_scores' in functionality, creating minor ambiguity about whether they perform retrieval or analysis.

Naming Consistency5/5

All tool names follow a consistent snake_case pattern with clear verb_noun structures. The naming convention is uniform throughout, using verbs like 'analyze', 'fetch', 'get', and 'search' paired with specific nouns, making the set highly predictable and readable.

Tool Count5/5

With 11 tools, the count is well-scoped for an app store analysis server. Each tool appears to serve a distinct data retrieval or analysis function, covering categories, reviews, keywords, app details, and more, without feeling excessive or insufficient for the domain.

Completeness4/5

The tool set provides comprehensive coverage for app store data analysis, including search, details, reviews, keywords, pricing, developer info, similar apps, and version history. A minor gap exists in update or modification tools (e.g., for tracking changes), but the surface supports core analysis workflows effectively.

Maintenance

ActivityMaintained
ResponsivenessSlow

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    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
    25
    MIT
  • A
    license
    B
    quality
    B
    maintenance
    MCP server that scrapes app data from Google Play and Apple App Store, providing tools for search, details, reviews, and similar apps.
    8
    39
    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.
    34
    4
    MIT

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