etsy-sales-mcp plugin for Cursor
Live Etsy search listing rows for any keyword, market phrase or category: price, rating, review count, Bestseller / Star Seller / Etsy's Pick badges, ad-vs-organic flag, rank position and shop. Uses Apify Actor publicrecords/etsy-search-scraper through MCP; needs an Apify token (OAuth/token).
# Etsy Search Scraper π
Give the agent real Etsy search results to reason from: what is actually ranking for a keyword right now, at what price, with which badges, and how much of page 1 is paid.
Disclosure: I maintain these Actors on Apify Store (publicrecords).
## Installation
```bash
npx skills add GeminiGeorge22/etsy-sales-mcp --skill etsy-search-scraper -g
```
This skill calls the **Etsy Search Scraper** Actor (`publicrecords/etsy-search-scraper`) through the Apify MCP server. Add it to your agent's MCP config once:
```json
{
"mcpServers": {
"etsy-sales": {
"url": "https://mcp.apify.com/?tools=publicrecords/etsy-shop-velocity,publicrecords/etsy-search-scraper",
"headers": { "Authorization": "Bearer <APIFY_TOKEN>" }
}
}
}
```
Auth: Apify OAuth/token. An Apify account is free; the Actor bills listing rows via Console PPE (see repo README). It runs on Apify residential proxy by default.
## What a row contains
Field names from a live SUCCEEDED dataset item (F-C125):
| field | meaning |
|---|---|
| `query`, `page`, `position`, `surface` | keyword and the exact rank/surface Etsy showed |
| `listing_id`, `url`, `title` | the listing |
| `price`, `currency` | shown price |
| `rating_value`, `review_count`, `review_count_approx` | rating; `true` when Etsy rounded |
| `bestseller`, `popular_now`, `star_seller`, `etsys_pick`, `free_shipping` | badges |
| `is_ad` | sponsored slot, or `null` when unknown |
| `shop_name`, `shop_id`, `shop_url` | the seller |
## Usage
Ask the agent, for example:
- "Pull page 1β3 for *personalized dog collar* and tell me the price band, how many slots are ads, and which titles carry Bestseller."
- "Which shops own the most page-1 slots for *linen apron*?"
Tool call the agent makes (`publicrecords--etsy-search-scraper`):
```json
{ "queries": ["personalized dog collar"], "maxPages": 3 }
```
Optional filters: `is_best_seller`, `is_star_seller`, `free_shipping`, `is_discounted`, `instant_download`, `ship_to` (e.g. `"US"`). `marketPhrases` and `categoryUrls` take Etsy's `/market/` phrases and category pages.
## How it pairs with other skills
- **etsy-shop-sales-tracker** β once the shops are known, check whether they are growing.
## Limits
- Results are what Etsy shows a logged-out visitor from your proxy's region.
- Etsy caps a query at 20 pages.
- Blocked pages charge no listing rows.Is this Etsy shop growing, and how fast? Daily sales counters with history, deltas, fitted sales rate and breakout flags for any Etsy shop from a hosted daily panel β no proxy required. Uses Apify Actor publicrecords/etsy-shop-velocity through MCP; needs an Apify token (OAuth/token).
# Etsy Shop Sales Tracker π
The question every seller tool guesses at and this one measures: how many sales did a shop make this week, and is that accelerating?
Disclosure: I maintain these Actors on Apify Store (publicrecords).
## Installation
```bash
npx skills add GeminiGeorge22/etsy-sales-mcp --skill etsy-shop-sales-tracker -g
```
This skill calls the **Etsy Shop Sales Tracker** Actor (`publicrecords/etsy-shop-velocity`) through the Apify MCP server:
```json
{
"mcpServers": {
"etsy-sales": {
"url": "https://mcp.apify.com/?tools=publicrecords/etsy-shop-velocity,publicrecords/etsy-search-scraper",
"headers": { "Authorization": "Bearer <APIFY_TOKEN>" }
}
}
}
```
Auth: Apify OAuth/token. The Actor reads from a daily panel captured once a day and served from a snapshot; your query never touches Etsy. A shop with no history yet comes back as coverage-pending and is added to the panel for the next day.
## What a record contains
Field names from a live SUCCEEDED dataset item (F-C125):
| field | meaning |
|---|---|
| `shop`, `shop_url`, `title`, `headline`, `category` | shop identity |
| `sales_count`, `sales_precision`, `reviews_count`, `rating`, `admirers`, `listings_active` | lifetime counters as of the snapshot |
| `as_of`, `snapshot_date`, `snapshot_stale`, `first_seen`, `last_changed`, `history_days`, `read_interval_days` | panel timing |
| `delta_last`, `delta_7d`, `delta_28d` | counter deltas |
| `sales_per_day`, `units_day`, `units_lo`, `units_hi`, `lift_7d` | fitted / estimated rate |
| `breakout`, `breakout_p`, `vintage_event` | flags |
| `source` | provenance string |
## Usage
- "Is *KJPottery* growing? Compare its 28-day sales delta to its baseline."
- "Of these ten shops from my keyword scan, which three are accelerating?"
- "Flag any shop in my watch list with a breakout this week."
Tool call the agent makes (`publicrecords--etsy-shop-velocity`):
```json
{ "shops": ["KJPottery", "OrelCeramics"] }
```
## How it pairs with other skills
- **etsy-search-scraper** β find the shops that own page 1 for a keyword, then ask which of them are growing.
## Limits
- Numbers are shop-level counters Etsy publishes; listing-level sales are estimates and are labelled as such.
- A shop added today has one reading; rates need several days of history and say so.