ASOLens
NPM · @ASOLENS/MCP
ASOLens MCP server: App Store ranks, competitors and weaknesses, from your own machine
Available components
Last scanned (11 hours ago)
Scores higher than 36% of npm servers
Category Marketing and SEO
How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →
Supply Chain Security98
- No malware found by supply-chain analysis.Pass
- No known CVEs affecting this package version or its production dependencies.Pass
- No install/post-install scripts declared.Pass
- 31 of 92 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency19
- Repository check failed: no source repository is declared. See how to fix → View diagnostics → Fail
- Provenance check failed: no build-provenance attestation is published. See how to fix → View diagnostics → Fail
- Clear OSI-approved license (MIT).Pass
- Actively maintained (last published 4 days ago).Pass
- Security-disclosure policy not yet verified: we couldn't inspect the source repository.Unverified
Schema Quality & AI Usability61
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 5254 tokens (~350/item across 15 items; 15 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management0
- Stability not yet verified: not enough scan history yet (needs a 30-day window).Unverified
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- We read all 15 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
- An AI judge read all 15 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Unverified: 1 category
A category scored 0 because we could not verify it: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 14 Oct 26 +29
- Injection markers: unverified → pass ▲ security
- First check of Judged manipulation: pass security
- Stability: Stability not yet verified: not enough scan history yet (needs a 30-day window). security
- Tool coverage: unverified → 100 ▲ functional
- MCP protocol: unverified → pass ▲ functional
- First check of Schema quality: fail functional
- First check of Schema quality: excellent functional
- First check of Destructive annotations: pass functional
- First check of Schema quality: fail functional
- First check of Tool coverage: 100 functional
- 13 Oct 26 33
First indexed and scored.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 17 Oct 2026 · Analysed npm/@asolens/mcp@0.4.1
Provenance No attestation
The registry publishes no build provenance for this version, so there is nothing to verify.
| Result | No attestation |
|---|---|
| Ecosystem | npm |
Background: How many MCP packages publish verified provenance →
Dependencies 92 packages
| Packages resolved | 92 |
|---|---|
| Stale | 31 |
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
app_snapshot App snapshot with developer's other apps ~92
Resolves an app by id, App Store URL, or name and returns its current listing data plus the developer's other apps in this storefront.
| Name | Type | Req | Description |
|---|---|---|---|
| app | string | yes | App to resolve: a numeric App Store id, an App Store URL, or an app name. |
| country | string | – | Two-letter App Store storefront country code, e.g. "us". Defaults to the server's configured default country. |
No output schema declared.
No examples provided.
audit_keywords Which words in your keyword field earn their place ~463
Tests every word in YOUR OWN keywords field by searching a phrase where that word is the distinguishing one -- an anchor your app certainly covers, plus the word under test ('matemática' + 'escola'). Ranking for the probe means the word is working; not ranking means it is not earning its 100 characters. Searching each word alone instead would mostly measure how small your app is. READ THE SUMMARY FIRST: if almost nothing ranks, the answer is usually not 'fix these words' -- a live audit found 1 of 19 German probes ranking, with the app at zero ratings against competitors holding thousands, which means keyword work is not the lever in that storefront at all. Requires App Store Connect credentials (the keywords field is private).
| Name | Type | Req | Description |
|---|---|---|---|
| anchor | string | – | The context word each probe is built from. Omitted, one is picked from your app name and reported back as anchorSource: "auto" -- check it. A mechanical anchor can produce a phrase no human would typ… |
| app | string | yes | Your app: numeric App Store id, App Store URL, or bundle id. Must be visible to the configured App Store Connect key. |
| country | string | – | Storefront to test in, e.g. "br". Defaults to the server's configured default country. The keyword field tested is the one for the locale that storefront serves. |
| probes | array | – | Override the generated probe for specific words, e.g. {word: "contar", probe: "aprender a contar"} where natural phrasing beats "<anchor> contar". Words not listed here still use the anchor. |
| suggestions | boolean | – | Include, per word, what App Store autocomplete says people typing that word are actually looking for. Free, adds no measurable wall-clock (autocomplete has its own request lane), and works in all 17… |
No output schema declared.
No examples provided.
compare_markets Which storefront is worth working on ~373
Runs the keyword-field audit across several storefronts at once and puts them side by side: how much of your keyword field places in each, your rating count there, and the competitor median with its sample size. This is the 'which market should I work on' question, which no single-market answer can settle. Uses auto-picked anchors only -- to override an anchor or a probe, run audit_keywords for that one market. Requires App Store Connect credentials (the keywords field is private). READ THE ANCHOR COLUMN: each market's numbers come from a different anchor in a different language, so the medians are NOT commensurable and only large differences mean anything.
| Name | Type | Req | Description |
|---|---|---|---|
| anchors | array | – | Per-market anchor overrides, e.g. {country: 'jp', anchor: '算数'}. Markets not listed pick one automatically. Worth setting wherever you know the category term a person there would actually search: the… |
| app | string | yes | Your app: numeric App Store id, App Store URL, or bundle id. Must be visible to the configured App Store Connect key. |
| countries | array | yes | Storefronts to compare, up to 8. Each costs roughly one App Store search per word in that locale's keyword field (free, but a four-market comparison takes about half a minute). |
| probes | array | – | Per-market probe overrides, e.g. {country: 'br', word: 'soma', probe: 'soma e subtração'}. This is where market knowledge pays: measured in br, natural phrasing put words at #23 and #35 that mechanic… |
No output schema declared.
No examples provided.
compare_queries Compare two searches' result sets ~288
Runs two keywords in one storefront and reports how much their ranked results overlap. Use this BEFORE concluding anything from a rank difference between two queries: rank is relative to whoever else is in that result set, so an app at #19 for one phrase and #131 for another has not necessarily been hurt by the extra word -- the two searches may simply have different competitors. identicalResults: true means Apple answered one query for both (it does this for some accented/unaccented pairs, and for some rewordings), so any rank difference is noise; NULL means both queries returned nothing, so there was no list to compare and no conclusion to draw either way. A low overlap means the two are genuinely different searches and their ranks are not comparable at all.
| Name | Type | Req | Description |
|---|---|---|---|
| a | string | yes | First search keyword. |
| app | string | – | Optional app (id, URL, or name) to also report the rank of in each result set, so you can see the rank difference and the overlap that qualifies it together. |
| b | string | yes | Second search keyword, the one to compare against. |
| country | string | – | Two-letter App Store storefront country code, e.g. "us". Defaults to the server's configured default country. |
| top | integer | – | How deep to compare the two ranked lists (default 25). identicalResults always compares the FULL lists, not just this depth. |
No output schema declared.
No examples provided.
find_app Find an App Store app ~115
Looks up an app by id, App Store URL, or name and returns candidate matches with rating and developer info.
| Name | Type | Req | Description |
|---|---|---|---|
| country | string | – | Two-letter App Store storefront country code, e.g. "us". Defaults to the server's configured default country. |
| limit | integer | – | Maximum matches to return for a name search (max 200, Apple's own ceiling). Ignored when query is a numeric id or App Store URL. |
| query | string | yes | App name or search text to look up on the App Store. |
No output schema declared.
No examples provided.
keyword_ranks Keyword ranks for one app across countries ~801
Looks up where one app ranks for a list of keywords, in one or more storefronts, with day-over-day trend where available.
| Name | Type | Req | Description |
|---|---|---|---|
| app | string | yes | App to check: a numeric App Store id, an App Store URL, or an app name. |
| countries | array | – | Storefront country codes to check, up to 8, paired with every entry in `keywords`. Defaults to the server's configured default country. Keywords x countries must not exceed 25 pairs total. |
| coverage | boolean | – | For YOUR OWN app (App Store Connect credentials required), report which of each keyword's words actually appear in the text Apple indexes -- name, subtitle and the keywords field, checked together ra… |
| depth | boolean | – | Add autocompleteDepth (how many App Store autocomplete suggestions begin with the keyword) to each row, and to each variant when variants is on. Free, works in every storefront, and adds no wall-cloc… |
| keywords | array | – | Keywords to check this app's rank for (max 50; keywords x countries must not exceed 25 pairs total). Accents matter: Apple usually treats an accented and an unaccented spelling as different searches,… |
| pairs | array | – | Explicit keyword/country pairs instead of the keywords x countries cross product. Use this whenever the storefronts need different keywords: 13 Brazilian plus 9 Nordic terms is 22 rows here, against… |
| variants | boolean | – | For every keyword with an accent on a Latin, Greek or Cyrillic letter, ALSO look up the stripped spelling and return the two side by side in one row, with identicalResults saying whether Apple actual… |
No output schema declared.
No examples provided.
keyword_table Saved keyword tracking table ~572
Builds a table of your saved keywords with current rank, difficulty and trend, refreshing today's data by default.
| Name | Type | Req | Description |
|---|---|---|---|
| add | array | – | Keywords to save before building the table (max 50 - each triggers a live App Store search when refresh is true, which it is by default). |
| app | string | – | Your own app, to compute rank/trend against in the table: id, URL, or name. |
| country | string | – | Two-letter App Store storefront country code, e.g. "us". Defaults to the server's configured default country. |
| depth | boolean | – | Fetch App Store autocomplete for each keyword and report autocompleteDepth: how many suggested queries begin with that keyword. Free, works in every storefront (unlike volume, which is 'us'-only), an… |
| notes | array | – | Notes to attach to already-saved keywords, applied before the table is built. |
| refresh | boolean | – | Re-fetch today's rank data for each saved keyword that hasn't been refreshed yet today, before building the table. Keywords already refreshed today are served from cache for free; up to 20 newly-fetc… |
| volume | boolean | – | DataForSEO's Apple keyword dataset covers the 'us' storefront ONLY -- in every other storefront volume comes back unavailable saying exactly that, at no cost and without failing the call. Look up key… |
No output schema declared.
No examples provided.
low_star_reviews Low-star reviews for an app ~122
Fetches recent low-star reviews for an app so you can read what's actually bothering users; theme extraction is left to the caller.
| Name | Type | Req | Description |
|---|---|---|---|
| app | string | yes | App to fetch reviews for: a numeric App Store id, an App Store URL, or an app name. |
| country | string | – | Two-letter App Store storefront country code, e.g. "us". Defaults to the server's configured default country. |
| limit | integer | – | Maximum number of reviews to return. |
| maxStars | integer | – | Only include reviews with this star rating or lower. |
No output schema declared.
No examples provided.
my_listing Your own App Store listing text ~195
Reads YOUR OWN app's indexed listing text -- name, subtitle and the keywords field -- from App Store Connect, per locale. This is the only way to see the keywords field: it is private to the developer and no public endpoint exposes it, so for anyone else's app it stays unavailable. Requires App Store Connect API credentials; without them the tool says so rather than failing. Use it before judging a keyword: coverage of a query's words across name+subtitle+keywords is what you can actually change.
| Name | Type | Req | Description |
|---|---|---|---|
| app | string | yes | Your app: a numeric App Store id, an App Store URL, or a bundle id. It must be an app your App Store Connect API key can see. |
| country | string | – | Two-letter storefront country code. Given, the response leads with the locale that storefront serves (and says so when the app has no localization for it and falls back). Omitted, every locale is ret… |
No output schema declared.
No examples provided.
niche_report Niche competitive report ~803
Builds a competitive report across a set of keywords: the union of top-ranked apps, a weakness score per competitor, difficulty per keyword, and gaps for your own app.
| Name | Type | Req | Description |
|---|---|---|---|
| app | string | – | Your own app, to compare against competitors and compute gaps: id, URL, or name. |
| country | string | – | Two-letter App Store storefront country code, e.g. "us". Defaults to the server's configured default country. |
| depth | boolean | – | Fetch App Store autocomplete for each keyword and report autocompleteDepth: how many suggested queries begin with that keyword. Free, works in every storefront (unlike volume, which is 'us'-only), an… |
| include_inputs | boolean | – | If true, every modelled value (weakness, difficulty, ownTrend, volume) also includes the raw inputs it was computed from. Default false keeps kind, value and model -- far smaller for reports with man… |
| keywords | array | yes | Keywords defining the niche (max 30). Accents matter: Apple usually treats an accented and an unaccented spelling as different searches, and neither is reliably better (br 'jogos de matemática' ranke… |
| name | string | – | Name for this niche; required (together with save: true) to save it for later reuse. |
| save | boolean | – | If true, saves this niche definition for later reuse -- requires name to also be given, otherwise nothing is saved (see saved/savedReason in the response). |
| top | integer | – | How many top-ranked apps per keyword to include in the report. |
| volume | boolean | – | DataForSEO's Apple keyword dataset covers the 'us' storefront ONLY -- in every other storefront volume comes back unavailable saying exactly that, at no cost and without failing the call. Look up key… |
No output schema declared.
No examples provided.
price_keywords Search volume for a keyword list ~391
Looks up DataForSEO search volume for keywords you already have, by naming each one to the vendor. Use this to RANK a list -- 'which of these 40 terms is biggest' -- which niche_report cannot answer, because it reads each competitor's top 50 keywords only and everything below that comes back unpriced. This asks across each app's full ranked list instead. Paid: keywords are sent in batches of 150, and each batch is $0.012 per app, plus $0.00012 per keyword actually found -- so 200 keywords across 2 apps is 4 batches, about $0.05. Free for the rest of the UTC day once bought. US storefront only, like all volume in this server. A keyword still comes back unavailable if none of the queried apps ranks for it -- volume exists only as 'the keywords this app ranks for', so the answer depends on which competitors are reached, and it is NEVER evidence a keyword is unpopular.
| Name | Type | Req | Description |
|---|---|---|---|
| apps | array | – | Competitor app ids to price through. STRONGLY PREFERRED: supplying these makes the call cost ZERO App Store requests. Leave empty and the tool searches the App Store for a few of your keywords to fin… |
| country | string | – | Two-letter App Store storefront country code. Volume is "us"-only; any other storefront returns unavailable at no cost. |
| keywords | array | yes | The keywords to price. Duplicates and casing are normalised. |
| max_apps | integer | – | How many competitor apps to query. Cost is per app AND per 150-keyword batch: $0.012 x ceil(keywords/150) x apps, so 100 keywords at 2 apps is $0.024 before per-keyword charges. Each app reaches a di… |
No output schema declared.
No examples provided.
search_ranks App Store search ranks ~271
Ranked apps for one keyword in one country, as the App Store lists them (fetched from this machine; cached for the UTC day). Bundles are kept as ranked rows. resultCount is what Apple returned (250 is a ceiling), not how many apps compete.
| Name | Type | Req | Description |
|---|---|---|---|
| country | string | – | Two-letter App Store storefront country code, e.g. "us". Defaults to the server's configured default country. |
| keyword | string | yes | Search keyword to rank apps for. Accents matter: Apple usually treats an accented and an unaccented spelling as different searches, and neither is reliably better (br 'jogos de matemática' ranked #19… |
| top | integer | – | How many ranked entries to return, most-relevant first (max 250 — the ceiling Apple's search returns). |
No output schema declared.
No examples provided.
snapshot_diff Compare two rank snapshots ~141
Compares two named snapshots keyword by keyword: rank before and after (null included), how the result set size changed, which apps entered or left the top 10, and your ratings against the competitor median on each date. Rows are grouped by the labels given when saving. READ THE CONTROLS FIRST: if keywords you expected to hold still have moved, the whole comparison is drift and the targets prove nothing. Deliberately reports no significance or confidence -- with small numbers there is no statistical power, and a confidence label would be theatre.
| Name | Type | Req | Description |
|---|---|---|---|
| after | string | yes | Name of the later snapshot. |
| before | string | yes | Name of the earlier snapshot. |
No output schema declared.
No examples provided.
snapshot_save Save a named rank snapshot ~356
Captures a named, kept measurement of a keyword set: rank (including null, which is a value here), resultCount, the top 10 app ids, keyword coverage with the listing version it was read from, and your rating count against the competitor median per storefront. Take one BEFORE shipping a metadata change -- the moment cannot be recovered afterwards, because Apple publishes no rank history and this tool's own cache is per-UTC-day. Label each keyword ('target', 'control', 'regression watch') so a later diff can tell signal from drift: if the controls move while nothing about them changed, the reading is noise.
| Name | Type | Req | Description |
|---|---|---|---|
| app | string | yes | The app to record ranks for: numeric App Store id, App Store URL, or name. |
| countries | array | – | Storefronts to capture in, paired with every entry in `keywords`. Defaults to the server's configured default country. |
| keywords | array | – | Keywords to capture in every one of `countries` (a cross product). Use `pairs` instead when different storefronts need different keywords. Keywords x countries must not exceed 60. |
| name | string | yes | Name to save under, e.g. "pre-release-2026-08-29". Re-using a name overwrites that snapshot. |
| pairs | array | – | Explicit keyword/country pairs, instead of the keywords x countries cross product. Use this whenever storefronts need different keyword sets -- 13 Brazilian plus 9 Nordic keywords is 22 rows here, ag… |
No output schema declared.
No examples provided.
suggest_keywords Keyword autocomplete suggestions ~271
Returns App Store autocomplete suggestions for a search term, showing what people actually search for -- the way to check a keyword's intent is what you assume (e.g. 'rakna' autocompleting to calorie counting, not maths). Suggestion order is Apple's own ranking. Autocomplete is PREFIX completion, so a count of zero means nothing popular extends the term -- NOT that nobody searches it ('math quiz for kids' returns none and is plainly a real search). Read a low count as a prompt to look closer, never as proof a keyword is dead. This tool never spends money. It cannot buy search volume (no vendor prices a bare App Store keyword), but a suggestion that a niche_report, keyword_table or price_keywords run already bought a price for in 'us', on any of the last 7 UTC days (today counted as the first), comes back priced for free in `volumes`, carrying the day the price was bought so an older number says it is older; when none of the suggestions has such a price, a single `volume` field says why.
| Name | Type | Req | Description |
|---|---|---|---|
| country | string | – | Two-letter App Store storefront country code, e.g. "us". Defaults to the server's configured default country. |
| term | string | yes | Search term to get App Store autocomplete suggestions for. |
No output schema declared.
No examples provided.
How do I install the ASOLens MCP server?
ASOLens runs locally as an npm package, launched with npx -y @asolens/mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
npm · @asolens/mcp
claude mcp add dev-danielhan-asolens-mcp -- npx -y @asolens/mcp
What is the ASOLens MCP server?
ASOLens is an MCP server listed in the public MCP registry as dev.danielhan.asolens/mcp. ASOLens MCP server: App Store ranks, competitors and weaknesses, from your own machine. This page covers its npm package (@asolens/mcp).
Is the ASOLens MCP server safe to use?
ASOLens scores 62 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 17 October 2026. It declares no install or post-install scripts. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the ASOLens MCP server expose?
ASOLens exposes 15 tools: find_app, app_snapshot, search_ranks, keyword_ranks, compare_queries, and 10 more. Their descriptions and schemas cost roughly 5,254 tokens of context every time the server is loaded.
Is the ASOLens MCP server still maintained?
ASOLens is still listed as active in the MCP registry. We last reached this channel on 17 October 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.
What licence is the ASOLens MCP server under?
ASOLens declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.