AppTail – ASO & Keyword Research
Server Details
App Store keyword rankings, competitors, markets, reviews and analytics for iOS apps, from your AI.
- Status
- Healthy
- Uptime
- 100.0% over the last 24 hours
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- ChatGPT
- AppTail
- Claude
- AppTail – ASO & Keyword Research
TDQS
Scored across 25 tools
Descriptions work hard to draw boundaries, e.g. get_keywords explicitly replaces deprecated tools and get_competitors is contrasted with get_landscape. Still, several read/report tools overlap conceptually (get_performance vs get_signals vs explain_period; get_market vs get_landscape vs get_competitors), so an agent could occasionally hesitate between them.
Every tool follows a clean verb_noun snake_case pattern (add_app, get_keywords, remove_competitors, save_market, tag_keywords). No mixing of conventions or vague verbs across the set.
25 tools sits at the heavy end for a single server, and the surface spans many subdomains (apps, keywords, markets, competitors, reviews, performance, charts, signals). Each tool is justified by domain breadth, but the set is large enough to be borderline.
Strong lifecycle coverage: apps, competitors, keywords and markets each have add/remove/read, reviews have read/reply, plus discovery, signals, charts and performance. Minor gaps like no remove_app/update_app keep it just short of full coverage.
Available Tools
25 toolsadd_appAdd AppAInspect
Add an app to the account as one of the user's own. Takes an Apptail app_id, an App Store URL, or a name — resolved and imported the way search_apps does. Tracking starts immediately (rankings, reviews, competitors); measured downloads and proceeds still require connecting App Store Connect in the console, which cannot be done from here.
Inputs: app (required), country, dry_run. Returns: app, note, status, country, +4 more
add_competitorsAdd CompetitorsAInspect
Track one or more rival apps against one of YOUR apps. Each competitor can be given as an Apptail app_id, an App Store URL, or just a name — names and URLs are resolved and imported the way search_apps does, so you do NOT need to look up an app_id first. Returns one outcome per item: what was added, what was already tracked, and what a plan limit refused.
Inputs: app_id (required), competitors (required), country, dry_run. Returns: app_id, dry_run, outcomes, remaining, +2 more
add_keywordsAdd KeywordsAInspect
Start tracking search terms for one of your apps, in one storefront. Send terms, or keyword_ids for suggestions returned by discover_keywords — a suggestion MUST be added by id, because re-resolving its term can land on a different keyword row. Counts against the plan's per-app keyword limit; dry_run reports what would happen without writing anything. Terms already in the corpus come back under already_tracked rather than as an error — that is the state the caller asked for.
Inputs: app_id (required), country (required), dry_run, keywords, +1 more. Returns: added, limit, app_id, country, +7 more
discover_keywordsDiscover KeywordsAInspect
Terms an app could be tracking but is not, merged from every source and each labelled with where it came from: what tracked competitors rank for, what the store's similar apps rank for, what those competitors put in their own titles and subtitles, what the store's own mining surfaced, and — reading the listing cold — what the app's own title, subtitle and description suggest. The last is the only source that works on an app added minutes ago; listing is the only one that can surface a phrase nobody has ranked for yet, and it offers a phrase only when two or more rivals publish it and Apple reports somebody searching it. Pass contains to also match terms already in AppTail's database. Already-tracked and already-dismissed terms are never returned. This is a list of candidates, not a measure of coverage: for how much of a niche's vocabulary the account is missing, and which holes matter most, call get_landscape and read term_gap. Discovery can persist shared suggested keyword records, cache generated suggestions, and queue background popularity collection. It does not add those terms to account tracking.
Inputs: app_id (required), limit, source, country, +1 more. Returns: count, total, app_id, country, +6 more
edit_market_corpusEdit Market CorpusADestructiveInspect
Add terms to one storefront's corpus, or take terms out of it. Add for a term the corpus SHOULD hold and does not — a rival's brand, a phrase Apple has never measured the popularity of, the term a thin storefront is really about; a pinned term is kept through every rebuild and refreshed on the same 72-hour cadence as the rest. Remove for a term that does not belong: ANY term can go, and one the heuristic found is also kept out of future rebuilds rather than returning within 72 hours. This is NOT save_market: seeds are what the corpus is expanded FROM and changing one re-runs the whole heuristic over that storefront, where these two writes act on single terms in the result.
Inputs: country (required), market_id (required), add, remove. Returns: cap, terms, pinned, caveats, +8 more
explain_periodExplain PeriodARead-onlyInspect
Return an account or owned-app summary for a requested period: available measured App Store Connect performance, storefront changes, tracked keyword movements, recorded signals, review volume and the last sent digest. Returns comparison data, coverage and caveats identifying unavailable sections. Reads account data without changing tracking or publishing content.
Inputs: to, from, app_id, period, +2 more. Returns: digest, window, app_ids, caveats, +6 more
get_accountGet AccountARead-onlyInspect
The account: its apps with Apptail ids, its plan and the limits that can refuse a write, App Store Connect health per app, how fresh the first-party data is, and the storefronts it focuses on. Call this first whenever the request is about "my app" or "my keywords" — every other tool needs an app_id, and the focus countries and hidden apps here are what keep your answer agreeing with what the customer sees in the console.
Inputs: include_hidden, include_competitors. Returns: apps, plan, count, connection, +2 more
get_appGet AppARead-onlyInspect
Everything AppTail holds about one app, at the depth you ask for. The base answer is the store listing in one storefront — the localised title and subtitle a shopper in country actually reads, the price and its currency, version, category, release dates, the publisher's ids. include adds sections: prices (what it costs in every storefront), ratings (every storefront's rating and vote count, pooled honestly, plus a daily series and per-storefront movement with history_days), charts (the charts it currently ranks in), popularity (organic reach), developer (the publisher and its portfolio), versions (release cadence) and screenshots. Works for ANY app in the store, not only the user's own. It does NOT return impressions, downloads or revenue — get_performance does, and only for the user's own connected apps.
Inputs: app_id (required), country, include, history_days. Returns: icon, name, tier, price, +33 more
get_competitorsGet CompetitorsAInspect
List tracked competitor apps for one of your apps, with how many more the plan allows — and suggested: up to ten rivals the account does not track yet, ranked by how many of the app's own search terms they sit in the top ten for. Works on an app with no keywords: its listing is read for terms and the store is crawled for them. Read suggested_basis.terms_pending before calling a short list complete. Suggestions can persist shared keyword records and queue background crawls. Suggested apps are not added to your competitor watchlist.
Inputs: app_id (required). Returns: count, limit, app_id, remaining, +3 more
get_keywordsGet KeywordsARead-onlyInspect
The account's tracked keywords for an app — or across the whole portfolio — over any window: where each term ranked at the start and end, how far it moved, how many days it held and how many days it was measured, and optionally its day-by-day history, the same terms measured for named competitors, Search Visibility (a 0–100 score per storefront with the terms that moved it), and the terms two of your own apps are both on. Sorted worst movement first by default, so "what dropped" is at the top of a 300-term corpus — which also makes the returned rows a selection rather than a sample: movers and coverage are counted over the whole corpus and are what a summary comes from. Filter by contains to ask about one term by name. This is the tool for every question about tracked terms; it replaces get_tracked_keywords, get_keyword_positions and compare_keyword_positions.
Inputs: to, from, sort, limit, +9 more. Returns: sort, count, scope, total, +12 more
get_keyword_serpGet Keyword SerpAInspect
The App Store search results for one term in one storefront, on one day: who ranked, in what order, with their names, subtitles and ratings. This is how you find out WHO took the places an app lost — a rank that fell is a fact, and the results page on the day it fell is the reason. Works for ANY term in the store, tracked or not, known to us or not: pass keyword_id for a term you already have an id for, or keyword + country for words a user typed, which resolves the term and crawls the storefront live when what we hold is over a day old. Omit the date for the most recent crawl. A lookup can persist a new shared keyword record and queue a background crawl that updates stored search observations. It does not track the keyword for your account.
Inputs: date, limit, country, keyword, +1 more. Returns: apps, date, count, country, +9 more
get_landscapeGet LandscapeARead-onlyInspect
Who the App Store shows beside one of your apps for the terms it competes on, in one storefront: every app in the niche with how many of your terms it ranks for and owns the top 10 for, its ratings, its review flow and its size, plus which apps arrived or fell out this window — and term_gap, how much of the niche's own vocabulary you do not track yet, with the biggest holes ready for add_keywords. This is the niche, not your watchlist: most rows are apps nobody added, and get_competitors answers the other question.
Inputs: app_id (required), to, from, period, +1 more. Returns: count, terms, total, app_id, +10 more
get_marketGet MarketAInspect
Read iOS App Store niche data by saved market_id or by query and countries. Returns storefront competition, search visibility, app membership and optional corpus or movement data. Phrase research can create shared keyword records and persist crawled search observations; it does not save an account market. Downloads and revenue are labelled third-party rolling 30-day estimates. Reports per-storefront values, coverage and caveats.
Inputs: to, from, query, store, +7 more. Returns: apps, left, name, slug, +32 more
get_performanceGet PerformanceARead-onlyInspect
Read measured App Store Connect impressions, store views, downloads, sales and proceeds for apps connected to the authenticated account. Supports an owned app or portfolio, documented time windows, period comparisons and breakdowns by storefront or traffic source. Returns the actual reporting window, connection coverage and caveats. Does not provide private analytics for apps outside the account.
Inputs: to, from, grain, scope, +5 more. Returns: apps, grain, scope, split, +12 more
get_reviewsGet ReviewsARead-onlyInspect
Reviews for any app over a window, filtered by storefront, star rating, text, or whether the developer has replied — plus the shape of the period: how many arrived per bucket, what they averaged, and where the app's pooled store rating stood while they did. Reviews exist for every app whether or not App Store Connect is connected, because they are read from the public store. This is the tool for "what are people complaining about": filter it and read the reviews yourself rather than asking for a summary. Every review says whether it can be answered (can_reply) and where an existing reply stands (reply_state); reply_to_reviews is what answers them.
Inputs: app_id (required), to, from, limit, +5 more. Returns: count, total, trend, app_id, +9 more
get_signalsGet SignalsARead-onlyInspect
What actually happened, from the record the product keeps: rank moves on tracked terms, chart entries, review spikes, competitor releases and price changes, plus — for the user's own apps only — week-over-week traffic and conversion shifts, download collapses, new reviews and rating moves. Each carries the two numbers behind it and the sentence that states the finding. This is a stored table read, not a reconstruction, so it is both cheaper and more reliable than diffing rank histories yourself. Covers the user's own apps and the competitors tracked under them; a rival's finding never asks_action.
Inputs: to, from, limit, types, +4 more. Returns: count, total, digest, window, +5 more
get_top_chartsGet Top ChartsCRead-onlyInspect
Get top app charts (free, paid, or grossing) for a store, country, and category.
Inputs: limit, store, country, category, +1 more. Returns: apps, count, country, chart_type
list_marketsList MarketsARead-onlyInspect
List markets saved by the authenticated account, including market ids, storefronts, competition ranges, app counts and observed changes for the requested period. Reads saved account configuration and market observations without creating, updating or deleting markets. Returned ids can be used with get_market.
Inputs: to, from, period. Returns: count, limit, window, markets
remove_competitorsRemove CompetitorsADestructiveIdempotentInspect
Remove one or more competitor tracking relationships for an app owned by the authenticated account. Accepts AppTail app ids, App Store URLs or names. Name and URL resolution can query the public App Store and import shared app records. Removes the selected pairing only; public apps and pairings for other apps remain. Requires write authorisation and returns one outcome per item.
Inputs: app_id (required), competitors (required). Returns: app_id, outcomes, remaining, removed_count, +1 more
remove_keywordsRemove KeywordsADestructiveIdempotentInspect
Remove tracked keywords from an app. Frees the slots against the plan limit; position history is kept, so re-adding a term later does not start from nothing.
Inputs: app_id (required), keyword_ids (required). Returns: app_id, remaining, removed_count, requested_count
remove_marketRemove MarketADestructiveInspect
Delete a saved market, or just one of its storefronts. Pass store to drop a single storefront and leave the rest of the market with its corpora and its build clocks untouched; omit it to delete the whole market. Deleting frees a slot on the account's plan. The terms themselves are not deleted — they are shared with any other market or tracked app using them.
Inputs: market_id (required), store. Returns: name, deleted, market_id, markets_remaining, +2 more
reply_to_reviewsReply To ReviewsADestructiveInspect
Create, update or remove public App Store review responses for apps owned by the authenticated account, using its connected App Store Connect API key. Requires write authorisation and eligible review ids. Submitted text is sent verbatim under the developer's name. Obtain approval for the exact text or requested removal before submitting. dry_run validates without publication. Accepts up to ten items and returns per-item outcomes; pending means Apple has accepted a response but has not published it.
Inputs: replies (required), dry_run. Returns: dry_run, outcomes, max_items, failed_count, +3 more
save_marketSave MarketADestructiveInspect
Create or update a saved market in the authenticated account from a query, countries and optional per-storefront seed terms. An existing name updates that market, adding storefronts or replacing seed configuration and rebuilding requested storefronts. Persists account configuration and queues background corpus collection using public App Store data. Requires write authorisation. Returns market_id, build status, affected storefronts and caveats; collection may still be pending.
Inputs: query (required), countries (required), name, seeds. Returns: name, slug, status, caveats, +5 more
search_appsSearch AppsAInspect
Search for iOS apps by name, bundle ID, or App Store URL. Supports all languages including Cyrillic, Chinese, etc. If the app is not in our database, it will be fetched from the App Store, persisted as a shared public app record, and queued for enrichment. This does not add the app to your account or competitor watchlist. Auto-detects the likely App Store region from the query language (e.g. Cyrillic → Russia, Chinese → China). To add what you find, add_competitors and add_app take the same name or URL directly — you do not have to look up an app_id first.
Inputs: query (required), limit, country. Returns: apps, hint, note, count, +2 more
tag_keywordsTag KeywordsADestructiveInspect
Put tracked keywords under a tag, in bulk — or clear their tag — and/or say whether they are brand terms for Search Visibility. The tag is named, not looked up: a name that does not exist yet is created. A keyword carries at most one tag, so assigning replaces whatever it had. brand is separate from tags: own (your app's name) and competitor (a rival's name) leave the terms out of the visibility score, none counts them whatever detection says, auto hands them back to detection. Send brand without tag to change only that — the tags stay as they are. This is the tool for organising a large corpus after reading it with get_keywords, which is drudgery in the console and one call here.
Inputs: app_id (required), keyword_ids (required), tag, brand, +1 more. Returns: tag, tags, brand, action, +6 more
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
Related MCP Connectors
ASO for your AI: keywords, rankings, competitors and ads across 2.5M+ App Store apps.
App Store and Google Play keyword ranks, keyword research and competitors for your apps.
App Store Optimization data for AI agents: keyword ranks, scores, competitors, charts
App Store & Google Play keyword ranks, rivals, reviews and AI visibility. Pro plan and above.
Related MCP Servers
- AlicenseBqualityBmaintenanceStorelift's MCP server lets Claude, ChatGPT, Cursor or any MCP client read your App Store and Google Play keyword ranks, rivals, reviews, store pages, charts and AI visibility from your Storelift workspace. The remote server is included on every plan, including Free (1 app, 25 keywords in each of 2 storefronts, no end date); the local server and public API come with Pro and Studio.85173 npm1MIT
- AlicenseNot gradedqualityAmaintenanceApp Store and Google Play ASO: keyword rankings, competitors, reviews, audits and an action queue.137AGPL 3.0
- AlicenseAqualityBmaintenanceConnects App Store and Google Play keyword data to AI assistants, enabling ASO tasks like rank tracking, keyword analysis, competitor visibility, and top charts through natural language.30334 npmMIT

AppmanAi MCPofficial
AlicenseNot gradedqualityCmaintenanceEnables AI assistants to query live App Store and Google Play data — keyword demand, rank history, top charts, competitor sets, reviews and ratings — across 100+ countries, directly inside a chat instead of a dashboard. Exposes 35 read-only tools covering app search, ASO keyword profiling, ranking trajectories, and worldwide market comparisons through a remote OAuth-authenticated endpoint.3MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.