# app.trysonar/sonar (remote · trysonar.app)

ASO tools for AI agents: keyword research, rank tracking, competitor analysis (iOS & Android).

- Trust score: 81/100 (high trust)
- Change this week: +1
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-09-20

> **Recent critical change**: Authorization (2026-09-12). See the changelog below before you install this server.

## Components

- remote · `trysonar.app`: 81/100 (this document), [markdown](https://verifymcp.io/servers/app-trysonar-sonar/trysonar.md), [page](https://verifymcp.io/servers/app-trysonar-sonar/trysonar)
- npm · `@sonarapp/mcp`: 83/100, [markdown](https://verifymcp.io/servers/app-trysonar-sonar/sonarapp-mcp.md), [page](https://verifymcp.io/servers/app-trysonar-sonar/sonarapp-mcp)

## Channel facts

- Endpoint: `https://trysonar.app/mcp`
- Transports: `streamable-http`
- Auth: `required`
- Version: `0.7.0`

## Trust breakdown

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. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-09-20.

- **Endpoint Security**: 66/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - Authorisation check failed: no authorisation is required to call this server, and it exposes a tool marked destructive (sonar_delete_tracked_keyword).
  - HTTPS is enforced; there's no plaintext access path.
  - The HSTS (Strict-Transport-Security) header is present.
  - DNSSEC is configured correctly; the domain's records validate against the full chain to the root.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 74/100
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 7595 tokens (~146/item across 52 items; 52 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 98/100
  - Stability check failed: schema churn in the 30 days we've observed: 1 tool removals, 0 breaking changes, 0 auth/transport breaks, 0 additions.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - All 6 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.
  - An AI judge read all 52 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### 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.

### Claude

```bash
claude mcp add --transport http app-trysonar-sonar 'https://trysonar.app/mcp'
```

### Cursor

```json
{
  "mcpServers": {
    "app-trysonar-sonar": {
      "url": "https://trysonar.app/mcp"
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "app-trysonar-sonar": {
      "type": "http",
      "url": "https://trysonar.app/mcp"
    }
  }
}
```

### Codex

```toml
[mcp_servers.app-trysonar-sonar]
url = "https://trysonar.app/mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "app-trysonar-sonar": {
      "type": "remote",
      "url": "https://trysonar.app/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add app-trysonar-sonar --url 'https://trysonar.app/mcp' --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  app-trysonar-sonar:
    url: "https://trysonar.app/mcp"
```

### Netclaw

```json
{
  "McpServers": {
    "app-trysonar-sonar": {
      "Transport": "http",
      "Url": "https://trysonar.app/mcp"
    }
  }
}
```

### Vellum

```bash
assistant mcp add app-trysonar-sonar -t streamable-http -u 'https://trysonar.app/mcp'
```

### Other

```json
{
  "mcpServers": {
    "app-trysonar-sonar": {
      "type": "http",
      "url": "https://trysonar.app/mcp"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-09-16 (score 81, 0)

- [security] Tool “sonar_app_rankings” rewrote its description, which is the text the model reads
- [functional] Server version: 0.8.1 → 0.9.0

### 2026-09-15 (score 81, +1)

No change was recorded against any check on this day. Stability & Change Management went from 91 to 95.

### 2026-09-14 (score 80, 0)

- [cosmetic] “sonar_app_reviews” added an optional parameter “lang”

### 2026-09-12 (score 80, −12)

- [critical regression] Authorization: pass → fail
- [security regression] Stability: 0.83 → fail
- [security regression] Tool “sonar_export_screenshots” was removed
- [security] Tool “sonar_add_screenshot” rewrote its description, which is the text the model reads
- [security] Tool “sonar_track_keywords” rewrote its description, which is the text the model reads
- [security] Tool “sonar_track_competitor” rewrote its description, which is the text the model reads
- [security] Tool “sonar_track_app” rewrote its description, which is the text the model reads
- [security] Tool “sonar_star_keyword” rewrote its description, which is the text the model reads
- [security] Tool “sonar_set_screenshot_translations” rewrote its description, which is the text the model reads
- [security] Tool “sonar_set_alert” 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] Tool “sonar_remove_competitor” rewrote its description, which is the text the model reads
- [security] Tool “sonar_generate_review_insights” rewrote its description, which is the text the model reads
- [security] Tool “sonar_delete_screenshot_set” rewrote its description, which is the text the model reads
- [security] Tool “sonar_delete_screenshot” rewrote its description, which is the text the model reads
- [security] Tool “sonar_delete_product” rewrote its description, which is the text the model reads
- [security] Tool “sonar_delete_alert” rewrote its description, which is the text the model reads
- [security] Tool “sonar_create_screenshot_set” rewrote its description, which is the text the model reads
- [security] Tool “sonar_create_product” rewrote its description, which is the text the model reads
- [security] Tool “sonar_analyze_competitors” rewrote its description, which is the text the model reads
- [security] Tool “sonar_delete_tracked_keyword” rewrote its description, which is the text the model reads
- [security] Tool “sonar_update_screenshot_set” rewrote its description, which is the text the model reads
- [security] Tool “sonar_update_screenshot” rewrote its description, which is the text the model reads
- [security] Tool “sonar_update_keyword_note” rewrote its description, which is the text the model reads
- [security] Tool “sonar_untrack_keywords” rewrote its description, which is the text the model reads
- [security] Tool “sonar_untrack_app” rewrote its description, which is the text the model reads
- [security] Tool “sonar_set_screenshot_translations” is now declared destructive
- [security] Tool “sonar_update_screenshot” is now declared destructive
- [functional] Server version: 0.7.0 → 0.8.1

### 2026-09-11 (score 92, +1)

No change was recorded against any check on this day. Stability & Change Management went from 80 to 83. That category is still filling its 30-day observation window: 24 days of observed history at the previous scan, 25 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-09 (score 91, +1)

No change was recorded against any check on this day. Stability & Change Management went from 73 to 77. That category is still filling its 30-day observation window: 22 days of observed history at the previous scan, 23 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-06 (score 90, +1)

- [security] Tool “sonar_keyword_metrics” rewrote its description, which is the text the model reads

### 2026-09-04 (score 89, +1)

No change was recorded against any check on this day. Stability & Change Management went from 57 to 60. That category is still filling its 30-day observation window: 17 days of observed history at the previous scan, 18 at this one. The score rises as the window fills, whether or not the server changes.

## MCP tools (52)

### `sonar_app_lookup` (~153 tokens)

Look Up App

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).

Input parameters:

- `country` (string): ISO 3166-1 alpha-2 country code (e.g. "us", "gb", "de"). Default "us".
- `store` (string, required): App store. "ios" for Apple App Store, "android" for Google Play.
- `store_id` (string, required): Store-specific app identifier. iOS: numeric track ID (e.g. "123456789"). Android: package name (e.g. "com.spotify.music").

### `sonar_app_search` (~150 tokens)

Search Apps

Search apps in the App Store or Google Play by keyword. Returns ranked list of apps with metadata (results are returned in store ranking order). Works without an API key (free tier, limited daily use per IP).

Input parameters:

- `country` (string): ISO 3166-1 alpha-2 country code (e.g. "us", "gb", "de"). Default "us".
- `num` (integer): Number of results to return (1-50, default 10).
- `query` (string, required): Search query (e.g. "meditation", "meal planner").
- `store` (string, required): App store. "ios" for Apple App Store, "android" for Google Play.

### `sonar_app_aso_score` (~160 tokens)

ASO Score

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).

Input parameters:

- `country` (string): ISO 3166-1 alpha-2 country code (e.g. "us", "gb", "de"). Default "us".
- `store` (string, required): App store. "ios" for Apple App Store, "android" for Google Play.
- `store_id` (string, required): Store-specific app identifier. iOS: numeric track ID. Android: package name.

### `sonar_app_extract_keywords` (~163 tokens)

Extract App Keywords

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).

Input parameters:

- `country` (string): ISO 3166-1 alpha-2 country code (e.g. "us", "gb", "de"). Default "us".
- `max` (integer): Maximum number of keywords to extract (1-50, default 20).
- `store` (string, required): App store. "ios" for Apple App Store, "android" for Google Play.
- `store_id` (string, required): Store-specific app identifier. iOS: numeric track ID. Android: package name.

### `sonar_app_reviews` (~253 tokens)

Fetch App Reviews

Fetch user reviews for an app. Supports filtering by star rating range and sorting by recent or helpful. Useful for sentiment analysis, feature-request mining, and competitive research.

Input parameters:

- `country` (string): ISO 3166-1 alpha-2 country code (e.g. "us", "gb", "de"). 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, required): App store. "ios" for Apple App Store, "android" for Google Play.
- `store_id` (string, required): Store-specific app identifier. iOS: numeric track ID. Android: package name.

### `sonar_app_revenue` (~144 tokens)

Estimate App Revenue

Estimate monthly revenue for an app, based on install counts, ratings, and category benchmarks. Returns the dollar estimate, a confidence grade (high/medium/low) with the factors behind it, and the methodology used — always communicate the confidence alongside the number.

Input parameters:

- `country` (string): ISO 3166-1 alpha-2 country code (e.g. "us", "gb", "de"). Default "us".
- `store` (string, required): App store. "ios" for Apple App Store, "android" for Google Play.
- `store_id` (string, required): Store-specific app identifier. iOS: numeric track ID. Android: package name.

### `sonar_keyword_search` (~126 tokens)

Keyword Research

Research a keyword and related terms. Returns difficulty (0-100), popularity score, and results count for the seed keyword plus related autocomplete suggestions. Use this to find keywords worth targeting.

Input parameters:

- `country` (string): ISO 3166-1 alpha-2 country code (e.g. "us", "gb", "de"). Default "us".
- `query` (string, required): Seed keyword to research (e.g. "meditation", "recipe app").
- `store` (string, required): App store. "ios" for Apple App Store, "android" for Google Play.

### `sonar_keyword_metrics` (~247 tokens)

Keyword Metrics

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. A keyword the API cannot compute right away comes back as `pending` (queued on the scrape fleet, not charged) — this tool already waits and re-checks briefly; if it is still pending, call again after `retry_after_seconds`.

Input parameters:

- `country` (string): ISO 3166-1 alpha-2 country code (e.g. "us", "gb", "de"). 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, required): App store. "ios" for Apple App Store, "android" for Google Play.

### `sonar_keyword_suggestions` (~152 tokens)

Keyword Suggestions

Get autocomplete suggestions for a seed keyword from the App Store or Google Play. Returns terms with a priority score (higher = more searched). Lighter and faster than sonar_keyword_search — use when you only need term ideas without difficulty/popularity scoring. Works without an API key (free tier, limited daily use per IP).

Input parameters:

- `country` (string): ISO 3166-1 alpha-2 country code (e.g. "us", "gb", "de"). Default "us".
- `seed` (string, required): Seed keyword. The store will return autocomplete suggestions starting from this term.
- `store` (string, required): App store. "ios" for Apple App Store, "android" for Google Play.

### `sonar_top_charts` (~278 tokens)

Top Charts

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 always describe the full top 200 — `limit` truncates the returned entries only. Movement is empty on the first day a chart is requested (no previous snapshot yet). Works without an API key (free tier, limited daily use per IP).

Input parameters:

- `category` (string): Category key, e.g. "HEALTH_AND_FITNESS" (iOS) or "HEALTH_AND_FITNESS" / "GAME" (Android). Use "overall" (default) for the store-wide chart.
- `chart` (string): Chart type: "free", "paid" or "grossing". Default "free".
- `country` (string): ISO 3166-1 alpha-2 country code (e.g. "us", "gb", "de"). Default "us".
- `limit` (integer): Number of chart entries to return (1-200). Default 50.
- `store` (string, required): App store. "ios" for Apple App Store, "android" for Google Play.

### `sonar_list_apps` (~130 tokens)

List Tracked Apps

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-paginated (default 100 per page). Requires an Indie plan (trial counts).

Input parameters:

- `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.

### `sonar_get_app` (~83 tokens)

Get Tracked App

Get full details for one tracked app in the caller's Sonar workspace: store metadata plus up to 90 daily snapshots of rating, review count, version, and installs. Requires an Indie plan (trial counts).

Input parameters:

- `app_id` (string, required): Sonar app UUID — the `id` returned by sonar_list_apps or sonar_create_product. NOT a store id.

### `sonar_app_keywords` (~168 tokens)

List App Keywords

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).

Input parameters:

- `app_id` (string, required): 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.

### `sonar_app_rankings` (~264 tokens)

App Rank History

Rank history for an app's tracked keywords — daily ranks over the requested window, one history array per keyword. Prefer observations for daily status: 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).

Input parameters:

- `app_id` (string, required): 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.
- `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.

### `sonar_app_changes` (~128 tokens)

App Change History

Change history for a tracked app — detected releases, metadata edits, screenshot swaps, price changes, and category moves, newest first. Useful for correlating rank movements with what the app (or a competitor) changed. Requires an Indie plan (trial counts).

Input parameters:

- `app_id` (string, required): 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.

### `sonar_keyword_rankings` (~125 tokens)

Keyword SERP History

SERP history for one tracked keyword — which apps ranked in the top results on each measured day, newest first. 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).

Input parameters:

- `days` (integer): History window in days (1-365). Default 30.
- `keyword_id` (string, required): Sonar keyword UUID — a `keyword_id` from sonar_app_keywords or sonar_competitor_keywords. NOT the keyword text.

### `sonar_competitor_keywords` (~207 tokens)

Competitor Keywords

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).

Input parameters:

- `competitor_app_id` (string, required): 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.

### `sonar_competitor_landscape` (~152 tokens)

Competitor Landscape

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). Read this before deciding which keywords to target next. Requires an Indie plan (trial counts).

Input parameters:

- `app_id` (string, required): 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_products` (~38 tokens)

List Products

List your products with their linked store versions and competitor counts. Use it to discover product/app UUIDs. Requires an Indie plan (trial counts).

### `sonar_list_alerts` (~55 tokens)

List Alert Rules

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).

### `sonar_alert_events` (~226 tokens)

Alert Events Feed

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).

Input parameters:

- `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.

### `sonar_app_overview` (~186 tokens)

App Overview (Dashboard Scoreboard)

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). Read this FIRST when asked how an app is doing — it's the same numbers the dashboard renders, so you don't need to recompute anything from raw rank history. Requires an Indie plan (trial counts).

Input parameters:

- `app_id` (string, required): 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.

### `sonar_discovered_keywords` (~337 tokens)

Discovered Keywords

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: read it, pick the winners, then track them with sonar_track_keywords. Requires an Indie plan (trial counts).

Input parameters:

- `app_id` (string, required): 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.
- `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.

### `sonar_review_insights` (~160 tokens)

Review Insights (AI)

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 requests, and what changed vs the previous analysis. `insight` is null if none has been generated yet — use sonar_generate_review_insights. Requires an Indie plan (trial counts).

Input parameters:

- `app_id` (string, required): 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".

### `sonar_portfolio` (~111 tokens)

Portfolio Rollup (Agency)

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 (visibility drops, rating drops, not-ranked apps), and the best discovered-keyword opportunities across all apps. Same numbers as the /portfolio page. Requires an Agency plan (403 on other plans).

### `sonar_create_product` (~147 tokens)

Create Product

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. Requires an Indie plan (trial counts) and an authorized Sonar account or an API key with the write scope.

Input parameters:

- `apps` (array, required): 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.

### `sonar_track_app` (~203 tokens)

Track App

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_create_product instead. Requires an Indie plan (trial counts) and an authorized Sonar account or an API key with the write scope.

Input parameters:

- `country` (string): ISO 3166-1 alpha-2 country code (e.g. "us"). Optional — defaults server-side.
- `product_id` (string, required): Sonar product UUID (from sonar_create_product). NOT a store id.
- `store` (string, required): App store. "ios" for Apple App Store, "android" for Google Play.
- `store_id` (string, required): Store-specific app identifier of the version to link. iOS: numeric track ID. Android: package name.

### `sonar_track_competitor` (~185 tokens)

Track Competitor

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 Sonar account or an API key with the write scope.

Input parameters:

- `country` (string): ISO 3166-1 alpha-2 country code (e.g. "us"). Optional — defaults server-side.
- `product_id` (string, required): Sonar product UUID (from sonar_create_product). NOT a store id.
- `store` (string, required): App store. "ios" for Apple App Store, "android" for Google Play.
- `store_id` (string, required): Store-specific app identifier of the COMPETITOR app to track. iOS: numeric track ID. Android: package name.

### `sonar_track_keywords` (~194 tokens)

Track Keywords

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). Requires an Indie plan (trial counts) and an authorized Sonar account or an API key with the write scope.

Input parameters:

- `app_id` (string, required): 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.
- `country` (string): ISO 3166-1 alpha-2 country code (e.g. "us"). Optional — defaults to the product's country.
- `keywords` (array, required): Keywords to start tracking (1-200). Duplicates and already-tracked terms are reported, not duplicated.

### `sonar_update_keyword_note` (~139 tokens)

Update Keyword Note

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 an API key with the write scope.

Input parameters:

- `note` (required): Note text (max 1000 chars). Pass null or an empty string to clear the note.
- `tracked_keyword_id` (string, required): Tracked-keyword UUID — the `id` (not keyword_id) returned by sonar_app_keywords or sonar_track_keywords.

### `sonar_star_keyword` (~160 tokens)

Star Keyword

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 timestamp, unstarring a non-starred keyword is a no-op. Requires an Indie plan (trial counts) and an authorized Sonar account or an API key with the write scope.

Input parameters:

- `starred` (boolean, required): true to star the keyword (mark as a favorite/target), false to unstar.
- `tracked_keyword_id` (string, required): Tracked-keyword UUID — the `id` (not keyword_id) returned by sonar_app_keywords or sonar_track_keywords.

### `sonar_scan_competitor` (~198 tokens)

Scan Competitor Keywords

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. Returns generated/queued/verified_now counts; the rest verify in the background over the following hours — read results with sonar_competitor_keywords. Requires an Indie plan (trial counts) and an authorized Sonar account or an API key with the write scope.

Input parameters:

- `competitor_app_id` (string, required): 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, required): Sonar app UUID of your own app the scan compares against. The competitor must be linked to this app.

### `sonar_analyze_competitors` (~157 tokens)

Analyze Competitors (AI)

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.

Input parameters:

- `app_id` (string, required): Sonar app UUID of YOUR OWN tracked app to analyze. NOT a store id, NOT a competitor id.

### `sonar_generate_review_insights` (~173 tokens)

Generate Review Insights (AI)

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.

Input parameters:

- `app_id` (string, required): 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".

### `sonar_delete_tracked_keyword` (~95 tokens)

Delete Tracked Keyword

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). Requires an Indie plan (trial counts) and an authorized Sonar account or an API key with the write scope.

Input parameters:

- `tracked_keyword_id` (string, required): The tracked-keyword UUID — the `id` returned by sonar_app_keywords. NOT the keyword_id.

### `sonar_untrack_keywords` (~187 tokens)

Untrack Keywords

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). Requires an Indie plan (trial counts) and an authorized Sonar account or an API key with the write scope.

Input parameters:

- `all` (boolean): Set true to untrack ALL keywords for the app. Mutually exclusive with `ids` — pass exactly one of `all` or `ids`.
- `app_id` (string, required): Sonar app UUID — the `id` returned by sonar_list_apps or sonar_create_product. NOT a store id.
- `ids` (array): Tracked-keyword ids to untrack (from sonar_app_keywords). Mutually exclusive with `all` — pass exactly one of `all` or `ids`.

### `sonar_untrack_app` (~84 tokens)

Untrack App

WRITE tool — untrack an app and its associated tracking data 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.

Input parameters:

- `app_id` (string, required): Sonar app UUID — the `id` returned by sonar_list_apps or sonar_create_product. NOT a store id.

### `sonar_delete_product` (~77 tokens)

Delete Product

WRITE tool — delete a product and untrack its apps 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.

Input parameters:

- `product_id` (string, required): Sonar product UUID — the `id` returned by sonar_list_products or sonar_create_product.

### `sonar_remove_competitor` (~106 tokens)

Remove Competitor

WRITE tool — remove a competitor from a product 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.

Input parameters:

- `competitor_app_id` (string, required): Sonar app UUID of the competitor to remove (the competitor's `id`, NOT a store id).
- `product_id` (string, required): Sonar product UUID — the `id` returned by sonar_list_products or sonar_create_product.

### `sonar_set_alert` (~181 tokens)

Set Alert Rule

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 plan (trial counts) and an authorized Sonar account or an API key with the write scope.

Input parameters:

- `enabled` (boolean): Whether the rule is active. Defaults to enabled when omitted.
- `scope_app_id`: Limit the alert to a single app (Sonar app UUID). Omit or null for an org-wide rule covering all tracked apps.
- `threshold`: Sensitivity threshold (meaning depends on type). Omit or null to use the per-type default.
- `type` (string, required): The alert type to subscribe to.

### `sonar_delete_alert` (~73 tokens)

Delete Alert Rule

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.

Input parameters:

- `id` (string, required): The alert subscription UUID — the `id` returned by sonar_list_alerts or sonar_set_alert.

### `sonar_screenshot_layout_guide` (~63 tokens)

Screenshot Layout Guide

The layout-format reference for Sonar screenshot sets. Call this ONCE before creating or editing screenshot layouts — it documents the layout JSON schema, coordinate system, image handling (remote URLs), flowing background shapes, fonts, translation overrides, and the recommended workflow.

### `sonar_screenshot_devices` (~52 tokens)

List Screenshot Devices

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. Pick a device here before sonar_create_screenshot_set.

### `sonar_list_screenshot_sets` (~60 tokens)

List Screenshot Sets

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

Input parameters:

- `product_id` (string, required): Product id (find it with sonar_list_products).

### `sonar_create_screenshot_set` (~187 tokens)

Create Screenshot Set

Create an app-store screenshot set for a product. Read sonar_screenshot_layout_guide first, then author the screens array. The set is immediately visible/editable for humans in the Screenshot Studio (studio_url in the response). Requires an authorized Sonar account or a write-scope API key.

Input parameters:

- `device_size` (string, required): Device id from sonar_screenshot_devices, e.g. "iphone-6.7".
- `name` (string): Display name.
- `product_id` (string, required): 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, required): Target app store.
- `template_id` (string): Seed from a built-in template (see sonar_screenshot_layout_guide) instead of providing screens.

### `sonar_get_screenshot_set` (~106 tokens)

Get Screenshot Set

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.

Input parameters:

- `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, required): Screenshot set id.

### `sonar_update_screenshot_set` (~129 tokens)

Update Screenshot Set

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

Input parameters:

- `locales` (array): Replaces the extra-locale list (e.g. ["de-DE","fr-FR"]). Locales removed here lose their stored translations.
- `name` (string): New display name.
- `screen_order` (array): Full permutation of the set's screen ids in the new display order.
- `set_id` (string, required): Screenshot set id.

### `sonar_delete_screenshot_set` (~66 tokens)

Delete Screenshot Set

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

Input parameters:

- `set_id` (string, required): Screenshot set id.

### `sonar_add_screenshot` (~70 tokens)

Add Screenshot

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

Input parameters:

- `layout` (object): Omit for a blank screen.
- `set_id` (string, required): Screenshot set to append to.

### `sonar_update_screenshot` (~123 tokens)

Update Screenshot

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 authorized Sonar account or a write-scope API key.

Input parameters:

- `layout` (object, required): 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, required): Screen id (from the set's screens array).

### `sonar_delete_screenshot` (~59 tokens)

Delete Screenshot

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

Input parameters:

- `screenshot_id` (string, required): Screen id to delete.

### `sonar_set_screenshot_translations` (~125 tokens)

Set Screenshot Translations

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 authorized Sonar account or a write-scope API key.

Input parameters:

- `entries` (array, required): One entry per screen to localize.
- `locale` (string, required): Target locale code, e.g. "de-DE", "pt-BR", "zh-Hans".
- `set_id` (string, required): Screenshot set id.

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/app-trysonar-sonar/trysonar#diagnostics

## Score history

- 2026-09-20: 81
- 2026-09-19: 81
- 2026-09-18: 81
- 2026-09-17: 81
- 2026-09-16: 81
- 2026-09-15: 81
- 2026-09-14: 80
- 2026-09-13: 80
- 2026-09-12: 80
- 2026-09-11: 92
- 2026-09-10: 91
- 2026-09-09: 91
- 2026-09-08: 90
- 2026-09-07: 90
- 2026-09-06: 90
- 2026-09-05: 89
- 2026-09-04: 89
- 2026-09-03: 88
- 2026-09-02: 88
- 2026-09-01: 87
- 2026-08-31: 87
- 2026-08-30: 86
- 2026-08-29: 84
- 2026-08-28: 83
- 2026-08-27: 85
- 2026-08-26: 85
- 2026-08-25: 70
- 2026-08-24: 70
- 2026-08-23: 69
- 2026-08-22: 69

## Common questions

### 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 81 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 52 tools: sonar_app_lookup, sonar_app_search, sonar_app_aso_score, sonar_app_extract_keywords, sonar_app_reviews, and 47 more. Their descriptions and schemas cost roughly 7,595 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 20 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

## Links

- Remote endpoint: https://trysonar.app/mcp
- Authorisation metadata: https://trysonar.app/.well-known/oauth-protected-resource/mcp
- Repository: https://github.com/trysonar/mcp
- Changelog RSS feed: https://verifymcp.io/servers/app-trysonar-sonar/trysonar.xml
- Changelog JSON feed: https://verifymcp.io/servers/app-trysonar-sonar/trysonar.json
- HTML version of this page: https://verifymcp.io/servers/app-trysonar-sonar/trysonar
