Skip to main content
Glama

Server Details

Track app-store keyword rankings, rank history, listing metadata, engagement, reviews, and competitors across the iOS App Store, macOS App Store, Google Play, and Microsoft Store.

Ownership verified
Status
Healthy
Uptime
91.4% over 43 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL

TDQS

A4.1/5.0

Scored across 14 tools

Disambiguation4/5

Most tools are clearly distinct, and descriptions use explicit 'Not for...' boundaries (e.g., live rank vs. rank history vs. keyword volume). Minor overlap remains between get_app and show_app_overview (both describe an app's stores/locales) and slightly between get_keyword_rank and get_keyword_overview, but these are largely clarified in the descriptions.

Naming Consistency4/5

Almost all tools follow a snake_case verb_noun pattern (add_keyword, delete_keyword, get_app, list_apps, search_store_results). The only notable deviation is show_app_overview using 'show' instead of the otherwise consistent 'get' for retrieval operations, and verbs naturally vary across create/read/delete.

Tool Count5/5

14 tools is well within the ideal 3-15 range and each tool maps to a distinct operation in the ASO domain (keyword tracking, rankings, app details, store listings, reviews, engagement). No tool appears redundant or padded.

Completeness3/5

Core read operations for keywords, rankings, apps, store listings, and engagement are covered, but there are notable gaps: no app management (add/remove an app to track), no App Store reviews despite Google Play reviews being present, and no way to edit a keyword's bid after creation. Store metadata and app settings are read-only.

Available Tools

14 tools
add_keywordTrack a new keywordA
Destructive
Inspect

Use this when someone asks to start tracking a keyword for their app in a given language and country. Returns the new keyword; adding the same term twice creates two rows. Keywords without a country are skipped by the weekly rank check. Not for a one-off rank lookup.

ParametersJSON Schema
NameRequiredDescriptionDefault
appIdYesAppSkyline app id (uuid)
countryNoTwo-letter store country code such as US; without one the weekly rank check skips this keyword
languageNoTwo-letter language code such as en
searchTermsYesKeyword phrase to track, as users type it in the store, 1 to 200 characters

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusYes
keywordYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true, idempotentHint=false, and readOnlyHint=false, lowering the bar. The description nonetheless adds non-obvious behavior: duplicate terms create two rows, and keywords lacking a country are skipped by the weekly rank check. It stops short of permissions or rate-limit context.

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

Conciseness5/5

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

Three tight sentences, front-loaded with the use case, then return/side-effect facts, then the exclusion. Every sentence carries distinct information with no filler.

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

Completeness4/5

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

With annotations covering the safety profile and an output schema covering the return value, the description supplies the remaining essentials: trigger condition, duplicate behavior, and a sibling exclusion. Only minor gaps (auth or quota expectations) remain.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents appId, country, language, and searchTerms with examples. The description only reinforces the country-skip rule that the schema already states, adding little new semantic value; baseline 3 applies.

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?

The description names a specific verb and resource ('start tracking a keyword for their app in a given language and country') and explicitly distinguishes from a sibling action ('Not for a one-off rank lookup', i.e. get_keyword_rank). An agent can route without opening the schema.

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?

It states the trigger condition ('when someone asks to start tracking a keyword'), names the alternative tool's domain implicitly, and gives a negative case ('Not for a one-off rank lookup'). Both when-to-use and when-not-to-use are present.

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

delete_keywordStop tracking a keywordA
DestructiveIdempotent
Inspect

Use this when someone asks to stop tracking one of their keywords. Returns deleted, or not-found for an unknown id or one outside the account. Weekly rank checks stop and past snapshots stay, leaving a gap if it is tracked again later. Not for pausing tracking temporarily.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesKeyword id

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusYes
keywordIdYes

TDQS

A4.3/5.0
Behavior5/5

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

Adds substantial context beyond the destructive/idempotent annotations: it discloses the return values (deleted, not-found), that weekly rank checks stop, that past snapshots are retained, and that a gap appears if the keyword is re-tracked. This is exactly the side-effect detail an agent needs before a destructive call.

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

Conciseness5/5

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

Three sentences, each load-bearing: trigger, outcome values, side effects, and exclusion. The usage trigger is front-loaded and there is no filler.

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?

Annotations cover the safety profile and an output schema exists, yet the description still supplies the non-obvious behavioral consequences (snapshot retention, re-track gap) and the return values. Nothing needed to call this correctly is missing.

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

Parameters3/5

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

Only one parameter with 100% schema description coverage, so the schema fully carries the 'id' semantics. The description adds no format or sourcing detail about the id, so the baseline 3 applies.

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

Purpose4/5

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

States a specific verb and resource: stopping tracking of one keyword, backed by the title/name. It contrasts itself against a pause operation, which sharpens the scope, though it never names a sibling tool from the provided list.

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

Usage Guidelines4/5

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

Explicit 'Use this when...' trigger for stopping keyword tracking, plus an exclusion ('Not for pausing tracking temporarily'). It stops short of naming the alternative tool for temporary pauses, so the routing guidance is clear but not fully enumerated.

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

get_appGet app detailsA
Read-onlyIdempotent
Inspect

Use this when someone asks about one of their AppSkyline apps, such as which stores it is on or which languages it supports. Returns the app's name, default and supported locales, App Store, Mac App Store, Google Play and Microsoft Store ids, and creation and edit times. Not for the live public store page or ratings.

ParametersJSON Schema
NameRequiredDescriptionDefault
appIdYesAppSkyline app id (uuid)

Output Schema

ParametersJSON Schema
NameRequiredDescription
appYesNull when the app is not in the signed-in account
statusYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint/idempotentHint/destructiveHint=false and openWorldHint=false, so safety is covered. The description adds value by scoping what data is exposed (locales, per-store ids, timestamps) and by explicitly ruling out live store pages and ratings, which prevents misuse. It says nothing about auth scope or error behavior for an invalid appId.

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

Conciseness5/5

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

Three sentences, front-loaded with the use case, then the return payload, then the negative boundary. No filler and nothing buried.

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?

For a one-parameter read-only getter with a full output schema and rich annotations, the description supplies everything needed: when to call it, what it returns, and what it is not for. Return-value documentation is correctly left to the output schema.

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

Parameters3/5

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

Schema coverage is 100% and the single appId parameter is fully documented as a UUID in the schema, so the baseline applies. The description's phrase 'one of their AppSkyline apps' lightly reinforces that appId must be a user-owned app id, but adds no format or constraint detail beyond the schema.

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 specific verb+resource ('get app details' for a single AppSkyline app) and enumerates exactly what it returns: name, locales, per-store ids, and creation/edit times. That enumeration cleanly separates it from list_apps (plural) and from the store-listing/metadata siblings.

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

Usage Guidelines4/5

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

Gives a concrete triggering situation ('someone asks about one of their AppSkyline apps, such as which stores it is on or which languages it supports') and an explicit exclusion ('Not for the live public store page or ratings'). It stops short of naming the sibling tools (get_store_listing, get_store_metadata) that should be used instead, leaving a small inference gap.

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

get_app_engagement_summaryGet downloads and installsA
Read-onlyIdempotent
Inspect

Use this when someone asks how many downloads, installs, uninstalls or crashes their app had over a period. Returns store-reported totals, the latest 30 daily rows and top countries for one app and store; metric names differ by store. Not for keyword rankings.

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNoRolling window of the last 1 to 365 days, used when no dates are given; omit dates and days for every synced day
appIdYesAppSkyline app id (uuid)
storeYesStore to summarize: ios-app-store, macos-app-store, google-play or microsoft-store
endDateNoLast day of the window as YYYY-MM-DD; applies only together with startDate
startDateNoFirst day of the window as YYYY-MM-DD; applies only together with endDate

Output Schema

ParametersJSON Schema
NameRequiredDescription
appIdYes
storeYes
statusYes
totalsYesStore-reported totals for the window; metric names differ by store
dailySeriesYesThe most recent 30 days of one daily metric series
dataThroughYes
lastSyncedAtYes
topTerritoriesYesUp to 8 leading countries or territories by downloads or installs
totalsTruncatedYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), so the description's value is in the result shape it discloses: store-reported totals, the latest 30 daily rows, top countries, and the caveat that metric names differ by store. That last point is a genuine gotcha an agent could not infer from annotations, though the return contract is partly redundant with the output schema.

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

Conciseness5/5

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

Three tight sentences, front-loaded with the invocation trigger, then the return shape, then the exclusion. No filler and every clause carries information.

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 a full schema, an output schema, and annotations present, the description needs only to add trigger, scope, and caveats — which it does. An agent has enough to pick this tool and call it correctly.

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

Parameters3/5

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

Schema description coverage is 100%, including the days/startDate/endDate interaction and the store enum, so the schema carries the parameter burden. The description only restates scoping at a high level ('for one app and store', 'over a period') without adding format or precedence detail beyond what the schema already documents.

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?

The description opens with a concrete trigger and names the exact resources it reports on (downloads, installs, uninstalls, crashes) over a period, which is more specific than the title's 'downloads and installs'. It also explicitly carves itself away from sibling territory with 'Not for keyword rankings.'

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

Usage Guidelines4/5

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

It states a clear when-to-use condition ('when someone asks how many downloads, installs, uninstalls or crashes their app had over a period') and one negative exclusion. It stops short of naming the positive alternative for a broader app picture (e.g. show_app_overview or get_app), so the routing is implied rather than complete.

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

get_keyword_historyShow keyword rank historyA
Read-onlyIdempotent
Inspect

Use this when someone asks how their app's ranking for a keyword has changed over time in one store and country. Returns the app's rank on each date AppSkyline stored a search snapshot, newest first, up to 365 rows; tracked keywords are re-checked weekly. Not for today's live rank.

ParametersJSON Schema
NameRequiredDescriptionDefault
termYesSearch term to read history for, 1 to 200 characters
appIdYesAppSkyline app id (uuid)
limitNoSnapshots to return, newest first, from 1 to 365; defaults to 365
storeYesStore to read: ios-app-store, macos-app-store, google-play or microsoft-store; the app needs an id on that store
countryYesTwo-letter store country code such as US or IT (required)

Output Schema

ParametersJSON Schema
NameRequiredDescription
appYes
termYes
storeYes
statusYes
countryYes
returnedYes
snapshotsYesOne row per stored search snapshot, newest first; rank is null when the app was not in that snapshot
truncatedYes
totalSnapshotsYes
totalSnapshotsIsLowerBoundYes

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive, and the description adds genuinely new behavioral context: rank is returned per stored snapshot, newest first, capped at 365 rows, and tracked keywords are only re-checked weekly. That freshness cadence is exactly what an agent needs to interpret stale results.

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

Conciseness5/5

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

Three tight sentences, front-loaded with the usage trigger, then return shape, then the exclusion. Every sentence earns its place with no filler.

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 an output schema present, the description needn't explain the response payload, and annotations cover safety. Combined with the freshness cadence and row cap, an agent has everything required to call this correctly and interpret the result.

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

Parameters3/5

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

Schema description coverage is 100%, so all five parameters (including term, store enum, country, limit) are already documented in the schema. The description restates the one-store/one-country scope but adds no syntax or format detail beyond the schema, so baseline 3 applies.

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 specific verb and resource (retrieve an app's keyword rank history over time) and pins the scope to one store and one country. It is clearly distinguishable from siblings like get_keyword_rank (live rank) and get_keyword_overview.

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

Usage Guidelines4/5

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

Gives an explicit trigger ('when someone asks how their app's ranking ... has changed over time') and an explicit exclusion ('Not for today's live rank'). It stops short of naming the alternative tool an agent should use for live rank, so it is clear but not fully routed.

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

get_keyword_overviewLook up keyword search volumeA
Read-onlyIdempotent
Inspect

Use this when someone asks how popular a keyword is or which keyword ideas are worth targeting. Returns monthly Google web-search volume (a demand proxy, not app-store search counts), difficulty, CPC and competition for up to 50 terms in one country. Terms missing from the 30-day cache trigger a billable lookup. Not for rankings.

ParametersJSON Schema
NameRequiredDescriptionDefault
langNoTwo-letter language code such as en or it; optional
termsYesKeyword ideas to look up in one batch, 1 to 50 terms of up to 200 characters, none containing a comma
countryYesTwo-letter country code such as US or IT (required)

Output Schema

ParametersJSON Schema
NameRequiredDescription
langYes
statusYes
countryYes
keywordsYesGoogle web-search demand per term from the shared 30-day cache, highest volume first; a proxy for interest, not app-store search counts
returnedYes
truncatedYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so safety is covered; the description goes beyond them by disclosing the billing side effect (cache misses trigger a billable lookup) and the 30-day cache window. It does not mention rate limits or latency, so it stops short of a 5.

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

Conciseness5/5

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

Three short sentences, front-loaded with the trigger, then the payload, then the cost caveat and the exclusion. Every sentence carries distinct information with no filler.

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?

An output schema exists, so return-field detail is not required, yet the description still summarizes what comes back. Combined with the billing disclosure, batch limits, country scoping and the ranking exclusion, an agent has everything needed to invoke it correctly.

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

Parameters3/5

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

Schema coverage is 100%, so the schema already documents terms, country and lang including the 50-item cap and code patterns. The description restates 'up to 50 terms in one country' and adds the useful point that a batch is scoped to a single country, but contributes little else beyond the schema.

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 specific verb+resource (look up keyword search volume) and enumerates the returned metrics: monthly Google web-search volume, difficulty, CPC and competition. It also preempts a likely confusion by clarifying this is a demand proxy rather than app-store search counts, which separates it from the app/store siblings.

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?

Opens with an explicit trigger ('when someone asks how popular a keyword is or which keyword ideas are worth targeting') and closes with an exclusion ('Not for rankings'), routing the agent to get_keyword_rank. The batch constraint (up to 50 terms in one country) further bounds correct usage.

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

get_keyword_rankCheck an app's keyword rankA
Read-onlyIdempotent
Inspect

Use this when someone asks where their app ranks for a keyword right now in one store and country. Returns the app's live position, or not-ranked, after scanning the top 50 results by default and up to 200, and renders a rank card. Not for how a rank changed over time.

ParametersJSON Schema
NameRequiredDescriptionDefault
numNoHow many search results to scan for the app, from 1 to 200; defaults to 50
langNoTwo-letter language code such as en or it; defaults to en except on Google Play, which uses the store default
termYesSearch term to check, 1 to 200 characters
appIdYesAppSkyline app id (uuid)
storeYesStore to check: ios-app-store, macos-app-store, google-play or microsoft-store; the app needs an id on that store
countryNoTwo-letter store country code such as US or IT; defaults to US

Output Schema

ParametersJSON Schema
NameRequiredDescription
appYes
langYes
rankYes1-based position; null unless status is ranked
termYes
storeYes
statusYes
countryYes
resultsScannedYesHow many results were scanned; report a rank as #N of this

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so safety is covered. The description adds real behavioral context beyond that: it scans the top 50 by default, up to 200, and returns a live position or a not-ranked result, plus mentions rendering a rank card.

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

Conciseness5/5

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

Three tight sentences with zero waste, front-loaded with the triggering condition and then the return behavior and exclusion. Every sentence earns its place.

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 a rich annotation set and an output schema present, the description need not explain the return payload; it nonetheless signals the rank-card rendering and the not-ranked case. Nothing an agent needs to invoke this correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so all six parameters (including defaults, enums and limits) are already documented in the schema. The description only restates the scan default and ceiling, adding no syntax or meaning beyond the structured fields.

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 specific verb (check/return) and resource (an app's live keyword rank) plus the scope (one store and country, right now). The final clause explicitly separates it from get_keyword_history, so an agent can distinguish it from the sibling without opening either schema.

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

Usage Guidelines4/5

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

"Use this when someone asks where their app ranks for a keyword right now" gives a clear triggering context, and "Not for how a rank changed over time" supplies an explicit exclusion. It does not name get_keyword_history directly, so the routing is described rather than pinned to a sibling name.

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

get_store_listingRead any app's store listingA
Read-onlyIdempotent
Inspect

Use this when someone asks about a competitor's or any app's public store page, such as its rating, number of ratings, price, version or last update. Returns the live listing for one store id, with description and release notes cut to 600 characters. Not for your own app's synced text per language.

ParametersJSON Schema
NameRequiredDescriptionDefault
langNoTwo-letter language code such as en or it; defaults to the store's own default
storeYesStore to read: ios-app-store, macos-app-store, google-play or microsoft-store
countryNoTwo-letter store country code such as US or IT; defaults to the store's own default
storeIdYesThe app's id in that store: numeric Apple id, Google Play package name such as com.example.app, or Microsoft Store product id

Output Schema

ParametersJSON Schema
NameRequiredDescription
langYes
storeYes
statusYes
countryYes
listingYesThe live public listing; description and release notes are cut to 600 characters. Null when the store has no app with that id.
storeIdYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, openWorld and non-destructive, so the safety profile is covered. The description adds genuinely new behavior: the result is a live listing, and description and release notes are truncated at 600 characters — a constraint an agent cannot learn from the schema or annotations.

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?

Three short sentences, front-loaded with the usage trigger, then the return shape, then the exclusion. Every sentence carries information; only the closing clause is slightly elliptical about what "synced text per language" refers to.

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?

An output schema exists, so return values need no elaboration, and the description still adds the truncation caveat and the live-vs-synced distinction. For a four-parameter read tool with full schema coverage, nothing needed to call it correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100% and each parameter is documented (lang, store, country, storeId). The description only adds the framing of "one store id" and hints at language via the exclusion clause, which is marginal over the schema. Baseline 3 applies.

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?

The description names a specific verb (read) and resource (a public store listing) and enumerates the fields returned — rating, number of ratings, price, version, last update. It also distinguishes itself from sibling read tools like get_store_metadata and search_store_results by scoping to a single store id's live public page.

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

Usage Guidelines4/5

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

It gives an explicit trigger ("when someone asks about a competitor's or any app's public store page") and an exclusion ("Not for your own app's synced text per language"). It never names the sibling tool that handles the excluded case, so the agent must infer the alternative rather than being routed to it.

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

get_store_metadataCheck your store listing and review statusA
Read-onlyIdempotent
Inspect

Use this when someone asks about their own app's listing text per language, such as the title, subtitle, keywords or release notes, or whether the latest version is still in review or approved. Returns the metadata AppSkyline last synced for each locale, with the version, its review state and the keyword field's length against Apple's 100-character limit; longer texts are cut to 600 characters. Not for a live competitor listing.

ParametersJSON Schema
NameRequiredDescriptionDefault
appIdYesAppSkyline app id (uuid)
storeYesStore listing to read: ios-app-store, macos-app-store, google-play or microsoft-store
localeNoOnly this locale, written as in the listing such as en-US or it; every synced locale when absent

Output Schema

ParametersJSON Schema
NameRequiredDescription
appIdYes
storeYes
statusYes
listingsYesMetadata as last synced into AppSkyline, one row per locale; it may differ from what the store shows now. Long texts are cut to 600 characters.
returnedYes
truncatedYes
localeFilterYes

TDQS

A4.4/5.0
Behavior5/5

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

Annotations already establish read-only/idempotent/no-destruction, and the description adds genuinely new behavioral context on top: the data is mirrored from the last AppSkyline sync (staleness), long texts are truncated at 600 characters, and it reports keyword length against Apple's 100-character limit. Those are non-obvious traits an agent would otherwise discover only at runtime.

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 the triggering condition, then the payload facts, then a one-clause exclusion. The middle sentence is dense with semicolon-joined clauses, but every clause carries information (returned fields, review state, keyword limit, truncation cap), so the size is justified.

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?

For a three-parameter, fully annotated read tool with an output schema, the description supplies everything needed to select and call it: trigger condition, scope, locale semantics, sync staleness and truncation behavior. It even over-delivers slightly on return values, which the output schema already covers.

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

Parameters3/5

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

Schema coverage is 100%, so appId, store and locale are all documented in the schema itself, which sets the baseline at 3. The description reinforces locale behavior (per-language text, every synced locale when absent) but adds no syntax or format detail beyond what the schema already states.

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?

The description names a concrete verb and resource: reading back per-locale listing text (title, subtitle, keywords, release notes) plus the review state of the latest version. It scopes the tool to "their own app's" data and ends with a contrastive boundary ("Not for a live competitor listing"), so an agent can separate it from listing-scraping tools.

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

Usage Guidelines4/5

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

Usage is triggered explicitly ("Use this when someone asks about their own app's listing text per language... or whether the latest version is still in review") and one exclusion is given. However, the more ambiguous sibling get_store_listing is never named or contrasted, leaving the agent to guess between two closely related listing tools.

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

list_appsList your AppSkyline appsA
Read-onlyIdempotent
Inspect

Use this when someone asks which apps they track in AppSkyline, or an app's id is needed. Returns each app's id, name, default locale and its App Store, Mac App Store, Google Play and Microsoft Store ids, up to 100 apps. Not for finding other apps in a store.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
appsYesApps the signed-in account can access, at most 100
statusYes
truncatedYesTrue when the account has more than 100 apps

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds a real behavioral constraint beyond the structured data: the result is capped at 'up to 100 apps', which tells the agent to expect truncation. It stops short of explaining ordering or pagination behavior, so not a full 5.

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

Conciseness5/5

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

Three tight sentences, front-loaded with the usage trigger, then the return contents, then the exclusion. Every sentence carries information an agent would otherwise have to guess.

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 parameters, a present output schema, and annotations covering safety, the description only needs to supply the trigger, the scope and the sibling boundary — all of which it does. Nothing required for correct invocation is missing.

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?

The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline 4 applies. The description correctly implies the call is unfiltered and account-scoped rather than accepting query arguments.

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?

Specific verb+resource (list the apps tracked in AppSkyline) with an explicit enumeration of the returned fields, plus a negative scope statement ('Not for finding other apps in a store') that separates it from search_store_results. An agent can identify and use it without opening the schema.

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?

States the trigger condition ('when someone asks which apps they track... or an app's id is needed') and names the condition under which it is the wrong tool ('Not for finding other apps in a store'). Both when-to-use and when-not are explicit.

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

list_google_play_reviewsRead recent Google Play reviewsA
Read-onlyIdempotent
Inspect

Use this when someone asks what users say about their Android app on Google Play, or about recent ratings and complaints. Returns reviews with stars, text cut to 300 characters, app version, device, language and whether the developer replied, up to 100 per page. Google Play only returns reviews from the last 7 days. Not for App Store reviews.

ParametersJSON Schema
NameRequiredDescriptionDefault
appIdYesAppSkyline app id (uuid); the app needs a Google Play service account in AppSkyline
tokenNonextPageToken from the previous page; absent for the first page
maxResultsNoReviews to return per page, from 1 to 100
translationLanguageNoTranslate review text into this language, such as en; omit to keep the original language

Output Schema

ParametersJSON Schema
NameRequiredDescription
appIdYes
statusYes
reviewsYesReviews created or edited in the last 7 days, as the Google Play API returns them; review text is cut to 300 characters
returnedYes
truncatedYes
nextPageTokenYesPass as token to get the next page; null on the last page

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds genuinely non-obvious behavior: a hard 7-day retention window on Google Play's side and 300-character truncation of review text. It does not mention rate limits or what happens when a page token expires, which keeps it short of a 5.

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

Conciseness5/5

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

Three sentences, front-loaded with the usage trigger, then return shape, then the platform constraint and exclusion. Every sentence carries distinct information and nothing is repeated from the schema.

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 annotations covering safety, a full input schema and an output schema, the description only needs to supply routing, retention limits and truncation behavior — which it does. An agent has everything required to call this correctly and interpret the result.

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

Parameters3/5

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

Schema description coverage is 100%, so appId, token, maxResults and translationLanguage are already fully documented in the schema. The description only restates the page size ('up to 100 per page') and implies the pagination flow, adding no syntax or format detail beyond structured fields. Baseline 3.

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 specific verb and resource (read Google Play reviews) and immediately distinguishes itself from the nearest lookalike with 'Not for App Store reviews.' It also enumerates the exact payload (stars, truncated text, app version, device, language, developer reply), so an agent knows what it gets without opening the output schema.

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?

Gives an explicit trigger ('when someone asks what users say about their Android app on Google Play, or about recent ratings and complaints') plus an explicit when-not ('Not for App Store reviews'). No relevant competing sibling exists in the tool list, so no further routing is needed.

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

list_keywordsList tracked keywordsA
Read-onlyIdempotent
Inspect

Use this when someone asks which keywords they track for an app, or before adding or deleting one. Returns each tracked keyword's id, search term, language, country and bid, up to 500 per call. Not for current rankings or search volume.

ParametersJSON Schema
NameRequiredDescriptionDefault
skipNoKeywords to skip before the first one returned, for paging; defaults to 0
appIdYesAppSkyline app id (uuid)
limitNoKeywords to return, from 1 to 500; omit for all tracked keywords, capped at 500

Output Schema

ParametersJSON Schema
NameRequiredDescription
offsetYes
statusYes
keywordsYesTracked keywords for the app, at most 500 per call
returnedYes
truncatedYesTrue when more than 500 keywords matched; page with skip

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent and non-destructive, so safety is covered. The description adds real behavioral context the annotations lack: the returned field set and the 500-per-call ceiling. It does not discuss paging behavior beyond what the schema says, keeping it short of a 5.

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

Conciseness5/5

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

Three sentences, front-loaded with the usage trigger, followed by return contents and then the exclusion. Every clause earns its place with no restatement of the tool name or title.

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?

For a read-only list tool with a full output schema and annotated safety profile, the description supplies the routing context, return fields, and cap. Nothing needed to invoke it correctly is missing.

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

Parameters3/5

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

Schema coverage is 100% and each parameter (skip, limit, appId) is documented in-schema with bounds. The description only reinforces the cap ('up to 500 per call'), which is already implied by the limit maximum, so the baseline 3 applies.

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 specific verb (list) and resource (tracked keywords) scoped to an app, and explicitly excludes adjacent capabilities: 'Not for current rankings or search volume.' An agent can separate it from get_keyword_rank and get_keyword_overview without opening a schema.

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?

Gives an explicit trigger ('when someone asks which keywords they track for an app') plus a workflow trigger ('before adding or deleting one') that routes to add_keyword/delete_keyword, and names what it is not for. Nothing is left to inference.

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

search_store_resultsSearch an app storeA
Read-onlyIdempotent
Inspect

Use this when someone asks which apps show up for a search term, or who their competitors are for a keyword, on the App Store, Mac App Store, Google Play or Microsoft Store. Returns the live results in rank order with store id, title, rating and developer (10 by default, up to 200). Not for one app's own position.

ParametersJSON Schema
NameRequiredDescriptionDefault
numNoNumber of results to return, from 1 to 200; defaults to 10
langNoTwo-letter language code such as en or it; defaults to en except on Google Play, which uses the store default
termYesSearch term as a user would type it in the store, 1 to 200 characters
storeYesStore to search: ios-app-store, macos-app-store, google-play or microsoft-store
countryNoTwo-letter store country code such as US or IT; defaults to US

Output Schema

ParametersJSON Schema
NameRequiredDescription
langYes
termYes
storeYes
statusYes
countryYes
resultsYesLive search results in store rank order; nothing is stored in AppSkyline
truncatedYesTrue when the store returned more than 200 results

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, openWorld and non-destructive, so the safety profile is covered. The description adds real context beyond them: results come back in rank order with specific fields, are live, and default to 10 with a ceiling of 200.

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

Conciseness5/5

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

Two sentences, zero filler, with the usage trigger front-loaded and the return shape and exclusion packed into the second. Nothing is repeated.

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?

For a five-parameter read tool with an output schema, annotations and a full schema description coverage, all that is needed to select and invoke it is present: when to use, when not to, or which stores, and result-size bounds.

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

Parameters3/5

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

Schema coverage is 100%, so store, term, num, lang and country are all documented in the schema itself. The description only restates the num default (10, up to 200) and the store list, which duplicates schema content rather than adding syntax or format guidance, so the baseline 3 applies.

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 ('search' an app store) and enumerates the four supported stores, immediate scope. Naming the exact question it answers ('which apps show up for a search term') separates it cleanly from siblings like get_store_listing and get_app.

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?

Explicit positive trigger ('when someone asks which apps show up for a search term, or who their competitors are for a keyword') plus an explicit exclusion ('Not for one app's own position'), which routes the agent away from this tool for single-app lookups.

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

show_app_overviewShow app overviewA
Read-onlyIdempotent
Inspect

Use this when someone wants a quick overview of one of the apps they track in AppSkyline. Returns an overview card with the app's connected stores, locales and up to 50 tracked keywords. Not for keyword rankings.

ParametersJSON Schema
NameRequiredDescriptionDefault
appIdYesAppSkyline app id (uuid)

Output Schema

ParametersJSON Schema
NameRequiredDescription
appYes
keywordsYesThe first 50 tracked keywords; keywordCount has the total
storeCountYes
keywordCountYes

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive, closed-world, so the safety profile is covered. The description adds genuinely useful behavior beyond that: the 50-keyword cap on the returned card, which tells the agent the result is truncated rather than complete.

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

Conciseness5/5

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

Three short sentences, trigger first, payload second, exclusion last. No filler and nothing buried.

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

Completeness4/5

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

With an output schema present, return values needn't be spelled out, and annotations cover the safety profile, so the definition is nearly complete for a one-parameter read. The only meaningful gap is that it never positions itself against get_app or list_apps.

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

Parameters3/5

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

Schema description coverage is 100% and the single appId parameter is documented as a uuid in the schema, so the schema carries the load. The description adds nothing about appId format or where to obtain it, so baseline 3 is appropriate.

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

Purpose4/5

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

Names a specific verb+resource (show an overview of a tracked app) and enumerates the payload: connected stores, locales, and up to 50 tracked keywords. It rules out keyword rankings, but never distinguishes itself from the closest sibling, get_app, leaving the agent to guess between two app-scoped reads.

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

Usage Guidelines4/5

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

"Use this when someone wants a quick overview" is an explicit trigger, and "Not for keyword rankings" is an explicit exclusion that routes ranking questions elsewhere. It stops short of naming the alternative tool for rankings or explaining when get_app is preferable.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 14 tool updates
    • Changedadd_keyword4 fields changed
      • changedInput schema / properties / appId / description
        Previous value: -"Appskyline app id to attach the keyword to"New value: +"AppSkyline app id (uuid)"
      • changedInput schema / properties / country / description
        Previous value: -"Two-letter country code (e.g. US)"New value: +"Two-letter store country code such as US; without one the weekly rank check skips this keyword"
      • changedInput schema / properties / language / description
        Previous value: -"Two-letter language code (e.g. en)"New value: +"Two-letter language code such as en"
      • changedInput schema / properties / searchTerms / description
        Previous value: -"The keyword phrase to track"New value: +"Keyword phrase to track, as users type it in the store, 1 to 200 characters"
    • Changeddelete_keyword1 field changed
      • changedInput schema / properties / id / description
        Previous value: -"Keyword id to delete"New value: +"Keyword id"
    • Changedget_app2 fields changed
      • changedInput schema / properties / appId / description
        Previous value: -"App id (uuid)"New value: +"AppSkyline app id (uuid)"
      • addedOutput schema / properties / app / description
        Added value: +"Null when the app is not in the signed-in account"
    • Changedget_app_engagement_summary8 fields changed
      • changedInput schema / properties / appId / description
        Previous value: -"Appskyline app id"New value: +"AppSkyline app id (uuid)"
      • changedInput schema / properties / days / description
        Previous value: -"Rolling window size in days when no explicit dates are given"New value: +"Rolling window of the last 1 to 365 days, used when no dates are given; omit dates and days for every synced day"
      • changedInput schema / properties / endDate / description
        Previous value: -"End of the window as YYYY-MM-DD"New value: +"Last day of the window as YYYY-MM-DD; applies only together with startDate"
      • changedInput schema / properties / startDate / description
        Previous value: -"Start of the window as YYYY-MM-DD"New value: +"First day of the window as YYYY-MM-DD; applies only together with endDate"
      • changedInput schema / properties / store / description
        Previous value: -"Which store to summarize"New value: +"Store to summarize: ios-app-store, macos-app-store, google-play or microsoft-store"
      • addedOutput schema / properties / dailySeries / description
        Added value: +"The most recent 30 days of one daily metric series"
      • addedOutput schema / properties / topTerritories / description
        Added value: +"Up to 8 leading countries or territories by downloads or installs"
      • addedOutput schema / properties / totals / description
        Added value: +"Store-reported totals for the window; metric names differ by store"
    • Changedget_keyword_history6 fields changed
      • changedInput schema / properties / appId / description
        Previous value: -"Appskyline app id"New value: +"AppSkyline app id (uuid)"
      • changedInput schema / properties / country / description
        Previous value: -"Two-letter country code (e.g. US, IT)"New value: +"Two-letter store country code such as US or IT (required)"
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum number of history rows to return (newest first)"New value: +"Snapshots to return, newest first, from 1 to 365; defaults to 365"
      • changedInput schema / properties / store / description
        Previous value: -"Which store to check"New value: +"Store to read: ios-app-store, macos-app-store, google-play or microsoft-store; the app needs an id on that store"
      • changedInput schema / properties / term / description
        Previous value: -"Search term"New value: +"Search term to read history for, 1 to 200 characters"
      • addedOutput schema / properties / snapshots / description
        Added value: +"One row per stored search snapshot, newest first; rank is null when the app was not in that snapshot"
    • Changedget_keyword_overview4 fields changed
      • changedInput schema / properties / country / description
        Previous value: -"Two-letter country code (e.g. US, IT)"New value: +"Two-letter country code such as US or IT (required)"
      • changedInput schema / properties / lang / description
        Previous value: -"Two-letter language code (e.g. en, it)"New value: +"Two-letter language code such as en or it; optional"
      • changedInput schema / properties / terms / description
        Previous value: -"Search terms to look up (max 50 per call, no commas)"New value: +"Keyword ideas to look up in one batch, 1 to 50 terms of up to 200 characters, none containing a comma"
      • addedOutput schema / properties / keywords / description
        Added value: +"Google web-search demand per term from the shared 30-day cache, highest volume first; a proxy for interest, not app-store search counts"
    • Changedget_keyword_rank8 fields changed
      • changedInput schema / properties / appId / description
        Previous value: -"Appskyline app id"New value: +"AppSkyline app id (uuid)"
      • changedInput schema / properties / country / description
        Previous value: -"Two-letter country code (e.g. US, IT)"New value: +"Two-letter store country code such as US or IT; defaults to US"
      • changedInput schema / properties / lang / description
        Previous value: -"Two-letter language code (e.g. en, it)"New value: +"Two-letter language code such as en or it; defaults to en except on Google Play, which uses the store default"
      • changedInput schema / properties / num / description
        Previous value: -"How many results to scan when looking for the app (default 50, max 200)"New value: +"How many search results to scan for the app, from 1 to 200; defaults to 50"
      • changedInput schema / properties / store / description
        Previous value: -"Which store to check"New value: +"Store to check: ios-app-store, macos-app-store, google-play or microsoft-store; the app needs an id on that store"
      • changedInput schema / properties / term / description
        Previous value: -"Search term"New value: +"Search term to check, 1 to 200 characters"
      • addedOutput schema / properties / rank / description
        Added value: +"1-based position; null unless status is ranked"
      • addedOutput schema / properties / resultsScanned / description
        Added value: +"How many results were scanned; report a rank as #N of this"
    • Changedget_store_listing6 fields changed
      • changedInput schema / properties / country / description
        Previous value: -"Two-letter country code (e.g. US, IT)"New value: +"Two-letter store country code such as US or IT; defaults to the store's own default"
      • changedInput schema / properties / lang / description
        Previous value: -"Two-letter language code (e.g. en, it)"New value: +"Two-letter language code such as en or it; defaults to the store's own default"
      • changedInput schema / properties / store / description
        Previous value: -"Which store to read the listing from"New value: +"Store to read: ios-app-store, macos-app-store, google-play or microsoft-store"
      • changedInput schema / properties / storeId / description
        Previous value: -"Store-native app identifier: numeric Apple id, Google Play package name, or Microsoft Store product id"New value: +"The app's id in that store: numeric Apple id, Google Play package name such as com.example.app, or Microsoft Store product id"
      • changedOutput schema / properties / listing / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "currency": {
        -        "anyOf": [
        -          {
        -            "maxLength": 32,
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ]
        -      },
        -      "description": {
        -        "anyOf": [
        -          {
        -            "maxLength": 600,
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ]
        -      },
        -      "developer": {
        -        "anyOf": [
        -          {
        -            "maxLength": 300,
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ]
        -      },
        -      "developerId": {
        -        "anyOf": [
        -          {
        -            "maxLength": 300,
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ]
        -      },
        -      "free": {
        -        "type": [
        -          "boolean",
        -          "null"
        -        ]
        -      },
        -      "genres": {
        -        "items": {
        -          "maxLength": 100,
        -          "type": "string"
        -        },
        -        "maxItems": 20,
        -        "type": "array"
        -      },
        -      "id": {
        -        "anyOf": [
        -          {
        -            "maxLength": 300,
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ]
        -      },
        -      "price": {
        -        "anyOf": [
        -          {
        -            "maxLength": 100,
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ]
        -      },
        -      "ratings": {
        -        "anyOf": [
        -          {
        -            "maximum": 1000000000000,
        -            "minimum": 0,
        -            "type": "integer"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ]
        -      },
        -      "releaseNotes": {
        -        "anyOf": [
        -          {
        -            "maxLength": 600,
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ]
        -      },
        -      "released": {
        -        "anyOf": [
        -          {
        -            "maxLength": 64,
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ]
        -      },
        -      "requiredOsVersion": {
        -        "anyOf": [
        -          {
        -            "maxLength": 100,
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ]
        -      },
        -      "score": {
        -        "anyOf": [
        -          {
        -            "maximum": 1000000,
        -            "minimum": 0,
        -            "type": "number"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ]
        -      },
        -      "screenshotCount": {
        -        "maximum": 10000,
        -        "minimum": 0,
        -        "type": "integer"
        -      },
        -      "title": {
        -        "anyOf": [
        -          {
        -            "maxLength": 300,
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ]
        -      },
        -      "updated": {
        -        "anyOf": [
        -          {
        -            "maxLength": 64,
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ]
        -      },
        -      "version": {
        -        "anyOf": [
        -          {
        -            "maxLength": 100,
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ]
        -      }
        -    },
        -    "required": [
        -      "id",
        -      "title",
        -      "developer",
        -      "developerId",
        -      "score",
        -      "ratings",
        -      "price",
        -      "free",
        -      "currency",
        -      "version",
        -      "released",
        -      "updated",
        -      "requiredOsVersion",
        -      "genres",
        -      "screenshotCount",
        -      "description",
        -      "releaseNotes"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "currency": {
        +        "anyOf": [
        +          {
        +            "maxLength": 32,
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "description": {
        +        "anyOf": [
        +          {
        +            "maxLength": 600,
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "developer": {
        +        "anyOf": [
        +          {
        +            "maxLength": 300,
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "developerId": {
        +        "anyOf": [
        +          {
        +            "maxLength": 300,
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "free": {
        +        "type": [
        +          "boolean",
        +          "null"
        +        ]
        +      },
        +      "genres": {
        +        "items": {
        +          "maxLength": 100,
        +          "type": "string"
        +        },
        +        "maxItems": 20,
        +        "type": "array"
        +      },
        +      "id": {
        +        "anyOf": [
        +          {
        +            "maxLength": 300,
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "price": {
        +        "anyOf": [
        +          {
        +            "maxLength": 100,
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "ratings": {
        +        "anyOf": [
        +          {
        +            "maximum": 1000000000000,
        +            "minimum": 0,
        +            "type": "integer"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "releaseNotes": {
        +        "anyOf": [
        +          {
        +            "maxLength": 600,
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "released": {
        +        "anyOf": [
        +          {
        +            "maxLength": 64,
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "requiredOsVersion": {
        +        "anyOf": [
        +          {
        +            "maxLength": 100,
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "score": {
        +        "anyOf": [
        +          {
        +            "maximum": 1000000,
        +            "minimum": 0,
        +            "type": "number"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "description": "Average rating as the store reports it"
        +      },
        +      "screenshotCount": {
        +        "maximum": 10000,
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "title": {
        +        "anyOf": [
        +          {
        +            "maxLength": 300,
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "updated": {
        +        "anyOf": [
        +          {
        +            "maxLength": 64,
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "version": {
        +        "anyOf": [
        +          {
        +            "maxLength": 100,
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      }
        +    },
        +    "required": [
        +      "id",
        +      "title",
        +      "developer",
        +      "developerId",
        +      "score",
        +      "ratings",
        +      "price",
        +      "free",
        +      "currency",
        +      "version",
        +      "released",
        +      "updated",
        +      "requiredOsVersion",
        +      "genres",
        +      "screenshotCount",
        +      "description",
        +      "releaseNotes"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedOutput schema / properties / listing / description
        Added value: +"The live public listing; description and release notes are cut to 600 characters. Null when the store has no app with that id."
    • Changedget_store_metadata4 fields changed
      • changedInput schema / properties / appId / description
        Previous value: -"Appskyline app id"New value: +"AppSkyline app id (uuid)"
      • changedInput schema / properties / locale / description
        Previous value: -"Only return this locale (e.g. en-US, it)"New value: +"Only this locale, written as in the listing such as en-US or it; every synced locale when absent"
      • changedInput schema / properties / store / description
        Previous value: -"Which store listing to read"New value: +"Store listing to read: ios-app-store, macos-app-store, google-play or microsoft-store"
      • addedOutput schema / properties / listings / description
        Added value: +"Metadata as last synced into AppSkyline, one row per locale; it may differ from what the store shows now. Long texts are cut to 600 characters."
    • Changedlist_apps2 fields changed
      • addedOutput schema / properties / apps / description
        Added value: +"Apps the signed-in account can access, at most 100"
      • addedOutput schema / properties / truncated / description
        Added value: +"True when the account has more than 100 apps"
    • Changedlist_google_play_reviews6 fields changed
      • changedInput schema / properties / appId / description
        Previous value: -"Appskyline app id (uuid)"New value: +"AppSkyline app id (uuid); the app needs a Google Play service account in AppSkyline"
      • changedInput schema / properties / maxResults / description
        Previous value: -"How many reviews to fetch (max 100)"New value: +"Reviews to return per page, from 1 to 100"
      • changedInput schema / properties / token / description
        Previous value: -"Page token returned by a previous call"New value: +"nextPageToken from the previous page; absent for the first page"
      • changedInput schema / properties / translationLanguage / description
        Previous value: -"Translate review text into this language (e.g. en)"New value: +"Translate review text into this language, such as en; omit to keep the original language"
      • addedOutput schema / properties / nextPageToken / description
        Added value: +"Pass as token to get the next page; null on the last page"
      • addedOutput schema / properties / reviews / description
        Added value: +"Reviews created or edited in the last 7 days, as the Google Play API returns them; review text is cut to 300 characters"
    • Changedlist_keywords6 fields changed
      • changedInput schema / properties / appId / description
        Previous value: -"App id to list tracked keywords for"New value: +"AppSkyline app id (uuid)"
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum number of keywords to return (default server-side)"New value: +"Keywords to return, from 1 to 500; omit for all tracked keywords, capped at 500"
      • changedInput schema / properties / skip / description
        Previous value: -"Pagination offset"New value: +"Keywords to skip before the first one returned, for paging; defaults to 0"
      • addedOutput schema / properties / keywords / description
        Added value: +"Tracked keywords for the app, at most 500 per call"
      • addedOutput schema / properties / keywords / items / properties / bid / description
        Added value: +"Bid amount stored for the keyword; null when none is set"
      • addedOutput schema / properties / truncated / description
        Added value: +"True when more than 500 keywords matched; page with skip"
    • Changedsearch_store_results8 fields changed
      • changedInput schema / properties / country / description
        Previous value: -"Two-letter country code (e.g. US, IT)"New value: +"Two-letter store country code such as US or IT; defaults to US"
      • changedInput schema / properties / lang / description
        Previous value: -"Two-letter language code (e.g. en, it)"New value: +"Two-letter language code such as en or it; defaults to en except on Google Play, which uses the store default"
      • changedInput schema / properties / num / description
        Previous value: -"Number of results to return (default depends on store)"New value: +"Number of results to return, from 1 to 200; defaults to 10"
      • changedInput schema / properties / store / description
        Previous value: -"Which store to search"New value: +"Store to search: ios-app-store, macos-app-store, google-play or microsoft-store"
      • changedInput schema / properties / term / description
        Previous value: -"Search term"New value: +"Search term as a user would type it in the store, 1 to 200 characters"
      • addedOutput schema / properties / results / description
        Added value: +"Live search results in store rank order; nothing is stored in AppSkyline"
      • addedOutput schema / properties / results / items / properties / score / description
        Added value: +"Rating score as the store reports it"
      • addedOutput schema / properties / truncated / description
        Added value: +"True when the store returned more than 200 results"
    • Changedshow_app_overview2 fields changed
      • changedInput schema / properties / appId / description
        Previous value: -"Appskyline app id to render"New value: +"AppSkyline app id (uuid)"
      • addedOutput schema / properties / keywords / description
        Added value: +"The first 50 tracked keywords; keywordCount has the total"
  2. 2 tool updates
    • Changedlist_apps1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedshow_app_overview6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / properties / app / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "defaultLocale": {
        -        "anyOf": [
        -          {
        -            "maxLength": 32,
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ]
        -      },
        -      "googlePlayId": {
        -        "$ref": "#/properties/app/anyOf/0/properties/iosAppStoreId"
        -      },
        -      "id": {
        -        "maxLength": 200,
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "iosAppStoreId": {
        -        "anyOf": [
        -          {
        -            "maxLength": 200,
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ]
        -      },
        -      "locales": {
        -        "items": {
        -          "maxLength": 32,
        -          "type": "string"
        -        },
        -        "maxItems": 100,
        -        "type": "array"
        -      },
        -      "macosAppStoreId": {
        -        "$ref": "#/properties/app/anyOf/0/properties/iosAppStoreId"
        -      },
        -      "microsoftStoreId": {
        -        "$ref": "#/properties/app/anyOf/0/properties/iosAppStoreId"
        -      },
        -      "name": {
        -        "maxLength": 200,
        -        "minLength": 1,
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "id",
        -      "name",
        -      "defaultLocale",
        -      "locales",
        -      "iosAppStoreId",
        -      "macosAppStoreId",
        -      "googlePlayId",
        -      "microsoftStoreId"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "defaultLocale": {
        +        "anyOf": [
        +          {
        +            "maxLength": 32,
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "googlePlayId": {
        +        "anyOf": [
        +          {
        +            "maxLength": 200,
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "id": {
        +        "maxLength": 200,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "iosAppStoreId": {
        +        "anyOf": [
        +          {
        +            "maxLength": 200,
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "locales": {
        +        "items": {
        +          "maxLength": 32,
        +          "type": "string"
        +        },
        +        "maxItems": 100,
        +        "type": "array"
        +      },
        +      "macosAppStoreId": {
        +        "anyOf": [
        +          {
        +            "maxLength": 200,
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "microsoftStoreId": {
        +        "anyOf": [
        +          {
        +            "maxLength": 200,
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "name": {
        +        "maxLength": 200,
        +        "minLength": 1,
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "id",
        +      "name",
        +      "defaultLocale",
        +      "locales",
        +      "iosAppStoreId",
        +      "macosAppStoreId",
        +      "googlePlayId",
        +      "microsoftStoreId"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedOutput schema / properties / keywords / items / properties / id / $ref
        Removed value: -"#/properties/app/anyOf/0/properties/iosAppStoreId"
      • addedOutput schema / properties / keywords / items / properties / id / anyOf
        Added value: +[
        +  {
        +    "maxLength": 200,
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
  3. 14 tool updates
    • First observedadd_keyword
    • First observeddelete_keyword
    • First observedget_app
    • First observedget_app_engagement_summary
    • First observedget_keyword_history
    • First observedget_keyword_overview
    • First observedget_keyword_rank
    • First observedget_store_listing
    • First observedget_store_metadata
    • First observedlist_apps
    • First observedlist_google_play_reviews
    • First observedlist_keywords
    • First observedsearch_store_results
    • First observedshow_app_overview

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    Enables brand visibility monitoring across major AI platforms like ChatGPT, Claude, Gemini, and Perplexity. It allows users to track visibility scores, analyze competitor data, and receive actionable insights to improve AI-generated brand recommendations.
    16
    22 npm
    1
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables tracking competitor websites, changelogs, blog feeds, and pricing pages with meaningful diffs, classification, and Markdown digests via MCP tools for listing, adding, removing competitors, running checks, and retrieving digests or changes.
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Browse IndustryLens's published competitive-intelligence reports and head-to-head competitor comparisons from any AI agent — real, source-backed data.
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources