ShipASO
Audit any App Store or Google Play listing: measured ranks, keyword gaps, draft copy. Read-only.
Should I use this
Quality & Safety
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"shipaso": {
"url": "https://api.shipaso.com/mcp"
}
}
}Remote endpoints
https://api.shipaso.com/mcpstreamable-httpWhat it can do
Tool inventory
Tools (12)
🟢preview_app(query, bundleId, country)
Read-only ASO snapshot of any App Store app (grade, lead rank, top-10 count, sample). No account or store push — the optimized copy + push commands stay behind the human-approved loop. Works without a key.
Input Schema
{
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "App name, App Store URL, numeric id, or bundle id"
},
"bundleId": {
"type": "string",
"description": "Exact bundle id (skips resolution)"
},
"country": {
"type": "string",
"minLength": 2,
"maxLength": 2,
"description": "ISO country storefront, e.g. US"
}
},
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢audit_app(query, bundleId, country)
Read-only listing audit: prioritized findings (severity + impact) plus a summary, derived from the live public listing. Read-only — never edits or pushes.
Input Schema
{
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "App name, App Store URL, numeric id, or bundle id"
},
"bundleId": {
"type": "string",
"description": "Exact bundle id (skips resolution)"
},
"country": {
"type": "string",
"minLength": 2,
"maxLength": 2,
"description": "ISO country storefront, e.g. US"
}
},
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢audit_play_app(query, packageName, country, targets, brand)
Read-only GOOGLE PLAY listing audit: screenshot grade, the 30/80/4000 title/short/long-description budget, target-term coverage in the long description (Play's keyword surface), a keyword-stuffing guard, prioritized findings + summary, and capability locks for surfaces a public read can't see. Takes a Play package id (com.foo.bar) or a play.google.com URL — NOT a free-text name (Play has no public name search). Play has NO keyword field. Reads public Play data only; never edits or pushes.
Input Schema
{
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "Google Play package id (com.foo.bar) or a play.google.com app URL"
},
"packageName": {
"type": "string",
"description": "Exact Play package id (skips resolution)"
},
"country": {
"type": "string",
"minLength": 2,
"maxLength": 2,
"description": "ISO country storefront, e.g. US"
},
"targets": {
"type": "array",
"items": {
"type": "string"
},
"description": "Target search terms to measure long-description coverage for"
},
"brand": {
"type": "string",
"description": "App brand name, so brand-burn in the short description is flagged"
}
},
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢audit_play_app_owner(packageName, language, targets, brand)
Read-only audit of YOUR OWN Google Play app via the official Play Developer API — full fidelity including the short description (which the public page can't show), with NO capability locks. Requires a configured Play service account (GOOGLE_PLAY_SERVICE_ACCOUNT). Reads only — it opens and DISCARDS a Play 'edit' and NEVER commits, so it can't publish. Owner-only; for a competitor use audit_play_app.
Input Schema
{
"type": "object",
"properties": {
"packageName": {
"type": "string",
"description": "Your app's Play package id, e.g. com.foo.bar"
},
"language": {
"type": "string",
"description": "BCP-47 listing language, e.g. en-US"
},
"targets": {
"type": "array",
"items": {
"type": "string"
},
"description": "Target search terms to measure long-description coverage for"
},
"brand": {
"type": "string",
"description": "App brand name, so short-description brand-burn is flagged"
}
},
"required": [
"packageName"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢keyword_gaps(query, bundleId, country)
Read-only keyword opportunities: terms tracked competitors VISIBLY use that this app doesn't target and doesn't rank top-50 for, sorted by winnability. Inferred from competitor name/subtitle only — never their ranking algorithm.
Input Schema
{
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "App name, App Store URL, numeric id, or bundle id"
},
"bundleId": {
"type": "string",
"description": "Exact bundle id (skips resolution)"
},
"country": {
"type": "string",
"minLength": 2,
"maxLength": 2,
"description": "ISO country storefront, e.g. US"
}
},
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢rank_check(query, bundleId, country)
Read-only organic rank check across the app's target keywords, plus winnability-ranked opportunities computed from those measured positions. Positions are live-measured, never fabricated.
Input Schema
{
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "App name, App Store URL, numeric id, or bundle id"
},
"bundleId": {
"type": "string",
"description": "Exact bundle id (skips resolution)"
},
"country": {
"type": "string",
"minLength": 2,
"maxLength": 2,
"description": "ISO country storefront, e.g. US"
}
},
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢screenshot_coverage(query, bundleId, country)
Read-only screenshot scoring for the app's live store gallery (count, score, grade, levers to improve). Read-only — never uploads or pushes assets.
Input Schema
{
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "App name, App Store URL, numeric id, or bundle id"
},
"bundleId": {
"type": "string",
"description": "Exact bundle id (skips resolution)"
},
"country": {
"type": "string",
"minLength": 2,
"maxLength": 2,
"description": "ISO country storefront, e.g. US"
}
},
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢competitor_watch(query, bundleId, country, competitors)
Read-only competitor diff: resolves the named competitors and reports their current listings, what changed vs. the last seen state, and a digest line. Read-only metadata comparison; no ranking-algorithm data is invented.
Input Schema
{
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "App name, App Store URL, numeric id, or bundle id"
},
"bundleId": {
"type": "string",
"description": "Exact bundle id (skips resolution)"
},
"country": {
"type": "string",
"minLength": 2,
"maxLength": 2,
"description": "ISO country storefront, e.g. US"
},
"competitors": {
"type": "array",
"items": {
"type": "string"
},
"minItems": 1,
"description": "Competitor app names or bundle ids to compare against"
}
},
"required": [
"competitors"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢war_room(appId, competitors)
Read-only head-to-head rank war room for one of YOUR connected apps: your tracked-keyword rank history vs. live competitor positions on those same keywords. Reads stored data + live competitor ranks; writes nothing.
Input Schema
{
"type": "object",
"properties": {
"appId": {
"type": "string",
"description": "Id of a connected app you own"
},
"competitors": {
"type": "array",
"items": {
"type": "string"
},
"description": "Competitor names to compare (max 4)"
}
},
"required": [
"appId"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢localization_gaps(appId)
Read-only localization expansion recommendations (ROI-sorted locales to add) for one of YOUR connected apps, from its most recent App Store Connect run. A static, bundled heuristic over the locales already read — no live install data is fabricated. Empty until you've run an ASC-connected pass.
Input Schema
{
"type": "object",
"properties": {
"appId": {
"type": "string",
"description": "Id of a connected app you own"
}
},
"required": [
"appId"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢proof
Read-only, anonymized aggregate proof across all tracked apps (real rank-win numbers — no app names, no user data). This is the 'prove the rank moved' surface that closes the prepare → approve → push → prove loop. Works without a key.
Input Schema
{
"type": "object",
"properties": {},
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢propose_copy(query, bundleId, country)
Returns a DRAFT optimized listing (name/subtitle/keywords/description) with validation for any app. THIS IS A DRAFT ONLY: it does NOT persist a proposal and does NOT push to the App Store. Publishing stays a human-approved action in ShipASO — an agent can draft and read; only a human approves and pushes.
Input Schema
{
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "App name, App Store URL, numeric id, or bundle id"
},
"bundleId": {
"type": "string",
"description": "Exact bundle id (skips resolution)"
},
"country": {
"type": "string",
"minLength": 2,
"maxLength": 2,
"description": "ISO country storefront, e.g. US"
}
},
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Community
Evidence