ExtensionDash: Store Rankings
ANTON KOPYLOV v0.1.2
Chrome & Firefox analytics
Competitor profile
Developer declarations; not independently tested. Listing last checked Nov 4, 2026. Package observed Nov 4, 2026.
Declared capabilities
- Interactive
- Read
- Write
Cost & access
ExtensionDash currently supports free accounts only. It does not offer paid accounts, sell products, or process payments.
Declared limitations
- Extension installation is outside the plugin capabilities. Explain the limitation; do not invoke any ExtensionDash tool to install an extension.
- No ExtensionDash tool deletes recorded history. Explain this and direct the user to support. Do not substitute remove_keyword or remove_competitor, and do not claim deletion.
- Weather is outside ExtensionDash. Do not invoke any ExtensionDash tools.
Onboarding example
Which keyword rankings improved or dropped for my extension over the last seven days?
Description
From the marketplace listing
Keyword rank tracking and competitor analysis for Chrome Web Store extensions and Firefox add-ons. Bring extension analytics into ChatGPT to review user growth, ratings, and search visibility over time. Research the market: search the public catalog, filter listings by users, ratings, review counts, and category, and compare competitors' descriptions. Explore gaps and use the findings to plan Chrome Web Store SEO or Firefox listing improvements. Connect an account to compare keyword rankings across dates, see which listings appear above your extension, and investigate changes in performance. Add or remove tracked keywords and competitors, then ask for a weekly summary. Public research works without signing in. Personal metrics and history require a connected account; results depend on the data already collected.
Language: English · Automatically detected from descriptions.
Changes
No changes recorded yet. Follow this plugin to keep track of future changes.
First seen Nov 4, 2026. Last seen Nov 4, 2026.
Similar plugins
Find competitors to follow as you develop your plugin.
-
Live SEO evidence, deterministic analysis, information-gain research, and safe execution workflows for ChatGPT and Codex.
Shared terms: analytics, analysis, competitor, improvement
-
Analyze keywords, rankings, traffic trends, backlinks, competitor performance, and brand visibility — including AI search and LLM mention...
Shared terms: analytics, competitor, keyword, metrics
-
Research iOS markets, compare competitors, find keyword opportunities, and improve ASO with AppTail.
Shared terms: analytics, competitor, keyword, listing
-
Investment research for financial advisers: product rankings, performance and risk analytics, C8 top picks and rebalancing proposals.
Shared terms: analytics, category, count, performance
-
App Store Optimization for your own iOS and Android apps: keyword research, rank tracking, ASO score, competitor keywords and review repl...
Shared terms: analysis, category, competitor, description
Keywords
Files & skills
File archives
Skill instructions
manage-tracking5.36 KB
---
name: manage-tracking
description: Use when the user wants to see or change what ExtensionDash tracks for one of their extensions, such as adding or removing tracked keywords (search terms) or competitor listings, or showing the current tracking setup. Requires an ExtensionDash account connection. Uses list_extensions, list_keywords, list_competitors, search_catalog, add_keyword, remove_keyword, add_competitor, remove_competitor and list_scrape_runs.
---
# Manage tracking
Show and change the keywords and competitors tracked for one of the user's
extensions.
## What the server supports
There are exactly four write tools: `add_keyword`, `remove_keyword`,
`add_competitor` and `remove_competitor`. Everything else is read-only.
Nothing here can:
- add or remove a tracked extension of the user's own;
- change plans, notes or settings;
- delete recorded history.
If the user asks for one of those, say it is done on the dashboard at
https://extensiondash.com. Do not attempt a workaround.
These tools need an account. If a call answers that "this connection has no
account", follow
[connecting an account](../review-performance/references/connecting-an-account.md).
Never ask for a token in the chat.
## Resolve before writing
1. **Extension.** Call `list_extensions` and match the user's wording to
`name`.
- If exactly one extension exists, use it and say which.
- If the name is ambiguous or missing and there are several, ask.
Never write to a guessed extension.
2. **Keyword scope.**
- A keyword is a (term, locale) pair. `locale` defaults to `en`.
- `add_keyword` adds the term in every store the extension is listed in;
the response's `stores` says which.
- `remove_keyword` removes the (term, locale) from every store.
- If the user names a language or market ("track it in German"), pass
that locale, such as `de` or `pt-BR`.
3. **Competitor identity.**
- A competitor is a (store, external_id) pair. The id is Chrome's
32-letter id or Firefox's AMO slug.
- If the user gives a name, resolve it with `search_catalog` (one store
per call).
- If several listings plausibly match, show them with users and URL and
ask.
- Each store has its own roster, so a Chrome and a Firefox version of
the same product are two competitors.
4. **Check what already exists.**
- Call `list_keywords` before adding keywords. If a (term, locale) is
already tracked, report it as already tracked instead of re-adding.
- Call `list_competitors` before adding competitors. Skip ones already
on the roster.
- Terms are lowercased and whitespace-squished by the server, so compare
normalized forms.
## Executing changes
- **Clear requests.** When the request names the extension (or only one
exists) and the items, make the changes without asking for confirmation
again.
- **Ambiguous requests.** When the target or scope is ambiguous, ask once,
listing the specific choices.
- **Never write unasked.** Do not add a keyword or competitor the user did
not ask for, including ideas that came up during research. Offer them;
wait for a yes.
- **Limits.** If the server answers with a plan limit, stop for that item
type. The message names the limit and, for competitors, the current
roster. Report it, and ask what to remove if the user wants room. Do not
retry.
- **Removals.** Removing a keyword or competitor stops tracking but keeps
recorded history, and re-adding later restores it. Say so when removing.
- **Wrong-language removal.** If `remove_keyword` says the term was not
tracked in that locale, its message lists the locales it is tracked in.
Relay that and ask whether to remove one of them.
## After adding: pending results
A newly added item has no result when the add returns.
- **Keywords.** `add_keyword` returns rows whose `status` is `"pending"`
until a background rank fetch lands. Then `status` becomes `"scanned"`.
A pending row may still show an old position from earlier tracking;
that is not the new result.
- **Competitors.** `add_competitor` returns `status: "pending"` until the
listing fetch lands. Then it becomes `"scraped"`.
Polling rule:
- Check at most 3 times, roughly 20–30 seconds apart, using
`list_keywords` or `list_competitors` for the same `extension_id`.
- Between checks, `list_scrape_runs` with `extension_id` shows whether the
fetch is running, succeeded or failed.
- If it is still pending after that, stop. Tell the user the fetch is
queued and they can check later with the same request. Do not keep
polling, and do not promise a time.
- If `list_scrape_runs` shows a failure for the item, report it as a failed
fetch with its `error_message`, not as a ranking. Do not promise when it
will succeed.
## Showing the current setup
For "show my tracking", give a table per extension built from `list_keywords`
and `list_competitors`:
- **Keywords:** term, locale, store, status, position with `depth_scanned`.
- **Competitors:** name, store, users, rating, status.
- The plan limit from `list_competitors`' `limit_per_store` (null means no
limit).
- Any pending or failed items.
## Report
End every change with a short ledger:
- **Added:** each item and the stores it landed in.
- **Already tracked:** skipped, no change.
- **Removed:** each item.
- **Failed:** the item and the server's reason, for example a limit.
- **Pending:** what is still fetching and how the user can check later.
research-extensions6.05 KB
---
name: research-extensions
description: Use when the user wants to research a browser-extension niche, find or compare Chrome Web Store extensions or Firefox add-ons, look for market gaps (many users but weak ratings, stale listings, few languages), read a competitor's listing, or brainstorm keywords to investigate. Works without an ExtensionDash account. Uses the ExtensionDash MCP tools search_catalog and get_listing.
---
# Research extensions
Answer market and competitor questions from the ExtensionDash catalog. The
catalog holds a weekly-refreshed copy of Chrome Web Store and Firefox Add-ons
listings, so reading it never fetches the store and never waits.
## Tools
- `search_catalog`: search one store per call. Chrome is the default; pass
`store: "firefox"` for Firefox.
- `query`: name words, at most 8. Use `match` (`all` or `any`) to say how
they combine. Prefix a word with `-` to exclude it.
- `category`: one category slug of that store.
- Inclusive ranges: `users_min`/`users_max`, `rating_min`/`rating_max`,
`reviews_min`/`reviews_max`, `langs_min`/`langs_max`,
`description_length_min`/`description_length_max`, and
`screenshots_min`/`screenshots_max`.
- Sorting: `sort` takes users, rating, reviews, langs, description_length,
screenshots, updated or added. `dir` is desc or asc.
- Paging: `limit` (50 at most) and `page`.
- `get_listing`: one listing in full, given `store` and `external_id` (a
search_catalog row's `id`). Returns the description, users, rating,
reviews, version, languages, categories, permissions, publisher and
`refreshed_at`.
No other tool does research. There is no live store search, no store-ranking
lookup for untracked terms, and no search-volume lookup.
## Workflow
1. **Pin down the store.** Default to Chrome. Run Firefox as a separate
search when the user asks for it, or when the niche plainly matters there.
Never merge the two stores into one ranking: Chrome users are a rounded
weekly count, Firefox users an exact daily average.
2. **Resolve names to ids before comparing.** Search by the name the user
gave.
- An exact name match comes first unless you pass `sort`.
- If several rows plausibly match (same or near-same name, different
publishers or very different user counts), list the candidates with
their user counts and URLs and ask which one is meant. Do not guess.
- If nothing matches, say so and try fewer or alternative name words
before concluding the catalog lacks the extension.
3. **Search the niche.** Describe the niche in name words and run a few
searches with synonyms (`match: "any"` widens). Pass `sort: "users"` when
you want the biggest players rather than exact-name matches.
- Use `category` when the niche maps to one. An unknown slug is refused,
and the refusal lists the valid slugs.
- Name words only match names. An extension whose name never uses the
user's words will not appear, so say the search is name-based.
4. **Filter for opportunity questions.** Translate the question into ranges.
For example, "many users but weak ratings" becomes `users_min: 10000,
rating_max: 3.9, reviews_min: 20`. Require a minimum review count so a
single review does not decide a "weak rating", and state the thresholds
you picked.
5. **Read the listings that matter** with `get_listing`, usually 2–5 of
them. Compare promise (summary and description), permissions, languages,
last update, publisher and the users/rating/reviews figures.
6. **Report** in the format below.
## Reading the data honestly
- **Coverage.** Every search_catalog answer carries `listed`, `known` and
`synced_on`. Quote them, for example "the Chrome catalog holds 303,293
listed extensions as of 2026-10-17". Results cover the catalog, not
necessarily the whole store. `total` counts matches in the catalog only.
- **Nulls.** A null `users`, `rating` or `reviews` means the store showed no
number. It is not zero; never average it in as zero.
- **Rounding.** Chrome user counts are rounded store figures (1,000, 2,000,
10,000, ...). Treat two listings at "10,000" as tied, and do not read
precision into the difference between 1,000 and 2,000.
- **Freshness.** Listing copy is English and refreshed weekly. Quote
`refreshed_at` or `last_updated_on` when it matters.
- **Facts vs hypotheses.** Label everything inferred, such as "probably
ranks well because its title contains the term" or "likely abandoned,
last updated 2021", as a hypothesis. Never invent search volume, revenue,
installs-per-day, conversion rates or causes.
- **Keyword ideas are suggestions.** Terms you pull from competitors' names
and summaries are candidates to investigate, not proven demand. Say that
ranking and volume data only exist once a term is tracked (see the
manage-tracking skill), and that the catalog has no store-position data
for terms nobody tracks.
- **Reading is not tracking.** Never imply that searching or reading a
listing adds it to the user's account. Do not call `add_competitor` or
`add_keyword` from this skill. Offer it as a next step instead.
## Limits and account errors
- `search_catalog` and `get_listing` allow about 60 calls a minute, with or
without an account. Budget calls; do not page through hundreds of results.
- If a call reports a per-minute limit, stop and tell the user. Do not retry in a loop.
- Rows carry `yours` and `competitor` flags only when the connection has an
account.
## Output
Keep it concise:
1. **Answer.** The short answer to the question.
2. **Comparison table.** Name (linked to its store `url`), store, users,
rating (with review count), languages, last update, and one notable
observation each.
3. **Evidence.** What you searched (store, words, filters, sort) and the
coverage figures.
4. **Limitations.** Name-based matching, catalog coverage, rounding, nulls,
and anything that could not be resolved.
5. **Next steps.** Concrete and optional. For example: read a specific
listing, add a listing as a competitor, or track a candidate term to get
real rankings. Ask before doing anything that writes to the account.
review-performance6.44 KB
---
name: review-performance
description: Use when the user asks how their own tracked browser extension is doing on ExtensionDash, such as users, ratings, keyword positions over a period, which keywords improved or dropped, which competitors are overtaking them, or what to investigate first. Requires an ExtensionDash account connection. Uses list_extensions, get_extension, get_metrics_history, list_keywords, get_keyword_ranks, list_competitors, get_keyword_serp and list_scrape_runs.
---
# Review performance
Explain how the user's tracked extensions moved, using only what ExtensionDash
has recorded. Every tool used here is read-only.
## Prerequisite: an account connection
These tools need an account. If a call answers that "this connection has no
account", stop and follow [connecting an account](references/connecting-an-account.md).
Never ask the user to paste a token into the chat.
## Workflow
1. **Resolve the extension.** Call `list_extensions`. Use its `id` as
`extension_id` everywhere else.
- If the user named an extension, match it against `name`. If more than
one matches, or none does, list what exists and ask.
- If the user has exactly one extension, use it and say so.
- `list_extensions` also gives each listing's latest `users_count`,
`users_rounded`, `users_delta_7d`, `rating_average`, `ratings_count`
and `last_scraped_at`. That is enough for "how is it doing right now".
2. **Fix the comparison period.** Use the user's period if they gave one,
or 7 days by default. State the exact dates.
- `improvement_7d` and `users_delta_7d` are fixed 7-day comparisons.
- For any other period, pass `days` to the history tools and compare
the first and last observed dates yourself.
3. **Users and ratings.** Call `get_metrics_history` with `days` (and
`store` when one store is in question). Each metric is a map of ISO
date to value.
- Compare the earliest and latest dates actually present, and name
them. An empty map means nothing was measured in range. It is not
zero.
- If `users_rounded_in_range` is true, the store published rounded
counts, so small moves may be rounding.
- With `include_competitors: true` or a `competitors` list, rivals'
series arrive too. Competitors are sampled every few days, so compare
them against the user's numbers on dates present in both, never by
position in the map.
4. **Keyword positions.** Call `list_keywords` for the current state, and
`get_keyword_ranks` with `days` for movement over the period. Narrow
with `term`, `store` or `locale` as needed.
5. **Competition.**
- Call `list_competitors` with `include_observed: true`.
- `competitors` is the roster the user tracks.
- `candidates` are other listings seen in the user's recorded
results, ranked by how often they beat the user.
- Use `ahead_of_us_on`, `terms_seen`, `terms_tracked`,
`average_position` and `best_position` as the evidence for
"who is overtaking me".
- For one term, call `get_keyword_serp` with `store`, `term` and
`locale`. It returns the recorded page with `mine`/`competitor` flags
and `moved_up_by`. Pass `window: true` for just the leaders and the
user's neighbourhood.
6. **Separate collection problems from performance.** If numbers are
missing, stale, or a term looks stuck, call `list_scrape_runs` with
`extension_id` (and `status: "failure"` if useful).
- A failed fetch is a data-collection problem, not a ranking drop.
Report it separately.
- `expected_failure: true`, for example a delisted listing, is not
signal.
7. **Report** in the format below.
## Reading rankings correctly
Each keyword row and rank point is one (term, store, locale) result. Keep
stores and locales apart. "ad blocker" in Chrome/en, Firefox/en and
Chrome/de are three separate results; never average them.
Keyword rows fall into three states. Keep them distinct:
| State | How it looks | Say |
| --- | --- | --- |
| Never scanned | `status: "pending"`, no `captured_on` | "No result yet; the first fetch has not landed." |
| Scanned and found | `position` is a number | "#7 of the 50 results scanned on 2026-10-17." |
| Scanned but absent | `status: "scanned"`, `position: null` | "Not in the top 13 results scanned." |
Rules for positions:
- **Always give the depth.** Report every position with `depth_scanned`,
because #1 of 6 and #1 of 50 are different results.
- **Shallow scans.** `shallow: true` means the store returned fewer results
than the usual scan depth.
- **Absent is not a rank.** Never turn "not found within N" into a rank
such as N+1 or 51.
- **Stale positions.** A `pending` row may still carry an old position from
earlier tracking. Check `captured_on` before quoting it.
- **Direction of movement.**
- `improvement_7d` and `moved_up_by` are positive when the extension
moved up the page.
- `improvement_7d` is null when there is no 7-day baseline, or when the
extension is absent now. Call that "insufficient history", not "no
change".
- **Search volume.** `search_volume` is Google web-search demand (Google
Ads), not searches inside the store. It is the same for both stores.
Null means unknown, not zero.
## Reading user counts correctly
- **Units differ by store.** Chrome users are a rounded store figure.
Firefox users are AMO's daily-average users. Never add them together,
rank them against each other, or call them equivalent.
- **Rounding.** `users_rounded: true` means the store rounded the number.
A move across a rounding boundary (for example 9,000 to 10,000) is not a
measured gain of 1,000.
- **Rating precision.** Ratings come with their review counts. A 5.0 from
one review is not evidence of quality.
## Causation
Report what changed and when. Listing edits, new keywords, or a competitor's
update may coincide with a move. Present those as hypotheses to check, never
as the cause, unless the data directly shows it.
## Output
1. **Period.** Exact dates, the stores and locales covered.
2. **Key changes.** The 3–6 biggest movements: users, ratings and keyword
positions (with depth), each with its numbers.
3. **Competition.** Who is ahead of the user on the most terms, with the
evidence fields.
4. **Data limitations.** Missing baselines, pending terms, shallow scans,
rounded counts, failed fetches.
5. **What to investigate first.** A prioritized list of 2–4 concrete
checks, each tied to evidence above. Suggest tracking changes as an
offer, never as an action already taken.
Referenced files: 1 — file references are metadata, not package contents.
Release notes
Updated the listing title, descriptions, discovery keywords, and example prompts to clarify Chrome Web Store and Firefox Add-ons ranking analysis, extension analytics, and competitor research. Tools, skills, authentication, and tracking behavior are unchanged.
Declared in the saved package. Remote tools may change independently.
Package details
Publisher declarations from the archived package. These are separate from our research and the live service's terms.
- Package author
- ANTON KOPYLOV
- Keywords
- See keywords
- Declared availability
- No country restrictions declaredDeclared regions; live availability may differ.
- Commerce declaration
- Does not support commerceThis does not establish whether access is free or paid.
- Review scenarios
- 5 positive · 3 negativeScenario counts, not test results.
Declared capabilities
- Interactive
- Read
- Write
Package observed Nov 4, 2026.
Technical details
- First seen
- Nov 4, 2026 · 06:00 UTC
- Last seen
- Nov 4, 2026 · 06:00 UTC
- Collection status
- Collected
plugin_asdk_app_6ad86cac95c08191b4689c05f3f1761f
Download plugin data (JSON)