App Pain API MCP
An MCP server that mines iOS and Android app store reviews to identify ranked, evidence-backed user pain points, trends, and version history for competitive research and product intelligence.
Endpoint and access
No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.
https://hawkmill.com/mcpWhat you can do with it
- Rank user complaints by severity and share percentage
- Track pain point trends over time to see what got worse
- Find competitor apps across iOS and Android stores
- Analyze raw reviews and developer replies for specific apps
Source and maintenance
- Maintenance checked
Protocol and capabilities
- Server
- app-pain-api 0.3.0
- MCP protocol
- 2025-06-18
- Tools
- 7 advertised
- Resources
- Not advertised
- Resource templates
- Not advertised
- Prompts
- 2 advertised
{
"tools": {
"listChanged": false
},
"prompts": {
"listChanged": false
}
}Server-provided instructions
Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.
Tools
7 advertised
search_apps — Search apps
Search the iOS App Store and Google Play (both merged by default) to find apps and their ids. Use this FIRST when you only know an app name or a category.
{
"type": "object",
"required": [
"q"
],
"properties": {
"q": {
"type": "string",
"description": "search query, e.g. \"habit tracker\" or \"notion\""
},
"limit": {
"type": "integer",
"maximum": 30,
"minimum": 1,
"description": "max results per store, default 10"
},
"store": {
"enum": [
"ios",
"android"
],
"type": "string",
"description": "limit to one store (default: both merged)"
},
"country": {
"type": "string",
"description": "ISO country code, default \"us\""
}
}
}{
"title": "Search apps",
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}mine_app_pain_points — Mine app pain points
THE core tool: fetch recent reviews of any iOS/Android app, keep the negative ones, and cluster them into ranked pain points (title, sharePercent, severity 1-5, verbatim evidence quotes). Ideal for competitive research and product discovery. Cached 7 days (instant on repeat); a COLD server-side analysis takes 30-120s. If the result has "mode":"agent", it contains prepared negative reviews and "instructions" — do the clustering yourself and present it to the user.
{
"type": "object",
"required": [
"appId"
],
"properties": {
"appId": {
"type": "string",
"description": "App Store or Google Play URL, iOS numeric id (e.g. 324684580) or Android package (e.g. com.spotify.music) — get ids from search_apps"
},
"model": {
"enum": [
"glm-5.3-flash"
],
"type": "string",
"description": "premium refinement model (paid keys only). Omit for the free default."
},
"store": {
"enum": [
"ios",
"android"
],
"type": "string",
"description": "optional — inferred from appId (numeric id / App Store URL → ios, package / Play URL → android)"
},
"analyze": {
"enum": [
"auto",
"server",
"agent"
],
"type": "string",
"description": "who clusters on a cold run: \"server\" = our model; \"agent\" = you get the prepared negative reviews + instructions and cluster them with your own model; \"auto\" (default) = server, switching to agent when the server-side allowance is used up"
},
"country": {
"type": "string",
"description": "ISO country code, default \"us\""
},
"reviews": {
"enum": [
100,
300,
500
],
"type": "integer",
"description": "reviews to analyze, default 300 (other values round up to these tiers; iOS depth is ~50 due to Apple edge limits)"
},
"maxRating": {
"type": "integer",
"maximum": 5,
"minimum": 1,
"description": "ratings <= this count as negative, default 3"
}
}
}{
"title": "Mine app pain points",
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}get_pain_trend — Pain-point trend
How an app's pain points changed over time: compares two archived analyses and labels each theme new / resolved / rising / falling / stable with share deltas (percentage points). Instant (archive read, no LLM). Default: latest vs ~30 days earlier. Returns a note when the app has fewer than two snapshots yet.
{
"type": "object",
"required": [
"appId"
],
"properties": {
"to": {
"type": "string",
"description": "comparison date YYYY-MM-DD (optional, default newest)"
},
"from": {
"type": "string",
"description": "baseline date YYYY-MM-DD (optional)"
},
"appId": {
"type": "string",
"description": "App Store or Google Play URL, iOS numeric id (e.g. 324684580) or Android package (e.g. com.spotify.music) — get ids from search_apps"
},
"store": {
"enum": [
"ios",
"android"
],
"type": "string",
"description": "optional — inferred from appId (numeric id / App Store URL → ios, package / Play URL → android)"
}
}
}{
"title": "Pain-point trend",
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}get_app_details — App details
App metadata: name, developer, category, price, average rating, rating count and 1-5★ histogram (when available).
{
"type": "object",
"required": [
"appId"
],
"properties": {
"appId": {
"type": "string",
"description": "App Store or Google Play URL, iOS numeric id (e.g. 324684580) or Android package (e.g. com.spotify.music) — get ids from search_apps"
},
"store": {
"enum": [
"ios",
"android"
],
"type": "string",
"description": "optional — inferred from appId (numeric id / App Store URL → ios, package / Play URL → android)"
},
"country": {
"type": "string",
"description": "ISO country code, default \"us\""
}
}
}{
"title": "App details",
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}get_version_history — Version history
Per-version review stats (review count, average rating, first/last seen) — spot a rating crash right after a bad release. Android: aggregated from recent reviews. iOS: current version + release notes.
{
"type": "object",
"required": [
"appId"
],
"properties": {
"appId": {
"type": "string",
"description": "App Store or Google Play URL, iOS numeric id (e.g. 324684580) or Android package (e.g. com.spotify.music) — get ids from search_apps"
},
"store": {
"enum": [
"ios",
"android"
],
"type": "string",
"description": "optional — inferred from appId (numeric id / App Store URL → ios, package / Play URL → android)"
},
"country": {
"type": "string",
"description": "ISO country code, default \"us\""
}
}
}{
"title": "Version history",
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}watch_competitors — Watch competitors (alerts)
Continuous competitor monitoring (paid plans: Starter 2 apps weekly, Pro 15 apps daily). Manage the watchlist and the alert destination; digests of NEW 1-2★ reviews and NEW/RISING pain points are pushed to a Slack / Discord / any https webhook. action: list | add | remove | set_webhook | test.
{
"type": "object",
"required": [
"action"
],
"properties": {
"appId": {
"type": "string",
"description": "for add/remove: store URL, iOS id or Android package"
},
"store": {
"enum": [
"ios",
"android"
],
"type": "string",
"description": "optional — inferred from appId (numeric id / App Store URL → ios, package / Play URL → android)"
},
"action": {
"enum": [
"list",
"add",
"remove",
"set_webhook",
"test"
],
"type": "string"
},
"webhookUrl": {
"type": "string",
"description": "for set_webhook (or add): https URL, e.g. a Slack incoming webhook or Discord channel webhook"
}
}
}{
"title": "Watch competitors",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}get_app_reviews — Raw reviews
Fetch raw app reviews (unified schema across stores: rating/title/body/version/date/devReply/thumbsUp), 50 per page. Use for drill-down after mine_app_pain_points.
{
"type": "object",
"required": [
"appId"
],
"properties": {
"page": {
"type": "integer",
"maximum": 10,
"minimum": 1,
"description": "page number, default 1 (50/page)"
},
"sort": {
"enum": [
"recent",
"helpful"
],
"type": "string",
"description": "default recent (Android only; iOS uses the store default order)"
},
"appId": {
"type": "string",
"description": "App Store or Google Play URL, iOS numeric id (e.g. 324684580) or Android package (e.g. com.spotify.music) — get ids from search_apps"
},
"store": {
"enum": [
"ios",
"android"
],
"type": "string",
"description": "optional — inferred from appId (numeric id / App Store URL → ios, package / Play URL → android)"
},
"country": {
"type": "string",
"description": "ISO country code, default \"us\""
}
}
}{
"title": "Raw reviews",
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}Prompts
2 advertised
competitor_pain_report — Competitor pain-point report
Find the top apps in a category and compare what their users complain about — shared pains, unique weaknesses, opportunities.
- category
- app category or niche, e.g. "habit tracker" (required)
- apps
- how many competitors to analyze (default 4)
app_pain_deep_dive — Single-app pain deep dive
Everything users hate about one app: ranked pain points, how they trend, which releases hurt, with quotes.
- app
- app name, store URL or id (required)
Resources
Not advertised
30-day availability
Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.
- Successful checks
- 1 of 1 (100%)
- Average latency
- 523 ms
- 95th percentile latency
- 523 ms
Maintenance history
Public check and source-refresh events. Editorial and ownership records remain private.
- · probe · passed · 523 ms · metadata changed · 7 tool(s), 2 prompt(s)
Connect from your client
Each snippet registers the same endpoint; pick the client you use.
Claude Code
claude mcp add --transport http app-pain-api-mcp https://hawkmill.com/mcpCodex
codex mcp add app-pain-api-mcp --url https://hawkmill.com/mcpCursor
{
"mcpServers": {
"app-pain-api-mcp": {
"url": "https://hawkmill.com/mcp"
}
}
}Cline
{
"mcpServers": {
"app-pain-api-mcp": {
"type": "streamableHttp",
"url": "https://hawkmill.com/mcp",
"disabled": false
}
}
}VS Code
{
"servers": {
"app-pain-api-mcp": {
"type": "http",
"url": "https://hawkmill.com/mcp"
}
}
}Gemini CLI
gemini mcp add --transport http app-pain-api-mcp https://hawkmill.com/mcpClaude Desktop
{
"mcpServers": {
"app-pain-api-mcp": {
"url": "https://hawkmill.com/mcp"
}
}
}Windsurf
{
"mcpServers": {
"app-pain-api-mcp": {
"serverUrl": "https://hawkmill.com/mcp"
}
}
}Let your agent find its tools
Find servers like App Pain API MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.