Real-time global intelligence dashboard. AI-powered news aggregation, geopolitical monitoring, and infrastructure tracking in a unified situational awareness interface
MCP server for App Store and Google Play tools
This server connects an MCP client to app store data from Google Play and the Apple App Store. It exposes tools for search, app details, review analysis, keyword ideas, pricing, similar apps, developer profiles, and version history.
Builders who want their agent to research apps, compare competitors, and study ASO signals across app stores.
You can ask your agent to pull app store data and turn it into ASO research instead of doing the lookup work by hand.
What it does
Search apps
Find apps by name and platform with `search_app`.
Inspect app details
Pull descriptions, ratings, screenshots, categories, and update info with `get_app_details`.
Analyze reviews
Summarize sentiment, themes, and repeated issues with `analyze_reviews`, or fetch raw reviews with `fetch_reviews`.
Research keywords
Analyze keyword competition and traffic with `get_keyword_scores`, plus suggestions by category, similarity, and competition.
Compare app positioning
See similar apps, pricing details, and developer portfolios with `get_similar_apps`, `get_pricing_details`, and `get_developer_info`.
Check version history
Read changelog and release history with `get_version_history`.
List Android categories
Fetch available Google Play categories with `get_android_categories`.
How to get it
- 1Run
# Clone the repository git clone https://github.com/appreply-co/mcp-appstore.git cd mcp-appstore # Install dependencies npm install
README
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
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 upplatform: The platform to search on (iosorandroid)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 (iosorandroid)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 analyzeplatform: The platform to analyze (iosorandroid)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 (iosorandroid)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 (iosorandroid)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 (iosorandroid)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 (iosorandroid)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 forplatform: The platform of the developer (iosorandroid)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 (iosorandroid)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 (iosorandroid).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 (iosorandroid)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 (iosorandroid)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 (iosorandroid)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"
Files in the repo
- src
- .DS_Store
- .gitignore
- appstore-scraper.txt
- aso.txt
- CLAUDE.md
- CODE_OF_CONDUCT.md
- CONTRIBUTING.md
- demo.js
- eslint.config.mjs
- google-play-scraper.txt
- ios-app-store-client.js
- jest.config.js
- LICENSE
- llms-full.txt
- mcp-appstore-1.0.0.tgz
- package-lock.json
- package.json
- README.md
- SDK_README.md
- SECURITY.md
- server-http.js
- server-http.run-test.js
- server-http.test.js
- server.js
- test-issue-9.js
- test.js
- tsconfig.cjs.json
- tsconfig.json
- tsconfig.prod.json
Discussion (0)
Ask about usage, or say what you built with itSign in to join the discussion.
No comments yet. Be the first to say what this is good for.
More connectors
High-performance code intelligence MCP server. Indexes codebases into a persistent knowledge graph — average repo in milliseconds. 158 languages, sub-ms queries, 99% fewer tokens. Single static binary, zero dependencies.

Universal provider proxy for OpenAI Codex & Claude Code — use any LLM (Claude, Gemini, Grok, DeepSeek, Ollama…) with Codex CLI, App, SDK, and Claude Code
Git-native persistent memory for AI coding agents. Implements Google OKF v0.2 with sub-300µs in-memory BM25 search, embedded MCP server, and progressive disclosure. Slashes token bloat by 80% with zero external databases or dependencies. Built in pure Go.
Stop your AI from making things up — it proposes, deterministic tools decide, every claim checked against ground truth with evidence. Grounded facts and context survive resets. Reverse engineering is the proving ground. MCP server + CLI.
x64dbg-MCP Server is a native MCP (Model Context Protocol) plugin for x64dbg that exposes the debugger's full functionality over HTTP. Connect any MCP-compatible AI assistant and control x64dbg programmatically: set breakpoints, step through code, read memory, dump registers, and more. Built with Zig — zero dependencies, single-binary output, cros