app.trysonar/sonar
REMOTE · TRYSONAR.APP · 2 COMPONENTS
ASO tools for AI agents: keyword research, rank tracking, competitor analysis (iOS & Android).
Available components
Last scanned (9 hours ago)
Scores higher than 81% of remote servers
Reachable. Last reached 5 Nov 2026.
Category Marketing and SEO
Recent critical change
Authorization (12 Sept 2026). See the changelog before you install this server.
How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →
Endpoint Security66
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- Authorisation check failed: no authorisation is required to call this server, and it exposes a tool marked destructive (sonar_delete_tracked_keyword). See how to fix → View diagnostics → Fail
- HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
- The HSTS (Strict-Transport-Security) header is present. View diagnostics → Pass
- DNSSEC is configured correctly; the domain's records validate against the full chain to the root. View diagnostics → Pass
Transport & Reachability100
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
Schema Quality & AI Usability66
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 16489 tokens (~208/item across 79 items; 79 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management100
- No destabilizing schema changes in the last 30 days.Pass
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- All 8 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
- An AI judge read all 79 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 4 Nov 26 −1
- New tool “sonar_ad_spy_vault_remove”, which the server declares destructive security
- New tool “sonar_ad_spy_unlink”, which the server declares destructive security
- Tool “sonar_app_rankings” rewrote its description, which is the text the model reads security
- Tool “sonar_top_charts” rewrote its description, which is the text the model reads security
- Tool “sonar_keyword_rankings” rewrote its description, which is the text the model reads security
- Tool “sonar_get_app” rewrote its description, which is the text the model reads security
- Tool “sonar_discovered_keywords” rewrote its description, which is the text the model reads security
- Tool “sonar_app_search” rewrote its description, which is the text the model reads security
- Tool “sonar_app_revenue” rewrote its description, which is the text the model reads security
- Schema quality: 12303 → 16489 ▼ functional
- Server version: 0.13.2 → 0.15.0 functional
- New tool “sonar_ad_spy_open_page” functional
- New tool “sonar_ad_spy_hide_ads” functional
- New tool “sonar_ad_spy_link” functional
- New tool “sonar_ad_spy_refresh” functional
- New tool “sonar_ad_spy_vault_update” functional
- New tool “sonar_ad_spy_vault_save” functional
- New tool “sonar_ad_spy_vault” functional
- New tool “sonar_ad_spy_tiktok_posts” functional
- New tool “sonar_ad_spy_search_pages” functional
- New tool “sonar_ad_spy_script” functional
- New tool “sonar_ad_spy_scan” functional
- New tool “sonar_ad_spy_competitors” functional
- New tool “sonar_ad_spy_analyze_ad” functional
- New tool “sonar_ad_spy_ads” functional
- New tool “sonar_ad_spy_ad_analysis” functional
- “sonar_top_charts” added an optional parameter “fields” cosmetic
- “sonar_keyword_rankings” added an optional parameter “fields” cosmetic
- “sonar_get_app” added an optional parameter “fields” cosmetic
- “sonar_discovered_keywords” added an optional parameter “fields” cosmetic
- “sonar_app_search” added an optional parameter “fields” cosmetic
- “sonar_app_rankings” added an optional parameter “fields” cosmetic
- 24 Oct 26 0
- Tool “sonar_keyword_metrics” rewrote its description, which is the text the model reads security
- Tool “sonar_app_keywords” rewrote its description, which is the text the model reads security
- Tool “sonar_competitor_keywords” rewrote its description, which is the text the model reads security
- Tool “sonar_discovered_keywords” rewrote its description, which is the text the model reads security
- Tool “sonar_keyword_search” rewrote its description, which is the text the model reads security
- 23 Oct 26 0
- Tool “sonar_app_keywords” rewrote its description, which is the text the model reads security
- Tool “sonar_discovered_keywords” rewrote its description, which is the text the model reads security
- Tool “sonar_keyword_metrics” rewrote its description, which is the text the model reads security
- Tool “sonar_keyword_search” rewrote its description, which is the text the model reads security
- Tool “sonar_competitor_keywords” rewrote its description, which is the text the model reads security
- 17 Oct 26 0
- Tool “sonar_app_search” rewrote its description, which is the text the model reads security
- Server version: 0.13.1 → 0.13.2 functional
- 15 Oct 26 0
- Tool “sonar_keyword_search” rewrote its description, which is the text the model reads security
- Tool “sonar_scan_competitor” rewrote its description, which is the text the model reads security
- Server version: 0.13.0 → 0.13.1 functional
- 14 Oct 26 0
- Schema quality: 10069 → 11597 ▼ functional
- Server version: 0.11.0 → 0.13.0 functional
- New tool “sonar_update_review_reply” functional
- New tool “sonar_set_review_responder” functional
- New tool “sonar_review_responder” functional
- New tool “sonar_review_inbox” functional
- New tool “sonar_post_review_reply” functional
- New tool “sonar_draft_review_reply” functional
- New tool “sonar_cancel_review_reply” functional
- New tool “sonar_dismiss_review_reply” functional
- “sonar_set_alert” added an optional parameter “cadence” cosmetic
- “sonar_set_alert” reworded the description of “type” cosmetic
- “sonar_set_alert” reworded the description of “threshold” cosmetic
- 12 Oct 26 +1
- Stability: fail → pass ▲ security
- 10 Oct 26 −1
- Schema quality: 166 → 186 ▼ functional
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 5 Nov 2026 · Probed https://trysonar.app/mcp
TLS valid
Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .
| Subject | Issuer | Valid from | Valid until | Key | Signature | Serial |
|---|---|---|---|---|---|---|
| CN=trysonar.app | CN=YE2,O=Let's Encrypt,C=US | 19 Sept 2026 | 18 Dec 2026 | ECDSA 256 | ECDSA-SHA384 | 6edc0989e65e173eff2dd7912cb6835a374 |
| SANs: *.trysonar.app, trysonar.app | ||||||
| CN=YE2,O=Let's Encrypt,C=US (CA) | CN=Root YE,O=ISRG,C=US | 3 Sept 2025 | 2 Sept 2028 | ECDSA 384 | ECDSA-SHA384 | 4df3b15dd6c0784c507cd37b58e6f115 |
| CN=Root YE,O=ISRG,C=US (CA) | CN=ISRG Root X2,O=Internet Security Research Group,C=US | 13 May 2026 | 2 Sept 2032 | ECDSA 384 | ECDSA-SHA384 | 872165fc34b6e5fba8add5b3705fb53a |
| CN=ISRG Root X2,O=Internet Security Research Group,C=US (CA) | CN=ISRG Root X1,O=Internet Security Research Group,C=US | 13 May 2026 | 2 Sept 2032 | ECDSA 384 | SHA256-RSA | 6c8f1dc727c7117f7baf853ac980f9cd |
Background: What to check on a remote MCP endpoint →
DNSSEC secure
Validation of trysonar.app. — Secure
| Zone | DS | Keys | Algorithms | Outcome |
|---|---|---|---|---|
| . | trust_anchor | 20326, 38696 | 8, 8 | Verified |
| app. | present | 23684 | 8 | Verified |
| trysonar.app. | present | 2371 | 13 | Verified |
| trysonar.app. | Verified address RRset verified with the apex keys |
Authentication No authorisation required
The endpoint answered without asking for a token. Anyone who knows the URL can reach it.
| Result | No authorisation required |
|---|---|
| HTTP status | 200 |
| Header | Value |
|---|---|
| strict-transport-security | max-age=63072000 |
| x-content-type-options | nosniff |
| x-frame-options | DENY |
| referrer-policy | strict-origin-when-cross-origin |
| permissions-policy | camera=(), microphone=(), geolocation=() |
Background: How OAuth 2.1 works in the 2026 MCP spec →
Transports 2 probes
| Transport | URL | Outcome | Status | Location |
|---|---|---|---|---|
| streamable-http | https://trysonar.app/mcp | Verified | 200 | |
| http (plaintext) | http://trysonar.app/mcp | HTTPS enforced | 308 | https://trysonar.app/mcp |
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
sonar_ad_spy_ad_analysis Cached Ad Analysis ~117
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).
| Name | Type | Req | Description |
|---|---|---|---|
| creative_id | string | yes | Sonar id of an ad (the `id` of an item in `ads` from sonar_ad_spy_ads) — not the Meta `ad_id`. |
No output schema declared.
No examples provided.
sonar_ad_spy_ads Competitor Meta Ads ~473
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 running and a longevity tier (30d+/60d+/90d+), and daily history of active/new ads (creative velocity). No spend or impression data exists for ads outside the EU — longevity and variants are the signals. Compact by default (no expiring media links; fields: "full" adds them). Media URLs are expiring CDN links; always give users each ad's permanent `library_url`. `refresh_due: true` means the copy is over 24h old (sonar_ad_spy_refresh fetches it). Cached read. Requires an Indie or Agency plan (a trial counts).
| Name | Type | Req | Description |
|---|---|---|---|
| advertiser_id | string | yes | Sonar advertiser id of a Facebook page (`advertiser_id` from sonar_ad_spy_competitors, or `advertiser.id` from sonar_ad_spy_open_page). |
| fields | string | – | "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,… |
| format | string | – | Only ads in this format. |
| history_days | integer | – | Days of daily active/new-ad history (default 30). |
| include_hidden | boolean | – | Include ads this account removed from its scans. |
| limit | integer | – | Ads to return (1-300, default 50). |
| min_days | integer | – | Only ads running at least this many days — longevity is the honest 'winner' signal (30/60/90). |
| sort | string | – | longest running (default), newest, or most variants. |
| status | string | – | active (default) = running now; all = include stopped ads. |
No output schema declared.
No examples provided.
sonar_ad_spy_analyze_ad Analyze Competitor Ad ~167
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`), otherwise the first analysis spends one of the account's daily Ad Spy lookups (a video transcript plus one AI call). Requires an Indie or Agency plan (a trial counts) and an authorized Sonar account or an API key with the write scope.
| Name | Type | Req | Description |
|---|---|---|---|
| creative_id | string | yes | Sonar id of an ad (the `id` of an item in `ads` from sonar_ad_spy_ads) — not the Meta `ad_id`. |
No output schema declared.
No examples provided.
sonar_ad_spy_competitors Ad Spy Competitors ~101
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 with no linked page needs sonar_ad_spy_scan then sonar_ad_spy_link. Cached read. Requires an Indie or Agency plan (a trial counts).
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
sonar_ad_spy_hide_ads Hide Ads From Scans ~114
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 write scope.
| Name | Type | Req | Description |
|---|---|---|---|
| creative_ids | array | yes | Ads to hide or restore (Sonar ad ids). |
| hidden | boolean | – | true (default) removes them from this account's scans; false puts them back. |
No output schema declared.
No examples provided.
sonar_ad_spy_link Link Page to Competitor ~270
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 no lookup; then use sonar_ad_spy_refresh to fetch the ads. Requires an Indie or Agency plan (a trial counts) and an authorized Sonar account or an API key with the write scope.
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | string | – | Channel tiktok: an account already linked elsewhere in this account (alternative to user_id). |
| advertiser_id | string | – | Channel meta: a page this account already sees (alternative to page_id). |
| channel | string | yes | "meta" links a Facebook page, "tiktok" a TikTok account. |
| competitor_id | string | yes | Sonar app id of a tracked competitor (an `app_id` from sonar_ad_spy_competitors), or its store id. |
| page_id | string | – | Channel meta: `page_id` of a candidate from sonar_ad_spy_scan or sonar_ad_spy_search_pages. |
| user_id | string | – | Channel tiktok: `user_id` of a candidate from sonar_ad_spy_scan. |
No output schema declared.
No examples provided.
sonar_ad_spy_open_page Open Facebook Page Ads ~326
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's usage comes back in `allowance` from sonar_ad_spy_competitors); re-opening the same page, account or ad the same day is free. Past the allowance a refresh returns the cached copy with `meta.stale` and a `meta.note` to relay. Requires an Indie or Agency plan (a trial counts) and an authorized Sonar account or an API key with the write scope.
| Name | Type | Req | Description |
|---|---|---|---|
| format | string | – | Only ads in this format. |
| history_days | integer | – | Days of daily active/new-ad history (default 30). |
| include_hidden | boolean | – | Include ads this account removed from its scans. |
| limit | integer | – | Ads to return (1-300, default 50). |
| min_days | integer | – | Only ads running at least this many days — longevity is the honest 'winner' signal (30/60/90). |
| page_id | string | yes | `page_id` of a candidate from sonar_ad_spy_search_pages or sonar_ad_spy_scan (last 2 days). |
| sort | string | – | longest running (default), newest, or most variants. |
| status | string | – | active (default) = running now; all = include stopped ads. |
No output schema declared.
No examples provided.
sonar_ad_spy_refresh Refresh Competitor Ads ~233
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_spy_tiktok_posts. Spends one of the account's daily Ad Spy lookups (today's usage comes back in `allowance` from sonar_ad_spy_competitors); re-opening the same page, account or ad the same day is free. Past the allowance a refresh returns the cached copy with `meta.stale` and a `meta.note` to relay. Requires an Indie or Agency plan (a trial counts) and an authorized Sonar account or an API key with the write scope.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | advertiser_id (kind meta) or account_id (kind tiktok) from sonar_ad_spy_competitors. |
| kind | string | yes | "meta" refreshes a Facebook page's ads; "tiktok" a TikTok account's videos. |
No output schema declared.
No examples provided.
sonar_ad_spy_scan Find Competitor Page ~293
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 page mapping is shared by every Sonar account, so a wrong link misleads everyone). A Meta scan that found nothing in the last 24h replays for free (`cooldown: true`). Spends one of the account's daily Ad Spy lookups (today's usage comes back in `allowance` from sonar_ad_spy_competitors); re-opening the same page, account or ad the same day is free. Past the allowance a refresh returns the cached copy with `meta.stale` and a `meta.note` to relay. Requires an Indie or Agency plan (a trial counts) and an authorized Sonar account or an API key with the write scope.
| Name | Type | Req | Description |
|---|---|---|---|
| channel | string | – | "meta" (default) finds the Facebook page; "tiktok" the TikTok account. |
| competitor_id | string | yes | Sonar app id of a tracked competitor (an `app_id` from sonar_ad_spy_competitors), or its store id. |
| query | string | – | Search this brand name or @handle instead of the app's name. |
No output schema declared.
No examples provided.
sonar_ad_spy_script Organic Script From Ad ~214
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 daily Ad Spy lookups (plus one for the ad's first analysis when it has none yet). Requires an Indie or Agency plan (a trial counts) and an authorized Sonar account or an API key with the write scope.
| Name | Type | Req | Description |
|---|---|---|---|
| app_id | string | – | 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 | yes | Sonar id of an ad (the `id` of an item in `ads` from sonar_ad_spy_ads) — not the Meta `ad_id`. |
| platform | string | – | tiktok (default) or reels (Instagram Reels). |
No output schema declared.
No examples provided.
sonar_ad_spy_search_pages Search Facebook Advertisers ~175
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 comes back in `allowance` from sonar_ad_spy_competitors); re-opening the same page, account or ad the same day is free. Past the allowance a refresh returns the cached copy with `meta.stale` and a `meta.note` to relay. Requires an Indie or Agency plan (a trial counts) and an authorized Sonar account or an API key with the write scope.
| Name | Type | Req | Description |
|---|---|---|---|
| query | string | yes | Brand or company name, e.g. "duolingo". |
No output schema declared.
No examples provided.
sonar_ad_spy_tiktok_posts Competitor TikTok Videos ~230
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 (fields: "full" adds it). Cached read; sonar_ad_spy_refresh with kind "tiktok" fetches newer videos. Requires an Indie or Agency plan (a trial counts).
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | string | yes | Sonar id of a linked TikTok account (`account_id` from sonar_ad_spy_competitors). |
| fields | string | – | "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). |
| limit | integer | – | Videos to return (1-200, default 50). |
| sort | string | – | Order (default most viewed). |
No output schema declared.
No examples provided.
sonar_ad_spy_unlink Unlink Page From Competitor ~148
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 authorized Sonar account or an API key with the write scope.
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | string | – | The TikTok account to unlink. |
| advertiser_id | string | – | The Facebook page to unlink. |
| competitor_id | string | yes | Sonar app id of a tracked competitor (an `app_id` from sonar_ad_spy_competitors), or its store id. |
No output schema declared.
No examples provided.
sonar_ad_spy_vault Ad Spy Vault ~87
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 public links. Requires an Indie or Agency plan (a trial counts).
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
sonar_ad_spy_vault_remove Remove Saved Ad ~76
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.
| Name | Type | Req | Description |
|---|---|---|---|
| item_id | string | yes | A vault item `id` from sonar_ad_spy_vault. |
No output schema declared.
No examples provided.
sonar_ad_spy_vault_save Save Ads to Vault ~155
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_vault for status. An ad whose media links already expired is refetched once, which spends one Ad Spy lookup. Requires an Indie or Agency plan (a trial counts) and an authorized Sonar account or an API key with the write scope.
| Name | Type | Req | Description |
|---|---|---|---|
| competitor_id | string | – | The competitor these ads belong to (its Sonar app id). |
| creative_ids | array | yes | Meta ads to save. |
No output schema declared.
No examples provided.
sonar_ad_spy_vault_update Update Saved Ad ~106
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.
| Name | Type | Req | Description |
|---|---|---|---|
| item_id | string | yes | A vault item `id` from sonar_ad_spy_vault. |
| note | – | – | Note text; null clears it. |
| retry | boolean | – | true re-queues a failed or partial media download. |
No output schema declared.
No examples provided.
sonar_add_screenshot Add Screenshot ~78
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.
| Name | Type | Req | Description |
|---|---|---|---|
| layout | object | – | Omit for a blank screen. |
| set_id | string | yes | Screenshot set to append to. |
No output schema declared.
No examples provided.
sonar_alert_events Alert Events Feed ~226
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/keyword names, old vs new values). Events only exist for alert types you've enabled rules for (sonar_set_alert); detection runs once daily. Poll with `since` to react to changes programmatically. Requires an Indie plan (trial counts).
| Name | Type | Req | Description |
|---|---|---|---|
| app_id | string | – | Filter to events about one tracked app (Sonar app UUID or store id). |
| limit | integer | – | Max events to return (1-200). Default 50. |
| since | string | – | 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. |
| type | string | – | Filter to one alert type. Omit for all types. |
No output schema declared.
No examples provided.
sonar_analyze_competitors Analyze Competitors (AI) ~157
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, and diffs against the previous analysis. At most one analysis per app per 7 days (429 with the next available time while in cooldown — use sonar_competitor_landscape to read the current one). Requires a paid (non-trial) Indie plan and an authorized Sonar account or an API key with the write scope.
| Name | Type | Req | Description |
|---|---|---|---|
| app_id | string | yes | Sonar app UUID of YOUR OWN tracked app to analyze. NOT a store id, NOT a competitor id. |
No output schema declared.
No examples provided.
sonar_app_aso_score ASO Score ~197
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 daily use per IP).
| Name | Type | Req | Description |
|---|---|---|---|
| country | string | – | 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". |
| store | string | yes | App store. "ios" for Apple App Store, "android" for Google Play. |
| store_id | string | yes | Store-specific app identifier. iOS: bundle ID or numeric track ID — the `storeId` returned by sonar_app_search works as-is. Android: package name. |
No output schema declared.
No examples provided.
sonar_app_changes App Change History ~166
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, dates), newest first. Useful for correlating rank movements with what the app (or a competitor) changed. Requires an Indie plan (trial counts).
| Name | Type | Req | Description |
|---|---|---|---|
| app_id | string | yes | Sonar app UUID — the `id` returned by sonar_list_apps or sonar_create_product. NOT a store id. |
| limit | integer | – | Max changes to return (1-200). Default 50. |
| type | string | – | Filter to one change type. Omit for all types. |
No output schema declared.
No examples provided.
sonar_app_engagement App Engagement (App Store Connect) ~409
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 referrer…), plus daily installs, deletions and sessions. Impressions follow App Store Connect's definition and INCLUDE product page views, so totals reconcile with ASC. Downloads come from the Sales report. Same numbers as the Engagement page. iOS only. Requires the Agency plan (403 on other plans) AND an App Store Connect connection with an Admin-role key (`key_lacks_analytics` otherwise); Apple delivers the first analytics 24-48 hours after connecting (`pending`). Always check `status`: anything other than `ready` (not_connected, not_ios, app_not_in_account, pending, key_lacks_analytics) means there's no data and `message` says how to fix it — never read an empty series as zero. Days Apple hasn't reported yet have `reported: false` and null metrics.
| Name | Type | Req | Description |
|---|---|---|---|
| app_id | string | yes | 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. |
| days | integer | – | Window length in days (1-366) when `start` is omitted. Default 30. |
| end | string | – | Last day of the window (YYYY-MM-DD, inclusive). Default yesterday (UTC) — Apple posts a day the next morning at the earliest. |
| start | string | – | First day of the window (YYYY-MM-DD, inclusive). Omit to count `days` back from `end`. |
| store | string | – | Only needed when `app_id` is a store id tracked in both stores. App Store Connect data is iOS-only. |
No output schema declared.
No examples provided.
sonar_app_extract_keywords Extract App Keywords ~200
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).
| Name | Type | Req | Description |
|---|---|---|---|
| country | string | – | 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". |
| max | integer | – | Maximum number of keywords to extract (1-50, default 20). |
| store | string | yes | App store. "ios" for Apple App Store, "android" for Google Play. |
| store_id | string | yes | Store-specific app identifier. iOS: bundle ID or numeric track ID — the `storeId` returned by sonar_app_search works as-is. Android: package name. |
No output schema declared.
No examples provided.
sonar_app_keywords List App Keywords ~272
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 keyword_ids used by sonar_keyword_rankings. Cursor-paginated (default 50 per page). Requires an Indie plan (trial counts). `popularity` (5-100) is the value Sonar's dashboard shows: Apple's Search Popularity when Apple has a real reading; when Apple reports a keyword below its threshold (popularity_apple 5, about 20) it is Sonar's estimate (at most 18). `popularity_source` says which (apple | proxy), `popularity_apple` is Apple's own reading (null on Android), `popularity_proxy` is Sonar's estimate beside a floored reading.
| Name | Type | Req | Description |
|---|---|---|---|
| app_id | string | yes | Sonar app UUID — the `id` returned by sonar_list_apps or sonar_create_product. NOT a store id. |
| cursor | string | – | Pagination cursor from a previous call's `next_cursor`. Omit for the first page. |
| limit | integer | – | Page size (1-200). Server default applies when omitted. |
No output schema declared.
No examples provided.
sonar_app_lookup Look Up App ~259
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 then comes back as `{ data, meta }` with `meta.stale: true`, its date in `meta.stale_as_of`, and a `meta.note` to pass on to the user.
| Name | Type | Req | Description |
|---|---|---|---|
| country | string | – | 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". |
| store | string | yes | App store. "ios" for Apple App Store, "android" for Google Play. |
| store_id | string | yes | 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.… |
No output schema declared.
No examples provided.
sonar_app_overview App Overview (Dashboard Scoreboard) ~179
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, and the actionable opportunity list (near_page_one / top_three_push / easy_target). Use it when asked how an app is doing: these are the same numbers the dashboard renders, already computed from rank history. Requires an Indie plan (trial counts).
| Name | Type | Req | Description |
|---|---|---|---|
| app_id | string | yes | 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. |
| days | integer | – | Rank-history window in days (7-90). Default 30. |
No output schema declared.
No examples provided.
sonar_app_rankings App Rank History ~471
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 fields: "full" for the per-day `observations` grid: ranked has a numeric rank; not_found means a completed search did not return the app (results_count is the returned search size); not_observed means no confirmed check, including legacy gaps. Never interpret an absent rank as a collection failure or assign a numeric rank to it. The legacy history array contains positive ranks only. Use this to check how rankings moved after a metadata change or to find keywords trending up or down. Cursor-paginated over keywords (default 50 per page). Requires an Indie plan (trial counts).
| Name | Type | Req | Description |
|---|---|---|---|
| app_id | string | yes | Sonar app UUID — the `id` returned by sonar_list_apps or sonar_create_product. NOT a store id. |
| cursor | string | – | Pagination cursor from a previous call's `next_cursor`. Omit for the first page. |
| days | integer | – | History window in days (1-365). Default 30. |
| fields | string | – | "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 rank… |
| keyword_id | string | – | Restrict to one keyword — a keyword_id from sonar_app_keywords. Omit for all tracked keywords. |
| limit | integer | – | Page size (1-200). Server default applies when omitted. |
No output schema declared.
No examples provided.
sonar_app_revenue Estimate App Revenue ~306
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) with the factors behind it, and the methodology used. On the App Store installs aren't public: they are estimated from that storefront's rating count (`source: review_derived`), apps differ several-fold in installs per rating, so quote the range rather than the point figure — those estimates are never graded above medium. Google Play's public install count (`source: public_install_count`) has no install range. The figure is a model estimate, not reported revenue. Needs a Sonar API key or connected account (1 credit per call on prepaid API credits); not part of the free tier.
| Name | Type | Req | Description |
|---|---|---|---|
| country | string | – | 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". |
| store | string | yes | App store. "ios" for Apple App Store, "android" for Google Play. |
| store_id | string | yes | Store-specific app identifier. iOS: bundle ID or numeric track ID — the `storeId` returned by sonar_app_search works as-is. Android: package name. |
No output schema declared.
No examples provided.
sonar_app_reviews Fetch App Reviews ~433
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, feature-request mining, and competitive research; for an already-summarized view of a tracked app, sonar_review_insights returns themed AI analysis instead. Needs a Sonar API key or connected account (1 credit per call on prepaid API credits); not part of the free tier. If the store is throttling, the result may be Sonar's stored copy: it then comes back as `{ data, meta }` with `meta.stale: true`, its date in `meta.stale_as_of`, and a `meta.note` to pass on to the user.
| Name | Type | Req | Description |
|---|---|---|---|
| country | string | – | 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". |
| lang | string | – | 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. |
| limit | integer | – | Maximum number of reviews to return (1-200). |
| max_rating | integer | – | Filter to reviews with a star rating <= this value (1-5). |
| min_rating | integer | – | Filter to reviews with a star rating >= this value (1-5). |
| sort | string | – | Sort order. "recent" returns newest first, "helpful" returns most-voted first. |
| store | string | yes | App store. "ios" for Apple App Store, "android" for Google Play. |
| store_id | string | yes | Store-specific app identifier. iOS: bundle ID or numeric track ID — the `storeId` returned by sonar_app_search works as-is. Android: package name. |
No output schema declared.
No examples provided.
sonar_app_sales App Sales (App Store Connect) ~352
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 sorted by downloads. Same numbers as the Performance page. iOS only. Requires the Agency plan (403 on other plans) AND an App Store Connect connection at /settings/connections. Always check `status`: anything other than `ready` (not_connected, not_ios, app_not_in_account, pending, key_lacks_analytics) means there's no data and `message` says how to fix it — never read an empty series as zero. Days Apple hasn't reported yet have `reported: false` and null metrics.
| Name | Type | Req | Description |
|---|---|---|---|
| app_id | string | yes | 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. |
| days | integer | – | Window length in days (1-366) when `start` is omitted. Default 30. |
| end | string | – | Last day of the window (YYYY-MM-DD, inclusive). Default yesterday (UTC) — Apple posts a day the next morning at the earliest. |
| start | string | – | First day of the window (YYYY-MM-DD, inclusive). Omit to count `days` back from `end`. |
| store | string | – | Only needed when `app_id` is a store id tracked in both stores. App Store Connect data is iOS-only. |
No output schema declared.
No examples provided.
sonar_app_search Search Apps ~566
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 URL, list position `rank`); pass fields: "full" for whole listings, or call sonar_app_lookup for one app's full details. `source` says which ordering served the list. `app_store`: Apple's own App Store search order in that storefront (what people see searching on iPhone, editorial cards left out, at most the top 50, cached up to 30 minutes) — fine to report as the app's current position for that search, as a one-off snapshot. `itunes_search`: the iTunes Search API's text-match order, used when Apple's own search couldn't be read — NOT a rank (below the top 10 it can be dozens of places off), so never report a position from it as a rank. `google_play`: Google Play's own search order. For rank history, daily tracking or positions beyond 50, track the keyword (sonar_track_keywords) and read sonar_app_rankings or sonar_keyword_rankings. 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 then comes back as `{ data, meta }` with `meta.stale: true`, its date in `meta.stale_as_of`, and a `meta.note` to pass on to the user.
| Name | Type | Req | Description |
|---|---|---|---|
| country | string | – | 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". |
| fields | string | – | "compact" (default): rank, store, storeId, numericId, name, subtitle, developer, category, iconUrl, rating, reviews (rating count), installs (Android), price, currency (ISO code of price — store pric… |
| num | integer | – | Number of results to return (1-50, default 10). |
| query | string | yes | Search query (e.g. "meditation", "meal planner"). |
| store | string | yes | App store. "ios" for Apple App Store, "android" for Google Play. |
No output schema declared.
No examples provided.
sonar_cancel_review_reply Cancel Scheduled Review Reply ~86
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.
| Name | Type | Req | Description |
|---|---|---|---|
| review_id | string | yes | Sonar review id (the `id` of an item from sonar_review_inbox — not Apple's review id). |
No output schema declared.
No examples provided.
sonar_competitor_keywords Competitor Keywords ~311
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). Requires an Indie plan (trial counts). `popularity` (5-100) is the value Sonar's dashboard shows: Apple's Search Popularity when Apple has a real reading; when Apple reports a keyword below its threshold (popularity_apple 5, about 20) it is Sonar's estimate (at most 18). `popularity_source` says which (apple | proxy), `popularity_apple` is Apple's own reading (null on Android), `popularity_proxy` is Sonar's estimate beside a floored reading.
| Name | Type | Req | Description |
|---|---|---|---|
| competitor_app_id | string | yes | 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. |
| cursor | string | – | Pagination cursor from a previous call's `next_cursor`. Omit for the first page. |
| limit | integer | – | Page size (1-200). Server default applies when omitted. |
| own_app_id | string | – | 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. |
No output schema declared.
No examples provided.
sonar_competitor_landscape Competitor Landscape ~152
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 with metrics, and the latest AI insight if one was generated (opportunity clusters, threat narratives, strengths, posture). Use it when choosing which keywords to target next. Requires an Indie plan (trial counts).
| Name | Type | Req | Description |
|---|---|---|---|
| app_id | string | yes | 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. |
No output schema declared.
No examples provided.
sonar_create_product Create Product ~184
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_track_competitor. Own apps count against the plan cap (Indie 10, Agency 50; competitors are not capped) — at the cap the call fails with a 403 plan_limit error. Requires an Indie plan (trial counts) and an authorized Sonar account or an API key with the write scope.
| Name | Type | Req | Description |
|---|---|---|---|
| apps | array | yes | 1-2 store versions: a single iOS or Android app, or one of each for a cross-store product. |
| name | string | – | Product name. Optional — defaults to the first app's name. |
No output schema declared.
No examples provided.
sonar_create_screenshot_set Create Screenshot Set ~210
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 (studio_url in the response). Requires an Indie plan (trial counts) and an authorized Sonar account or a write-scope API key.
| Name | Type | Req | Description |
|---|---|---|---|
| device_size | string | yes | Device id from sonar_screenshot_devices, e.g. "iphone-6.7". |
| name | string | – | Display name. |
| product_id | string | yes | Product the set belongs to. |
| screens | array | – | Initial screens, in order (max 10). Either this or template_id, not both; with neither you get one blank screen. |
| store | string | yes | Target app store. |
| template_id | string | – | Seed from a built-in template (see sonar_screenshot_layout_guide) instead of providing screens. |
No output schema declared.
No examples provided.
sonar_delete_alert Delete Alert Rule ~73
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.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | The alert subscription UUID — the `id` returned by sonar_list_alerts or sonar_set_alert. |
No output schema declared.
No examples provided.
sonar_delete_product Delete Product ~127
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 not deleted. Returns { id, deleted, untracked_apps }. Requires an Indie plan (trial counts) and an authorized Sonar account or an API key with the write scope.
| Name | Type | Req | Description |
|---|---|---|---|
| product_id | string | yes | Sonar product UUID — the `id` returned by sonar_list_products or sonar_create_product. |
No output schema declared.
No examples provided.
sonar_delete_screenshot Delete Screenshot ~67
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.
| Name | Type | Req | Description |
|---|---|---|---|
| screenshot_id | string | yes | Screen id to delete. |
No output schema declared.
No examples provided.
sonar_delete_screenshot_set Delete Screenshot Set ~74
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.
| Name | Type | Req | Description |
|---|---|---|---|
| set_id | string | yes | Screenshot set id. |
No output schema declared.
No examples provided.
sonar_delete_tracked_keyword Delete Tracked Keyword ~123
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. Requires an Indie plan (trial counts) and an authorized Sonar account or an API key with the write scope.
| Name | Type | Req | Description |
|---|---|---|---|
| tracked_keyword_id | string | yes | The tracked-keyword UUID — the `id` returned by sonar_app_keywords. NOT the keyword_id. |
No output schema declared.
No examples provided.
sonar_discovered_keywords Discovered Keywords ~530
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 (0-100, best first). This is Sonar's "what should I track next" answer; rows can be tracked with sonar_track_keywords (by keyword text + country). Compact by default (no discovered-row id, store or timestamps; keyword_id stays; fields: "full" adds them). Requires an Indie plan (trial counts). `popularity` (5-100) is the value Sonar's dashboard shows: Apple's Search Popularity when Apple has a real reading; when Apple reports a keyword below its threshold (popularity_apple 5, about 20) it is Sonar's estimate (at most 18). `popularity_source` says which (apple | proxy), `popularity_apple` is Apple's own reading (null on Android), `popularity_proxy` is Sonar's estimate beside a floored reading.
| Name | Type | Req | Description |
|---|---|---|---|
| app_id | string | yes | Sonar app UUID of one of your tracked apps — the `id` returned by sonar_list_apps or sonar_create_product. NOT a store id. |
| bucket | string | – | 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. |
| country | string | – | Filter to one market (ISO country code). Omit for all markets. |
| fields | string | – | "compact" (default): keyword_id, keyword, country, rank, source, status, bucket, the four popularity fields, difficulty, ai_relevance, opportunity, competitor_rank, competitor_name. "full": adds the… |
| limit | integer | – | Max rows to return (1-500). Default 200. |
| min_opportunity | integer | – | Only rows with an opportunity score at or above this value (0-100). |
| min_relevance | integer | – | Only rows with AI relevance at or above this value (0-100). |
| source | string | – | Filter by how the keyword was discovered. Omit for all sources. |
| status | string | – | Filter by row status. Default "new" — the still-actionable suggestions; "all" includes rows already tracked or hidden. |
No output schema declared.
No examples provided.
sonar_dismiss_review_reply Dismiss Review ~83
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.
| Name | Type | Req | Description |
|---|---|---|---|
| review_id | string | yes | Sonar review id (the `id` of an item from sonar_review_inbox — not Apple's review id). |
No output schema declared.
No examples provided.
sonar_draft_review_reply Draft Review Reply (AI) ~157
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 with sonar_update_review_reply (not metered). Requires an Indie plan (trial counts) and an authorized Sonar account or an API key with the write scope.
| Name | Type | Req | Description |
|---|---|---|---|
| hint | string | – | One-off direction for this draft, e.g. "mention the fix in 2.1". |
| review_id | string | yes | Sonar review id (the `id` of an item from sonar_review_inbox — not Apple's review id). |
No output schema declared.
No examples provided.
sonar_generate_review_insights Generate Review Insights (AI) ~173
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 — use sonar_review_insights to read the current one); needs at least 5 recent reviews. Requires a paid (non-trial) Indie plan and an authorized Sonar account or an API key with the write scope.
| Name | Type | Req | Description |
|---|---|---|---|
| app_id | string | yes | Sonar app UUID of a tracked app — your own or a competitor (an `id` from sonar_list_apps). NOT a store id. |
| country | string | – | Reviews market (ISO country code). Insights are generated per country. Default "us". |
No output schema declared.
No examples provided.
sonar_get_app Get Tracked App ~223
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 notes and up to 90 snapshots. Requires an Indie plan (trial counts).
| Name | Type | Req | Description |
|---|---|---|---|
| app_id | string | yes | Sonar app UUID — the `id` returned by sonar_list_apps or sonar_create_product. NOT a store id. |
| fields | string | – | "compact" (default): identity plus the listing basics in `metadata` (numericId, subtitle, url, rating, reviews, installs, price, currency, free, offersIAP, iapRange, version, released, updated, conte… |
No output schema declared.
No examples provided.
sonar_get_screenshot_set Get Screenshot Set ~114
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).
| Name | Type | Req | Description |
|---|---|---|---|
| include_image_data | boolean | – | 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 rejected… |
| set_id | string | yes | Screenshot set id. |
No output schema declared.
No examples provided.
sonar_keyword_metrics Keyword Metrics ~467
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_keyword_search instead when you want related keyword ideas alongside metrics. Answers within about 30 seconds: a keyword that can't be computed in that time comes back as `pending` (queued on Sonar's scrape fleet, not charged, results are being cached) — call again after `retry_after_seconds` for just those keywords. Each row carries `measured_at` (when difficulty was measured) and `popularity_measured_at` (when the popularity value was measured — can be older), both ISO 8601 UTC. `stale: false` means both are under 7 days old; `stale: true` rows are real but older data (refreshed in the background) — check the timestamps when freshness matters. `popularity` (5-100) is the value Sonar's dashboard shows: Apple's Search Popularity when Apple has a real reading; when Apple reports a keyword below its threshold (popularity_apple 5, about 20) it is Sonar's estimate (at most 18). `popularity_source` says which (apple | proxy), `popularity_apple` is Apple's own reading (null on Android), `popularity_proxy` is Sonar's estimate beside a floored reading.
| Name | Type | Req | Description |
|---|---|---|---|
| country | string | – | 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". |
| keyword | string | – | Single keyword to fetch metrics for. Use this OR `keywords`, not both. |
| keywords | array | – | Bulk list of keywords to fetch metrics for (max 25). Use this OR `keyword`, not both. 1 credit per keyword. |
| store | string | yes | App store. "ios" for Apple App Store, "android" for Google Play. |
No output schema declared.
No examples provided.
sonar_keyword_rankings Keyword SERP History ~194
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 tracked in the caller's Sonar workspace. Requires an Indie plan (trial counts).
| Name | Type | Req | Description |
|---|---|---|---|
| days | integer | – | History window in days (1-365). Default 30. |
| fields | string | – | "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). |
| keyword_id | string | yes | Sonar keyword UUID — a `keyword_id` from sonar_app_keywords or sonar_competitor_keywords. NOT the keyword text. |
No output schema declared.
No examples provided.
How do I install the app.trysonar/sonar MCP server?
app.trysonar/sonar is a hosted endpoint at https://trysonar.app/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
remote · trysonar.app
claude mcp add --transport http app-trysonar-sonar 'https://trysonar.app/mcp'
What is the app.trysonar/sonar MCP server?
app.trysonar/sonar is an MCP server listed in the public MCP registry as app.trysonar/sonar. ASO tools for AI agents: keyword research, rank tracking, competitor analysis (iOS & Android). This page covers its hosted endpoint (https://trysonar.app/mcp).
Is the app.trysonar/sonar MCP server safe to use?
app.trysonar/sonar scores 80 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the app.trysonar/sonar MCP server expose?
app.trysonar/sonar exposes 79 tools: sonar_app_lookup, sonar_app_search, sonar_app_aso_score, sonar_app_extract_keywords, sonar_app_reviews, and 74 more. Their descriptions and schemas cost roughly 16,489 tokens of context every time the server is loaded.
Does the app.trysonar/sonar MCP server require authentication?
No. We connected to app.trysonar/sonar without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.
Is the app.trysonar/sonar MCP server still maintained?
app.trysonar/sonar is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.