ExtensionDash
Research extension listings and search results; track installs, keyword rankings, and competitors.
| Endpoint | https://extensiondash.com/mcp (streamable-http) |
|---|---|
| Registry version | 1.0.0 |
| Now | 14 tools · grade F (43) · pin ts_04b808cbca1fb99bec97b7d7b73ce57c · protocol 2025-06-18 |
| First / last listed | 2026-10-30 01:01 UTC / 2026-10-30 01:01 UTC |
| Grade over time | 2026-10-30: F (43), 14 tools |
Is this your server? Own a server? ToolFit hosted watch re-checks it every 24 h ($0.25 per 30 days) or 6 h ($0.60) and sends you an HMAC-signed webhook when its tools or grade change: POST https://api.youraitools.co/toolfit/v1/watch. To opt out, see About & opt-out.
Tools: list_extensions get_extension get_metrics_history list_keywords get_keyword_ranks add_keyword remove_keyword add_competitor remove_competitor list_competitors get_keyword_serp list_scrape_runs search_catalog get_listing
list_extensions | Every extension this token's owner tracks, with each store listing's
latest numbers: user count (and whether the store rounded it), the
7-day change, rating, ratings count and category rank.
Start here when this connection has an account: every tracking tool
takes an extension_id from this list.
Needs an ExtensionDash account: sign in from your app, e.g. `claude mcp login extensions-dashboard` o params: none |
get_extension | One extension in full: every store listing's latest numbers plus its
tracked keywords and their current positions.
Each listing's rank is its position by users within its store, computed
from the current user count; ties share a rank (rank_tied = others at the
same count); rank_change is the move since last week's recorded rank.
locales lists every store language this extension tracks, with a
ke params: extension_id* |
get_metrics_history | Daily-or-sparser history of an extension's numbers: user count,
rating and ratings count, each as a map of ISO date to value.
"listings" is this extension's own store listings; "competitors" is
its roster from list_competitors. store and days filter both.
A map holds only dates actually observed; an empty map means no
measurement in range, never zero. If users_rounded_in_range is true
the store p params: extension_id*, store, days, include_competitors, competitors |
list_keywords | Every search term tracked for one extension, one row per term per store.
status is "pending" until a fetch has landed since the term was tracked,
and "scanned" once one has. A "scanned" row with a null position means
we searched depth_scanned results and this extension was not among
them — that is a real observation, not missing data.
A "pending" row can still carry a position. Removing a keywor params: extension_id*, locale |
get_keyword_ranks | Daily search position history for an extension's tracked keywords, one
series per term per store.
Every point carries the depth it was scanned to, because a position only
means something against the size of the pool it came from: #1 of 9 and
#1 of 50 are different results. A null position means we searched that
deep and this extension was not in the results.
A term tracked in more than one store params: extension_id*, term, store, locale, source, days |
add_keyword | Start tracking a search term for an extension. The term is added once
per store the extension is listed in, and a rank fetch is enqueued for
each store that was not already tracking it.
The position is not available when this returns. Call list_keywords with
the same extension_id until this term's status turns from "pending" to
"scanned", or list_scrape_runs to watch the fetch itself — a fetch th params: extension_id*, term*, locale |
remove_keyword | Stop tracking a search term for an extension, across every store it was
tracked in. Positions already recorded are kept; only the tracking stops.
Other extensions tracking the same term are unaffected, including ones
that track the same store listing: every extension's keywords are its own.
A term is tracked per store language. Tracking "ad blocker" in en and
again in de gives two independent ke params: extension_id*, term*, locale |
add_competitor | Start tracking a competitor for an extension.
Takes the store and id of a search_catalog row (as external_id), so a
listing you just found can be promoted without looking anything up in
between.
Promoting a listing is what earns it a store fetch: its description,
install count, rating and languages start being recorded, and its
position is kept even on days it falls out of the results entirely.
params: extension_id*, store*, external_id* |
remove_competitor | Stop tracking a competitor for an extension.
Stops the store fetches. The recorded history is kept, so adding the
same competitor again later restores its charts rather than starting
from zero — and its positions carry on being observed either way,
because they come from searches this account already runs.
Needs an ExtensionDash account: sign in from your app, e.g. `claude mcp login extensions-d params: extension_id*, store*, external_id* |
list_competitors | Who this extension competes with, measured across every keyword it
tracks.
Two sets. "competitors" is the roster you promoted with
add_competitor: their descriptions, install counts and ratings are
recorded, and their positions are kept even on days they fall out of
the results. "candidates" — returned only with include_observed —
is everyone else who has appeared in those searches, ranked by how params: extension_id*, include_observed |
get_keyword_serp | The search page for one of an extension's tracked keywords, as this
account last recorded it — who was on it, in what order, and which way
each of them moved over the past week.
Read from recorded history, not from the store: no fetch, no waiting,
no egress spent. Use this when you want movement, or the same page the
dashboard is showing.
Every row carries mine and competitor flags, so "who is a params: extension_id*, store*, term*, locale, window |
list_scrape_runs | Recent scrape attempts against your own extensions, newest first, with
their outcome and any error. Covers both the listing fetches and the
rank fetches for the search terms they track.
Use this after add_keyword to watch the rank fetch: the run is targeted
at the search term, and a failed fetch appears here as a failure rather
than as a position that never arrives.
Needs an ExtensionDash accoun params: status, extension_id, limit |
search_catalog | Search one store's catalog of extensions fetched so far, for market and niche research:
store "chrome" (default) or "firefox", one per call -- Chrome users are a rounded weekly
count, Firefox's an exact daily average, so the two are never mixed. listed and known in
each answer show how much of that store the catalog covers.
rank is the position by users within the store; ties share a rank (rank_ti params: store, category, query, match, sort, dir, limit, page, users_min, users_max, rating_min, rating_max, reviews_min, reviews_max, description_length_min, description_length_max, langs_min, langs_max, screenshots_min, screenshots_max |
get_listing | One extension's full listing from the catalog -- any extension, tracked by this account or
not: description, users, rating, reviews, version, languages, categories, permissions and
publisher. Pass the store and id of a search_catalog row as store and external_id.
rank is the position by users within the store; ties share a rank (rank_tied = others at the same
count); recomputed weekly on rank_on; params: store*, external_id* |
Entries describe changes in tool definitions. They are not statements about a server, its quality or its author. The grade measures how the tool definitions fit model providers (token cost, schema compatibility, confusable names) as scored by the ToolFit engine at the time of the listing. JSON: append .json. Opt-out: how or hello@youraitools.co.