Skip to main content
Glama

Get the ASO Health audit

get_aso_health
Read-only

Audit a tracked app's ASO health by scoring how well its store listing is written, not how it ranks. Returns coverage, targeting, appeal, maturity tier, flags, and release score history.

Instructions

Get the full ASO Health audit of one tracked app: how well its listing is WRITTEN, as opposed to how it currently ranks. Returns app (id, app_id, title, store, country, lang) so a score is always attributable, global (0-100), the three axes, the maturity tier with its label, every field, the terms it targets, flags[], and timeline[] of past releases with their score. THE AXES: coverage = how much searched vocabulary the indexed fields carry; targeting = whether the terms it aims at are winnable AT THIS APP'S SIZE; appeal = rating, screenshots and freshness. TIER drives targeting: 1 Emerging, 2 Growing, 3 Established. The verdict threshold moves with it, so the same term can be "ambitious" for a tier 2 app and "out-of-reach" for a tier 1 one, and a tier 3 app can reasonably aim higher. Say that when you explain a verdict. fields[].state is "scored", "empty" (blank on the store) or "missing" (the iOS keywords field, which Apple never publishes: we only know it if the user gave it to us). fields[].key stays "subtitle" on Google Play, where the store calls that field the short description: use the store's name when you talk to the user. fields[].text is TRUNCATED to a preview and fields[].truncated says so; the full text is on list_applications. targeting.keywords[].verdict is "reachable", "ambitious" or "out-of-reach"; traffic and difficulty are both 0-100. targeting.ungraded counts searched terms we have no competition data for; targeting.unsearched counts words nobody types, listed in unsearched_words. targeting.assessable is false when the listing holds no searched term at all, and then there is no targeting to judge. report is null on an app the audit has never reached, which is not a score of zero. The audit is kept up to date automatically, so this reads a stored result and answers in milliseconds: call it as often as you need. For visibility over time instead, use get_app_score_history; to score a listing that does not exist yet, use simulate_metadata.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
app_idYesThe application INTERNAL id: the "id" field of list_applications (numeric, e.g. "344"). Not its "app_id" field, which is the store bundle id.
include_wordsNoAdd the per-word table of every indexed field: name, traffic (0-100), difficulty (0-100), occurrences and status. STATUS values: "earning" (real search demand, and this field is credited for it), "already-used" (an earlier field already claimed it; the stores index a word once), "not-searched" (indexed, but nobody types it here), "pending" (no search data yet on this storefront), and on the Google Play long description "covered" / "missing" (does it repeat what the title and short description target) and "extra-reach" (a searched word it carries that no other field does). occurrences is only counted on the Google Play long description, where repetition is visible; it is null elsewhere, because a word is either in the field or not. Off by default: it is detail you rarely need to answer how a listing is doing.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changedv1.6.1
    • removedInput schema / additionalProperties
      Removed value: -false
  2. Addedv1.5.0

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover the safety profile (readOnly, non-destructive, non-open-world), and the description adds substantial behavior beyond that: the result is a stored, auto-updated audit answering in milliseconds, report is null when the audit never reached the app ('which is not a score of zero'), and fields[].text is a truncated preview with the full text living on list_applications.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and alternatives before the dense reference material, and nearly every sentence carries distinct semantic content (axes, tiers, state values, truncation, null-vs-zero). It runs long and repeats some schema content, and a few asides ('Say that when you explain a verdict', store-name phrasing) are advisory rather than definitional, but it is not padded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the full burden of describing the return shape and does so thoroughly: app identity fields, global score, three axes, maturity tier, fields[] states including the unpublished iOS keywords field, targeting verdicts and counters, assessable, and the null-report case.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the schema already documents app_id and include_words in depth, so the baseline is 3. The description nonetheless adds meaning the schema lacks: that field/verdict semantics (state values, tier-dependent verdict thresholds, ungraded/unsearched counts) shape what include_words returns, and it reinforces why include_words is off by default.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a precise verb+resource ('Get the full ASO Health audit of one tracked app') and immediately scopes it against the sibling concern of ranking: 'how well its listing is WRITTEN, as opposed to how it currently ranks.' It also enumerates the return payload, so an agent knows exactly what this tool yields versus other app tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes to alternatives with conditions: get_app_score_history 'for visibility over time' and simulate_metadata 'to score a listing that does not exist yet.' It also states a usage property ('call it as often as you need') grounded in the cached/stored nature of the result.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.