trysonar avatar

Sonar

trysonar/mcp

Connects Claude to Sonar's ASO (App Store Optimization) platform for mobile app intelligence. You get tools for keyword research across iOS and Android stores, rank tracking to monitor where apps place for specific search terms, and competitor analysis to see how other apps are positioned. Reach for this when you're optimizing app store listings, researching market opportunities for a mobile app, or need to pull ASO data into your workflow without switching to a separate dashboard. Saves you from manually checking app store rankings or exporting CSV files from traditional ASO tools when you want to integrate that data into broader analysis or decision making.

tools
79
auth
Secret needed
transport
STDIO, HTTP
env vars
2
last updated
Aug 17, 2026

Install

From registry metadata
$ npx add-mcp https://trysonar.app/mcp --name sonar --header 'Authorization: Bearer ${API_TOKEN}'

Run in your terminal. add-mcp asks which agents to add it to, then asks for each value it needs. Add -g to install it for every project.

Review the command, arguments and environment values before installing. MCP servers run with your local permissions.

Other ways

Claude Code

$ claude mcp add --transport http sonar https://trysonar.app/mcp --header 'Authorization: YOUR_AUTHORIZATION'

Run in your terminal. Add --scope user to make it available in every project.

Tools

Verified live · 79 tools

Verified live against the running server on Nov 6, 2026.

sonar_app_lookupLook up a single app by its store ID. Returns app metadata including name, developer, category, rating, reviews, installs (Android), and price. Works without an API key (free tier, limited daily use per IP). If the store is throttling, the result may be Sonar's stored copy: it...3 params

Look up a single app by its store ID. Returns app metadata including name, developer, category, rating, reviews, installs (Android), and price. Works without an API key (free tier, limited daily use per IP). If the store is throttling, the result may be Sonar's stored copy: it...

Parameters* required
countrystring
Market as an ISO 3166-1 alpha-2 code (e.g. "us", "gb", "de", "mt"). Any App Store storefront (175 countries) or Google Play market (145). Default "us".default: us
store*string
App store. "ios" for Apple App Store, "android" for Google Play.one of ios · android
store_id*string
Store-specific app identifier. iOS: bundle ID (e.g. "com.spotify.client") or numeric track ID (e.g. "324684580") — the `storeId` returned by sonar_app_search works as-is. Android: package name (e.g...
sonar_app_searchFind apps in the App Store or Google Play by keyword, e.g. to get an app's store ID before calling other tools. Returns `{ source, data }`: `data` is the matching apps, compact by default (store ID, name, subtitle, developer, category, icon, rating, rating count, price, store...5 params

Find apps in the App Store or Google Play by keyword, e.g. to get an app's store ID before calling other tools. Returns `{ source, data }`: `data` is the matching apps, compact by default (store ID, name, subtitle, developer, category, icon, rating, rating count, price, store...

Parameters* required
countrystring
Market as an ISO 3166-1 alpha-2 code (e.g. "us", "gb", "de", "mt"). Any App Store storefront (175 countries) or Google Play market (145). Default "us".default: us
fieldsstring
"compact" (default): rank, store, storeId, numericId, name, subtitle, developer, category, iconUrl, rating, reviews (rating count), installs (Android), price, currency (ISO code of price — store pr...one of compact · fulldefault: compact
numinteger
Number of results to return (1-50, default 10).default: 10
query*string
Search query (e.g. "meditation", "meal planner").
store*string
App store. "ios" for Apple App Store, "android" for Google Play.one of ios · android
sonar_app_aso_scoreCalculate an ASO (App Store Optimization) audit score (0-100) for an app. Returns the overall score plus an itemized breakdown of checks (title length, keyword usage, screenshots, ratings, etc.) so you can identify what to improve. Works without an API key (free tier, limited...3 params

Calculate an ASO (App Store Optimization) audit score (0-100) for an app. Returns the overall score plus an itemized breakdown of checks (title length, keyword usage, screenshots, ratings, etc.) so you can identify what to improve. Works without an API key (free tier, limited...

Parameters* required
countrystring
Market as an ISO 3166-1 alpha-2 code (e.g. "us", "gb", "de", "mt"). Any App Store storefront (175 countries) or Google Play market (145). Default "us".default: us
store*string
App store. "ios" for Apple App Store, "android" for Google Play.one of ios · android
store_id*string
Store-specific app identifier. iOS: bundle ID or numeric track ID — the `storeId` returned by sonar_app_search works as-is. Android: package name.
sonar_app_extract_keywordsExtract the most likely target keywords from an app's title and description, ranked by relevance. Useful for understanding what an app (yours or a competitor) is optimizing for. Works without an API key (free tier, limited daily use per IP).4 params

Extract the most likely target keywords from an app's title and description, ranked by relevance. Useful for understanding what an app (yours or a competitor) is optimizing for. Works without an API key (free tier, limited daily use per IP).

Parameters* required
countrystring
Market as an ISO 3166-1 alpha-2 code (e.g. "us", "gb", "de", "mt"). Any App Store storefront (175 countries) or Google Play market (145). Default "us".default: us
maxinteger
Maximum number of keywords to extract (1-50, default 20).default: 20
store*string
App store. "ios" for Apple App Store, "android" for Google Play.one of ios · android
store_id*string
Store-specific app identifier. iOS: bundle ID or numeric track ID — the `storeId` returned by sonar_app_search works as-is. Android: package name.
sonar_app_reviewsFetch user reviews for any app, live from the store (up to ~500 of the most recent or most helpful for the country). The star-rating filters and `limit` apply to that fetched window, so a narrow filter on a small app can return few or no reviews. Useful for sentiment analysis,...8 params

Fetch user reviews for any app, live from the store (up to ~500 of the most recent or most helpful for the country). The star-rating filters and `limit` apply to that fetched window, so a narrow filter on a small app can return few or no reviews. Useful for sentiment analysis,...

Parameters* required
countrystring
Market as an ISO 3166-1 alpha-2 code (e.g. "us", "gb", "de", "mt"). Any App Store storefront (175 countries) or Google Play market (145). Default "us".default: us
langstring
Android only: fetch one language feed (e.g. ar, fr). Omit to merge the market language plus en, es, fr, ar; coverage is not exhaustive.
limitinteger
Maximum number of reviews to return (1-200).
max_ratinginteger
Filter to reviews with a star rating <= this value (1-5).
min_ratinginteger
Filter to reviews with a star rating >= this value (1-5).
sortstring
Sort order. "recent" returns newest first, "helpful" returns most-voted first.one of recent · helpfuldefault: recent
store*string
App store. "ios" for Apple App Store, "android" for Google Play.one of ios · android
store_id*string
Store-specific app identifier. iOS: bundle ID or numeric track ID — the `storeId` returned by sonar_app_search works as-is. Android: package name.
sonar_app_revenueEstimate monthly revenue for an app, based on install counts, ratings, and category benchmarks. Returns the dollar estimate with its likely range (`monthly_range`), the install base it rests on (`installs`: estimate, low, high, source), a confidence grade (high/medium/low) wit...3 params

Estimate monthly revenue for an app, based on install counts, ratings, and category benchmarks. Returns the dollar estimate with its likely range (`monthly_range`), the install base it rests on (`installs`: estimate, low, high, source), a confidence grade (high/medium/low) wit...

Parameters* required
countrystring
Market as an ISO 3166-1 alpha-2 code (e.g. "us", "gb", "de", "mt"). Any App Store storefront (175 countries) or Google Play market (145). Default "us".default: us
store*string
App store. "ios" for Apple App Store, "android" for Google Play.one of ios · android
store_id*string
Store-specific app identifier. iOS: bundle ID or numeric track ID — the `storeId` returned by sonar_app_search works as-is. Android: package name.
sonar_keyword_searchResearch a keyword and related terms. Returns up to 10 rows — the seed keyword plus the store's top autocomplete suggestions — each with difficulty (0-100), popularity score, and results count. Use this to find keywords worth targeting; for metrics on terms you already know, s...3 params

Research a keyword and related terms. Returns up to 10 rows — the seed keyword plus the store's top autocomplete suggestions — each with difficulty (0-100), popularity score, and results count. Use this to find keywords worth targeting; for metrics on terms you already know, s...

Parameters* required
countrystring
One of Sonar's 72 keyword-research markets, as an ISO 3166-1 alpha-2 code (e.g. "us", "gb", "de", "jp", "br"). Keyword data isn't available for other storefronts. Default "us".default: us
query*string
Seed keyword to research (e.g. "meditation", "recipe app").
store*string
App store. "ios" for Apple App Store, "android" for Google Play.one of ios · android
sonar_keyword_metricsDifficulty + popularity for a specific keyword (or up to 25 in bulk). Use this when you already know which keywords you care about — costs 1 credit per keyword. Works without an API key for up to 5 keywords/day (free tier, per IP); an API key removes that cap. Use sonar_keywor...4 params

Difficulty + popularity for a specific keyword (or up to 25 in bulk). Use this when you already know which keywords you care about — costs 1 credit per keyword. Works without an API key for up to 5 keywords/day (free tier, per IP); an API key removes that cap. Use sonar_keywor...

Parameters* required
countrystring
One of Sonar's 72 keyword-research markets, as an ISO 3166-1 alpha-2 code (e.g. "us", "gb", "de", "jp", "br"). Keyword data isn't available for other storefronts. Default "us".default: us
keywordstring
Single keyword to fetch metrics for. Use this OR `keywords`, not both.
keywordsarray
Bulk list of keywords to fetch metrics for (max 25). Use this OR `keyword`, not both. 1 credit per keyword.
store*string
App store. "ios" for Apple App Store, "android" for Google Play.one of ios · android
sonar_keyword_suggestionsGet autocomplete suggestions for a seed keyword from the App Store or Google Play, in the order the store shows them. List position is the only demand signal: the `priority` field is 0 on Google Play and currently 0 on the App Store as well. Lighter and faster than sonar_keywo...3 params

Get autocomplete suggestions for a seed keyword from the App Store or Google Play, in the order the store shows them. List position is the only demand signal: the `priority` field is 0 on Google Play and currently 0 on the App Store as well. Lighter and faster than sonar_keywo...

Parameters* required
countrystring
Market as an ISO 3166-1 alpha-2 code (e.g. "us", "gb", "de", "mt"). Nearly every App Store storefront and Google Play market works; the few small storefronts that are not supported return an error...default: us
seed*string
Seed keyword. The store will return autocomplete suggestions starting from this term.
store*string
App store. "ios" for Apple App Store, "android" for Google Play.one of ios · android
sonar_top_chartsGet a store top chart (free / paid / grossing, overall or by category) with day-over-day movement: per-app rank delta, apps new to the chart, biggest movers and apps that dropped out. Use to see what's rising in a market or category. Note: summary, movers and droppedApps alway...6 params

Get a store top chart (free / paid / grossing, overall or by category) with day-over-day movement: per-app rank delta, apps new to the chart, biggest movers and apps that dropped out. Use to see what's rising in a market or category. Note: summary, movers and droppedApps alway...

Parameters* required
categorystring
Category key; keys differ by store (e.g. iOS "SOCIAL_NETWORKING" / "GAMES", Android "SOCIAL" / "GAME"; "HEALTH_AND_FITNESS" exists on both). An unknown key is rejected with an error. Use "overall"...default: overall
chartstring
Chart type: "free", "paid" or "grossing". Default "free".one of free · paid · grossingdefault: free
countrystring
Market as an ISO 3166-1 alpha-2 code (e.g. "us", "gb", "de", "mt"). Nearly every App Store storefront and Google Play market works; the few small storefronts that are not supported return an error...default: us
fieldsstring
"compact" (default): each app is storeId, name, developer, rating, rank, delta, isNew (movers: rank + delta; droppedApps: previousRank) — about 60% smaller. "full": adds iconUrl and numericId to ev...one of compact · fulldefault: compact
limitinteger
Number of chart entries to return (1-200). Default 50.default: 50
store*string
App store. "ios" for Apple App Store, "android" for Google Play.one of ios · android
sonar_list_appsList the apps tracked in the caller's Sonar workspace (own apps + competitors), each with its latest snapshot (rating, review count, version, installs). Returns the Sonar app UUIDs needed by sonar_get_app, sonar_app_keywords, sonar_app_rankings, and sonar_app_changes. Cursor-p...2 params

List the apps tracked in the caller's Sonar workspace (own apps + competitors), each with its latest snapshot (rating, review count, version, installs). Returns the Sonar app UUIDs needed by sonar_get_app, sonar_app_keywords, sonar_app_rankings, and sonar_app_changes. Cursor-p...

Parameters* required
cursorstring
Pagination cursor from a previous call's `next_cursor`. Omit for the first page.
limitinteger
Page size (1-200). Server default applies when omitted.
sonar_get_appGet details for one tracked app in the caller's Sonar workspace: store metadata plus daily snapshots of rating, review count, version, and installs. Compact by default (listing basics + the 7 newest snapshots); pass fields: "full" for the description, screenshots, release note...2 params

Get details for one tracked app in the caller's Sonar workspace: store metadata plus daily snapshots of rating, review count, version, and installs. Compact by default (listing basics + the 7 newest snapshots); pass fields: "full" for the description, screenshots, release note...

Parameters* required
app_id*string
Sonar app UUID — the `id` returned by sonar_list_apps or sonar_create_product. NOT a store id.
fieldsstring
"compact" (default): identity plus the listing basics in `metadata` (numericId, subtitle, url, rating, reviews, installs, price, currency, free, offersIAP, iapRange, version, released, updated, con...one of compact · fulldefault: compact
sonar_app_keywordsList the keywords tracked for an app in the caller's Sonar workspace, with latest difficulty, popularity, results count, note, and starred_at (favorite/target marker) per keyword. Returns the tracked-keyword ids used by sonar_update_keyword_note and sonar_star_keyword, and the...3 params

List the keywords tracked for an app in the caller's Sonar workspace, with latest difficulty, popularity, results count, note, and starred_at (favorite/target marker) per keyword. Returns the tracked-keyword ids used by sonar_update_keyword_note and sonar_star_keyword, and the...

Parameters* required
app_id*string
Sonar app UUID — the `id` returned by sonar_list_apps or sonar_create_product. NOT a store id.
cursorstring
Pagination cursor from a previous call's `next_cursor`. Omit for the first page.
limitinteger
Page size (1-200). Server default applies when omitted.
sonar_app_rankingsRank history for an app's tracked keywords over the requested window. Compact by default: each keyword's current rank and status, best rank, positions gained and a newest-first daily `ranks` list (a rank, "unranked" = checked but not found, null = no check that day). Pass fiel...6 params

Rank history for an app's tracked keywords over the requested window. Compact by default: each keyword's current rank and status, best rank, positions gained and a newest-first daily `ranks` list (a rank, "unranked" = checked but not found, null = no check that day). Pass fiel...

Parameters* required
app_id*string
Sonar app UUID — the `id` returned by sonar_list_apps or sonar_create_product. NOT a store id.
cursorstring
Pagination cursor from a previous call's `next_cursor`. Omit for the first page.
daysinteger
History window in days (1-365). Default 30.
fieldsstring
"compact" (default): per keyword: rank + status + measured_at (latest day with a completed check or recorded rank), best_rank, positions_gained (oldest ranked day in the window minus the current ra...one of compact · fulldefault: compact
keyword_idstring
Restrict to one keyword — a keyword_id from sonar_app_keywords. Omit for all tracked keywords.
limitinteger
Page size (1-200). Server default applies when omitted.
sonar_app_changesChange history for a tracked app — detected releases, metadata edits, screenshot swaps, price changes, category moves, iOS product page header swaps (`header`: data.action added/changed/removed + header artwork) and newly listed iOS In-App Events (`in_app_event`: title, kind,...3 params

Change history for a tracked app — detected releases, metadata edits, screenshot swaps, price changes, category moves, iOS product page header swaps (`header`: data.action added/changed/removed + header artwork) and newly listed iOS In-App Events (`in_app_event`: title, kind,...

Parameters* required
app_id*string
Sonar app UUID — the `id` returned by sonar_list_apps or sonar_create_product. NOT a store id.
limitinteger
Max changes to return (1-200). Default 50.
typestring
Filter to one change type. Omit for all types.one of release · metadata · screenshots · price · category · header
sonar_keyword_rankingsSERP history for one tracked keyword — which apps ranked in the top results on each measured day, newest first (compact by default: no icon URLs; fields: "full" adds them). Use this to see who competes on a keyword and how the top spots shifted over time. The keyword must be t...3 params

SERP history for one tracked keyword — which apps ranked in the top results on each measured day, newest first (compact by default: no icon URLs; fields: "full" adds them). Use this to see who competes on a keyword and how the top spots shifted over time. The keyword must be t...

Parameters* required
daysinteger
History window in days (1-365). Default 30.
fieldsstring
"compact" (default): each entry is rank, store_id, app_name, measured_at, outlier — about half the size. "full": adds app_icon_url to every entry (one icon URL per app per day).one of compact · fulldefault: compact
keyword_id*string
Sonar keyword UUID — a `keyword_id` from sonar_app_keywords or sonar_competitor_keywords. NOT the keyword text.
sonar_competitor_keywordsKeywords a tracked competitor currently ranks for (last 7 days of SERP data), with difficulty and popularity per keyword. Pass own_app_id for gap analysis: keywords where the competitor ranks but your app doesn't are marked gap=missing. Cursor-paginated (default 50 per page)....4 params

Keywords a tracked competitor currently ranks for (last 7 days of SERP data), with difficulty and popularity per keyword. Pass own_app_id for gap analysis: keywords where the competitor ranks but your app doesn't are marked gap=missing. Cursor-paginated (default 50 per page)....

Parameters* required
competitor_app_id*string
Sonar app UUID of the competitor — the `competitor.id` from sonar_track_competitor, or an `id` from sonar_list_apps where is_own is false. NOT a store id.
cursorstring
Pagination cursor from a previous call's `next_cursor`. Omit for the first page.
limitinteger
Page size (1-200). Server default applies when omitted.
own_app_idstring
Sonar app UUID of your own app. When set, each keyword includes your current rank and a gap marker for keywords you don't rank for.
sonar_competitor_landscapeThe full competitive keyword picture for one of your own apps vs every tracked competitor, in one call: live stats (keyword gaps where competitors rank and you don't, winnable gaps, competitors climbing on your tracked keywords, keywords you lead), the top gap/threat/lead rows...1 params

The full competitive keyword picture for one of your own apps vs every tracked competitor, in one call: live stats (keyword gaps where competitors rank and you don't, winnable gaps, competitors climbing on your tracked keywords, keywords you lead), the top gap/threat/lead rows...

Parameters* required
app_id*string
Sonar app UUID of YOUR OWN tracked app (an `id` from sonar_list_apps where is_own is true). NOT a store id, NOT a competitor id.
sonar_list_productsList every product in your workspace (unpaginated): each product's id, name, country, competitor count, and its linked store versions (Sonar app id, store, store_id, name). Product ids are what sonar_track_app, sonar_track_competitor, sonar_remove_competitor, sonar_delete_prod...

List every product in your workspace (unpaginated): each product's id, name, country, competitor count, and its linked store versions (Sonar app id, store, store_id, name). Product ids are what sonar_track_app, sonar_track_competitor, sonar_remove_competitor, sonar_delete_prod...

No parameters. Call it with no arguments.

sonar_list_alertsList your alert subscriptions — each rule defines a change type (rank drops, review spikes, etc.), its scope (a specific app or org-wide), threshold, and whether it's enabled. Requires an Indie plan (trial counts).

List your alert subscriptions — each rule defines a change type (rank drops, review spikes, etc.), its scope (a specific app or org-wide), threshold, and whether it's enabled. Requires an Indie plan (trial counts).

No parameters. Call it with no arguments.

sonar_alert_eventsThe detected alert events for your workspace, newest first — the same feed as the in-app Recent Alerts panel and the email digest: rank drops/gains, top-10 entries/exits, new rankings, rating drops, review spikes, and competitor changes, each with a type-specific payload (app/...4 params

The detected alert events for your workspace, newest first — the same feed as the in-app Recent Alerts panel and the email digest: rank drops/gains, top-10 entries/exits, new rankings, rating drops, review spikes, and competitor changes, each with a type-specific payload (app/...

Parameters* required
app_idstring
Filter to events about one tracked app (Sonar app UUID or store id).
limitinteger
Max events to return (1-200). Default 50.
sincestring
Only events created at/after this ISO 8601 timestamp (e.g. "2026-08-01T00:00:00Z"). Use your last poll time to fetch only new events.
typestring
Filter to one alert type. Omit for all types.one of rank_drop · rank_gain · entered_top10 · left_top10 · new_ranking · rating_drop
sonar_app_overviewThe dashboard's computed scoreboard for one of your apps in a single call: visibility index and share of voice (with 7-day deltas and a daily spark), ranked / top-10 keyword counts with movement, best rank, the biggest 7-day improvements and drops, the rank-distribution trend,...2 params

The dashboard's computed scoreboard for one of your apps in a single call: visibility index and share of voice (with 7-day deltas and a daily spark), ranked / top-10 keyword counts with movement, best rank, the biggest 7-day improvements and drops, the rank-distribution trend,...

Parameters* required
app_id*string
Sonar app UUID of one of your own tracked apps — the `id` returned by sonar_list_apps or sonar_create_product. NOT a store id.
daysinteger
Rank-history window in days (7-90). Default 30.
sonar_discovered_keywordsKeywords Sonar's discovery engine surfaced for one of your tracked apps but that aren't tracked yet — ranked finds (the app already ranks, unnoticed), competitor gaps, and AI/autocomplete-sourced ideas — each with popularity, difficulty, AI relevance, and an opportunity score...9 params

Keywords Sonar's discovery engine surfaced for one of your tracked apps but that aren't tracked yet — ranked finds (the app already ranks, unnoticed), competitor gaps, and AI/autocomplete-sourced ideas — each with popularity, difficulty, AI relevance, and an opportunity score...

Parameters* required
app_id*string
Sonar app UUID of one of your tracked apps — the `id` returned by sonar_list_apps or sonar_create_product. NOT a store id.
bucketstring
Filter by classification: "ranked" = the app already ranks for it, "gap" = a competitor ranks but the app does not, "idea" = verified research suggestion with no rank evidence yet. Omit for all.one of ranked · gap · idea
countrystring
Filter to one market (ISO country code). Omit for all markets.
fieldsstring
"compact" (default): keyword_id, keyword, country, rank, source, status, bucket, the four popularity fields, difficulty, ai_relevance, opportunity, competitor_rank, competitor_name. "full": adds th...one of compact · fulldefault: compact
limitinteger
Max rows to return (1-500). Default 200.
min_opportunityinteger
Only rows with an opportunity score at or above this value (0-100).
min_relevanceinteger
Only rows with AI relevance at or above this value (0-100).
sourcestring
Filter by how the keyword was discovered. Omit for all sources.one of autocomplete · metadata · serp_scan · competitor · apple_ads · ai
statusstring
Filter by row status. Default "new" — the still-actionable suggestions; "all" includes rows already tracked or hidden.one of new · tracked · hidden · all
sonar_review_insightsThe latest AI review analysis for a tracked app (your own or a competitor): what users praise and complain about as named themes with frequency, verbatim quotes, and trend movement (new / persisting / growing / improving / resolved), plus overall sentiment, surfaced feature re...2 params

The latest AI review analysis for a tracked app (your own or a competitor): what users praise and complain about as named themes with frequency, verbatim quotes, and trend movement (new / persisting / growing / improving / resolved), plus overall sentiment, surfaced feature re...

Parameters* required
app_id*string
Sonar app UUID of a tracked app — your own or a competitor (an `id` from sonar_list_apps). NOT a store id.
countrystring
Reviews market (ISO country code). Insights are generated per country. Default "us".default: us
sonar_review_responderThe review responder's configuration for an own iOS app: whether it is switched on, manual vs auto mode (auto posts AI replies after a delay, only for reviews written after auto was enabled and within the star range), the reply instructions, sign-off, reply language, last sync...1 params

The review responder's configuration for an own iOS app: whether it is switched on, manual vs auto mode (auto posts AI replies after a delay, only for reviews written after auto was enabled and within the star range), the reply instructions, sign-off, reply language, last sync...

Parameters* required
app_id*string
Sonar app UUID of one of your own iOS apps (an `id` from sonar_list_apps). NOT a store id.
sonar_review_inboxAn own iOS app's App Store reviews (synced from App Store Connect every 5 minutes) with their reply state: the AI draft or your text, English translations of non-English reviews and drafts, hold reasons (needs_human, quota, daily_cap), schedule time, and any live App Store res...7 params

An own iOS app's App Store reviews (synced from App Store Connect every 5 minutes) with their reply state: the AI draft or your text, English translations of non-English reviews and drafts, hold reasons (needs_human, quota, daily_cap), schedule time, and any live App Store res...

Parameters* required
app_id*string
Sonar app UUID of one of your own iOS apps (an `id` from sonar_list_apps). NOT a store id.
countrystring
Only reviews from this storefront (ISO alpha-2).
cursorstring
next_cursor from the previous page.
languagestring
Only reviews in this language (ISO 639-1).
limitinteger
Page size, 1-100 (default 25).
ratinginteger
Only reviews with this star rating.
statusstring
needs_reply = no reply yet (incl. AI drafts waiting for approval, held and failed ones), scheduled = will post soon, replied = live or waiting for Apple (incl. replies made in App Store Connect), d...one of needs_reply · scheduled · replied · dismissed
sonar_portfolioThe whole portfolio's health in one call — for orgs managing many apps: per-app KPIs (visibility + 7-day delta, ranked/top-10 counts, net rank movement, rating, review count), org-wide totals, the biggest keyword movers in both directions, a needs-attention triage list (visibi...

The whole portfolio's health in one call — for orgs managing many apps: per-app KPIs (visibility + 7-day delta, ranked/top-10 counts, net rank movement, rating, review count), org-wide totals, the biggest keyword movers in both directions, a needs-attention triage list (visibi...

No parameters. Call it with no arguments.

sonar_app_salesApp Store Connect sales for one of your own iOS apps: daily first-time downloads, redownloads, in-app purchase units and approximate USD proceeds (`proceeds_usd_approx`, converted with a static FX table — present it as approximate), window totals, and a per-country breakdown s...5 params

App Store Connect sales for one of your own iOS apps: daily first-time downloads, redownloads, in-app purchase units and approximate USD proceeds (`proceeds_usd_approx`, converted with a static FX table — present it as approximate), window totals, and a per-country breakdown s...

Parameters* required
app_id*string
Sonar app UUID of one of your own tracked iOS apps — the `id` returned by sonar_list_apps or sonar_create_product. The app's store id (bundle id) also works; pass `store` if it exists in both stores.
daysinteger
Window length in days (1-366) when `start` is omitted. Default 30.
endstring
Last day of the window (YYYY-MM-DD, inclusive). Default yesterday (UTC) — Apple posts a day the next morning at the earliest.
startstring
First day of the window (YYYY-MM-DD, inclusive). Omit to count `days` back from `end`.
storestring
Only needed when `app_id` is a store id tracked in both stores. App Store Connect data is iOS-only.one of ios · android
sonar_app_engagementApp Store Connect App Analytics for one of your own iOS apps: the impressions → product page views → downloads funnel with conversion rates (`page_view_rate`, `download_rate`) and App Store search share, impressions by source (App Store search, browse, app referrer, web referr...5 params

App Store Connect App Analytics for one of your own iOS apps: the impressions → product page views → downloads funnel with conversion rates (`page_view_rate`, `download_rate`) and App Store search share, impressions by source (App Store search, browse, app referrer, web referr...

Parameters* required
app_id*string
Sonar app UUID of one of your own tracked iOS apps — the `id` returned by sonar_list_apps or sonar_create_product. The app's store id (bundle id) also works; pass `store` if it exists in both stores.
daysinteger
Window length in days (1-366) when `start` is omitted. Default 30.
endstring
Last day of the window (YYYY-MM-DD, inclusive). Default yesterday (UTC) — Apple posts a day the next morning at the earliest.
startstring
First day of the window (YYYY-MM-DD, inclusive). Omit to count `days` back from `end`.
storestring
Only needed when `app_id` is a store id tracked in both stores. App Store Connect data is iOS-only.one of ios · android
sonar_create_productWRITE tool — creates a product in the caller's Sonar workspace and starts tracking the given app(s). A product is the cross-store unit (one iOS + one Android app, or just one of either). Returns the product id and the Sonar app ids needed by sonar_track_keywords and sonar_trac...2 params

WRITE tool — creates a product in the caller's Sonar workspace and starts tracking the given app(s). A product is the cross-store unit (one iOS + one Android app, or just one of either). Returns the product id and the Sonar app ids needed by sonar_track_keywords and sonar_trac...

Parameters* required
apps*array
1-2 store versions: a single iOS or Android app, or one of each for a cross-store product.
namestring
Product name. Optional — defaults to the first app's name.
sonar_track_appWRITE tool — links the second-store version of an existing Sonar product (e.g. the product already tracks the iOS app and you want to add the Android version, or vice versa). Each product holds at most one iOS + one Android app; to start tracking a brand-new app, use sonar_cre...4 params

WRITE tool — links the second-store version of an existing Sonar product (e.g. the product already tracks the iOS app and you want to add the Android version, or vice versa). Each product holds at most one iOS + one Android app; to start tracking a brand-new app, use sonar_cre...

Parameters* required
countrystring
ISO 3166-1 alpha-2 country code (e.g. "us"). Optional — defaults server-side.
product_id*string
Sonar product UUID (from sonar_create_product). NOT a store id.
store*string
App store. "ios" for Apple App Store, "android" for Google Play.one of ios · android
store_id*string
Store-specific app identifier of the version to link. iOS: bundle ID or numeric track ID — the `storeId` returned by sonar_app_search works as-is. Android: package name.
sonar_track_competitorWRITE tool — adds a competitor app under a Sonar product so its keywords and rankings get tracked alongside the product's own app. The product must already have its own app linked in the same store as the competitor. Requires an Indie plan (trial counts) and an authorized Sona...4 params

WRITE tool — adds a competitor app under a Sonar product so its keywords and rankings get tracked alongside the product's own app. The product must already have its own app linked in the same store as the competitor. Requires an Indie plan (trial counts) and an authorized Sona...

Parameters* required
countrystring
ISO 3166-1 alpha-2 country code (e.g. "us"). Optional — defaults server-side.
product_id*string
Sonar product UUID (from sonar_create_product). NOT a store id.
store*string
App store. "ios" for Apple App Store, "android" for Google Play.one of ios · android
store_id*string
Store-specific app identifier of the COMPETITOR app to track. iOS: bundle ID or numeric track ID — the `storeId` returned by sonar_app_search works as-is. Android: package name.
sonar_track_keywordsWRITE tool — starts daily rank tracking for one or more keywords on an app in the caller's Sonar workspace. Idempotent: re-posting the same terms reports them as already_tracked instead of creating duplicates. Returns per-keyword outcomes (created / already_tracked / failed)....3 params

WRITE tool — starts daily rank tracking for one or more keywords on an app in the caller's Sonar workspace. Idempotent: re-posting the same terms reports them as already_tracked instead of creating duplicates. Returns per-keyword outcomes (created / already_tracked / failed)....

Parameters* required
app_id*string
Sonar app UUID — the `apps[].id` returned by sonar_create_product (or sonar_track_app). NOT a store id; the store is implied by the app.
countrystring
ISO 3166-1 alpha-2 country code (e.g. "us"). Optional — defaults to the product's country.
keywords*array
Keywords to start tracking (1-200). Duplicates and already-tracked terms are reported, not duplicated.
sonar_update_keyword_noteWRITE tool — sets or clears the note on a tracked keyword in the caller's Sonar workspace (e.g. why it's tracked, an optimization hypothesis, a reminder). Idempotent: re-sending the same note is a no-op. Requires an Indie plan (trial counts) and an authorized Sonar account or...2 params

WRITE tool — sets or clears the note on a tracked keyword in the caller's Sonar workspace (e.g. why it's tracked, an optimization hypothesis, a reminder). Idempotent: re-sending the same note is a no-op. Requires an Indie plan (trial counts) and an authorized Sonar account or...

Parameters* required
note*value
Note text (max 1000 chars). Pass null or an empty string to clear the note.
tracked_keyword_id*string
Tracked-keyword UUID — the `id` (not keyword_id) returned by sonar_app_keywords or sonar_track_keywords.
sonar_star_keywordWRITE tool — stars or unstars a tracked keyword in the caller's Sonar workspace. A star marks the keyword as a favorite/target the user is actively pursuing; starred keywords carry a starred_at timestamp in sonar_app_keywords results. Idempotent: re-starring refreshes the time...2 params

WRITE tool — stars or unstars a tracked keyword in the caller's Sonar workspace. A star marks the keyword as a favorite/target the user is actively pursuing; starred keywords carry a starred_at timestamp in sonar_app_keywords results. Idempotent: re-starring refreshes the time...

Parameters* required
starred*boolean
true to star the keyword (mark as a favorite/target), false to unstar.
tracked_keyword_id*string
Tracked-keyword UUID — the `id` (not keyword_id) returned by sonar_app_keywords or sonar_track_keywords.
sonar_scan_competitorWRITE tool — runs an AI keyword discovery scan on a tracked competitor: generates the search terms the competitor's listing is optimized for (brand terms included), queues them for SERP verification, and verifies the first batch inline (~30s), recording both apps' ranks. Retur...2 params

WRITE tool — runs an AI keyword discovery scan on a tracked competitor: generates the search terms the competitor's listing is optimized for (brand terms included), queues them for SERP verification, and verifies the first batch inline (~30s), recording both apps' ranks. Retur...

Parameters* required
competitor_app_id*string
Sonar app UUID of the competitor to scan — the `competitor.id` from sonar_track_competitor, or an `id` from sonar_list_apps where is_own is false. NOT a store id.
own_app_id*string
Sonar app UUID of your own app the scan compares against. The competitor must be linked to this app.
sonar_analyze_competitorsWRITE tool — generates a fresh AI competitive insight for one of your own apps: clusters the keyword gaps vs your competitors into named opportunity themes (with a why-now narrative and per-keyword metrics), writes threat narratives for competitors climbing on your keywords, a...1 params

WRITE tool — generates a fresh AI competitive insight for one of your own apps: clusters the keyword gaps vs your competitors into named opportunity themes (with a why-now narrative and per-keyword metrics), writes threat narratives for competitors climbing on your keywords, a...

Parameters* required
app_id*string
Sonar app UUID of YOUR OWN tracked app to analyze. NOT a store id, NOT a competitor id.
sonar_generate_review_insightsWRITE tool — generates a fresh AI review analysis for a tracked app from its recent reviews (praise/complaint themes, sentiment, feature requests, trend vs the previous run). At most one analysis per app+country every 90 days (429 with the next available time while in cooldown...2 params

WRITE tool — generates a fresh AI review analysis for a tracked app from its recent reviews (praise/complaint themes, sentiment, feature requests, trend vs the previous run). At most one analysis per app+country every 90 days (429 with the next available time while in cooldown...

Parameters* required
app_id*string
Sonar app UUID of a tracked app — your own or a competitor (an `id` from sonar_list_apps). NOT a store id.
countrystring
Reviews market (ISO country code). Insights are generated per country. Default "us".default: us
sonar_delete_tracked_keywordWRITE tool — stop tracking one keyword/app pair in the caller's Sonar workspace. Identify the pair by its tracked-keyword id (from sonar_app_keywords). Equivalent to sonar_untrack_keywords with a single id; that tool removes several (or all) of an app's keywords in one call. R...1 params

WRITE tool — stop tracking one keyword/app pair in the caller's Sonar workspace. Identify the pair by its tracked-keyword id (from sonar_app_keywords). Equivalent to sonar_untrack_keywords with a single id; that tool removes several (or all) of an app's keywords in one call. R...

Parameters* required
tracked_keyword_id*string
The tracked-keyword UUID — the `id` returned by sonar_app_keywords. NOT the keyword_id.
sonar_untrack_keywordsWRITE tool — bulk-untrack keywords for an app in the caller's Sonar workspace. Pass `all: true` to remove every tracked keyword, OR `ids: [...]` to remove specific ones (exactly one of the two). For a single keyword, sonar_delete_tracked_keyword is equivalent. Requires an Indi...3 params

WRITE tool — bulk-untrack keywords for an app in the caller's Sonar workspace. Pass `all: true` to remove every tracked keyword, OR `ids: [...]` to remove specific ones (exactly one of the two). For a single keyword, sonar_delete_tracked_keyword is equivalent. Requires an Indi...

Parameters* required
allboolean
Set true to untrack ALL keywords for the app. Mutually exclusive with `ids` — pass exactly one of `all` or `ids`.
app_id*string
Sonar app UUID — the `id` returned by sonar_list_apps or sonar_create_product. NOT a store id.
idsarray
Tracked-keyword ids to untrack (from sonar_app_keywords). Mutually exclusive with `all` — pass exactly one of `all` or `ids`.
sonar_untrack_appWRITE tool — untrack an app in the caller's Sonar workspace. Deletes the workspace's tracked keywords for it (with their notes and stars), its discovered keywords, and its competitor links, and detaches it from its product — deleting the product, and that product's screenshot...1 params

WRITE tool — untrack an app in the caller's Sonar workspace. Deletes the workspace's tracked keywords for it (with their notes and stars), its discovered keywords, and its competitor links, and detaches it from its product — deleting the product, and that product's screenshot...

Parameters* required
app_id*string
Sonar app UUID — the `id` returned by sonar_list_apps or sonar_create_product. NOT a store id.
sonar_delete_productWRITE tool — delete a product in the caller's Sonar workspace and untrack every app linked to it, with their tracked keywords, discovered keywords, and competitor links. The product's screenshot sets are deleted too. Shared store data (app metadata, snapshots, rank history) is...1 params

WRITE tool — delete a product in the caller's Sonar workspace and untrack every app linked to it, with their tracked keywords, discovered keywords, and competitor links. The product's screenshot sets are deleted too. Shared store data (app metadata, snapshots, rank history) is...

Parameters* required
product_id*string
Sonar product UUID — the `id` returned by sonar_list_products or sonar_create_product.
sonar_remove_competitorWRITE tool — remove a competitor from a product in the caller's Sonar workspace. Drops the competitor link under every own app of the product; if no other own app in the workspace still references the competitor, the competitor app is untracked as well. 404 when the product ha...2 params

WRITE tool — remove a competitor from a product in the caller's Sonar workspace. Drops the competitor link under every own app of the product; if no other own app in the workspace still references the competitor, the competitor app is untracked as well. 404 when the product ha...

Parameters* required
competitor_app_id*string
Sonar app UUID of the competitor to remove (the competitor's `id`, NOT a store id).
product_id*string
Sonar product UUID — the `id` returned by sonar_list_products or sonar_create_product.
sonar_set_alertWRITE tool — create or update an alert subscription in the caller's Sonar workspace. Upserts on (type + scope): re-submitting the same type/scope updates the existing rule. Omit `threshold` for the per-type default; omit `scope_app_id` for an org-wide rule. Requires an Indie p...6 params

WRITE tool — create or update an alert subscription in the caller's Sonar workspace. Upserts on (type + scope): re-submitting the same type/scope updates the existing rule. Omit `threshold` for the per-type default; omit `scope_app_id` for an org-wide rule. Requires an Indie p...

Parameters* required
cadencevalue
new_review only: email cadence. instant = within ~5 minutes of the review syncing, hourly = at most one email an hour, daily = the 08:30 UTC digest. Omit to keep the stored value (daily on create).
countriesvalue
top_chart only: storefronts to watch (ISO 3166-1 alpha-2, e.g. ["us", "de"]), max 10. Omit to keep the stored list; null or [] = the countries you track keywords in.
enabledboolean
Whether the rule is active. Defaults to enabled when omitted.
scope_app_idvalue
Limit the alert to a single app (Sonar app UUID). Omit or null for an org-wide rule covering all tracked apps.
thresholdvalue
Trigger threshold; omit or null for the default. rank_drop / rank_gain: positions moved (default 5). rating_drop: tenths of a star (default 2 = a 0.2-star drop). review_spike: new reviews since the...
type*string
The alert type to subscribe to. top_chart = one of your own apps entered or left a store top chart (overall + its category, free/paid/grossing). new_review = a new App Store review arrived for an o...one of rank_drop · rank_gain · entered_top10 · left_top10 · new_ranking · rating_drop
sonar_delete_alertWRITE tool — delete an alert subscription in the caller's Sonar workspace. Requires an Indie plan (trial counts) and an authorized Sonar account or an API key with the write scope.1 params

WRITE tool — delete an alert subscription in the caller's Sonar workspace. Requires an Indie plan (trial counts) and an authorized Sonar account or an API key with the write scope.

Parameters* required
id*string
The alert subscription UUID — the `id` returned by sonar_list_alerts or sonar_set_alert.
sonar_set_review_responderWRITE tool — switch the review responder on/off for an own iOS app and update its instructions or auto-mode policy (partial update; omitted fields keep their value). Turning auto mode on only affects reviews written afterwards; anything the AI flags as needing a human is held....10 params

WRITE tool — switch the review responder on/off for an own iOS app and update its instructions or auto-mode policy (partial update; omitted fields keep their value). Turning auto mode on only affects reviews written afterwards; anything the AI flags as needing a human is held....

Parameters* required
app_id*string
Sonar app UUID of one of your own iOS apps (an `id` from sonar_list_apps). NOT a store id.
auto_daily_capinteger
Auto mode: max auto replies per app per day (default 50).
auto_delay_minutesinteger
Auto mode: minutes before posting (default 5).
auto_max_ratinginteger
Auto mode: highest star rating to auto-reply to (default 5).
auto_min_ratinginteger
Auto mode: lowest star rating to auto-reply to (default 4).
enabledboolean
Switch the responder on (starts the review backfill) or off.
instructionsstring
Instructions for the AI: tone, support contact, product facts, known issues and fixes.
modestring
manual = every reply waits for approval; auto = AI replies post automatically after auto_delay_minutes.one of manual · auto
reply_languagestring
review = reply in the reviewer's language (default); en = always English.one of review · en
sign_offvalue
Sign-off appended to every reply (null clears it).
sonar_draft_review_replyWRITE tool — write a fresh AI reply draft for a review using the app's instructions (and an optional hint), with English translations. Counts against the monthly AI-draft allowance, then 1 credit per draft. Never posts. Tip: agents can skip this and write the reply themselves...2 params

WRITE tool — write a fresh AI reply draft for a review using the app's instructions (and an optional hint), with English translations. Counts against the monthly AI-draft allowance, then 1 credit per draft. Never posts. Tip: agents can skip this and write the reply themselves...

Parameters* required
hintstring
One-off direction for this draft, e.g. "mention the fix in 2.1".
review_id*string
Sonar review id (the `id` of an item from sonar_review_inbox — not Apple's review id).
sonar_update_review_replyWRITE tool — replace a review's reply text (not metered, doesn't post). Use sonar_post_review_reply to publish. Requires an Indie plan (trial counts) and an authorized Sonar account or an API key with the write scope.3 params

WRITE tool — replace a review's reply text (not metered, doesn't post). Use sonar_post_review_reply to publish. Requires an Indie plan (trial counts) and an authorized Sonar account or an API key with the write scope.

Parameters* required
body*string
The reply text.
review_id*string
Sonar review id (the `id` of an item from sonar_review_inbox — not Apple's review id).
translate_from_englishboolean
true = body is English; store its translation into the reviewer's language (keeps the English copy).
sonar_post_review_replyWRITE tool — PUBLIC ACTION: publishes the reply on the App Store under the developer's name (now, or after delay_minutes). Overwrites an existing response (Apple keeps one per review and marks it edited). Apple shows it within ~24h: status pending_publish, then published. Need...3 params

WRITE tool — PUBLIC ACTION: publishes the reply on the App Store under the developer's name (now, or after delay_minutes). Overwrites an existing response (Apple keeps one per review and marks it edited). Apple shows it within ~24h: status pending_publish, then published. Need...

Parameters* required
bodystring
Replace the reply text before posting. Omit to post the current draft.
delay_minutesinteger
Schedule instead of posting now (minutes). 0/omitted = post now.
review_id*string
Sonar review id (the `id` of an item from sonar_review_inbox — not Apple's review id).
sonar_dismiss_review_replyWRITE tool — mark a review as not needing a reply (also cancels a scheduled post). Requires an Indie plan (trial counts) and an authorized Sonar account or an API key with the write scope.1 params

WRITE tool — mark a review as not needing a reply (also cancels a scheduled post). Requires an Indie plan (trial counts) and an authorized Sonar account or an API key with the write scope.

Parameters* required
review_id*string
Sonar review id (the `id` of an item from sonar_review_inbox — not Apple's review id).
sonar_cancel_review_replyWRITE tool — cancel a scheduled reply (manual or auto mode) before it posts; it goes back to draft. Requires an Indie plan (trial counts) and an authorized Sonar account or an API key with the write scope.1 params

WRITE tool — cancel a scheduled reply (manual or auto mode) before it posts; it goes back to draft. Requires an Indie plan (trial counts) and an authorized Sonar account or an API key with the write scope.

Parameters* required
review_id*string
Sonar review id (the `id` of an item from sonar_review_inbox — not Apple's review id).
sonar_screenshot_layout_guideThe layout-format reference for Sonar screenshot sets: static text, so one call per session is enough. It documents the layout JSON schema, coordinate system, image handling (remote URLs), flowing background shapes, fonts, translation overrides, and the recommended workflow.

The layout-format reference for Sonar screenshot sets: static text, so one call per session is enough. It documents the layout JSON schema, coordinate system, image handling (remote URLs), flowing background shapes, fonts, translation overrides, and the recommended workflow.

No parameters. Call it with no arguments.

sonar_screenshot_devicesList the device sizes supported for app-store screenshot sets, with their canvas dimensions (the pixel coordinate space all layouts use) and which store each belongs to — including the landscape App Store creative-asset canvases (category "creative": product page header and se...

List the device sizes supported for app-store screenshot sets, with their canvas dimensions (the pixel coordinate space all layouts use) and which store each belongs to — including the landscape App Store creative-asset canvases (category "creative": product page header and se...

No parameters. Call it with no arguments.

sonar_list_screenshot_setsList a product's app-store screenshot sets (metadata only: store, device size, locales, studio_url). Use sonar_get_screenshot_set for full layouts. Requires an Indie plan (trial counts).1 params

List a product's app-store screenshot sets (metadata only: store, device size, locales, studio_url). Use sonar_get_screenshot_set for full layouts. Requires an Indie plan (trial counts).

Parameters* required
product_id*string
Product id (find it with sonar_list_products).
sonar_create_screenshot_setCreate an app-store screenshot set for a product, from your own `screens` layouts or a built-in template. The layout JSON format and template ids are documented by sonar_screenshot_layout_guide. The set is immediately visible/editable for humans in the Screenshot Studio (studi...6 params

Create an app-store screenshot set for a product, from your own `screens` layouts or a built-in template. The layout JSON format and template ids are documented by sonar_screenshot_layout_guide. The set is immediately visible/editable for humans in the Screenshot Studio (studi...

Parameters* required
device_size*string
Device id from sonar_screenshot_devices, e.g. "iphone-6.7".
namestring
Display name.
product_id*string
Product the set belongs to.
screensarray
Initial screens, in order (max 10). Either this or template_id, not both; with neither you get one blank screen.
store*string
Target app store.one of ios · android
template_idstring
Seed from a built-in template (see sonar_screenshot_layout_guide) instead of providing screens.
sonar_get_screenshot_setFetch a screenshot set in full: every screen's layout JSON plus per-screen translation overrides keyed by locale. By default inline image data is replaced with placeholders to keep the response readable. Requires an Indie plan (trial counts).2 params

Fetch a screenshot set in full: every screen's layout JSON plus per-screen translation overrides keyed by locale. By default inline image data is replaced with placeholders to keep the response readable. Requires an Indie plan (trial counts).

Parameters* required
include_image_databoolean
When false (default), inline base64 images are replaced with short placeholders to keep the response small. Set true only when you need the raw data URLs (a layout containing placeholders is reject...default: false
set_id*string
Screenshot set id.
sonar_update_screenshot_setRename a screenshot set, replace its extra-locale list, and/or reorder its screens. Returns the updated set (with image data stripped). Requires an Indie plan (trial counts) and an authorized Sonar account or a write-scope API key.4 params

Rename a screenshot set, replace its extra-locale list, and/or reorder its screens. Returns the updated set (with image data stripped). Requires an Indie plan (trial counts) and an authorized Sonar account or a write-scope API key.

Parameters* required
localesarray
Replaces the extra-locale list (e.g. ["de-DE","fr-FR"]). Locales removed here lose their stored translations.
namestring
New display name.
screen_orderarray
Full permutation of the set's screen ids in the new display order.
set_id*string
Screenshot set id.
sonar_delete_screenshot_setPermanently delete a screenshot set and everything in it (screens, translations). Irreversible — confirm with the user before deleting work they may want. Requires an Indie plan (trial counts) and an authorized Sonar account or a write-scope API key.1 params

Permanently delete a screenshot set and everything in it (screens, translations). Irreversible — confirm with the user before deleting work they may want. Requires an Indie plan (trial counts) and an authorized Sonar account or a write-scope API key.

Parameters* required
set_id*string
Screenshot set id.
sonar_add_screenshotAppend a screen to a screenshot set (at the end; reorder with sonar_update_screenshot_set). Requires an Indie plan (trial counts) and an authorized Sonar account or a write-scope API key.2 params

Append a screen to a screenshot set (at the end; reorder with sonar_update_screenshot_set). Requires an Indie plan (trial counts) and an authorized Sonar account or a write-scope API key.

Parameters* required
layoutobject
Omit for a blank screen.
set_id*string
Screenshot set to append to.
sonar_update_screenshotReplace one screen's layout in a screenshot set. Whole-document replace — fetch the current layout, modify it, send it back. The change shows up immediately in the Screenshot Studio for human review. Requires an Indie plan (trial counts) and an authorized Sonar account or a wr...2 params

Replace one screen's layout in a screenshot set. Whole-document replace — fetch the current layout, modify it, send it back. The change shows up immediately in the Screenshot Studio for human review. Requires an Indie plan (trial counts) and an authorized Sonar account or a wr...

Parameters* required
layout*object
The FULL replacement layout — this replaces the whole document, it does not merge. Never send a layout containing '[inline image omitted…]' placeholders; refetch with include_image_data first.
screenshot_id*string
Screen id (from the set's screens array).
sonar_delete_screenshotDelete one screen from a screenshot set. A set keeps at least one screen — deleting the last one is rejected. Requires an Indie plan (trial counts) and an authorized Sonar account or a write-scope API key.1 params

Delete one screen from a screenshot set. A set keeps at least one screen — deleting the last one is rejected. Requires an Indie plan (trial counts) and an authorized Sonar account or a write-scope API key.

Parameters* required
screenshot_id*string
Screen id to delete.
sonar_set_screenshot_translationsWrite a locale's translation overrides for screens in a screenshot set (text copy, localized captures/images). Geometry and styling always come from the source layout; anything not overridden falls back to it. The locale is auto-enabled on the set. Requires an Indie plan (tria...3 params

Write a locale's translation overrides for screens in a screenshot set (text copy, localized captures/images). Geometry and styling always come from the source layout; anything not overridden falls back to it. The locale is auto-enabled on the set. Requires an Indie plan (tria...

Parameters* required
entries*array
One entry per screen to localize.
locale*string
Target locale code, e.g. "de-DE", "pt-BR", "zh-Hans".
set_id*string
Screenshot set id.
sonar_ad_spy_competitorsStart here for competitor ads. Every competitor the account tracks, with the Facebook pages (meta_pages) and TikTok accounts (tiktok_accounts) already linked to it and its last page scan, plus today's Ad Spy lookup allowance (used / limit / remaining / resets_at). A competitor...

Start here for competitor ads. Every competitor the account tracks, with the Facebook pages (meta_pages) and TikTok accounts (tiktok_accounts) already linked to it and its last page scan, plus today's Ad Spy lookup allowance (used / limit / remaining / resets_at). A competitor...

No parameters. Call it with no arguments.

sonar_ad_spy_adsA Facebook page's cached Meta ads (Facebook, Instagram, Messenger, Audience Network): stats over every cached ad (active count, longest running, new in 30 days, format and placement mix, max variants), the ads matching the filters with copy, CTA, landing URL, placements, days...9 params

A Facebook page's cached Meta ads (Facebook, Instagram, Messenger, Audience Network): stats over every cached ad (active count, longest running, new in 30 days, format and placement mix, max variants), the ads matching the filters with copy, CTA, landing URL, placements, days...

Parameters* required
advertiser_id*string
Sonar advertiser id of a Facebook page (`advertiser_id` from sonar_ad_spy_competitors, or `advertiser.id` from sonar_ad_spy_open_page).
fieldsstring
"compact" (default): each ad without its expiring `media` links and `media_expires_at` — ids, the permanent `library_url`, dates, days running, longevity, format, copy, CTA, landing URL, placements...one of compact · fulldefault: compact
formatstring
Only ads in this format.one of video · image · carousel · text
history_daysinteger
Days of daily active/new-ad history (default 30).
include_hiddenboolean
Include ads this account removed from its scans.
limitinteger
Ads to return (1-300, default 50).
min_daysinteger
Only ads running at least this many days — longevity is the honest 'winner' signal (30/60/90).
sortstring
longest running (default), newest, or most variants.one of longest · newest · variants
statusstring
active (default) = running now; all = include stopped ads.one of active · all
sonar_ad_spy_tiktok_postsA linked TikTok account's cached public videos with real counters (views, likes, comments, shares, saves), caption, post date and a `breakout` flag (3× or more the account's median views). Use `url` (permanent); compact by default, so the expiring `cover_url` is left out (fiel...4 params

A linked TikTok account's cached public videos with real counters (views, likes, comments, shares, saves), caption, post date and a `breakout` flag (3× or more the account's median views). Use `url` (permanent); compact by default, so the expiring `cover_url` is left out (fiel...

Parameters* required
account_id*string
Sonar id of a linked TikTok account (`account_id` from sonar_ad_spy_competitors).
fieldsstring
"compact" (default): each video without its expiring `cover_url`; the permanent `url`, caption, dates and every counter stay. "full": adds `cover_url` (an expiring CDN image link).one of compact · fulldefault: compact
limitinteger
Videos to return (1-200, default 50).
sortstring
Order (default most viewed).one of views · newest · shares · likes · saves
sonar_ad_spy_ad_analysisThe cached AI analysis of an ad (hook, angle, format, structure, CTA, why it works) and its video transcript, or `analysis: null` when it hasn't been analyzed yet — then use sonar_ad_spy_analyze_ad. Free cached read. Requires an Indie or Agency plan (a trial counts).1 params

The cached AI analysis of an ad (hook, angle, format, structure, CTA, why it works) and its video transcript, or `analysis: null` when it hasn't been analyzed yet — then use sonar_ad_spy_analyze_ad. Free cached read. Requires an Indie or Agency plan (a trial counts).

Parameters* required
creative_id*string
Sonar id of an ad (the `id` of an item in `ads` from sonar_ad_spy_ads) — not the Meta `ad_id`.
sonar_ad_spy_vaultThe account's saved ads (the vault), newest first: details frozen at save time, status (pending/stored/partial/failed), notes and stored media files, plus usage vs the plan's vault limit. Asset URLs need the account's API key — vault media is private, never share them as publi...

The account's saved ads (the vault), newest first: details frozen at save time, status (pending/stored/partial/failed), notes and stored media files, plus usage vs the plan's vault limit. Asset URLs need the account's API key — vault media is private, never share them as publi...

No parameters. Call it with no arguments.

sonar_ad_spy_scanWRITE tool — search a competitor's Facebook page (channel "meta") or TikTok account (channel "tiktok") and return ranked candidates; an unambiguous top match is flagged `best_match`. It never links: show the candidates and let the user confirm, then call sonar_ad_spy_link (the...3 params

WRITE tool — search a competitor's Facebook page (channel "meta") or TikTok account (channel "tiktok") and return ranked candidates; an unambiguous top match is flagged `best_match`. It never links: show the candidates and let the user confirm, then call sonar_ad_spy_link (the...

Parameters* required
channelstring
"meta" (default) finds the Facebook page; "tiktok" the TikTok account.one of meta · tiktok
competitor_id*string
Sonar app id of a tracked competitor (an `app_id` from sonar_ad_spy_competitors), or its store id.
querystring
Search this brand name or @handle instead of the app's name.
sonar_ad_spy_search_pagesWRITE tool — free-text search for Facebook advertiser pages by brand or company name, not tied to a tracked competitor. Open a result with sonar_ad_spy_open_page, or link it to a competitor with sonar_ad_spy_link. Spends one of the account's daily Ad Spy lookups (today's usage...1 params

WRITE tool — free-text search for Facebook advertiser pages by brand or company name, not tied to a tracked competitor. Open a result with sonar_ad_spy_open_page, or link it to a competitor with sonar_ad_spy_link. Spends one of the account's daily Ad Spy lookups (today's usage...

Parameters* required
query*string
Brand or company name, e.g. "duolingo".
sonar_ad_spy_linkWRITE tool — confirm which Facebook page or TikTok account belongs to a competitor. Only call it after the user picked the candidate (the mapping is shared by every Sonar account). Accepts only candidates this account's own scans or searches returned in the last 2 days. Spends...6 params

WRITE tool — confirm which Facebook page or TikTok account belongs to a competitor. Only call it after the user picked the candidate (the mapping is shared by every Sonar account). Accepts only candidates this account's own scans or searches returned in the last 2 days. Spends...

Parameters* required
account_idstring
Channel tiktok: an account already linked elsewhere in this account (alternative to user_id).
advertiser_idstring
Channel meta: a page this account already sees (alternative to page_id).
channel*string
"meta" links a Facebook page, "tiktok" a TikTok account.one of meta · tiktok
competitor_id*string
Sonar app id of a tracked competitor (an `app_id` from sonar_ad_spy_competitors), or its store id.
page_idstring
Channel meta: `page_id` of a candidate from sonar_ad_spy_scan or sonar_ad_spy_search_pages.
user_idstring
Channel tiktok: `user_id` of a candidate from sonar_ad_spy_scan.
sonar_ad_spy_unlinkWRITE tool — remove a wrong competitor → Facebook page (advertiser_id) or TikTok account (account_id) link. Pass exactly one. The link is shared, so this also removes it for other Sonar accounts tracking that competitor. Requires an Indie or Agency plan (a trial counts) and an...3 params

WRITE tool — remove a wrong competitor → Facebook page (advertiser_id) or TikTok account (account_id) link. Pass exactly one. The link is shared, so this also removes it for other Sonar accounts tracking that competitor. Requires an Indie or Agency plan (a trial counts) and an...

Parameters* required
account_idstring
The TikTok account to unlink.
advertiser_idstring
The Facebook page to unlink.
competitor_id*string
Sonar app id of a tracked competitor (an `app_id` from sonar_ad_spy_competitors), or its store id.
sonar_ad_spy_open_pageWRITE tool — open a Facebook page from a recent search or scan without linking it to a competitor, and return its ads (same shape and filters as sonar_ad_spy_ads). The ads are fetched when the cached copy is over 24h old. Spends one of the account's daily Ad Spy lookups (today...8 params

WRITE tool — open a Facebook page from a recent search or scan without linking it to a competitor, and return its ads (same shape and filters as sonar_ad_spy_ads). The ads are fetched when the cached copy is over 24h old. Spends one of the account's daily Ad Spy lookups (today...

Parameters* required
formatstring
Only ads in this format.one of video · image · carousel · text
history_daysinteger
Days of daily active/new-ad history (default 30).
include_hiddenboolean
Include ads this account removed from its scans.
limitinteger
Ads to return (1-300, default 50).
min_daysinteger
Only ads running at least this many days — longevity is the honest 'winner' signal (30/60/90).
page_id*string
`page_id` of a candidate from sonar_ad_spy_search_pages or sonar_ad_spy_scan (last 2 days).
sortstring
longest running (default), newest, or most variants.one of longest · newest · variants
statusstring
active (default) = running now; all = include stopped ads.one of active · all
sonar_ad_spy_refreshWRITE tool — fetch a page's current Meta ads or a TikTok account's latest videos when the cached copy is over 24h old (a fresher copy comes back unchanged and costs nothing). Linked pages also refresh weekly on their own. Returns the same view as sonar_ad_spy_ads / sonar_ad_sp...2 params

WRITE tool — fetch a page's current Meta ads or a TikTok account's latest videos when the cached copy is over 24h old (a fresher copy comes back unchanged and costs nothing). Linked pages also refresh weekly on their own. Returns the same view as sonar_ad_spy_ads / sonar_ad_sp...

Parameters* required
id*string
advertiser_id (kind meta) or account_id (kind tiktok) from sonar_ad_spy_competitors.
kind*string
"meta" refreshes a Facebook page's ads; "tiktok" a TikTok account's videos.one of meta · tiktok
sonar_ad_spy_analyze_adWRITE tool — AI breakdown of why an ad works: hook, persuasion angle, creative format, beat-by-beat structure, CTA and a grounded "why it works" (no invented metrics). Analyses are cached for every Sonar account: an ad that already has one comes back free (`cached: true`), oth...1 params

WRITE tool — AI breakdown of why an ad works: hook, persuasion angle, creative format, beat-by-beat structure, CTA and a grounded "why it works" (no invented metrics). Analyses are cached for every Sonar account: an ad that already has one comes back free (`cached: true`), oth...

Parameters* required
creative_id*string
Sonar id of an ad (the `id` of an item in `ads` from sonar_ad_spy_ads) — not the Meta `ad_id`.
sonar_ad_spy_scriptWRITE tool — adapt a proven competitor ad's FORMAT (not its claims or brand) into an organic TikTok or Reels script the user can film: hook, beats (shot + on-screen text), soft CTA, audio and caption ideas. Every call is a new AI generation and spends one of the account's dail...3 params

WRITE tool — adapt a proven competitor ad's FORMAT (not its claims or brand) into an organic TikTok or Reels script the user can film: hook, beats (shot + on-screen text), soft CTA, audio and caption ideas. Every call is a new AI generation and spends one of the account's dail...

Parameters* required
app_idstring
One of the user's own apps (an `id` from sonar_list_apps) to ground the script; omit for [YOUR APP] placeholders.
creative_id*string
Sonar id of an ad (the `id` of an item in `ads` from sonar_ad_spy_ads) — not the Meta `ad_id`.
platformstring
tiktok (default) or reels (Instagram Reels).one of tiktok · reels
sonar_ad_spy_hide_adsWRITE tool — remove irrelevant ads from this account's scans ("Remove from scan"), or put them back with hidden: false. Per account only; other accounts still see them. Requires an Indie or Agency plan (a trial counts) and an authorized Sonar account or an API key with the wri...2 params

WRITE tool — remove irrelevant ads from this account's scans ("Remove from scan"), or put them back with hidden: false. Per account only; other accounts still see them. Requires an Indie or Agency plan (a trial counts) and an authorized Sonar account or an API key with the wri...

Parameters* required
creative_ids*array
Ads to hide or restore (Sonar ad ids).
hiddenboolean
true (default) removes them from this account's scans; false puts them back.
sonar_ad_spy_vault_saveWRITE tool — save Meta ads to the account's private vault: details are frozen and the media downloaded into Sonar's storage, so the ad survives being stopped or its links expiring. Saves what fits the plan's vault limit and reports the rest as `over_limit`; poll sonar_ad_spy_v...2 params

WRITE tool — save Meta ads to the account's private vault: details are frozen and the media downloaded into Sonar's storage, so the ad survives being stopped or its links expiring. Saves what fits the plan's vault limit and reports the rest as `over_limit`; poll sonar_ad_spy_v...

Parameters* required
competitor_idstring
The competitor these ads belong to (its Sonar app id).
creative_ids*array
Meta ads to save.
sonar_ad_spy_vault_updateWRITE tool — set or clear a saved ad's note and/or retry its media download. Requires an Indie or Agency plan (a trial counts) and an authorized Sonar account or an API key with the write scope.3 params

WRITE tool — set or clear a saved ad's note and/or retry its media download. Requires an Indie or Agency plan (a trial counts) and an authorized Sonar account or an API key with the write scope.

Parameters* required
item_id*string
A vault item `id` from sonar_ad_spy_vault.
notevalue
Note text; null clears it.
retryboolean
true re-queues a failed or partial media download.
sonar_ad_spy_vault_removeWRITE tool — delete a saved ad and its stored media files from the vault. Requires an Indie or Agency plan (a trial counts) and an authorized Sonar account or an API key with the write scope.1 params

WRITE tool — delete a saved ad and its stored media files from the vault. Requires an Indie or Agency plan (a trial counts) and an authorized Sonar account or an API key with the write scope.

Parameters* required
item_id*string
A vault item `id` from sonar_ad_spy_vault.

Sponsors

Configuration

SONAR_API_KEY*secret

Your Sonar API key (aso_...). Create one at https://trysonar.app

SONAR_API_URLdefault: https://trysonar.app

API base URL. Defaults to https://trysonar.app.

Readme

@sonarapp/mcp

npm license smithery badge

The official Sonar MCP server — App Store Optimization tools for AI agents.

For the hosted Grok Build and Cursor marketplace plugin, see plugin setup, authentication, and permissions.

Lets Claude Desktop, Claude Code, Cursor, Cline, and any Model Context Protocol-compatible client look up apps, research keywords, audit ASO, mine reviews, and estimate revenue across the iOS App Store and Google Play. Powered by Sonar.


Tools

55 tools covering the whole Sonar REST API, grouped by what they need.

Read tools — stateless (any plan with credits)


View the full README on GitHub

Details

Repository
github.com/trysonar/mcp
Category
Mobile Development
Package
@sonarapp/mcp
Transport
STDIO, HTTP
Auth
Required
Registry
MCP registry, active
Tools verified
Nov 6, 2026

Related Mobile Development MCP servers

View all
1gameanalytics avatarGameAnalytics Documentationcom.gameanalytics/analytics-docsSearch GameAnalytics docs: Unity, Unreal, iOS, Android SDK and API guides for mobile game analytics.0stars
2sharminsirajudeen avatarDrengrsharminsirajudeen/drengr-communityEyes and hands for AI agents on Android and iOS devices.0stars
3devsrodrigo avatarLOCK IN — Social Media Addiction & Dopamine Resetdevsrodrigo/lockin-mcpiOS dopamine detox app with social media blocking and screen time tools.0stars
4fonino avatarFoninofonino/foninoLet your AI agent use your real iPhone or Android phone, with your OK before anything is sent.0stars
5flywheelstudio avatarUlinkflywheelstudio/ulink-mcp-serverDeep linking for iOS, Android, Flutter & React Native. Firebase Dynamic Links alternative.0stars
6shelldrop-sh avatarShell Dropshelldrop-sh/agent-skillsRead-only help with SSH, tmux and Tailscale setup for running AI agents from an iPhone or iPad.0stars