App-store market intelligence for AI agents over MCP: competitor sets, studios, share-of-search, rank movement. Public endpoints, no API keys.
This server exhibits strong naming conventions and comprehensive parameter schemas across 15 tools. Tool names uniformly follow verb_noun patterns (search_apps, app_profile, create_watchlist, etc.), making intent clear. All tools have descriptions exceeding 20 characters; most are well-crafted and explain use cases. Input schemas use Zod with proper type constraints, enums, min/max bounds, and defaults. However, output schemas are not formally documented in the source, responses are constructed ad-hoc via helper functions (fullProfile, studioBoard, etc.), and their exact structure is inferred from implementation rather than declared. Parameter descriptions are consistently present and specific (e.g., 'ISO-2 storefront, e.g. US, TR, DE' for country). Error handling uses a guard() wrapper that returns ok/fail results, but recovery guidance is minimal, errors are often terse ('No app found for...') without actionable next steps. Destructive operations (delete_watchlist) exist but lack confirmation/dry-run patterns. No tool annotations (readOnlyHint, destructiveHint) are visible in registration. Composition is sound: tools chain naturally (search_apps → app_profile, create_watchlist → snapshot_watchlist → rank_movement) and output IDs/names needed for downstream calls. The server prioritizes practical app-store intelligence over API completeness.
Full normalized metadata for one app: pricing, rating, genre, release/update dates, description. Accepts an Apple track id or a bundle id.
Persist a named competitor set — focal app, rival apps, and the keywords that matter — so snapshot_watchlist can record rankings over time and rank_movement can report who's climbing. Stored locally as JSON.
Delete a saved watchlist and all its snapshots. Irreversible.
Public App Store screenshot URLs for one app from Apple's lookup endpoint. Use for lightweight design-reference discovery; screenshots are marketing assets, not complete in-app flows.
The competitive grid: for a set of keywords and a set of apps, where does every app rank on every keyword? Up to 10 keywords × 10 apps; searches are paced ~3s apart, so 10 keywords takes ~30s.
All saved watchlists with keyword/app/snapshot counts.
Output schemas not formally documented. Tool responses are constructed via helper functions (fullProfile, studioBoard, rowOf, etc.) but their exact structure is not declared in tool registration. LLMs cannot plan downstream calls or validate response structure without explicit output schema documentation.
Error handling lacks recovery guidance. The guard() wrapper catches errors and returns fail() with minimal context (e.g., 'No app found for...'). Errors should guide the LLM: 'Channel not found. Try search_channels()' or 'Rate limit hit. Retry after 30s.' Current errors are terse and don't suggest next steps.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 61 | 2026-07-28+ | v2 |
One-call landscape of a keyword's market: top apps, which studios dominate, free/paid mix, rating and concentration stats, genre mix, median app age.
Movement across a watchlist's stored snapshots: per-keyword rank series for every tracked app, latest deltas (positive = climbed toward #1), best mover, biggest slip, and top-10 churn. Reads local snapshots only — no network calls.
App Store search results for a term, in Apple's rank order. The raw primitive — for competitive questions prefer share_of_search or market_map.
Who owns an App Store keyword: the top-50 apps returned for a search term in rank order, plus which studios hold the most slots. Optionally flag a focus app and its competitors to see where they all sit.
Collect current rankings for every keyword in a watchlist and store a dated snapshot. Takes ~3s per keyword. Returns movement vs the previous snapshot.
A developer/studio's full App Store portfolio with totals: app count, ratings, genre mix, first/latest release. Accepts an Apple artist id (studio_id) or a name to search; ambiguous names return candidates to pick from.
What a studio shipped recently: new apps released and existing apps updated within a window. Good for spotting momentum or dormancy.
Find likely competitors for an app from its search neighborhood: probes the store with terms derived from the app's title and genre, scores apps that co-occur high in results. Runs up to 4 paced searches (~15s).
Apple's top-free or top-paid apps chart for a storefront (from the public marketing-tools feed; no rating data in this feed).
No tool annotations visible. The server does not use readOnlyHint, destructiveHint, or idempotentHint in tool registration. delete_watchlist is destructive ('Irreversible') but not marked with destructiveHint. All search/read tools lack readOnlyHint. This prevents MCP clients from applying correct safety policies.
Destructive operations lack confirmation or dry-run. delete_watchlist and snapshot_watchlist (which WRITE) have no confirmation step or preview. Agents can irreversibly delete user data without review. Consider a dry_run parameter or a separate confirm_delete_watchlist tool.
Parameter descriptions lack format guidance for some fields. The 'keywords' parameter in keyword_matrix and 'competitor_ids' in share_of_search accept arrays but don't specify if duplicates are allowed, what delimiter (if any) is expected, or order sensitivity. Descriptions should state: 'Array of unique keywords (case-insensitive), no duplicates.'
list_watchlists has a minimal description ('All saved watchlists with keyword/app/snapshot counts'). It doesn't explain why an agent would call it or what structure to expect from the response. Should state: 'Retrieve all previously created watchlists with metadata. Call this to see saved competitor-tracking sets before calling snapshot_watchlist or rank_movement.'