Clean, LLM-optimized Reddit MCP server. Browse posts, search content, analyze users. No fluff, just Reddit data.
AppGoat is installed from its publisher's own source and answers where it runs, so this marketplace is not in the path of a single call. There is no address here to send one to, and a panel that pretended otherwise would be showing you an answer we made up. Install it and call it from your own client — the Installation tab has the entry for each one.
What it does
App Store and Google Play data: apps, reviews, keywords, charts, competitors, ASO playbooks.
Quickstart
# 1 — add it to Claude Code
claude mcp add --scope user --transport http appgoat-mcp https://api.appgoat.ai/mcp
# 2 — ask your agent for something these tools do
# get_app, get_reviews, get_app_history and 26 more
AppGoat costs nothing on mcprush: there is no plan to choose here, no cap to set and nothing mcprush can bill you for.
Collected from a public index. Nobody has claimed this account, so nothing here was written by its author — claim it if it is yours.
Where are you running it?
Every route below installs the same thing and ends at the same approval screen. Nothing here runs on your machine and nothing runs on ours: this server answers at its publisher’s own address, and what you install is the connection straight to it.
This is a public server: it answers at its publisher’s own address and this marketplace is not in the path. Claude Code registers it in one command; --scope user makes it available in every project. The transport below is http, as the publisher's own manifest declares it. Its publisher asks you to sign in with OAuth: run /mcp in Claude Code and pick this server, and it opens a browser for that once.
claude mcp add --scope user --transport http appgoat-mcp https://api.appgoat.ai/mcpReconnect, or start a new session, and the tools appear in the model’s tool list.
Nothing is required, but it can take X-API-Key header (Optional AppGoat API key from dash.appgoat.ai; omit to sign in with OAuth) if you want to set it.
One config entry pointing straight at the publisher’s own address — this marketplace is not in the path, and nothing from this listing executes on your machine.
29 tools, with what each one reads, writes and reaches shown before you agree — the same list on every route above. Read the tool surface.
Tool surface
What the model actually sees. Descriptions are diffed on every release — see version history.
Look up one App Store or Google Play app: title, subtitle, developer, category, price, rating and histogram, installs (Play), version and dates, description, languages, and the same app in the other store. Accepts any id, bundle id, package, store URL or a name. Reads stored data (refreshed from the store only when older than max_age, default 7 days) for one country (default us); add include secti
| Parameter | Type | Required | Notes |
|---|---|---|---|
| app | string | yes | Any app identifier: App Store id (284882215, id284882215), Play package (com.spotify.music), Apple bundle id (com.spotify.client), store URL (URL-encoded), apple:<id> / play:<id>, or a nam |
| store | string | no | Disambiguates {app} (a bundle id vs a Play package, or a name). |
| country | string | no | ISO country code(s): us (default), a comma list (paid plans), or all (Studio). Example: us,de |
| max_age | integer | no | Refresh from the store when our data is older than this many seconds (0 = always). Default 604800 (7 days). |
| wait | boolean | no | Block up to ~25 s for a refresh (default). false = answer immediately from cache with a job id. |
| include | array | no | Extra sections: markets (every storefront), iap, versions (history with release notes), privacy (App Store labels), estimates (modelled downloads/revenue), charts (current top-chart positions) |
| full_text | boolean | no | Return long text (description, release notes, review bodies) in full instead of cut short |
| format | string | no | 'markdown' (default): compact tables for reading. 'json': the API's raw { data, meta } |
Read an app's user reviews, newest first, up to 100 per page: rating, title, text, version, date, developer reply and AI tags (sentiment, intent, severity, topic) where tagged. Filter by stars (rating='1-2' for complaints), version, date range, text (q) or AI tags (intent='bug,crash'; tag filters skip untagged reviews). Page with cursor. Cost: 1 per page + 1 if the US reviews are refreshed credits
| Parameter | Type | Required | Notes |
|---|---|---|---|
| app | string | yes | Any app identifier: App Store id (284882215, id284882215), Play package (com.spotify.music), Apple bundle id (com.spotify.client), store URL (URL-encoded), apple:<id> / play:<id>, or a nam |
| store | string | no | Disambiguates {app} (a bundle id vs a Play package, or a name). |
| country | string | no | ISO country code(s): us (default), a comma list (paid plans), or all (Studio). Example: us,de |
| rating | string | no | Star rating filter, 1, 1,2 or a range 1-3. Example: 1-2 |
| version | string | no | Only reviews written for this app version. |
| since | string | no | Only items at or after this ISO date / datetime. Example: 2026-10-01 |
| until | string | no | Only reviews created before this ISO date / datetime. |
| q | string | no | Case-insensitive text search in the title and body. Example: crash |
| sentiment | string | no | AI sentiment filter (comma list): positive, neutral, negative. Example: negative |
| intent | string | no | AI intent filter (comma list): bug, crash, feature_request, pricing, ux, praise, spam, other. Example: bug,crash |
| topic | string | no | AI topic filter (comma list of topic labels, case-insensitive, or topic ids). |
| limit | integer | no | Max items to return. Default: 50. |
| cursor | string | no | meta.next_cursor from the previous page. |
| max_age | integer | no | Refresh the latest US reviews when older than this many seconds. Default 86400 (1 day). |
| full_text | boolean | no | Return long text (description, release notes, review bodies) in full instead of cut short |
| format | string | no | 'markdown' (default): compact tables for reading. 'json': the API's raw { data, meta } |
An app's daily metric history per country: rating, ratings count, reviews count, installs (Play), star histogram and price, one row per day a value changed (default the last 90 days), with the change over the period. Use it to chart growth or spot rating drops after a release. Cost: 1 + 1 per country refreshed (max 10) credits.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| app | string | yes | Any app identifier: App Store id (284882215, id284882215), Play package (com.spotify.music), Apple bundle id (com.spotify.client), store URL (URL-encoded), apple:<id> / play:<id>, or a nam |
| store | string | no | Disambiguates {app} (a bundle id vs a Play package, or a name). |
| country | string | no | ISO country code(s): us (default), a comma list (paid plans), or all (Studio). Example: us,de |
| from | string | no | Start date (ISO), default 90 days before to. |
| to | string | no | End date (ISO), default today. |
| format | string | no | 'markdown' (default): compact tables for reading. 'json': the API's raw { data, meta } |
What changed in an app's store listing, newest first, with old and new values: version, release notes, title, subtitle, description, screenshots, icon, price, IAP, privacy, in-app events, badges, featuring, installs, content rating. Use it to monitor competitors ("what did X change this month?"). Cost: 1 + 1 if the US listing is refreshed credits.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| app | string | yes | Any app identifier: App Store id (284882215, id284882215), Play package (com.spotify.music), Apple bundle id (com.spotify.client), store URL (URL-encoded), apple:<id> / play:<id>, or a nam |
| store | string | no | Disambiguates {app} (a bundle id vs a Play package, or a name). |
| country | string | no | Only changes seen in these storefronts (comma list). Default all storefronts. |
| field | string | no | Only these fields (comma list), e.g. version,title,subtitle. |
| since | string | no | Only items at or after this ISO date / datetime. Example: 2026-10-01 |
| limit | integer | no | Max items to return. Default: 50. |
| cursor | string | no | meta.next_cursor from the previous page. |
| format | string | no | 'markdown' (default): compact tables for reading. 'json': the API's raw { data, meta } |
The search terms an app ranks for in a country, best rank first, with popularity (5–100) and difficulty (0–100): from the weekly keyword universe plus your tracked keywords. Call it for the app and a competitor to find keyword gaps. Cost: 1 credits.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| app | string | yes | Any app identifier: App Store id (284882215, id284882215), Play package (com.spotify.music), Apple bundle id (com.spotify.client), store URL (URL-encoded), apple:<id> / play:<id>, or a nam |
| store | string | no | Disambiguates {app} (a bundle id vs a Play package, or a name). |
| country | string | no | Two-letter country code (default 'us'). |
| max_rank | integer | no | Only terms where the app ranks at or above this position. |
| limit | integer | no | Max items to return. Default: 100. |
| cursor | string | no | meta.next_cursor from the previous page. |
| format | string | no | 'markdown' (default): compact tables for reading. 'json': the API's raw { data, meta } |
An app's competitors, best first, scored from search terms both apps rank for (shared keywords) plus the store's similar-apps list. Feed the app ids into get_app or get_app_changes for a competitor digest. Cost: 1 credits.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| app | string | yes | Any app identifier: App Store id (284882215, id284882215), Play package (com.spotify.music), Apple bundle id (com.spotify.client), store URL (URL-encoded), apple:<id> / play:<id>, or a nam |
| store | string | no | Disambiguates {app} (a bundle id vs a Play package, or a name). |
| country | string | no | Two-letter country code (default 'us'). |
| limit | integer | no | Max items to return. Default: 20. |
| format | string | no | 'markdown' (default): compact tables for reading. 'json': the API's raw { data, meta } |
Find apps by name or id in AppGoat's catalog of both stores (~5M apps): exact title matches first, then prefix, then substring, most-rated first. Returns store, app_id, title, developer, category, rating, ratings and price; pass the app_id to the other tools. Cost: 1 credits.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| q | string | yes | App name (≥ 2 characters) or exact id. Example: photo editor |
| store | string | no | Limit to one store: 'apple' or 'play'. Omit for both. |
| category | string | no | Store category name, e.g. Photo & Video (App Store) or PHOTOGRAPHY (Play). |
| limit | integer | no | Max items to return. Default: 20. |
| cursor | string | no | meta.next_cursor from the previous page. |
| format | string | no | 'markdown' (default): compact tables for reading. 'json': the API's raw { data, meta } |
A top free, paid or grossing chart for a store, country and category, today or on a past date: rank, app, developer, rating and the move since the previous capture (new entries marked), plus apps that dropped out. Charts are captured daily for every country and category. Cost: 1 credits.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| store | string | no | 'apple' (default) or 'play'. |
| country | string | no | Two-letter country code (default 'us'). |
| chart | string | no | 'free' (default), 'paid' or 'grossing'. |
| category | string | no | App Store genre id (36 or all = all apps, 6014 = games, …) or Play category (GAME_PUZZLE; APPLICATION = all apps). |
| date | string | no | The chart as of this date (ISO). Default the latest capture. |
| limit | integer | no | How many ranks to return (default 100, max 200). |
| format | string | no | 'markdown' (default): compact tables for reading. 'json': the API's raw { data, meta } |
Keyword metrics and research for App Store / Google Play search terms: popularity (5–100), difficulty (0–100), result count and the #1 result's estimated daily downloads. include adds related terms with metrics, the store's autocomplete and the current top 10 apps; app adds that app's rank and metadata relevance per term (the core of an ASO keyword audit). Unmeasured terms are measured live (a few
| Parameter | Type | Required | Notes |
|---|---|---|---|
| terms | array | yes | Search terms, 1–25 (at most 5 with include related or suggestions) |
| store | string | no | Required unless app is given. |
| country | string | no | Two-letter ISO country code (storefront), e.g. us, gb, de. Default: us. |
| app | string | no | Any app identifier (as in {app}); adds app.rank and app.relevance per term. |
| wait | boolean | no | Block up to ~25 s for a refresh (default). false = answer immediately from cache with a job id. |
| include | array | no | related (~10 related terms with metrics), suggestions (store autocomplete), top_apps (current top 10). related/suggestions cost 5 credits per term |
| format | string | no | 'markdown' (default): compact tables for reading. 'json': the API's raw { data, meta } |
Deprecated: use watch with kind keyword (also reports rank moves as events). Starts tracking the search ranking of terms in one or both stores and the given countries: ranked apps are captured daily from now on (idempotent; already tracked terms are reported as such). Each term × store × country uses one keyword slot of the plan; a request over the limit tracks nothing (plan_limit). Read history w
| Parameter | Type | Required | Notes |
|---|---|---|---|
| terms | array | yes | Search terms to track, e.g. ['habit tracker', 'streaks'] |
| store | string | yes | 'apple', 'play' or 'both' (tracks each term in each store) |
| countries | array | no | Two-letter country codes to track in (default ['us']) |
| depth | integer | no | How many results to keep per ranking (default 100 Apple / 50 Play). |
| tags | array | no | Free-form labels. |
| format | string | no | 'markdown' (default): compact tables for reading. 'json': the API's raw { data, meta } |
Deprecated: use unwatch for keyword watches. Stops tracking keywords by id (from list_tracked_keywords or track_keywords): no new rankings are recorded and their plan slots are freed. Cost: 0 credits.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| ids | array | yes | Tracked keyword ids |
Deprecated: use list_watches (keyword watches list their slots). Your tracked keywords with id, store, country, popularity, depth, cadence, last ranking and current top 3. Filter by store, country or a term substring. Cost: 0 credits.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| store | string | no | 'apple' = Apple App Store (iOS), 'play' = Google Play (Android). |
| country | string | no | Only this two-letter country code. |
| q | string | no | Only terms containing this text. |
| format | string | no | 'markdown' (default): compact tables for reading. 'json': the API's raw { data, meta } |
Ranking history of a watched keyword: per capture the top 10 app ids, or with app, that app's rank over time (best, worst, latest). Default the last 90 days. The id is a keyword slot of a keyword watch (list_watches and watch show the slot ids) or a list_tracked_keywords id. Cost: 1 credits.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | integer | yes | Keyword slot id (from a keyword watch, or list_tracked_keywords) |
| app | string | no | Store app id; returns rank per point instead of the full id list. |
| from | string | no | Start, ISO date or datetime (default 90 days ago) |
| to | string | no | End date or datetime (ISO), default now. |
| format | string | no | 'markdown' (default): compact tables for reading. 'json': the API's raw { data, meta } |
Watch an app, a set of competitors or a set of keywords; significant changes become events (get_events, webhooks, daily email). kind app {app}: new versions, metadata and price changes, featuring, rating drops, review and ratings spikes, chart entries. kind competitor_set {competitors, app?}: the same for every competitor. kind keyword {terms, store or app}: the app's rank moves per term and new a
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | integer | no | Watch id to change (from list_watches). Omit to create a watch |
| kind | string | no | 'app' (one app), 'competitor_set' (several apps) or 'keyword' (search terms). Required when creating |
| app | string | no | Any app id, bundle id, package, store URL or name. kind app: the app (required); competitor_set: your own app (optional); keyword: the app whose ranks to report (optional) |
| competitors | array | no | kind competitor_set: the apps to watch (any identifiers), up to 50 |
| terms | array | no | kind keyword: search terms, e.g. ['habit tracker', 'streaks'] |
| store | string | no | 'apple', 'play' or 'both' (keyword watches without app; default both). Also disambiguates app inputs |
| countries | array | no | Two-letter country codes to watch in (default ['us']) |
| event_types | no | Only these event types (default: every type of the kind) | |
| settings | object | no | Thresholds: significance (0–1, default 0.5, minimum for an event), rank_move (default 5), keyword_top_n (10), chart_top_n (100), rating_drop (stars over 7 days, 0.1), spike_factor (3), email_digest (t |
| name | no | A label for the watch | |
| active | boolean | no | false pauses the watch, true resumes it |
| format | string | no | 'markdown' (default): compact tables for reading. 'json': the API's raw { data, meta } |
Stop watches by id (from list_watches or watch): no new events, and their watched apps and keyword slots are freed. Past events are kept. To pause instead, call watch with id and active=false. Cost: 0 credits.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| ids | array | yes | Watch ids |
Your watches (apps, competitor sets, keyword sets), newest first, with id, apps, terms, countries, event types and whether they are paused, plus watched apps and keyword slots used vs the plan's limits. Filter by kind or by an app they include. Cost: 0 credits.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| kind | string | no | Only this kind: 'app', 'competitor_set' or 'keyword'. |
| app | string | no | Only watches that include this app (any id, bundle id, package, URL or name). |
| store | string | no | Disambiguates {app} (a bundle id vs a Play package, or a name). |
| format | string | no | 'markdown' (default): compact tables for reading. 'json': the API's raw { data, meta } |
Significant changes on your watched apps and keywords, newest first: type, one-line title, AI summary, significance (0–1), app, country and the key payload fields (version, changes old → new, rating drop, rank move, chart rank…). Filter by type, app, watch, since and min_significance. To check for news, pass since = the created_at of the newest event already handled. Cost: 0 credits.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| type | string | no | Comma list of event types, e.g. 'new_version,rating_drop'. Types: new_version, metadata_change, price_change, featured, in_app_event, installs_milestone, rating_drop, ratings_spike, review_spike, nega |
| app | string | no | Only events of this app (any id, bundle id, package, URL or name). |
| store | string | no | Disambiguates {app} (a bundle id vs a Play package, or a name). |
| watch | integer | no | Only events of this watch id. |
| since | string | no | Only items at or after this ISO date / datetime. Example: 2026-10-01 |
| min_significance | number | no | Only events at least this significant (0–1). |
| limit | integer | no | Max items to return. Default: 50. |
| cursor | string | no | meta.next_cursor from the previous page. |
| format | string | no | 'markdown' (default): compact tables for reading. 'json': the API's raw { data, meta } |
A developer's profile: name, website, country, app count, total ratings and installs, all their apps (most-rated first) and the same company in the other store. get_app shows the developer id as dev <store>:<id>. Cost: 1 credits.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| dev | string | yes | apple:<artist id>, play:<developer id>, a numeric Apple artist id, a Play developer id (often the name), or the website domain (spotify.com). Example: apple:324684583 |
| store | string | no | Disambiguates {app} (a bundle id vs a Play package, or a name). |
| format | string | no | 'markdown' (default): compact tables for reading. 'json': the API's raw { data, meta } |
Poll a background store fetch that another call started (its output said refreshing or still being fetched, with a job id): status, per-country progress. When it is done, repeat the original call. Cost: 0 credits.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | meta.freshness.job_id, e.g. fetch_123. |
| format | string | no | 'markdown' (default): compact tables for reading. 'json': the API's raw { data, meta } |
The user's connected App Store Connect, Play Console and Apple Ads accounts: connection id, provider, mode (actions or read_only), status and the linked apps. Start here before read_connection or propose_action; secrets are never returned. No connections yet: the user adds them at https://dash.appgoat.ai/connections. Cost: 0 credits.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| provider | string | no | Only this provider: 'asc' (App Store Connect), 'play_console' or 'apple_ads'. |
| format | string | no | 'markdown' (default): compact tables for reading. 'json': the API's raw { data, meta } |
Read live data from one of the user's connected accounts. what='reviews' (asc, play_console): the app's own reviews with reply status, unanswered=true for those without a developer reply; their review_id feeds propose_action review.reply (Play only returns reviews from the last 7 days). what='listing' (asc, play_console): the current listing text for one locale with lengths and which fields are ed
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | Connection id (con_…) from list_connections |
| what | string | yes | 'reviews', 'listing' or 'ads' (Apple Ads) |
| app | string | no | A linked app (App Store id or package name); required for reviews and listing |
| unanswered | boolean | no | reviews: only reviews without a developer reply |
| rating | string | no | reviews: star filter, '1', '1,2' or '1-3' |
| country | string | no | reviews: App Store territory filter (two-letter code) |
| locale | string | no | listing: locale such as en-US, de-DE (default en-US) |
| view | string | no | ads: 'campaigns' (default), 'ad_groups', 'keywords', 'negatives' or 'report' |
| campaign_id | string | no | ads: campaign id (needed for ad_groups, keywords, negatives and every report level except campaigns) |
| ad_group_id | string | no | ads: ad group id (needed for keywords; optional for negatives) |
| level | string | no | ads report: 'campaigns' (default), 'adgroups', 'keywords' or 'searchterms' |
| start | string | no | ads report: start date YYYY-MM-DD (default 7 days before end) |
| end | string | no | ads report: end date YYYY-MM-DD (default yesterday, UTC) |
| limit | integer | no | Max rows: reviews up to 200 (default 100), ads up to 1000 (default 200) |
| cursor | string | no | reviews: next_cursor from the previous page |
| full_text | boolean | no | Return long text (description, release notes, review bodies) in full instead of cut short |
| format | string | no | 'markdown' (default): compact tables for reading. 'json': the API's raw { data, meta } |
Prepare a change to the user's connected account as a DRY RUN: nothing is written. AppGoat reads the live account and returns the before → after diff, guardrail results (AI probabilities for store policy, tone and risky claims, plus checks such as character limits and bid jumps) and an action id. ALWAYS show the diff and any guardrail flags to the user and get their go-ahead before calling apply_a
| Parameter | Type | Required | Notes |
|---|---|---|---|
| type | string | yes | What to change: review.reply, listing.update, keywords.set, screenshots.upload, ads.keyword.bid, ads.keyword.add or ads.negative.add |
| params | object | yes | Params for the type (see the tool description) |
| connection | string | no | Connection id from list_connections; optional when exactly one active connection fits the type and app |
| playbook | string | no | The playbook proposing this, e.g. 'reply-to-every-review' (shown to approvers); omit outside a playbook |
| format | string | no | 'markdown' (default): compact tables for reading. 'json': the API's raw { data, meta } |
Go ahead with an action from propose_action, after the user has seen its diff and agreed. Outcomes: applied (written to the store / Apple Ads account, 1 credit; when the org has an auto-apply rule the guardrail score clears, or allows agents to approve); pending_approval (a person must approve it in the AppGoat dashboard: give the user the approve link, nothing is written until then); needs a pers
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | Action id (act_…) from propose_action |
| force | boolean | no | Apply the recomputed diff even though the account changed since the dry run. Only after the user has seen the new diff |
| format | string | no | 'markdown' (default): compact tables for reading. 'json': the API's raw { data, meta } |
One action from propose_action: its status (draft, pending_approval, approved, applied, failed, rejected), diff, guardrail scores, the provider result or error, the approve link and the audit trail. Use it to check whether a pending action was approved and applied. Cost: 0 credits.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | Action id (act_…) |
| format | string | no | 'markdown' (default): compact tables for reading. 'json': the API's raw { data, meta } |
Discard a draft or pending action the user does not want; nothing is written to the account. Cost: 0 credits.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | Action id (act_…) |
| reason | string | no | Why (shown in the audit log) |
| format | string | no | 'markdown' (default): compact tables for reading. 'json': the API's raw { data, meta } |
Run an App Audit of one app in one country: a 0–100 score, prioritised ASO actions with evidence, title / subtitle / keyword rewrites within the store character limits, and findings from listing, ratings, reviews, keywords and competitors, plus a shareable report page. Takes 1–3 minutes: waits about 25 s, then returns the audit id to pass to get_audit. An audit of the same app, country and mode fr
| Parameter | Type | Required | Notes |
|---|---|---|---|
| app | string | yes | Any app identifier: App Store id (284882215, id284882215), Play package (com.spotify.music), Apple bundle id (com.spotify.client), store URL (URL-encoded), apple:<id> / play:<id>, or a nam |
| store | string | no | Disambiguates {app} (a bundle id vs a Play package, or a name). |
| country | string | no | Two-letter country code, one storefront (default 'us'). |
| mode | string | no | lite = cached data, fewer reviews and keywords (cheaper and faster for us; same price). Default: full. |
| fresh | boolean | no | Run again even if a recent audit exists. Default: false. |
| free_only | boolean | no | Only run when it is the free first audit (402 free_audit_used otherwise). Default: false. |
| white_label | boolean | no | Studio: the shareable report shows the organization's branding (set in the dashboard under Settings → Report branding) instead of AppGoat's, e.g. for client or prospect reports. |
| label | no | Your label for the audit list, e.g. the client or prospect name. | |
| format | string | no | 'markdown' (default): compact tables for reading. 'json': the API's raw { data, meta } |
Check on an App Audit that audit_app started (by its id, e.g. aud_3fK9aQ2mXc81LpRt): waits up to about 25 s for it to finish, then returns the report (score, actions, metadata rewrites, findings, report page) or its status. Cost: 0 credits.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | Audit id from audit_app, e.g. aud_3fK9aQ2mXc81LpRt |
| format | string | no | 'markdown' (default): compact tables for reading. 'json': the API's raw { data, meta } |
What an app's users praise and complain about, from the AI tags on its reviews: top issues (topics behind negative, bug, crash, UX and pricing reviews) with last-30-days vs previous-30-days counts and sample reviews, topics, what each recent version changed in rating, sentiment and topics, and weekly sentiment. Use it for "what do users complain about since v2.3?" before reading individual reviews
| Parameter | Type | Required | Notes |
|---|---|---|---|
| app | string | yes | Any app identifier: App Store id (284882215, id284882215), Play package (com.spotify.music), Apple bundle id (com.spotify.client), store URL (URL-encoded), apple:<id> / play:<id>, or a nam |
| store | string | no | Disambiguates {app} (a bundle id vs a Play package, or a name). |
| country | string | no | One storefront; omit for every storefront we hold reviews for. |
| since_days | integer | no | How many days of reviews to analyse, 7–730 (default 180). |
| versions | integer | no | How many of the latest versions to break down. Default: 6. |
| format | string | no | 'markdown' (default): compact tables for reading. 'json': the API's raw { data, meta } |
AppGoat playbooks: step-by-step recipes (which tools to call, credit budget, decision rules, output format) for app audits, app idea research, ASO metadata rewrites, weekly competitor digests, turning reviews into GitHub issues, and, on connected accounts, replying to every review, optimizing Apple Ads and pushing localized listings. Without name, lists them; with name, returns the full playbook t
| Parameter | Type | Required | Notes |
|---|---|---|---|
| name | string | no | A playbook name from the list, e.g. 'app-audit-lite' |
- Every tool — any call limit is its publisher’s, not ours
- No card, and mcprush charges nothing for it
- Runs at its publisher’s own address — this marketplace is not in the path
- Nothing to cap, because mcprush bills nothing
What counts against your monthly calls
| Tool | Unit | Calls used | Out of the allowance |
|---|
Nothing here is billable: mcprush charges nothing to install AppGoat or to call it, at any volume.
Two independent axes, because powerful and malicious are different questions. The grade is threat only. The capability level is blast radius, and it is never a penalty on the grade — it is priced as one subtract-only term in the score, where you can see it.
| Term | Level | What it prices | Points |
|---|---|---|---|
| capability-exposure | moderate | capability blast radius (moderate) — client exposure if the model is manipulated | −3 |
| coverage-honesty | manifest | inspection depth (manifest) — how much of the target the scan could see | −4 |
What the scan could actually read
A grade is only as meaningful as its coverage, so the scanner publishes its own depth before it publishes its result.
The scan read each tool’s name, description, input schema and annotations exactly as the server listed them the last time it answered us; no code was reviewed. We ask the server again about once a month, and a list that changed is graded again.
The implementation source was not read — this reflects the declared tool metadata only.
Capability — what it could do if the model were manipulated
Tags derived from each tool’s schema and the implementation, not from what the tool calls itself. moderate is the level these add up to.
| Tool | Capability tags | Why the tag was assigned |
|---|---|---|
| get_app | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| get_reviews | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| get_app_history | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| get_app_changes | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| get_app_keywords | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| get_competitors | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| search_apps | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| get_charts | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| keyword_research | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| track_keywords | external-sink | external-sink: declares readOnlyHint: false, openWorldHint: true |
| untrack_keywords | external-sink | external-sink: declares readOnlyHint: false, destructiveHint: true, openWorldHint: true |
| list_tracked_keywords | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| get_keyword_ranks | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| watch | external-sink | external-sink: declares readOnlyHint: false, openWorldHint: true |
| unwatch | external-sink | external-sink: declares readOnlyHint: false, destructiveHint: true, openWorldHint: true |
| list_watches | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| get_events | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| get_developer | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| get_job | untrusted-input | untrusted-input: keyword "fetch", declares openWorldHint: true (interacts with entities outside the server) |
| list_connections | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| read_connection | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| propose_action | external-sink | external-sink: declares readOnlyHint: false, openWorldHint: true |
| apply_action | external-sink | external-sink: declares readOnlyHint: false, destructiveHint: true, openWorldHint: true |
| get_action | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| reject_action | external-sink | external-sink: declares readOnlyHint: false, openWorldHint: true |
| audit_app | external-sink | external-sink: declares readOnlyHint: false, openWorldHint: true |
| get_audit | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| get_insights | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| list_playbooks | no tags |
Toxic-flow graph
The lethal trifecta, checked as a graph rather than as a checklist: untrusted input, a sensitive source and an external sink have to meet before there is a path worth worrying about.
Supply chain and provenance
This is the first scan of this surface here, so there is nothing yet to compare it against.
Every result on this tab comes from one deterministic pass over the published package — offline, rule by rule, and auditable line by line above. Same methodology version, same bytes, same score.
Release history
This is an address its publisher runs: which release it serves is theirs to choose, so there is nothing here to pin. The history below is for reading; the current release on file is 0.2.0.
No release note was published with this version.
One review per account, from a signed-in account that does not publish this listing. Nothing else is asked — you can say what you think before you install it. Publishers can reply once per review, and a review can be edited or deleted by whoever wrote it.
Any signed-in account that does not publish AppGoat can review it, once — before installing it or after. A review from an account that has installed it is marked as one.
Nobody has reviewed this listing. The rating on the card is the mean of the reviews written here and nothing else, so there is no rating until somebody writes the first — which takes a signed-in account that does not publish it, and nothing else.