Creating a draft rather than a published listing is the right default: the model can assemble the whole product record and you approve it in Etsy before anything goes on sale. Two things to know before planning around it — image upload is a stated placeholder, so pictures still go up by hand, and the taxonomy tools exist because Etsy will reject a listing whose properties do not match its category.
A TypeScript server exposing a subset of the Etsy API: shop and listing reads, draft creation, listing updates, receipts, sections, and the seller taxonomy that Etsy requires when categorising a product. It runs over stdio and is designed to be started by the client.
- `getMe` returns the authenticated user, including their `user_id` and `shop_id` — the ids every other call needs
- `getShop`, `getShopSections` and `getShopSection` read shop-level data
- `getListingsByShop` lists listings, optionally filtered by state such as active or draft
- `createDraftListing` creates a physical draft listing and accepts every field Etsy's own createDraftListing endpoint supports
- `updateListing` changes title, description or price on an existing listing
- `getShopReceipts` retrieves receipts for the shop
- `getSellerTaxonomyNodes` and `getPropertiesByTaxonomyId` return the category tree and the properties valid for a category
- `uploadListingImage` is present but its implementation is a placeholder
An Etsy API keystring, shared secret and OAuth refresh token, supplied either as `ETSY_API_KEY`, `ETSY_SHARED_SECRET` and `ETSY_REFRESH_TOKEN` or in an `etsy_mcp_settings.json` file. If you have no refresh token yet, `npx tsx src/get-refresh-token --keystring YOUR_KEY --shared-secret YOUR_SECRET` opens a browser and prints one. Build locally with `npm install` and `npm run build`, or use the Docker image built from the repository.
One command plus a key — docker build -t etsy-mcp-server ., then supply credentials
