Skip to main content
Glama

etsy-clean-mcp

A small MCP server for looking after your own Etsy shop through the Etsy Open API v3. It reads listings, orders and shop settings, and can create draft listings, edit them, upload images, publish and add tracking. Every change is previewed first and only sent when you confirm it.

  • Node 22+, TypeScript, stdio transport

  • Endpoints and field names checked against Etsy's OpenAPI spec (spec/etsy-openapi-v3.json)

  • Narrow OAuth scopes: shops_r listings_r listings_w transactions_r transactions_w

Setup

1. Register an app on Etsy

  1. Sign in to Etsy with your shop account and open https://www.etsy.com/developers/register.

  2. Create a personal app. Etsy may not accept the word "Etsy" in the app name, so pick something else (for example phobic-shop-tool).

  3. Wait for the app to be approved if Etsy asks for review. Personal-access apps only work for your own shop, which is all this server needs.

  4. On https://www.etsy.com/developers/your-apps, open the app and note the keystring and the shared secret.

  5. In the app settings, add this callback URL exactly (no trailing slash, lowercase):

    http://localhost:3003/callback

    If you use a different port or path, put the same value in redirect_uri (see below). Etsy compares the two character for character.

2. Build

cd /home/karstein/src/etsy-clean-mcp
npm ci && npm run build

3. Put the keys in the config

Either environment variables:

export ETSY_KEYSTRING=your-keystring
export ETSY_SHARED_SECRET=your-shared-secret

or a config file (recommended):

mkdir -p ~/.config/etsy-clean-mcp && chmod 700 ~/.config/etsy-clean-mcp
cp config.example.toml ~/.config/etsy-clean-mcp/config.toml
chmod 600 ~/.config/etsy-clean-mcp/config.toml
# then edit keystring / shared_secret

Setting

Env variable

config.toml key

Default

App keystring

ETSY_KEYSTRING

keystring

none

App shared secret

ETSY_SHARED_SECRET

shared_secret

none

Callback URL

ETSY_REDIRECT_URI

redirect_uri

http://localhost:3003/callback

Image upload folder

ETSY_UPLOAD_DIR

upload_dir

~/Etsy/upload

Config folder

ETSY_CLEAN_MCP_HOME

~/.config/etsy-clean-mcp

Environment variables win over the file.

4. Log in

node dist/index.js login

This opens Etsy in the browser (or prints the URL), waits on the callback URL for Etsy to send you back, checks the state value, swaps the code for tokens with PKCE and stops listening. Tokens are saved to ~/.config/etsy-clean-mcp/tokens.json (file mode 0600, folder 0700). The access token lasts about an hour and is refreshed automatically; the refresh token lasts about 90 days. Run login again after that.

node dist/index.js status   # who is logged in and when the tokens expire

(npm link makes the etsy-clean-mcp command available instead of node dist/index.js.)

5. Add it to your MCP client

For example:

claude mcp add etsy -- node /home/karstein/src/etsy-clean-mcp/dist/index.js

Related MCP server: Etsy MCP Server

Tools

Read:

Tool

What it does

get_my_shop

Shop name, URL, currency, counts, reviews

list_listings(state, limit, offset)

Listings by state (active, inactive, sold_out, draft, removed, expired)

get_listing(listing_id)

One listing with images and inventory (products, prices, quantities, SKUs)

list_shipping_profiles

Shipping profiles with destinations and costs

list_return_policies

Return policies

list_processing_profiles

Processing profiles (readiness_state_id)

list_shop_sections

Shop sections

search_taxonomy(query)

Find category ids; the category tree is cached for a day

list_receipts(was_paid, was_shipped, limit, offset)

Orders

get_receipt(receipt_id)

One order with items, totals, address and shipments

Write (all take confirm, default false):

Tool

What it does

create_draft_listing

New listing, always as a draft

update_listing

Title, description, tags, materials, section, profiles, category

update_inventory

Price, quantity, SKU per product

upload_listing_image(listing_id, path, rank, alt_text)

Upload a jpg/png/gif/webp from the upload folder

activate_listing

Publish a draft or inactive listing (costs a listing fee)

add_tracking(receipt_id, tracking_code, carrier_name, send_bcc)

Mark an order shipped; Etsy emails the buyer

Prices come back as readable text, e.g. 1299.00 NOK.

Safety rules

  • Preview first. Every write tool returns the exact request it would send when confirm is false and sends nothing. Only confirm: true sends. (update_inventory reads the current inventory to build its preview, since Etsy replaces the whole inventory on update.)

  • No deleting. There is no delete tool and the listings_d scope is never requested.

  • Drafts only. New listings are always created as drafts. Publishing is the separate activate_listing tool, and its preview warns that Etsy charges a listing fee.

  • Upload folder only. Images are read only from inside the upload folder. Symlinks are resolved first; anything outside the folder, or not jpg/png/gif/webp, is refused.

  • Writes are never retried. Only GET requests are retried (on 429 and 5xx, honouring Retry-After, with backoff). POST, PUT and PATCH are sent once.

  • Etsy's own error text is passed through with the HTTP status.

  • Secrets stay put. Tokens and the shared secret are never logged or returned by tools.

  • Advertising checklist. Titles over 40 characters or in ALL CAPS get a warning (not a block), following Etsy's own advice.

Development

npm test            # vitest, no network
npm run typecheck
npm run build

test/spec.test.ts checks every endpoint the client can call (method, path and body type), the enum values used by the tools, and the fields the write tools send, against spec/etsy-openapi-v3.json. To refresh the spec, download https://www.etsy.com/openapi/generated/oas/3.0.0.json over it and run the tests.

Licence

MIT, see LICENSE.

Available Tools

16 tools
activate_listingA

Publish a draft or inactive listing (state -> active). COSTS AN ETSY LISTING FEE. confirm=false previews.

Inputs: listing_id (required), confirm.

add_trackingA

Add tracking to an order and mark it shipped. Etsy emails the buyer. confirm=false previews.

Inputs: receipt_id (required), carrier_name (required), tracking_code (required), confirm, +1 more.

create_draft_listingA

Create a new listing as a DRAFT (never published). confirm=false previews. Physical listings also need shipping_profile_id and readiness_state_id before they can be activated.

Inputs: price (required), title (required), quantity (required), who_made (required), +13 more.

get_listingB
Read-only

One listing with details, images and inventory (products, prices, quantities, SKUs).

Inputs: listing_id (required).

get_my_shopA
Read-only

Your Etsy shop: name, URL, currency, counts, reviews.

Inputs: no named parameters.

get_receiptC
Read-only

One order: items, totals, buyer message, shipping address, shipments.

Inputs: receipt_id (required).

list_listingsB
Read-only

List your shop's listings by state (default active).

Inputs: limit, state, offset.

list_processing_profilesA
Read-only

Your processing profiles (readiness_state_id + processing days), needed for physical listings.

Inputs: no named parameters.

list_receiptsA
Read-only

Your orders (receipts), newest first. Filter by paid/shipped.

Inputs: limit, offset, was_paid, was_shipped.

list_return_policiesC
Read-only

Your return policies.

Inputs: no named parameters.

list_shipping_profilesB
Read-only

Your shipping profiles with destinations and costs.

Inputs: no named parameters.

list_shop_sectionsC
Read-only

Your shop sections.

Inputs: no named parameters.

search_taxonomyA
Read-only

Find seller taxonomy ids (categories) by words, e.g. 'wall clock'. Prefer leaf entries.

Inputs: query (required).

update_inventoryA

Set price, quantity and/or SKU per product. Omit product_id when the listing has a single product. confirm=false reads the current inventory and previews the full update.

Inputs: changes (required), listing_id (required), confirm.

update_listingA

Change listing text and settings (title, description, tags, materials, section, profiles, category). Not price/quantity: use update_inventory. confirm=false previews.

Inputs: listing_id (required), tags, title, confirm, +10 more.

upload_listing_imageA

Upload a jpg/png/gif/webp image to a listing. The file must be inside the upload folder (/root/Etsy/upload); relative paths are taken from there. confirm=false checks the file and previews.

Inputs: path (required), listing_id (required), rank, confirm, +1 more.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    B3.3/5.0

    Scored across 16 tools

    Disambiguation5/5

    Each tool has a clear resource+action identity: read tools target distinct shop resources (shop, policies, profiles, sections, taxonomy, receipts, listings), and write tools split cleanly along listing lifecycle (create_draft_listing, update_listing, update_inventory, upload_listing_image, activate_listing) plus order fulfillment (add_tracking). The descriptions explicitly resolve the one plausible overlap by stating that price/quantity belong to update_inventory, not update_listing.

    Naming Consistency5/5

    All 16 names follow a strict snake_case verb_noun pattern (get_*, list_*, create_*, update_*, upload_*, activate_*, add_*), with singular/plural nouns used correctly for single-resource vs collection operations. No camelCase or verb-style drift.

    Tool Count4/5

    16 tools is at the upper edge for a shop-management server, but most earn their place given the breadth of the domain (listings, inventory, images, orders, taxonomy, shop config). A few read-only reference lookups (policies, sections, processing profiles, shipping profiles) could arguably be consolidated, but none are redundant with each other.

    Completeness3/5

    Listing creation/update/inventory/image/publish and order read+tracking are covered, but the lifecycle has a dead end: activate_listing exists with no deactivate or delete_listing counterpart, and images cannot be deleted or reordered. Reference data is read-only (policies, shipping/processing profiles, sections can only be listed, not created), which will block agents from fully setting up a shop.

    Maintenance

    ActivityMaintained
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • F
      license
      Not graded
      quality
      Not graded
      maintenance
      Enables seamless integration with Etsy's marketplace API v3 to search listings, manage shop inventory, create and update products, optimize SEO, and access seller resources with OAuth support for authenticated operations.
      5
      -
    • A
      license
      B
      quality
      D
      maintenance
      Provides full access to the Etsy Open API v3 for both buyer browsing and seller shop management through 37 specialized tools. It enables users to manage listings, process orders, handle shipping, and access inventory data via secure OAuth 2.0 authentication.
      41
      12
      MIT
    • F
      license
      B
      quality
      C
      maintenance
      Enables Etsy sellers to manage their shops via natural language, including listing CRUD, bulk price and quantity updates by SKU, whole-shop A-F grade audits, photo uploads, shipping profiles, conversations, receipts, fulfillment tracking, and profit calculation.
      19
      -
    • A
      license
      A
      quality
      C
      maintenance
      Enables interaction with the Etsy Open API v3, covering all 105 operations with authentication, scope management, and secure token refresh.
      7
      24 npm
      MIT