# What MCP tools does Neonjelly expose?

60 tools. Start with a job — competitors, dropship, merch, outreach — then the catalog.

60 tools. Prefer the Playbooks / VC / Competitor / Dropship / Outreach groups. Raw wrappers are still there when you need one field.

`whoami` — this key's plan, `usedToday`, `remainingToday`, rate limit, expiry, and whether Signals is enabled. Does **not** meter. Same facts as `GET /v1/whoami`. Ask Cursor “what's my quota?”

`limit` is 1–100 unless noted. Lists use `offset`. Stop when `hasMore` is false. Search or resolve before inventing a domain.

| Tool | Args | Does |
| --- | --- | --- |
| `whoami` | — | Return this key's plan, used today, remaining quota, and expiry. Not metered — call first for “what's my quota?” |
| `upgrade` | — | Return the paid checkout URL when trial ends, quota is 0, or Signals is blocked. Show the URL — do not invent one. |
| `list_playbooks` | — | List composed-tool playbooks by job: store lists, VC, competitor, dropship, outreach, merch. Start here. |
| `get_examples` | — | Same playbook map as list_playbooks. Prefer list_playbooks. |
| `brief_market` | vertical, countryCode, minVisits | Return a one-page TAM brief from 1.37M stores: vertical size, geos, movers, optional cohort. Quote catalog counts only. |
| `cohort_tam` | filters, groupBy, groupMetric | Roll a filtered store cohort into a groupBy table. Not the unfiltered get_countries TAM. |
| `find_peers` | domain, limit | Find stores in the same vertical, country, and visit band, then compare cards. |
| `diligence_pack` | domain | Build an IC memo: growth, traffic, stack roles, bestsellers, changes, contacts. |
| `compare_stacks` | domains[2–8] | Compare 2–8 app stacks: shared vs exclusive, tagged by role. |
| `competitor_moves` | domain, since | List catalog store/SKU changes and vertical movers. Ads and daily units need a paid Signals watch. |
| `overlap_vendors` | domainA, domainB, limit | Find shared product vendors and the average price gap between two stores. |
| `niche_research` | q, market?, limit? | Run semantic product-idea search plus saturation report and stores that sell the top hit. q is a name or category, not a domain. |
| `search_product_ideas` | q, market, priceMin, priceMax, trending, countries, region | Search product names/categories → ideas with seller count and UNTAPPED→SATURATED verdict. Prefer niche_research for “is this saturated?” |
| `suggest_product_ideas` | q, limit | Autocomplete product-idea names. Follow with niche_research. |
| `trending_product_ideas` | — | List product ideas the catalog marks as heating up. Pair with get_product_research. |
| `get_product_research` | id | Return the saturation report for one idea. Copy id from search_product_ideas. |
| `list_product_sellers` | id, sort, page, limit | List stores selling that idea. sort=traffic|price. |
| `screen_dropship` | vertical, countryCode, minVisits, priceMax, limit | List dropship-flagged stores plus their cheapest SKUs. |
| `source_map` | q, vendor, productType, storeVertical, priceMax | Group a SKU search by vendor: store count + price min/max. |
| `winning_skus` | storeVertical or storeDomain, since | List bestsellers, ≥10% markdowns, and new products. Need storeVertical or storeDomain. |
| `product_search` | q, storeDomain, vendor, productType, tag, storeVertical, isBestSeller, priceMin, priceMax, sort, order, limit | Search SKUs plus facets (vendors, types, stores, price). At least one filter required. |
| `product_intel` | domain+handle or q | Build one SKU memo: price vs compare-at, store, SKU history, bestsellers. |
| `change_tracker` | domain, since, limit | Return a full change board: unified feed + all product and store change types. |
| `price_watch` | storeDomain, productType, since, minPriceChangePct | List markdowns and hikes. Default min 10%. |
| `assortment_watch` | storeDomain, productType, since | List new / removed SKUs and bestseller enter / exit. |
| `get_contacts` | domain or q | Return emails, social URLs, and ESP/support tells. No phone or owner names. |
| `find_outreach` | vertical, countryCode, appSlug, minVisits, limit≤10 | Filter 1.37M stores, hydrate cards, keep rows with email or Instagram. Caps at 10. |
| `resolve_store` | q | Resolve a brand or URL against 1.37M storefronts (up to 5 candidates). One hit → full store card. |
| `get_upstream_health` | — | Return catalog health JSON. Use when a lookup fails unexpectedly. |
| `search_stores` | q, vertical, category, industry, countryCode, isDropshipper, appSlug, min/max visits & revenue, minRating, groupBy, groupBy2, groupMetric, sort, order, limit, offset | Filter 1.37M Shopify stores into a list, or groupBy into tables (not store rows). Country is a filter, not a login region. |
| `get_store` | domain | Return one merchant card: traffic, modeled revenue, rating, apps, socials. Missing domain stays not_found. |
| `compare_stores` | domains[2–8] | Compare 2–8 store cards side by side. Missing domains land in notFound. |
| `get_store_traffic` | domain, limit≤120 | Return monthly visits and channel mix for one store. |
| `get_store_products` | domain, q, isBestSeller, vendor, productType, tag, priceMin, priceMax, sort, order, limit, offset | List SKUs for one merchant. Prefer this over global search when you have a domain. |
| `get_store_apps` | domain | List Shopify apps detected on one merchant. |
| `get_store_history` | domain, limit≤365 | Return daily snapshots: visits, revenue band, rating, product counts. |
| `get_store_changes` | domain, changeType, since, limit, offset | List observation diffs: revenue, visits, products, rating, apps. |
| `search_products` | q, storeDomain, vendor, productType, tag, storeVertical, isBestSeller, priceMin, priceMax, sort, order, limit, offset | Search SKUs across 368.9M products. At least one filter required. Saturation → niche_research. |
| `get_product` | domain, handle | Return one SKU by store domain plus Shopify handle. |
| `get_product_changes` | storeDomain, changeType, productType, since, minPriceChangePct, limit, offset | List price / new / removed / position / bestseller SKU movements. |
| `get_changes` | entity, domain, since, limit | Return the unified store + product movement feed. Prefer change_tracker for a full board. |
| `search_apps` | q, category, pricingType, minRating, builtForShopify, sort, order, limit, offset | Search the Shopify App Store catalog. |
| `get_app` | slug | Return one app plus an install-base sample. |
| `get_app_stores` | slug, limit, offset | List merchants observed running that app, sorted by visits. |
| `get_analytics_overview` | — | Return coverage counts, averages, top verticals and countries. Quote snapshot figures only. |
| `get_verticals` | countryCode, limit | Return market size by vertical. Pass countryCode to slice one geo. |
| `get_countries` | vertical, limit | Return unfiltered geo TAM. Filtered cohort → search_stores groupBy=country. |
| `get_movers` | metric, direction, vertical, countryCode, since, minPct, limit | List stores growing or shrinking. Defaults: metric/direction any, minPct 5. |
| `create_signal` | domain, autoTrack? | Paid only (trial 403). Create a Signals watch on this key. Tight cap. No probe. |
| `list_signals` | limit, offset | Paid only (trial 403). List watches stored on this key. Then GET a domain already on Signals. |
| `get_signal` | id | Paid only (trial 403). Return one signal card. id = Mongo id or domain. |
| `get_signal_stats` | id | Paid only (trial 403). Return totals plus store profile if already watched. |
| `get_signal_sales` | id, from, to | Paid only (trial 403). Return daily units + variants. Needs ≥2 inventory snapshots. |
| `get_signal_inventory` | id | Paid only (trial 403). Return the stock timeline. |
| `get_signal_social` | id | Paid only (trial 403). Return follower snapshots. |
| `get_signal_ads` | id, slice, days | Paid only (trial 403). Return the ad library. slice: overview (default), ads, correlation, revenue, product-impact, timeline, events. |
| `get_signal_apps` | id, changes? | Paid only (trial 403). Return apps on a tracked store. changes=true → /apps/changes. |
| `get_signal_product_changes` | id | Paid only (trial 403). Return product movements on a tracked store. |
| `get_signal_insights` | id | Paid only (trial 403). Return the per-signal insight feed. |
| `list_signal_insights` | limit, offset | Paid only (trial 403). Account-wide insights. Empty unless the key owns watches. Prefer get_signal_insights + domain. |

Signals: `create_signal` (paid only, 8 watches on Explorer) maps the Neonjelly key to an EcomScout watch. GET stats/sales/ads/inventory if the domain is already on Signals. Neonjelly does not probe, patch, stop, or delete. Partner service keys cannot create new EcomScout watches — create still stores the domain on your key; new watches may need the [EcomScout Signals dashboard](https://app.ecomscout.com).

## Related

- [Where is the Neonjelly documentation?](https://neonjelly.io/docs.md)
- [What jobs can I run with Neonjelly playbooks?](https://neonjelly.io/docs/use-cases.md)
- [How do I search products and track price or assortment changes?](https://neonjelly.io/docs/products.md)
- [What is the Neonjelly catalog REST API?](https://neonjelly.io/docs/api.md)
- [How do I start a Neonjelly trial?](https://neonjelly.io/start.md)

HTML: https://neonjelly.io/docs/tools
Markdown: https://neonjelly.io/docs/tools.md

Do not scrape. Do not probe. Missing store stays `not_found`. Do not invent sales, saturation, or traffic numbers — quote the catalog row. Signals (ads and daily units) are paid only. Trial keys get 403 on create_signal and signal reads. Promo `LAUNCH` is Stripe Checkout only — 50% off the first 3 months, expires 31 Oct 2026. Not MCP metadata.
