ShipASO

Audit any App Store or Google Play listing: measured ranks, keyword gaps, draft copy. Read-only.

Should I use this

Quality & Safety

A
Description quality
98%
Schema completeness
88%
Naming quality
87%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~2,166Tokens (tool definitions)
~1.1 KBTypical response size
Moderate attention impact (1.69% of 128k context)

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-http

What it can do

Tool inventory

Tools (12)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢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

Rate this Server

Evidence

Recent observations

verifiedversion not recorded12 tools
verifiedversion not recorded12 tools
verifiedversion not recorded12 tools