_ registry / mcp streamable-http · checked 2h ago

Fourthwall MCP

https://mcp.fourthwall.com

Registry code: d3efc2441574fcbf

api record

# Fourthwall

You are the Fourthwall assistant, helping creators run their shop.

endpoint
https://mcp.fourthwall.com/app
protocol
streamable-http ·2025-06-18
authentication
none observed
public key
none — nobody has proven they own this listing · is it yours? claim it
karma
0 · newcomer
_ is it live, free and safe measured by this hub
Is Fourthwall MCP live?
Yes — it answered the hub's last check (checked 2h ago). It answered 100% of checks over the last 30 days.
Is Fourthwall MCP free to use?
Not measured yet.
What tools does Fourthwall MCP have?
143 tools: brand_extract_assets, brand_extract_assets_start, ecommerce_get-shop-permissions, ecommerce_get-fulfillment-details, ecommerce_get-order-details-by-ids, ecommerce_get-membership-free-trials-report, ecommerce_get-sales-over-time-report, ecommerce_get-customization-pricing, ….
Is Fourthwall MCP safe to connect?
The hub found no text in its card or tool descriptions aimed at the agent reading them. It measures what the server answers, not its code — grant it only the access its tools need.
reachable
live
uptime, 30 days
100%

90 days 100%· all time 100%

latency
740ms

last good check

priced tools
0

of 143 tools

_ answered our checks, 90 days 1 checks · signed record
  • unknown → live
_ usage and payments 30 days

Calls placed through this hub's router, from its own receipts. Every caller and every payer counts the same; the chain total is counted from three payers.

accounts
0

through this hub

calls served
0

successful

paid through this hub
0 USDC

what callers paid

_ what it can do 143 tools
143 never probed 0 of 143 classified

Price is per tool, not per server. An agent whose handshake is open can hold tools that demand a key or a payment, and one figure for the whole agent sends callers into a wall.

  • brand_extract_assets unknown never probed

    Stage 2 of brand extraction: produce just the assets you actually need. Reads the checkpoint produced by `brand_analyze`, then runs the logo stage and/or a focused per-artwork extraction for only the requested ids. Outputs are uploaded back into the same checkpoint, so calling this again with a different `want_artwork_ids` set extracts more without re-running analysis. Parameters: - checkpoint_uri: the URI returned by `brand_analyze`. - want_logo: extract the pixel-faithful 2048x2048 transparent logo PNG. Default True — flip to False on follow-up calls when you only want additional artworks. - want_artwork_ids: list of artwork ids (from `brand_analyze`'s `artwork_candidates`) to extract as transparent PNGs. Each id costs one medium-quality parallel gpt-image-2 call. Pass an empty list (or omit) to skip artwork extraction. Unknown ids raise — the message lists what's available so you can correct. At least one of `want_logo=True` or a non-empty `want_artwork_ids` must be set; otherwise the call has nothing to do and raises. Returns a dict with: - checkpoint_uri: echoed back so the model can chain another call. - brand_name - logo_compact: gs:// URI of a downsized, <512 KB transparent logo PNG. Pass it as `data` to `storefront_update-draft-theme-logo` (and to any downstream tool that wants the brand logo — there is no high-res variant; this is the canonical logo asset). Also None when the cut left no visible pixels — then use the original logo (e.g. `recommended_logo_url` from `brand_from_url`) for the storefront instead. None if want_logo=False or the checkpoint bucket is unset. - favicon: gs:// URI of a square <512 KB favicon PNG derived from the same logo. Pass it as `data` to `storefront_update-draft-theme-favicon`. None if want_logo=False or the checkpoint bucket is unset. - artworks: list of {id, kind, name, upload, media} for every successfully extracted id. `upload` is the gs:// URI; `media` is the media-library entry — pass `media[].media_url` to ecommerce tools like `ecommerce_generate-product-design-previews` so they can resolve the asset without a separate upload step. - failed_artworks: list of {id, kind, name, error_kind, message} for ids the model service refused. `error_kind` is one of `moderation_blocked`, `rate_limited`, `bad_request`, `api_error`, `other` — `moderation_blocked` means OpenAI's safety system rejected that specific artwork prompt; the caller should drop or rephrase that id and retry without it. - cost: usage summary for the artwork stage — `{input_text_tokens, input_image_tokens, output_image_tokens, total_tokens, estimated_usd, calls}`. Estimate uses published gpt-image rates; the OpenAI invoice is authoritative. For long extractions where the synchronous round-trip risks an MCP proxy timeout, use `brand_extract_assets_start` + `brand_extract_assets_status` — same pipeline behind a job_id poll.

    mcp-tool

    {
      "type": "object",
      "required": [
        "checkpoint_uri"
      ],
      "properties": {
        "want_logo": {
          "type": "boolean",
          "default": true
        },
        "checkpoint_uri": {
          "type": "string"
        },
        "want_artwork_ids": {
          "anyOf": [
            {
              "type": "array",
              "items": {
                "type": "string",
                "pattern": "^[\\x20-\\x7E]{1,64}$",
                "maxLength": 64,
                "minLength": 1
              }
            },
            {
              "type": "null"
            }
          ],
          "default": null
        }
      },
      "additionalProperties": false
    }
    arguments 33 lines
  • brand_extract_assets_start unknown never probed

    Async variant of `brand_extract_assets`. Enqueues the extraction and returns immediately, or returns the inline result if the job finishes inside the ~50s budget. Parameters: same as `brand_extract_assets`. Returns either: - `{"status": "done", "result": {...}}` — the extraction finished inline; treat `result` exactly like `brand_extract_assets` would have returned. - `{"job_id": "bx_...", "status": "pending" | "running", "progress": {...}}` — the job is still in flight. Poll `brand_extract_assets_status(job_id)` every 5–10 seconds. Typical extractions take 60–180s depending on how many artwork ids you requested. On failure surfaces `{"job_id": "bx_...", "status": "failed", "error": "..."}`.

    mcp-tool

    {
      "type": "object",
      "required": [
        "checkpoint_uri"
      ],
      "properties": {
        "want_logo": {
          "type": "boolean",
          "default": true
        },
        "checkpoint_uri": {
          "type": "string"
        },
        "want_artwork_ids": {
          "anyOf": [
            {
              "type": "array",
              "items": {
                "type": "string",
                "pattern": "^[\\x20-\\x7E]{1,64}$",
                "maxLength": 64,
                "minLength": 1
              }
            },
            {
              "type": "null"
            }
          ],
          "default": null
        }
      },
      "additionalProperties": false
    }
    arguments 33 lines
  • ecommerce_get-shop-permissions unknown never probed

    Retrieves the current user's permissions and group membership for the current shop. For shop profile and configuration details, use get-current-shop instead. Returns: - shopId (String, e.g. "sh_6c8684ef-6219-421f-90cf-d6d61b2237c9"): The shop's unique identifier - userId (String): The user's Keycloak ID - groups: Set of group names the user belongs to (OWNER, MANAGER, DESIGNER, VIEWER) Group meanings: - OWNER: Full access to all shop features, including user management and billing - MANAGER: Near-full access, excluding owner-level operations like deactivation - DESIGNER: Theme and visual editing access only - VIEWER: Read-only access to shop data

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [],
      "properties": {}
    }
    arguments 6 lines
  • ecommerce_get-fulfillment-details unknown never probed

    Retrieves fulfillment details for one or more orders by their order IDs. Fetches all orders concurrently. IMPORTANT — orderIds must be ORDER ids, not fulfillment ids. Pass the order's raw UUID (e.g. "8d79c46d-9a56-4266-885b-4b02a21aacd2"). Do NOT pass the "ful_..."-prefixed fulfillment id from this tool's own response, and do NOT pass an 8-char friendly order token (e.g. "T4YTE8HA") — resolve those to an order UUID via the `search` tool or `get-orders` first. Returns a list of fulfillments associated with the orders. Cancelled fulfillments are excluded unless includeCancelled=true. An order may have multiple fulfillments when items are shipped from different fulfillment services (e.g., some items via a third-party provider and others self-fulfilled by the creator). Each fulfillment includes: - id: Unique fulfillment identifier (e.g., "ful_abc123") - shopId: The shop this fulfillment belongs to - orderId: The order being fulfilled - status: Current fulfillment status (OPEN, ACCEPTED, IN_PRODUCTION, PACKAGED, ON_HOLD) - isFulfilledByCreator: true when the creator ships it themselves (FBC / Gnarlywood / Bolt Stitch / Mogul Merch / etc.); false when Fourthwall or a third-party provider handles shipping. Only fulfillments with isFulfilledByCreator=true can have their tracking edited via "edit-self-fulfilled-tracking". - items[]: List of items being fulfilled, each with: - variantId: Product variant ID (UUID) - quantity: Number of units - shippingLabels[]: Shipping labels with tracking info, each with: - trackingCompany: Carrier name (e.g., "USPS", "FedEx") - trackingNumber: Tracking number (may be null if not yet assigned) - trackingService: Service level (e.g., "Priority Mail") - orderShipmentId: Shipment ID linking to order shipping details (may be null) - createdAt: When the fulfillment was created - updatedAt: When the fulfillment was last updated Fulfillment status meanings: - OPEN: Fulfillment created, awaiting processing (no label purchased yet) - ACCEPTED: Acknowledged by the fulfillment provider - IN_PRODUCTION: Items are being produced or prepared - PACKAGED: Items packaged with shipping label purchased, ready to ship or shipped - ON_HOLD: Fulfillment temporarily paused - CANCELLED: Fulfillment was cancelled (only with includeCancelled=true), e.g. replaced by a new fulfillment or a voided label. updatedAt is the last change, usually the cancellation. Shipping labels on a CANCELLED fulfillment are NOT live tracking — never present them to a customer as the current tracking; use the non-cancelled fulfillments (or "get-order-details-by-ids") for that. Related tools: - Use "get-order-details-by-ids" to get the full order context (customer info, amounts, address) - Use "get-unfulfilled-orders" to see how many orders still need fulfillment Use this tool to: - Check the fulfillment status for one or more orders - Get tracking information for shipped items - Understand what items are being fulfilled and their quantities

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "orderIds"
      ],
      "properties": {
        "orderIds": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "List of ORDER IDs (not fulfillment ids). Format: order UUID strings (e.g., ['8d79c46d-9a56-4266-885b-4b02a21aacd2']). Max 10 IDs. Do NOT pass 'ful_...' fulfillment ids or 8-char friendly order tokens here — resolve them to an order UUID via `search` or `get-orders` first."
        },
        "includeCancelled": {
          "type": "boolean",
          "description": "Also return CANCELLED fulfillments, e.g. to see that a fulfillment was cancelled and replaced. Default false."
        }
      }
    }
    arguments 20 lines
  • ecommerce_get-order-details-by-ids unknown never probed

    Get full details of one or more orders by their IDs. Fetches all orders concurrently. Use get-orders first to find order IDs, then use this tool to get details. orderIds must be order UUIDs (e.g. "8d79c46d-9a56-4266-885b-4b02a21aacd2"). Do NOT pass 8-char friendly order tokens (e.g. "T4YTE8HA") or prefixed ids (e.g. "ful_...") — resolve those to an order UUID via the `search` tool or `get-orders` first. Returns a list of orders, each containing: - Order identity: id (UUID), friendlyId (8-char alphanumeric, e.g. "T4YTE8HA"), status, fulfillmentStatus, type, salesChannel - Customer info: customerEmail, customerName, customerPhone, message (note left by customer) - Financial summary (amounts): merchandiseTotal, shippingTotal, taxTotal, discountTotal, orderTotal, paidByCustomer, totalRefunded, paidByCustomerFinal, currency, donation - Shipping: shippingMethod - Items: list of ordered items with offerName, variantName, variantId, quantity, unitPrice, isDigital (true for digital products that are never shipped) - digitalDownloads (items with downloadable files, absent otherwise): one entry per file with fileName, downloadCount (times the buyer downloaded it), downloadLimitReached (true when that file hit its download limit, so the buyer can no longer download that file; other files may still be downloadable) - Cancelled items: same structure as items (without digitalDownloads), for any cancelled line items - Shipments: items grouped by shipment, each with status (NOT_SHIPPED/SHIPPED/DELIVERED), tracking, deliveryEstimate (human-readable string) - Shipment status SHIPPED only means a shipping label exists; it does NOT mean the carrier has the parcel. - tracking: url, carrier, trackingCode, plus carrier tracker data when available (all null otherwise): - status: LABEL_CREATED / PRE_TRANSIT (carrier has not scanned the parcel yet), IN_TRANSIT, OUT_FOR_DELIVERY, DELIVERY_ISSUE, DELIVERED, RETURN_TO_SENDER, UNKNOWN_ISSUE / BROKEN (tracker unusable) - trackerCreatedAt: when the tracker record was created; NOT necessarily when the label was created (trackers can be created later) - trackerUpdatedAt: last time the tracker record changed; NOT a confirmed carrier scan time - deliveredAt: delivery time reported by the carrier - lastMileCarrier, lastMileTrackingCode: local carrier after hand-over, if any - Promotion: title, code, type (e.g. "PERCENTAGE (10%)"), isAutoApplied - Gift cards: code, amountUsed, currency - Refund summary: hasRefunds, list of individual refunds with status, amount, issuer, reason - Replacement: type (SOURCE/REPLACEMENT), linked order IDs, reason - Profit: profit amount and currency

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "orderIds"
      ],
      "properties": {
        "orderIds": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "List of Order IDs. Format: order UUID strings (e.g., ['8d79c46d-9a56-4266-885b-4b02a21aacd2']). Max 10 IDs. Do NOT pass 8-char friendly order tokens or 'ful_...' fulfillment ids here — resolve them to an order UUID via `search` or `get-orders` first."
        }
      }
    }
    arguments 16 lines
  • ecommerce_get-membership-free-trials-report unknown never probed

    Get the Memberships Free Trials analytics report for the shop within a date range: free trial conversion tracking over time. This report shows free trial metrics over time with the following columns per row: - date: The time period - started: Number of free trials started - completed: Number of free trials that have ended, either through cancellation or conversion to a paid tier. Formula: Completed = Cancelled + Converted to paid tier - converted_to_paid_tier: Number of free trials converted to paid membership - cancelled: Number of free trials cancelled - conversion_rate: Percentage of completed free trials that converted to paid memberships. Formula: Conversion rate = Converted to paid tier / Completed Precision: choose finest granularity producing <=31 rows (HOUR for ~1d, DAY for ~1mo, WEEK for ~7mo, MONTH for ~2.5y, QUARTER for ~7y, YEAR beyond).

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "from",
        "to"
      ],
      "properties": {
        "to": {
          "type": "string",
          "description": "End of date range (ISO-8601 instant, e.g., '2024-12-31T23:59:59Z')"
        },
        "from": {
          "type": "string",
          "description": "Start of date range (ISO-8601 instant, e.g., '2024-01-01T00:00:00Z')"
        },
        "aggregationTimezone": {
          "type": "string",
          "description": "IANA timezone for date aggregation (e.g., 'America/New_York', 'UTC'). Defaults to UTC."
        },
        "aggregationPrecision": {
          "enum": [
            "HOUR",
            "DAY",
            "WEEK",
            "MONTH",
            "QUARTER",
            "YEAR"
          ],
          "type": "string",
          "description": "Time granularity: HOUR, DAY, WEEK, MONTH, QUARTER, YEAR. Defaults to DAY if omitted."
        }
      }
    }
    arguments 34 lines
  • ecommerce_get-sales-over-time-report unknown never probed

    Get the Sales Over Time analytics report for the shop within a date range: revenue and profit breakdown over time. This report shows sales trends over time with the following columns per row: - date: The time period - contributions: Total number of unique transactions - total_sales: Total revenue after cancellations, refunds, and shipping costs, but including all fees - gross_sales: Total sales before discounts, shipping, and taxes - discounts: Total discount amount applied to transactions - refunds_and_cancellations: Total amount refunded or cancelled - net_sales: Sales after shipping, taxes, and refunds/cancellations are deducted - shipping: Shipping revenue minus shipping costs paid to carriers - taxes_and_duties: Total tax collected on transactions - additional_fees: Payment processing, subscription, donation, and fulfillment fees - fourthwall_product_cost: Cost of products provided by Fourthwall - product_cost: Cost of self-produced products as declared by you - net_profit: Final profit after all costs and fees are deducted - net_profit_before_payment_fees: Profit before payment processing fees are deducted Precision: choose finest granularity producing <=31 rows (HOUR for ~1d, DAY for ~1mo, WEEK for ~7mo, MONTH for ~2.5y, QUARTER for ~7y, YEAR beyond). Filter groups (all default to true, pass comma-separated keys to include only specific metrics): - filter_group: orders, memberships, donations

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "from",
        "to"
      ],
      "properties": {
        "to": {
          "type": "string",
          "description": "End of date range (ISO-8601 instant, e.g., '2024-12-31T23:59:59Z')"
        },
        "from": {
          "type": "string",
          "description": "Start of date range (ISO-8601 instant, e.g., '2024-01-01T00:00:00Z')"
        },
        "filterGroup": {
          "type": "string",
          "description": "Filter group. Comma-separated values from: orders, memberships, donations. All included by default."
        },
        "aggregationTimezone": {
          "type": "string",
          "description": "IANA timezone for date aggregation (e.g., 'America/New_York', 'UTC'). Defaults to UTC."
        },
        "aggregationPrecision": {
          "enum": [
            "HOUR",
            "DAY",
            "WEEK",
            "MONTH",
            "QUARTER",
            "YEAR"
          ],
          "type": "string",
          "description": "Time granularity: HOUR, DAY, WEEK, MONTH, QUARTER, YEAR. Defaults to DAY if omitted."
        }
      }
    }
    arguments 38 lines
  • ecommerce_get-customization-pricing unknown never probed

    Gets pricing preview for a customization sketch without creating an offer. Returns manufacturing costs per size with cost component breakdown (blank, print regions, etc.). Use this to show the user what the offer would cost before creating it.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "customizationId"
      ],
      "properties": {
        "customizationId": {
          "type": "string",
          "description": "Customization ID to calculate pricing for"
        }
      }
    }
    arguments 13 lines
  • ecommerce_remove-draft-sizes unknown never probed

    Removes sizes from the draft's size selection. Does NOT affect the live product. Use rerender-design-previews after to see updated previews. Use apply-draft-to-product when the creator confirms changes. Throws CUSTOMIZATION_DESIGN_NOT_EDITABLE_IN_CHAT for designs made in another designer, see add-draft-sizes.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "customizationId",
        "sizes"
      ],
      "properties": {
        "sizes": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Sizes to remove (e.g. [\"2XL\", \"3XL\"])"
        },
        "customizationId": {
          "type": "string",
          "description": "Customization ID of the draft"
        }
      }
    }
    arguments 21 lines
  • ecommerce_get-current-subscription unknown never probed

    Retrieves the current subscription for the shop with usage information. For full plan details (pricing, all limits, features), use get-available-plans. Returns: - Subscription: id, status, activeFrom (nullable ISO 8601), activeTo (nullable ISO 8601), scheduledCancelledAtTheEndOfPeriod (boolean) - Plan summary: plan.id, plan.name, plan.pro (boolean), plan.custom (boolean) - Usage vs limits (each with limit and usage as Long): - offers: product/offer count - members: team member count - domains: custom domain count - digitalProductsStorageBytes: digital file storage in bytes - pendingSubscription (nullable): subscriptionId, planId, planName — present when a plan change is scheduled status values: - PENDING: awaiting payment/activation - ACTIVE: subscription is active and in good standing - PAST_DUE: payment is overdue - CANCELED: subscription has been cancelled Understanding limits: - When usage >= limit, the resource is at capacity - limit = -1 means unlimited for that resource - Storage is in bytes (divide by 1073741824 for GB)

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [],
      "properties": {}
    }
    arguments 6 lines
  • navigate unknown never probed

    Navigate the user to a specific page in the Fourthwall admin dashboard. The url must be an exact path from omni_knowledge results (modules or help docs) - never construct or guess paths. Do not tell users you are "searching" or "looking up" the path. Parameters: - url: Exact admin dashboard path from omni_knowledge results (e.g. "/admin/dashboard/promotions/promotion-codes/create/"), optionally with query parameters for filtering (e.g. "/admin/products/all/?badges=BESTSELLER"). Or a full URL returned by an MCP tool (e.g. checkout link), or a Fourthwall help-docs URL returned by omni_knowledge. Never guess or construct paths. - description: Button label shown to the user, 2-4 words, under 40 characters (e.g. "Create Promotion", "View Orders").

    mcp-tool

    {
      "type": "object",
      "required": [
        "url",
        "description"
      ],
      "properties": {
        "url": {
          "type": "string"
        },
        "description": {
          "type": "string"
        }
      },
      "additionalProperties": false
    }
    arguments 16 lines
  • media-library unknown never probed

    Open the media library for the user to browse, upload, and select an image. Renders a selectable image carousel plus an upload tile; a newly uploaded image joins the carousel preselected. When the user confirms an image with "Use selected image", its hosted URL arrives in their next message ("Selected [image](url)"). As soon as that message arrives, call analyze-image on the URL to get a description of the image's contents, then act on the URL. The user picks the image, never you — including when only one image exists: do not auto-select it. Wait for the "Selected [image](url)" message before using any URL. Parameters: - prompt: Instruction text shown in the media library UI (e.g. "Select artwork for your product"). - title: Optional heading displayed above the library.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "title": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "prompt": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        }
      },
      "additionalProperties": false
    }
    arguments 28 lines
  • checkout_session_detail_previews unknown never probed

    Render deferred gallery views automatically when a product page opens.

    mcp-tool

    {
      "type": "object",
      "required": [
        "session_id",
        "card_id",
        "version"
      ],
      "properties": {
        "card_id": {
          "type": "string"
        },
        "version": {
          "type": "integer",
          "minimum": 0
        },
        "session_id": {
          "type": "string"
        },
        "retry_failed": {
          "type": "boolean",
          "default": false
        }
      },
      "additionalProperties": false
    }
    arguments 25 lines
  • checkout_session_colors_save unknown never probed

    Version-check and save the colors one card offers, then refresh its preview.

    mcp-tool

    {
      "type": "object",
      "required": [
        "session_id",
        "card_id",
        "version",
        "colors"
      ],
      "properties": {
        "colors": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "card_id": {
          "type": "string"
        },
        "version": {
          "type": "integer",
          "minimum": 0
        },
        "session_id": {
          "type": "string"
        }
      },
      "additionalProperties": false
    }
    arguments 28 lines
  • brand_analyze unknown never probed

    Stage 1 of brand extraction: analyze a brand sheet and stash a checkpoint. Runs the vision analyzer on the image. Does NOT extract a logo or run any image generation — that happens in `brand_extract_assets`. Returns a `checkpoint_uri` that the follow-up call uses to pull only the artworks/logo it actually needs. Parameters: - image_path: Source brand sheet (PNG/JPEG) or brand deck (PDF). For PDF input a cheap text-only selector picks the most informative pages (at most 6), rasterizes them, and sends them to the vision model in one call — useful for multi-page merch decks or brand guidelines. When pages were dropped, `checkpoint_md` carries a NOTE saying so. Accepts an `http(s)://` URL (fetched anonymously) or a `gs://bucket/key` URI for an object in this shop's own storage (e.g. a media-library image). The `https://storage.googleapis.com/<bucket>/<key>` form (and its `storage.cloud.google.com` / virtual-hosted variants) is accepted the same way. Returns a dict with: - checkpoint_uri: opaque URI (gs:// in prod, file:// in local dev) that pins this analysis run; pass back as the first argument to `brand_extract_assets`. - brand_name: confirm with the user before spending image-gen calls. - checkpoint_md: a markdown summary of the brand (mood, palette, typography, logo description, products, and the artwork "menu" with ids and descriptions). Use this to decide which `want_artwork_ids` to request next. - artwork_candidates: structured list of `{id, kind, name, description}` for the same menu — the `id` values are what `brand_extract_assets` accepts in `want_artwork_ids`. - logo_description: verbal description of the primary logo, helpful for confirming "yes this is the right brand" before extraction. Typical flow: r1 = brand_analyze(image_path="...") # confirm r1["brand_name"] with the user, pick artwork ids from # r1["artwork_candidates"], then: r2 = brand_extract_assets( checkpoint_uri=r1["checkpoint_uri"], want_logo=True, want_artwork_ids=["main_logo", "side_heart"], ) For long brand decks where the synchronous round-trip risks an MCP proxy timeout, use `brand_analyze_start` + `brand_analyze_status` instead — they expose the same pipeline behind a job_id poll loop.

    mcp-tool

    {
      "type": "object",
      "required": [
        "image_path"
      ],
      "properties": {
        "image_path": {
          "type": "string"
        }
      },
      "additionalProperties": false
    }
    arguments 12 lines
  • brand_analyze_start unknown never probed

    Async variant of `brand_analyze`. Enqueues the analysis and returns immediately, or returns the inline result if the job finishes inside the ~50s budget. Parameters: - image_path: same shape as `brand_analyze` (http(s) URL, or a gs:// / storage.googleapis.com URI in this shop's own storage). Returns either: - `{"status": "done", "result": {...}}` — the analysis finished inside the inline wait window; treat `result` exactly like `brand_analyze` would have returned. - `{"job_id": "ba_...", "status": "pending" | "running", "progress": {...}}` — the job is still in flight. Poll `brand_analyze_status(job_id)` every 5–10 seconds. Typical brand-deck jobs take 120–180s; very short single-image inputs may return inline. On failure surfaces `{"job_id": "ba_...", "status": "failed", "error": "..."}` rather than raising, so the model can decide whether to retry.

    mcp-tool

    {
      "type": "object",
      "required": [
        "image_path"
      ],
      "properties": {
        "image_path": {
          "type": "string"
        }
      },
      "additionalProperties": false
    }
    arguments 12 lines
  • brand_analyze_status unknown never probed

    Wait for the next step of a `brand_analyze_start` job and return its status. Parameters: - job_id: the id returned by `brand_analyze_start`. - wait_seconds: how long to wait for the job to finish or its progress to change before answering (0–25, default 20). Each call costs the caller one agent step, so waiting here beats polling every second. Returns: - `{"job_id", "status": "pending" | "running" | "done" | "failed", ...}` - `progress` (optional): `{stage, pct}` while running. - `result` present when status=="done" — same shape as `brand_analyze`. - `error` present when status=="failed". Raises if `job_id` is unknown or has aged out of the 24h TTL.

    mcp-tool

    {
      "type": "object",
      "required": [
        "job_id"
      ],
      "properties": {
        "job_id": {
          "type": "string"
        },
        "wait_seconds": {
          "type": "integer",
          "default": 20
        }
      },
      "additionalProperties": false
    }
    arguments 16 lines
  • brand_extract_assets_status unknown never probed

    Wait for the next step of a `brand_extract_assets_start` job and return its status. Parameters: - job_id: the id returned by `brand_extract_assets_start`. - wait_seconds: how long to wait for the job to finish or its progress to change before answering (0–25, default 20). Each call costs the caller one agent step, so waiting here beats polling every second. Returns: - `{"job_id", "status": "pending" | "running" | "done" | "failed", ...}` - `progress` (optional): `{stage, pct}` while running. - `result` present when status=="done" — same shape as `brand_extract_assets`. - `error` present when status=="failed". Raises if `job_id` is unknown or has aged out of the 24h TTL.

    mcp-tool

    {
      "type": "object",
      "required": [
        "job_id"
      ],
      "properties": {
        "job_id": {
          "type": "string"
        },
        "wait_seconds": {
          "type": "integer",
          "default": 20
        }
      },
      "additionalProperties": false
    }
    arguments 16 lines
  • omni_search unknown never probed

    Search for entities across the shop when no dedicated MCP tool exists for the specific search you need. Returns matching entity IDs that you can then look up with the appropriate detail tool. Parameters: - query: Search term — can be a name, email, code, ID, or keyword (1-256 characters). - source: Optional entity type to narrow the search. One of: "orders", "offers", "promotions", "collections". Omit to search all sources at once. Returns: - Matching entity IDs grouped by source, e.g.: promotions: prm_abc123, prm_def456 orders: ord_xyz789 Follow-up: After getting IDs from this tool, find the dedicated ecommerce_* tool that can fetch full details by ID. When to use this tool: - Always prefer a dedicated ecommerce_* tool if one exists for the search you need (e.g. ecommerce_list-offers for offers by name). - Use THIS tool when no dedicated tool covers the search, for example: • Find a promotion by promo code (e.g. query="SUMMER20") • Find a collection by name • Find an order by customer email or friendly ID • Broad search across multiple entity types at once Examples: - Search promotion by code: query="SUMMER20", source="promotions" - Search collection by name: query="holiday", source="collections" - Search everything: query="holiday"

    mcp-tool

    {
      "type": "object",
      "required": [
        "query"
      ],
      "properties": {
        "query": {
          "type": "string"
        },
        "source": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        }
      },
      "additionalProperties": false
    }
    arguments 23 lines
  • omni_knowledge unknown never probed

    Search Fourthwall's knowledge base for help documentation, how-to guides, and tips. Use this to answer questions about how the Fourthwall platform works. Parameters: - query: A short, plain-language question or topic about Fourthwall (roughly 1-256 characters), e.g. "how do I create a promotion?". Keep it a single concise search phrase — NOT a long dump, not repeated words, and not pasted content or conversation history. Overly long or malformed queries are rejected; if that happens, shorten the query to the core question and retry. Returns: - Matching knowledge grouped by type: admin modules (dashboard pages with their exact navigation paths), snippets (tips and Q&A), and help docs (official documentation). Pass a module's path verbatim to the `navigate` tool — never construct paths. When to use this tool: - The user asks how to do something on Fourthwall (e.g. "how do I create a promotion?", "how does shipping work?") - The user needs guidance on platform features, product design, store setup, or best practices - You need context about Fourthwall concepts before using other tools When NOT to use this tool: - The user wants to search their own shop data (use the "omni_search" tool or a dedicated ecommerce_* tool instead) - The user wants to perform an action like creating or updating resources Examples: - query="how to create a promotion" - query="product designer walkthrough" - query="shipping flat rates setup"

    mcp-tool

    {
      "type": "object",
      "required": [
        "query"
      ],
      "properties": {
        "query": {
          "type": "string"
        }
      },
      "additionalProperties": false
    }
    arguments 12 lines
  • ecommerce_get-all-integrations unknown never probed

    Retrieves all connected integrations for the shop. This is a high-level overview — for TikTok or YouTube details, use get-tiktok-configuration or get-youtube-integrations. Returns a list of integrations, each with: - app: Integration identifier (TWITCH_GIFTING, TWITCH_DISCOUNTS_FOR_SUBS, YOUTUBE_PRODUCT_SHELF, TIKTOK_SHOP, INSTAGRAM_SHOP, INSTAGRAM_CHECKOUT, TWITTER_SHOP, STREAMELEMENTS, STREAMLABS, TIKTOK_FEED, INSTAGRAM_FEED, SHIPSTATION, LAYLO, KLAVIYO, MAILCHIMP, KIT, BEEHIIV, FWDISCORD, PLEDGE, BOOKFUNNEL) - status: CONNECTED, NOT_CONNECTED, NOT_CONFIGURED, IN_PROGRESS, COMING_SOON, EXTERNAL, BROKEN - categories: list of SOCIAL_COMMERCE, ALERTS, SOCIAL_FEED, EMAIL_MARKETING, SHIPPING, OTHER - recommendations: list of sales recommendations (e.g. "SALES (priority: 1)"), empty if none - channelName: Twitch channel name (nullable, only for Twitch integrations) - missingScopes: OAuth scopes that need to be granted (nullable, only for Twitch/StreamElements) Status values: - CONNECTED: Fully set up and active - NOT_CONNECTED: Not configured at all - NOT_CONFIGURED: Partial setup (e.g., OAuth connected but configuration incomplete) - IN_PROGRESS: Setup is being processed - COMING_SOON: Feature not yet available - EXTERNAL: Configured outside Fourthwall (e.g., TikTok Feed, Instagram Feed) - BROKEN: Needs attention (e.g., missing scopes, expired auth) Use this tool to: - See all available and connected integrations for a shop - Check which sales channels are set up (TikTok Shop, YouTube Merch Shelf) - Verify email marketing tool connections (Klaviyo, Mailchimp, Kit, Beehiiv, Laylo) - Identify integrations that need attention (BROKEN status) - Get sales recommendations based on connected integrations

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [],
      "properties": {}
    }
    arguments 6 lines
  • ecommerce_get-tiktok-configuration unknown never probed

    Retrieves the TikTok Shop configuration for the current shop. To see which products are synced to TikTok, use get-tiktok-products. Returns: - configured (Boolean): false if TikTok Shop is not set up — all other fields will be null/empty - tiktokShopId (nullable String): TikTok Shop ID linked to this Fourthwall shop - warehouseId (nullable String): Warehouse ID for fulfillment - status (nullable): ACTIVE, DISABLED, BLOCKED, or ARCHIVED - pricePercentageIncrease (nullable BigDecimal): Price markup percentage for TikTok listings - fullyConfigured (nullable Boolean): true if warehouseId is set (required for product syncing) - authorizationExpiresAt (nullable ISO 8601): When TikTok authorization expires - synchronizationPausedUntil (nullable ISO 8601): When syncing will resume - synchronizationPausedReasons: Set of pause reasons (SELLER_NOT_ACTIVE, SHOP_NOT_ACTIVE, INCORRECT_SHIPPING_OPTION, PRODUCT_CREATION_LIMIT_REACHED, WAREHOUSE_NOT_CONFIGURED, RETURN_WAREHOUSE_NOT_CONFIGURED, SHIPPING_TEMPLATES_NOT_IN_WAREHOUSE, NO_IMAGES_FOR_OFFER) - prerequisites (nullable): Setup requirements, each a String "COMPLETED" or "NOT_COMPLETED (reason)": - pickupWarehouse, returnWarehouse, shippingTemplates, deliveryOption, status, taxInfo, productQuantityLimit Use this tool to: - Check if TikTok Shop is set up for a shop (check configured=true) - Diagnose why products aren't syncing (check prerequisites, status, synchronizationPausedReasons) - Verify authorization is still valid (check authorizationExpiresAt) - See the price markup being applied to TikTok listings (pricePercentageIncrease)

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [],
      "properties": {}
    }
    arguments 6 lines
  • ecommerce_get-tiktok-products unknown never probed

    Retrieves products synced to TikTok Shop, grouped by sync status. Check get-tiktok-configuration first to verify TikTok Shop is configured. Returns products in three lists: - active: Products successfully listed on TikTok Shop - pending: Products awaiting TikTok approval or processing - denied: Products rejected by TikTok with issue details Each product includes: - name (String): Product name - offerId (UUID): Fourthwall offer ID - imageUrl (nullable URI): Product image URL - issues: List of problems, each with: - detail (String): Description of the issue - documentation (nullable String): Link to help documentation - suggestions (nullable String): Actionable fix suggestion Common denial issues (in priority order): - Product rejected by TikTok (with specific reason from TikTok) - Seller/platform deactivated or freeze - Shipping takes longer than 2 days - Only products shipping from USA are eligible - Product type/category not yet eligible - Product has no images - Product weighs over 5 lbs / 2.27 kg - Product status is HIDDEN - Daily sync limit exceeded (100 products/day) Use this tool to: - See which products are live on TikTok Shop - Identify products waiting for TikTok approval - Diagnose why specific products were rejected (check issues list) - Get actionable suggestions for fixing product issues (check suggestions field)

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [],
      "properties": {}
    }
    arguments 6 lines
  • ecommerce_get-youtube-integrations unknown never probed

    Retrieves YouTube Shopping (formerly "YouTube Merch Shelf") channel integrations for the shop, together with the shop's Google Merchant Center (GMC) account context. To see which products are synced to YouTube, use get-youtube-products. Returns: integrations: list of channel integrations, each with: - channelName (nullable String): YouTube channel name - oAuth2Provider (String): OAuth provider used (typically "GOOGLE") - thumbnailUri (nullable URI): Channel thumbnail image URL - settingsUri (nullable URI): Link to YouTube Studio monetization settings - status (String): ACTIVE, PENDING, DENIED, or ARCHIVED - deniedReason (nullable String): Only present when status is DENIED - info (nullable String): Only present when status is ACTIVE (e.g. "LEGACY_METHOD_DUE_TO_MISREPRESENTATION") - connectedAt (DateTime): when the integration was connected - daysSinceConnected (Long): whole days elapsed since connectedAt - withinReviewWindow (Boolean): true when status is PENDING and still within Google's ~3-5 day review window. When true, the integration is simply still under Google review — this is expected, NOT an error. Tell the creator to wait for the review to complete rather than escalating. account (nullable object): GMC sub-account for the shop. Null until Google Merchant Center provisioning completes. Contains: - merchantId (String), name (String), websiteUrl (URI) - hasCustomDomain (Boolean): false means the shop is still on a *.fourthwall.com domain - shoppingAdsEnabled (Boolean) - issues (list): account-level GMC issues, each { type (String), inProgress (Boolean) }. inProgress=true means a review/fix for that issue is already underway. Denied reason values: - INVALID_SCOPES_OR_CHANNEL: OAuth permissions issue - NOT_ENOUGH_SUBSCRIBERS: Channel doesn't meet subscriber threshold - CHANNEL_NOT_ELIGIBLE: Channel not eligible for merch shelf - TERMS_OF_SERVICE_NOT_SIGNED: Need to accept YouTube Shopping TOS - TERMS_OF_SERVICE_NOT_SIGNED_LEGACY: Legacy TOS issue - THIRD_PARTY_LINK_REMOVED: Store link was removed from YouTube - MISSING_SCOPES: OAuth needs additional permissions - NO_ACCESS_TO_YOUTUBE_API: API access issue - NO_CHANNEL_FOUND: No YouTube channel found for this account - UNKNOWN_ERROR: Unclassified error Account issue type values: - MISREPRESENTATION: Google flagged the store for misrepresentation (NOT resolvable by the creator — direct them to support) - DOMAIN_CLAIMED_BY_ANOTHER_MERCHANT: the shop domain is claimed by another Merchant Center account - MISSING_RETURN_AND_REFUND_POLICY, INSUFFICIENT_CONTACT_INFO, INACCURATE_SHIPPING_COSTS, INCONSISTENT_CURRENCY, WEBSITE_NEEDS_IMPROVEMENT, NO_PRODUCTS_DISPLAYED, LANDING_PAGE_NOT_WORKING, COUNTERFEIT Use this tool to: - Check if YouTube Shopping is connected (look for ACTIVE status) - See which YouTube channels are linked to the shop - Diagnose connection issues (check deniedReason field) - Get the YouTube Studio settings link for troubleshooting (settingsUri) - Confirm the correct GMC account is connected (account.merchantId / websiteUrl) Diagnosing root cause — IMPORTANT: - Base the diagnosis on the actual data. Do NOT guess. If account is present, its issues list is the authoritative account-level root cause. - If an account issue such as MISREPRESENTATION is present, THAT is the root cause. Do NOT attribute the problem to domain verification or anything else, and do NOT invent causes that aren't in the data. - If withinReviewWindow is true and there are no account issues, the integration is still under Google's standard 3-5 day review — advise the creator to wait; do not treat it as a failure.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [],
      "properties": {}
    }
    arguments 6 lines
  • ecommerce_get-youtube-products unknown never probed

    Retrieves products synced to YouTube Merch Shelf, one entry per product (offer) with its variants summarized by Google Merchant Center status. Check get-youtube-integrations first to verify YouTube is connected. Google reviews each variant (size/color) separately, but creators think in products — report products, and mention variants only when they differ (e.g. one size denied). Returns: totals: products, variants, activeVariants, pendingVariants, deniedVariants (Int) products: list, each with: - offerId (UUID): Fourthwall offer ID (use with get-offers-by-ids / show-entity) - name (String): Product name - status: ACTIVE (all variants live), PENDING (all awaiting Google approval), DENIED (all rejected), or PARTIAL (variants differ — check the counts) - activeVariants, pendingVariants, deniedVariants (Int): variant counts per status - disclosureDate (nullable ISO 8601): when the product was first submitted to Google - issueIds (list of String): ids into the top-level issues list, for the product's denied variants - deniedVariantLabels (list of String): denied variants as "Color / Size", only when the product is PARTIAL (when every variant is denied this is empty) issues: Google rejection reasons, each listed once: - id (String): referenced from products[].issueIds - detail (String): description of the issue — quote it to the creator - documentation (nullable String): link to Google help documentation - deniedVariants (Int): how many denied variants carry this issue Use this tool to: - See which products are live on YouTube Merch Shelf - Check approval status and wait time for pending products (status PENDING, disclosureDate) - Diagnose why products were rejected by Google (issueIds -> issues)

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [],
      "properties": {}
    }
    arguments 6 lines
  • ecommerce_cancel-giveaway-links unknown never probed

    Cancel giveaway links. IRREVERSIBLE. Always confirm with the user first. Provide EITHER giftId (cancel one link) OR packageId (cancel all available links in package). Only AVAILABLE links are cancelled. Already redeemed links are unaffected.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [],
      "properties": {
        "giftId": {
          "type": "string",
          "description": "Single gift ID to cancel (e.g., 'gft_...'). Provide this OR packageId."
        },
        "packageId": {
          "type": "string",
          "description": "Package ID to cancel all available links in (UUID string). Provide this OR giftId."
        }
      }
    }
    arguments 15 lines
  • ecommerce_create-giveaway-links unknown never probed

    Create a package of giveaway links (free product URLs) for a product. Each link is a unique URL someone can use to claim a free product. Links are grouped into a package. REQUIRED: • offerId: product ID (UUID). Use get-offers to find IDs. • numberOfGifts: how many links to generate (1-50) Returns: packageId + list of created gift IDs. Use get-giveaway-links to see URLs.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "offerId",
        "numberOfGifts"
      ],
      "properties": {
        "offerId": {
          "type": "string",
          "description": "Product offer ID (UUID string). Use get-offers to find IDs."
        },
        "numberOfGifts": {
          "type": "integer",
          "format": "int32",
          "description": "Number of giveaway links to generate (1-50)"
        }
      }
    }
    arguments 19 lines
  • ecommerce_get-giveaway-links unknown never probed

    List giveaway links with pagination. Filter by packageId to see links from a specific batch. Statuses: AVAILABLE (unclaimed, has shareable URL), REDEEMED (claimed), CANCELLED (revoked). Each link has a uri (the shareable URL) and belongs to a packageId.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "page",
        "size"
      ],
      "properties": {
        "page": {
          "type": "integer",
          "format": "int32",
          "description": "Page number (0-indexed). Start with 0."
        },
        "size": {
          "type": "integer",
          "format": "int32",
          "description": "Page size (max 10). Use 5 unless user requests more."
        },
        "status": {
          "type": "string",
          "description": "Filter by status: AVAILABLE or REDEEMED. Omit for all."
        },
        "packageId": {
          "type": "string",
          "description": "Filter by package ID (UUID string). Omit for all packages."
        }
      }
    }
    arguments 28 lines
  • ecommerce_get-payout-info unknown never probed

    Retrieves the current payout account status and configuration for the shop. Returns: - Status: status (INACTIVE/IN_PROGRESS/ACTIVE) - Ownership: owner (CUSTOM/PARTNER, nullable), shopId (nullable), partnerId (nullable), partnerName (nullable) - Connection: connectedAt (ISO 8601, nullable) - Account creator: accountCreator with userId, email, fullName (nullable) — nullable when INACTIVE Status values: - INACTIVE: No payout account set up. All other fields are null. - IN_PROGRESS: Payout account exists but Stripe onboarding is incomplete. Payouts are pending. - ACTIVE: Payout account fully configured. The shop can receive payouts.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [],
      "properties": {}
    }
    arguments 6 lines
  • ecommerce_get-payout-transactions unknown never probed

    Retrieve paginated payout transaction history for the shop. Requires payout account to be active — use get-payout-info to check status first. Returns: - Pagination: pageNumber, pageSize, totalElements, totalPages - Transactions list, each with: - transferAmount (BigDecimal)/transferCurrency: Amount transferred from Fourthwall to creator's Stripe account (typically USD) - payoutAmount (BigDecimal, nullable)/payoutCurrency (nullable): Amount paid out to creator's bank/card (currency depends on account settings) - status: PENDING, IN_PROGRESS, PAID, FAILED, REVERTED - createdAt (ISO 8601) - paidToType: BANK_ACCOUNT, CARD, PARTNER, MANUAL, UNKNOWN - paidToDetails (nullable): Last 4 digits of bank/card (e.g. ****1234) or partner name; null for MANUAL/UNKNOWN Status values: - PENDING: Payout initiated, not yet processed - IN_PROGRESS: Being processed by Stripe - PAID: Successfully paid out to the creator - FAILED: Payout failed (check paidToDetails for destination info) - REVERTED: Payout was reversed

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [],
      "properties": {
        "page": {
          "type": "integer",
          "format": "int32",
          "description": "Page number, 0-indexed (e.g. 0). Start with 0 for the first page. Defaults to 0."
        },
        "size": {
          "type": "integer",
          "format": "int32",
          "description": "Page size - number of transactions per page, max 10 (e.g. 5, values above 10 are clamped). Always use 5 unless user explicitly requests more. Defaults to 5."
        }
      }
    }
    arguments 17 lines
  • ecommerce_create-sample-checkout unknown never probed

    Creates a checkout session to order product samples at cost. Use get-offers or get-offers-by-ids to find variant IDs for the items to order. Returns: - checkoutPath: Relative path to the checkout page (e.g., "/checkout/ch_abc123") Sample credits are applied automatically at checkout when available; if the balance is zero or insufficient, the buyer pays the remaining amount on the checkout page. You do NOT need to check the balance beforehand — never gate this call on get-sample-credit-balance. Examples: - Order 2 units of a variant: items="8d79c46d-9a56-4266-885b-4b02a21aacd2:2" - Order multiple variants: items="aaa-uuid:1,bbb-uuid:3"

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "items",
        "challengeDefinitionId"
      ],
      "properties": {
        "items": {
          "type": "string",
          "description": "Comma-separated list of variantId:quantity pairs. Example: '8d79c46d-9a56-4266-885b-4b02a21aacd2:2,0f43e3db-ac51-44b4-a3b5-022de1378bec:5'. At least one item required. Quantity must be between 1 and 10000."
        },
        "challengeDefinitionId": {
          "type": "string",
          "description": "Optional challenge definition ID if ordering as part of a challenge. Format: UUID string. Omit if not part of a challenge."
        }
      }
    }
    arguments 18 lines
  • ecommerce_get-sample-credit-balance unknown never probed

    Retrieves the current sample credit balance for the shop. Sample credits allow creators to order product samples at cost price instead of full retail. This is purely informational — do NOT use it to gate create-sample-checkout. Sample checkouts work regardless of the balance (any unfunded portion is paid by the buyer at checkout). Returns: - balance: Current sample credit balance (BigDecimal, nullable if no credits exist) - balanceWithIncentive: Balance including any bonus incentive credits (BigDecimal, nullable) - currency: Currency code for both balance fields (e.g., "USD", nullable if no balance) balanceWithIncentive >= balance when incentive credits are available. Both fields are null when the shop has never received sample credits.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [],
      "properties": {}
    }
    arguments 6 lines
  • ecommerce_get-shipping-flat-rates unknown never probed

    Retrieves the flat rate shipping pricing configuration for the shop. Flat rates allow shops to charge fixed shipping costs instead of carrier-calculated rates. Typically used for creator-fulfilled (self-shipped) products. Returns: - enabled: whether flat rate shipping is active (Boolean) - domesticShippingBasePrice: base price for domestic (same-country) shipments (BigDecimal) - domesticShippingEachAdditionalItemFee: per-additional-item fee for domestic orders (BigDecimal) - internationalShippingBasePrice: base price for international shipments (BigDecimal) - internationalShippingEachAdditionalItemFee: per-additional-item fee for international orders (BigDecimal) - currency: currency code for all prices (e.g. "USD", "EUR") Shipping cost formula: basePrice + (additionalItems × eachAdditionalItemFee).

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [],
      "properties": {}
    }
    arguments 6 lines
  • ecommerce_get-shipping-profiles unknown never probed

    Retrieves all shipping profiles configured for the shop. Shipping profiles define which products (offers) ship to which destination countries. Each profile maps a set of offer IDs to a set of countries. Returns: - enabled: whether shipping is globally enabled for this shop (Boolean) - shippingProfiles: list of profiles, each containing: - id: shipping profile ID (nullable — null for the default profile) - offerIds: list of offer IDs (UUIDs) covered by this profile - countries: list of destination countries (ISO enum values, e.g. US, GB, DE, FR) - enabled: whether this individual profile is active (Boolean) Note: offerIds correspond to offers from the get-offers tool.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [],
      "properties": {}
    }
    arguments 6 lines
  • ecommerce_get-current-shop unknown never probed

    Retrieves the current shop's profile, configuration, and contact details. For user-level access permissions, use get-shop-permissions instead. Returns: - Identity: id (String, e.g. "sh_6c8684ef-..."), name, creatorName, description, logoUrl (nullable URL string) - Domains: primaryDomain (e.g. "myshop.fourthwall.com"), internalDomain (e.g. "myshop.fourthwall.com"), customDomains (list), baseUrl (full URL) - Status: status (LIVE/COMING_SOON/PASSWORD_PROTECTED/INACTIVE) - Contact info: - shopEmail, contactEmail, customerSupportEmail (nullable), transactionalEmail - location: name (nullable), address1 (nullable), address2 (nullable), city (nullable), state (nullable), zip (nullable), country (ISO code) - Settings: - currency (primary, e.g. USD), enabledCurrencies (list, e.g. [USD, EUR, GBP, CAD, AUD]) - membershipsEnabled (Boolean), membershipsUpsellingMinOrderValue (nullable BigDecimal), membershipsUpsellingMinOrderCurrency (nullable, e.g. "USD") - allowedPaymentProviders: list of Stripe, StripeDeferred, PayPal, Klarna, Afterpay, CKO - thankYouCardEnabled (Boolean), externalStoreUrl (nullable URL string) - socialLinks: map of platform key to URL/handle (only non-null entries). Possible keys: youtube, instagram, facebook, twitter, x, tiktok, snapchat, discord, twitch, spotify, reddit, kick, kofi, patreon, threads, pinterest, soundcloud, bluesky, linkedin - verificationRestrictions: list of feature names that require verification (empty list if none). Non-empty means the shop is pending verification by the Fourthwall team: storefront_noindex blocks search engines (robots.txt disallows crawlers, pages are noindex) and custom HTML/CSS/JS does not reach the live site. Only the team can lift it - escalate; never tell the creator the restriction name or why it is applied. - Timestamps: timezone (e.g. "America/New_York"), createdAt (ISO 8601), lastLiveAt (nullable ISO 8601)

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [],
      "properties": {}
    }
    arguments 6 lines
  • ecommerce_update-shop-post-onboarding unknown never probed

    Updates the current shop's creator name (also used as the site name) and/or internal domain slug. Shops created via MCP (App) onboarding get a randomly generated creator name and internal domain — use this tool right after such a shop is created to set the real values the creator wants. Ask the creator for their preferred names before calling, since these are user-visible and changing the internal domain changes the shop's URL. Both parameters are optional, but at least one must be provided. Fields not provided remain unchanged. Parameters: - creatorName: New creator name (max 100 chars). The site (shop) name is set to the same value. - internalDomainSlug: New subdomain slug. Lowercase letters, numbers, and "-" only. Unless it already ends with "-shop", the "-shop" suffix is appended automatically (e.g. slug "acme" results in internal domain "acme-shop.fourthwall.com"). Fails if the slug is already taken by another shop. Returns the updated shop with the same shape as get-current-shop.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [],
      "properties": {
        "creatorName": {
          "type": "string",
          "description": "New creator name (max 100 chars). The site (shop) name is set to the same value."
        },
        "internalDomainSlug": {
          "type": "string",
          "description": "New internal domain slug (lowercase letters, numbers, \"-\"). \"-shop\" suffix is appended automatically unless already present."
        }
      }
    }
    arguments 15 lines
  • ecommerce_update-shop-site-status unknown never probed

    Changes the current shop's site visibility: - LIVE: published, publicly accessible - COMING_SOON: unpublished, placeholder page shown to visitors - PASSWORD_PROTECTED: visitors must enter the provided password to view the site Use this when a creator asks to publish/unpublish their site, take it live, set it to private/coming soon, hide it from visitors, or gate access behind a password. Confirm with the creator before calling — this is a user-visible state change. For PASSWORD_PROTECTED the `password` parameter is required; otherwise it is ignored. Returns the updated shop with the same shape as get-current-shop.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "status"
      ],
      "properties": {
        "status": {
          "type": "string",
          "description": "Target status: \"LIVE\", \"COMING_SOON\", or \"PASSWORD_PROTECTED\". Case-insensitive."
        },
        "password": {
          "type": "string",
          "description": "Password required when status is \"PASSWORD_PROTECTED\". Ignored for other statuses."
        }
      }
    }
    arguments 17 lines
  • ecommerce_get-user-connections unknown never probed

    Retrieves all shops associated with the current user's account. Returns: - shops: List of shops the user has access to, each with: - id (String): Shop ID - name (String): Shop name - baseUri (URI): Public shop URL (e.g., "https://myshop.fourthwall.com")

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [],
      "properties": {}
    }
    arguments 6 lines
  • ecommerce_edit-self-fulfilled-tracking unknown never probed

    Edits tracking information on existing self-fulfilled (creator-fulfilled) order fulfillments. Supports batch updates (up to 10). WHEN TO USE: A creator has shipped one or more existing self-fulfilled orders and you need to update the carrier and tracking number on the existing fulfillment. This tool cannot create new fulfillments — it only edits existing ones. INPUT FORMAT: Each entry is a pipe-delimited string with exactly 3 parts: fulfillmentId|trackingCompany|trackingNumber All 3 parts are required: - fulfillmentId: starts with "ful_" prefix (get it from "get-fulfillment-details") - trackingCompany: carrier name — one of: USPS, UPS, FedEx, DHL, Canada Post, Royal Mail, or other carrier - trackingNumber: the tracking number provided by the carrier EXAMPLES: - ["ful_abc123|USPS|9400111899223100001234"] - ["ful_abc123|USPS|9400111899223100001234", "ful_def456|FedEx|794644790138"] WHAT HAPPENS: The fulfillment transitions to PACKAGED status. A shipment tracker with a customer-visible tracking page URL is created in the background (not in this response). RETURNS: List of updated fulfillments with id, orderId, status, items, and shippingLabels. RELATED: Use "get-fulfillment-details" first to look up fulfillment IDs for an order.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "trackingEntries"
      ],
      "properties": {
        "trackingEntries": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Pipe-delimited tracking entries: 'fulfillmentId|trackingCompany|trackingNumber'. Example: ['ful_abc123|USPS|9400111899223100001234']. Max 10."
        }
      }
    }
    arguments 16 lines
  • ecommerce_cancel-order unknown never probed

    Cancel a full or partial order. IRREVERSIBLE. ALWAYS confirm with the user before calling. Before calling, use `get-order-cancellation-by-ids` to check eligibility: - For a full cancellation: `fullyCancellable` must be true. - For a partial cancellation: `partiallyCancellable` must be true; pass an `itemsToCancel` subset of `cancellableItems` (variantId + quantity). Omit `itemsToCancel` (or pass empty) to cancel the whole order. Payment handling — done automatically, no separate confirmation step: - If the shop's balance covers the refund, the refund is issued immediately (status = CANCELLED). - If the balance is insufficient, the shortfall is charged to the shop's card and the cancellation is queued (status = CHARGE_INITIATED). A background job finalizes the cancellation once the charge settles. If the charge fails, the cancellation is abandoned and the order stays open. The response fields `fromBalance`, `chargeAmount`, and `status` make this explicit. Always surface these to the user — especially `chargeAmount` when > 0. Permission: requires ORDER_WRITE role on the shop. Typical rejection reasons (returned as errors from the endpoint): - STATUS: order already cancelled, failed, etc. - IN_PRODUCTION_OR_DELIVERING: items in fulfillment - OLDER_THAN_ALLOWED_CANCELLATION_TIMEFRAME - CONTAINS_DIGITAL_ITEMS / GIFT_CARD_ALREADY_USED - REFUND_IN_PROGRESS: an existing refund is pending; wait or resolve first - ExpectedChargeAmountChanged: a rare race where the required charge changed between our estimate and submission; just retry.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "orderId"
      ],
      "properties": {
        "reason": {
          "type": "string",
          "description": "Reason for cancellation (visible to staff and in audit log)."
        },
        "orderId": {
          "type": "string",
          "description": "Order ID (order UUID, e.g. '8d79c46d-9a56-4266-885b-4b02a21aacd2'). Get it from get-orders or get-order-details-by-ids — not an 8-char friendly order token or a 'ful_...' fulfillment id."
        },
        "itemsToCancel": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "quantity",
              "variantId"
            ],
            "properties": {
              "quantity": {
                "type": "integer",
                "format": "int32"
              },
              "groupedId": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "variantId": {
                "type": "string"
              }
            }
          },
          "description": "Optional subset of items to cancel for a partial cancellation. Each entry: {variantId: UUID string, quantity: Int, groupedId: String? (optional)}. Copy variantId, quantity AND groupedId verbatim from `get-order-cancellation-by-ids` → `cancellableItems`; groupedId is required when present on the cancellable item, otherwise the item won't match. Omit (or pass empty) to cancel the entire order."
        },
        "restockCancelledItems": {
          "type": "boolean",
          "description": "Whether to return cancelled items to stock. Default: true."
        }
      }
    }
    arguments 47 lines
  • ecommerce_change-order-shipping-address unknown never probed

    Update the shipping address on an order. Only allowed before items enter production or shipping. The use case verifies: - Order status permits address changes (not in production/shipped/delivered/cancelled) - All items have `canUpdateAddress == true` for this issuer - Third-party fulfillment systems accept the update If the address is identical to the current one, the call is a no-op and returns the order unchanged. Emits `OrderAddressChangedEvent` on change. Permission: requires ORDER_WRITE role on the shop. Required fields: firstName, lastName, address1, city, country. Optional fields: address2, state, zip, phone. Returns the updated order summary (same shape as get-order-details-by-ids).

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "orderId",
        "firstName",
        "lastName",
        "address1",
        "city",
        "country"
      ],
      "properties": {
        "zip": {
          "type": "string",
          "description": "Postal/ZIP code. Max 20 chars."
        },
        "city": {
          "type": "string",
          "description": "City. Max 50 chars."
        },
        "phone": {
          "type": "string",
          "description": "Phone number. Max 50 chars."
        },
        "state": {
          "type": "string",
          "description": "State/province. Max 50 chars."
        },
        "country": {
          "type": "string",
          "description": "Country as ISO-3166 alpha-2 code — EXACTLY 2 uppercase letters. Examples: 'US' for United States, 'GB' for United Kingdom, 'DE' for Germany, 'CA' for Canada, 'AU' for Australia, 'JP' for Japan. Using a 3-letter code ('USA'), full name ('United States'), or lowercase will fail."
        },
        "orderId": {
          "type": "string",
          "description": "Order ID (order UUID, e.g. '8d79c46d-9a56-4266-885b-4b02a21aacd2'). Not an 8-char friendly order token or a 'ful_...' fulfillment id — resolve those via `search` or `get-orders` first."
        },
        "address1": {
          "type": "string",
          "description": "Street address line 1. Required, max 50 chars."
        },
        "address2": {
          "type": "string",
          "description": "Street address line 2 (apt, suite). Max 50 chars."
        },
        "lastName": {
          "type": "string",
          "description": "Recipient last name."
        },
        "firstName": {
          "type": "string",
          "description": "Recipient first name. Max 100 chars."
        }
      }
    }
    arguments 54 lines
  • ecommerce_get-order-cancellation-by-ids unknown never probed

    Get cancellation information for one or more orders by their IDs. Fetches all concurrently. Use this to check if orders are eligible for cancellation before attempting to cancel. Returns a list of cancellation responses, each containing: - Eligibility: fullyCancellable (boolean), partiallyCancellable (boolean) - notCancellableReason: why cancellation is blocked (STATUS, IN_PRODUCTION_OR_DELIVERING, OLDER_THAN_ALLOWED_CANCELLATION_TIMEFRAME, CONTAINS_DIGITAL_ITEMS, GIFT_CARD_ALREADY_USED, etc.) or null if cancellable - Refund: remainingRefundAmount + remainingRefundCurrency - cancellableItems: list with variantId, groupedId (nullable; needed verbatim for partial cancel), quantity, offerName, variantName, unitPrice, currency - nonCancellableItems: list with variantId, groupedId (nullable), quantity, reason (ORDER_NOT_CANCELLABLE, IN_PRODUCTION, IN_DELIVERY, etc.), offerName, variantName, unitPrice, currency

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "orderIds"
      ],
      "properties": {
        "orderIds": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "List of Order IDs. Format: order UUID strings (e.g., ['8d79c46d-9a56-4266-885b-4b02a21aacd2']). Max 10 IDs. Do NOT pass 8-char friendly order tokens or 'ful_...' fulfillment ids here — resolve them to an order UUID via `search` or `get-orders` first."
        }
      }
    }
    arguments 16 lines
  • ecommerce_get-orders unknown never probed

    List orders for the shop with filtering and pagination support. Returns a summary list of orders. Each order includes: - Identity: id (UUID), friendlyId (8-char alphanumeric, e.g. "T4YTE8HA"), status, fulfillmentStatus, type, salesChannel - Customer: customerEmail, customerName, message - Financial: amounts (merchandiseTotal, shippingTotal, taxTotal, discountTotal, orderTotal, paidByCustomer, totalRefunded, paidByCustomerFinal, currency, donation) - Shipping: shippingMethod - Items: list of items with offerName, variantName, variantId, quantity, unitPrice, isDigital - Cancelled items: same structure as items - Refund summary: hasRefunds, refundedViaCancel, refundedManually, individual refunds - Replacement info: type (SOURCE/REPLACEMENT), linked order IDs, reason - Timestamps: createdAt, updatedAt Note: This is a summary view. Fields like shipments, promotion, giftCards, profit, and customerPhone are only available via get-order-details-by-ids. IMPORTANT: To find a specific order by customer email, friendly ID, or keyword, you MUST use the `search` tool. NEVER paginate through results to find a specific entity. The 'q' parameter supports searching by: - Customer email address - Order number (friendlyId) - Customer name

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [],
      "properties": {
        "q": {
          "type": "string",
          "description": "Search query - can contain email, order number, customer name (min 3 chars)"
        },
        "page": {
          "type": "integer",
          "format": "int32",
          "description": "Page number (0-indexed). Always start with 0 for first page. Defaults to 0."
        },
        "size": {
          "type": "integer",
          "format": "int32",
          "description": "Page size - number of orders per page (max 10, values above 10 are clamped). Always use 5 unless user explicitly requests more. Defaults to 5."
        },
        "types": {
          "type": "array",
          "items": {
            "enum": [
              "COMMON",
              "GIFT",
              "CREATOR_BUDGET",
              "SAMPLE_ORDER_DEPRECATED"
            ],
            "type": "string"
          },
          "description": "Filter by order types: COMMON, GIFT, CREATOR_BUDGET"
        },
        "offerIds": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Filter by specific offer IDs. Format: UUID strings"
        },
        "statuses": {
          "type": "array",
          "items": {
            "enum": [
              "OPEN",
              "CONFIRMED",
              "PARTIALLY_IN_PRODUCTION",
              "IN_PRODUCTION",
              "PARTIALLY_SHIPPED",
              "SHIPPED",
              "PARTIALLY_DELIVERED",
              "DELIVERED",
              "COMPLETED",
              "ABANDONED",
              "CANCELLED",
              "FAILED"
            ],
            "type": "string"
          },
          "description": "Filter by order statuses: OPEN, CONFIRMED, PARTIALLY_IN_PRODUCTION, IN_PRODUCTION, PARTIALLY_SHIPPED, SHIPPED, PARTIALLY_DELIVERED, DELIVERED, COMPLETED, ABANDONED, CANCELLED, FAILED"
        },
        "salesChannel": {
          "type": "array",
          "items": {
            "enum": [
              "OnlineStore",
              "Meta",
              "TikTok",
              "ExternalMarketplace",
              "Ucp"
            ],
            "type": "string"
          },
          "description": "Filter by sales channels: OnlineStore, Meta, TikTok"
        },
        "updatedAtIsAfter": {
          "type": "string",
          "format": "date-time",
          "description": "Filter orders updated after this datetime (ISO 8601 format)"
        },
        "createdAtIsBefore": {
          "type": "string",
          "format": "date-time",
          "description": "Filter orders created before this datetime (ISO 8601 format)"
        },
        "showReplacementOrders": {
          "type": "boolean",
          "description": "Include replacement orders in results (default: false)"
        },
        "filterOutGiveawayGifts": {
          "type": "boolean",
          "description": "Exclude giveaway gift orders (default: false)"
        }
      }
    }
    arguments 94 lines
  • ecommerce_get-orders-statistics unknown never probed

    Get count of orders matching specific criteria. Returns the total number of orders matching the filters. Useful for: - Dashboard statistics - Counting orders by status - Monitoring order volume over time

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [],
      "properties": {
        "types": {
          "type": "array",
          "items": {
            "enum": [
              "COMMON",
              "GIFT",
              "CREATOR_BUDGET",
              "SAMPLE_ORDER_DEPRECATED"
            ],
            "type": "string"
          },
          "description": "Filter by order types (STANDARD, REPLACEMENT, GIFT, etc.)"
        },
        "statuses": {
          "type": "array",
          "items": {
            "enum": [
              "OPEN",
              "CONFIRMED",
              "PARTIALLY_IN_PRODUCTION",
              "IN_PRODUCTION",
              "PARTIALLY_SHIPPED",
              "SHIPPED",
              "PARTIALLY_DELIVERED",
              "DELIVERED",
              "COMPLETED",
              "ABANDONED",
              "CANCELLED",
              "FAILED"
            ],
            "type": "string"
          },
          "description": "Filter by order statuses (OPEN, FULFILLED, CANCELLED, etc.)"
        },
        "updatedAtIsAfter": {
          "type": "string",
          "format": "date-time",
          "description": "Filter orders updated after this datetime (ISO 8601 format)"
        }
      }
    }
    arguments 46 lines
  • ecommerce_get-unfulfilled-orders unknown never probed

    The creator's shipping queue: orders with self-fulfilled items they still have to ship (the dashboard's Orders > To be shipped page). Orders fulfilled by Fourthwall or a third-party provider are never in this queue. Use this, not get-orders with a status filter, for "pending orders", "orders to ship", "what do I need to fulfill". An order status such as CONFIRMED does not mean the creator still has to ship it. Returns: - total: number of orders in the queue - overdue: orders whose promised delivery window has already ended - approachingDeadline: orders whose promised delivery ends within the next few days - orders: one page of the queue, earliest delivery promise first. Each order has the get-orders summary fields plus deliveryPromisedFrom, deliveryPromisedTo and deliveryNotice (NORMAL, WARNING, OVERDUE)

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [],
      "properties": {
        "page": {
          "type": "integer",
          "format": "int32",
          "description": "Page number (0-indexed). Defaults to 0."
        },
        "size": {
          "type": "integer",
          "format": "int32",
          "description": "Page size (max 10, values above 10 are clamped). Defaults to 5."
        }
      }
    }
    arguments 17 lines
  • ecommerce_preview-cancel-cost unknown never probed

    Preview how a full or partial order cancellation would be paid for BEFORE calling `cancel-order`. Read-only. Pass `itemsToCancel` to preview a partial cancellation (subset of cancellable items from `get-order-cancellation-by-ids`). Omit it to preview a full-order cancellation. Returns the split between shop balance and card charge: - `fromBalance`: amount drawn from the shop's balance - `chargeAmount`: amount that would be charged to the shop's card on file - `requiresCharge`: shortcut for `chargeAmount > 0` - `maxRefundAvailable`: total refund the customer would receive Use this to tell the user ahead of time whether a card charge is required, and for how much, so they can confirm before `cancel-order` is called.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "orderId"
      ],
      "properties": {
        "orderId": {
          "type": "string",
          "description": "Order ID (order UUID, e.g. '8d79c46d-9a56-4266-885b-4b02a21aacd2'). Not an 8-char friendly order token or a 'ful_...' fulfillment id — resolve those via `search` or `get-orders` first."
        },
        "itemsToCancel": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "quantity",
              "variantId"
            ],
            "properties": {
              "quantity": {
                "type": "integer",
                "format": "int32"
              },
              "groupedId": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "variantId": {
                "type": "string"
              }
            }
          },
          "description": "Optional subset of items to cancel for a partial cancellation. Each entry: {variantId: UUID string, quantity: Int, groupedId: String? (optional)}. Copy variantId, quantity AND groupedId verbatim from `get-order-cancellation-by-ids` → `cancellableItems`; groupedId is required when present on the cancellable item, otherwise the item won't match. Omit (or pass empty) for a full-order cancellation."
        }
      }
    }
    arguments 39 lines
  • ecommerce_preview-refund-cost unknown never probed

    Preview how a refund would be paid for BEFORE calling `refund-order`. Read-only. Returns the split between shop balance and card charge: - `fromBalance`: amount drawn from the shop's balance - `chargeAmount`: amount charged to the shop's card on file - `requiresCharge`: shortcut for `chargeAmount > 0` Use this to tell the user how much (if anything) will hit their card before you call the destructive `refund-order`.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "orderId",
        "amount",
        "currency"
      ],
      "properties": {
        "amount": {
          "type": "number",
          "description": "Refund amount in major units (e.g. 12.50 = $12.50 USD, not cents). Positive decimal."
        },
        "orderId": {
          "type": "string",
          "description": "Order ID (order UUID, e.g. '8d79c46d-9a56-4266-885b-4b02a21aacd2'). Not an 8-char friendly order token or a 'ful_...' fulfillment id — resolve those via `search` or `get-orders` first."
        },
        "currency": {
          "enum": [
            "USD",
            "EUR",
            "CAD",
            "GBP",
            "AUD",
            "NZD",
            "SEK",
            "NOK",
            "DKK",
            "PLN",
            "INR",
            "JPY",
            "MYR",
            "SGD",
            "MXN",
            "BRL",
            "CHF",
            "IDR"
          ],
          "type": "string",
          "description": "ISO currency code. Must match the order's currency (orders are multi-currency — read the order to confirm before refunding)."
        }
      }
    }
    arguments 43 lines
  • ecommerce_refund-order unknown never probed

    Issue a refund on an order. IRREVERSIBLE. ALWAYS confirm with the user before calling. Refunds a specific amount to the customer via their original payment method. For itemized refunds (specific line items / shipping / tax / donation), use the web admin — this MCP tool only supports a total-amount refund. Payment handling — done automatically, no separate confirmation step: - If the shop's balance covers the refund, it is issued immediately and appears in the `pending` or `refunded` list. `chargeAmount` will be 0. - If the balance is insufficient, the shortfall is charged to the shop's card and the refund is queued in `initialized`. A background job finalizes the refund once the charge settles. If the charge fails, the refund is abandoned. - For PayPal / other providers that can't auto-refund, `manualRefundProvider` is set and the refund stays in `initialized`/`pending` until completed externally. Always surface `chargeAmount`, `fromBalance`, and `manualRefundProvider` to the user when non-zero / non-null. Validations enforced by the domain: - Order must have a refundable status (not cancelled, failed, etc.) - Amount must not exceed remainingRefundAmount - No duplicate: identical refund amount within protection window is rejected - No in-progress refund or dispute - ExpectedChargeAmountChanged: rare race where the required charge changed between our estimate and submission; just retry. Permission: requires ORDER_WRITE role.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "orderId",
        "amount",
        "currency"
      ],
      "properties": {
        "type": {
          "enum": [
            "OrderNotProduced",
            "CreatorCaused",
            "FourthwallCaused"
          ],
          "type": "string",
          "description": "Why the refund is being issued. Omit for default behavior. Values: `OrderNotProduced` — order was cancelled because it couldn't be manufactured or stock unavailable. `CreatorCaused` — creator's decision (e.g. customer complaint, goodwill, policy exception). `FourthwallCaused` — defect on Fourthwall's side; do NOT use from a creator-initiated request."
        },
        "amount": {
          "type": "number",
          "description": "Refund amount in MAJOR units (e.g. 12.50 means $12.50 USD, not 1250 cents). Positive decimal. Must not exceed the order's remaining refundable amount — call `preview-refund-cost` first if unsure."
        },
        "reason": {
          "type": "string",
          "description": "Reason for the refund. Max 1024 chars. Shown in audit log and customer emails."
        },
        "orderId": {
          "type": "string",
          "description": "Order ID (order UUID, e.g. '8d79c46d-9a56-4266-885b-4b02a21aacd2'). Not an 8-char friendly order token or a 'ful_...' fulfillment id — resolve those via `search` or `get-orders` first."
        },
        "currency": {
          "enum": [
            "USD",
            "EUR",
            "CAD",
            "GBP",
            "AUD",
            "NZD",
            "SEK",
            "NOK",
            "DKK",
            "PLN",
            "INR",
            "JPY",
            "MYR",
            "SGD",
            "MXN",
            "BRL",
            "CHF",
            "IDR"
          ],
          "type": "string",
          "description": "ISO currency code. Must match the order's currency (orders are multi-currency — read the order to confirm before refunding)."
        }
      }
    }
    arguments 56 lines
  • ecommerce_get-dns-entries unknown never probed

    Retrieves the DNS configuration and records for the shop's custom domain. This is a read-only check — it does NOT re-validate records against live DNS. To trigger a fresh validation, use validate-dns-entries instead. Returns null if no custom domain is configured, otherwise returns: - Domain: domainId, domain (e.g. "myshop.com") - Status: status (CONNECTED, NOT_CONNECTED, PARTIALLY_CONNECTED, SYNCING_YOUR_DOMAIN, REMOVAL_IN_PROGRESS) - Flags: areAllEntriesComplete (boolean), isSslSynced (boolean), retryAllowed (boolean) - Provider: dnsProvider (nullable String, e.g. "Cloudflare", "GoDaddy"), dnsProviderMode (MANUAL/AUTOMATIC, nullable) - Nameservers: nameservers (list of hostname strings) - Per record in records: - recordType (CNAME, TXT, MX, A) - host (nullable, e.g. "www", "@") - value (nullable, the expected DNS value) - status (VALID, INVALID, UNKNOWN) - validationError (nullable String — e.g. "RECORD_NOT_FOUND", "INCORRECT_TYPE_OR_VALUE (found: ...)", "DUPLICATED_BASE_DOMAIN (...)") - alias (identifies the record purpose, e.g. SHOP_IP_ADDRESS, SHOP_WWW_REDIRECT, SENDGRID_MAIL_CNAME, DMARC, SPF_RULE) - priority (nullable Int, for MX records) status values: - CONNECTED: All DNS records verified and SSL active - PARTIALLY_CONNECTED: Website records verified but other records (email, etc.) still pending - NOT_CONNECTED: Website DNS records not yet verified - SYNCING_YOUR_DOMAIN: Website records verified, waiting for SSL certificate provisioning - REMOVAL_IN_PROGRESS: Domain is being disconnected Use this tool to: - Check if a custom domain is set up for the shop - See the current domain connection status and SSL state - List DNS records that need to be configured at the domain registrar - Identify which specific records are failing (check record status + validationError) - Identify the DNS provider being used

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [],
      "properties": {}
    }
    arguments 6 lines
  • ecommerce_validate-dns-entries unknown never probed

    Triggers a fresh DNS validation by checking all configured records against live DNS and updates their verification status. Unlike get-dns-entries (which returns cached status), this tool performs real-time DNS lookups. Returns the same structure as get-dns-entries: - Domain: domainId, domain (e.g. "myshop.com") - Status: status (CONNECTED, NOT_CONNECTED, PARTIALLY_CONNECTED, SYNCING_YOUR_DOMAIN, REMOVAL_IN_PROGRESS) - Flags: areAllEntriesComplete (boolean), isSslSynced (boolean), retryAllowed (boolean) - Provider: dnsProvider (nullable String), dnsProviderMode (MANUAL/AUTOMATIC, nullable) - Nameservers: nameservers (list of hostname strings) - Per record in records: - recordType (CNAME, TXT, MX, A) - host (nullable), value (nullable) - status (VALID, INVALID, UNKNOWN) — freshly validated - validationError (nullable String — e.g. "RECORD_NOT_FOUND", "INCORRECT_TYPE_OR_VALUE (found: ...)") - alias (record purpose, e.g. SHOP_IP_ADDRESS, SHOP_WWW_REDIRECT, DMARC) - priority (nullable Int, for MX records) Use this tool when: - User reports their domain is not working after configuring DNS records - Need to refresh validation status (e.g. status was NOT_CONNECTED, user says they fixed it) - Troubleshooting specific record failures — check validationError for details - After user makes changes at their domain registrar and wants to verify - retryAllowed from get-dns-entries is true (status is NOT_CONNECTED or PARTIALLY_CONNECTED)

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [],
      "properties": {}
    }
    arguments 6 lines
  • ecommerce_bulk-update-offer-variant-prices unknown never probed

    Bulk-update the selling price and/or compare-at (strikethrough) price across an offer's variants. Call get-offers-by-ids-selective with VARIANTS first to see current variants and prices. Pick ONE mode: - UNIFORM — omit groupBy. Set `price` and/or `compareAtPrice` on every active variant. - BY ATTRIBUTE — set groupBy to SIZE/COLOR/CUSTOM and pass `priceUpdates` as an array of {attributeValue, price?, compareAtPrice?} entries. Variants whose attribute value is not in the array are left unchanged. Example priceUpdates: [{"attributeValue":"S","price":10.00},{"attributeValue":"L","price":20.00,"compareAtPrice":30.00}] Rules: - A price you leave out keeps its current value: omit `price` to change only the compare-at price, omit `compareAtPrice` to change only the selling price (the existing compare-at price is kept). - To remove compare-at prices, set `clearCompareAtPrice` to true and leave `compareAtPrice` out. - Uniform `price` and `priceUpdates` are mutually exclusive. - All prices are set in USD dollars, NOT cents (9.99 = $9.99). Shops price in USD; checkout handles currency conversion automatically. - `priceUpdates` is a plain JSON array, NOT a stringified JSON string.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "offerId"
      ],
      "properties": {
        "price": {
          "type": "number",
          "description": "UNIFORM mode: selling price for every active variant, in USD dollars (e.g., 9.99 = $9.99 — NOT cents). Omit to keep current selling prices, and when using priceUpdates."
        },
        "groupBy": {
          "enum": [
            "SIZE",
            "COLOR",
            "CUSTOM"
          ],
          "type": "string",
          "description": "BY-ATTRIBUTE mode: attribute type to group on. SIZE, COLOR, or CUSTOM. Omit for UNIFORM mode."
        },
        "offerId": {
          "type": "string",
          "description": "Offer ID containing the variants. Format: UUID string."
        },
        "priceUpdates": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "attributeValue"
            ],
            "properties": {
              "price": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "attributeValue": {
                "type": "string"
              },
              "compareAtPrice": {
                "type": [
                  "number",
                  "null"
                ]
              }
            }
          },
          "description": "BY-ATTRIBUTE mode: array of {attributeValue, price?, compareAtPrice?} entries. Required when groupBy is set. Each entry MUST include `attributeValue` (string, e.g. \"S\") and at least one of `price` / `compareAtPrice` (USD dollars, not cents); a price left out keeps its current value. Example: [{\"attributeValue\":\"S\",\"price\":10.00},{\"attributeValue\":\"L\",\"compareAtPrice\":30.00}]"
        },
        "compareAtPrice": {
          "type": "number",
          "description": "UNIFORM mode: compare-at price (strikethrough) for every active variant, in USD dollars. Omit to keep current compare-at prices."
        },
        "clearCompareAtPrice": {
          "type": "boolean",
          "description": "Set to true to remove the compare-at price from every updated variant. Leave compareAtPrice (and each entry's compareAtPrice) out when true."
        }
      }
    }
    arguments 61 lines
  • ecommerce_create-bundle unknown never probed

    Create a new bundle offer — a group of existing offers sold together at a combined price. The bundle starts in HIDDEN state. Use update-bundle to change status to PUBLIC when ready.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "name"
      ],
      "properties": {
        "name": {
          "type": "string",
          "description": "Bundle name (max 200 chars)"
        },
        "offerIds": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "List of Offer IDs to include in the bundle. Format: UUID strings. Can be added later via update-bundle."
        },
        "fixedPrice": {
          "type": "number",
          "description": "Fixed bundle price in USD dollars, NOT cents. Example: 49.99 = $49.99. Do NOT multiply by 100. Shops price in USD; checkout handles currency conversion automatically. Required when pricingStrategy is FIXED_PRICE."
        },
        "description": {
          "type": "string",
          "description": "Bundle description in HTML format"
        },
        "pricingStrategy": {
          "type": "string",
          "description": "Pricing strategy: SAME_AS_INDIVIDUAL (default), DISCOUNT_BASED, or FIXED_PRICE"
        },
        "discountPercentage": {
          "type": "number",
          "description": "Discount percentage (1-99). Required when pricingStrategy is DISCOUNT_BASED."
        }
      }
    }
    arguments 36 lines
  • ecommerce_create-combined-listing unknown never probed

    Create a combined listing — merges color variants from multiple offers (same product library) into one storefront product. Unlike bundles, combined listings share the same product library. All offers must have compatible colors (no duplicates). The listing starts in HIDDEN state. Use update-combined-listing to change status to PUBLIC when ready. Use validate-combined-listing first to check if offers are compatible.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "name"
      ],
      "properties": {
        "name": {
          "type": "string",
          "description": "Listing name (max 200 chars)"
        },
        "offerIds": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "List of Offer IDs to combine. Format: UUID strings. All must share the same product library and have unique colors."
        },
        "description": {
          "type": "string",
          "description": "Listing description in HTML format"
        }
      }
    }
    arguments 24 lines
  • ecommerce_duplicate-offer unknown never probed

    Create a copy of an existing offer (product). The duplicated offer will have a new ID and a modified slug (with a suffix). The duplicate starts in HIDDEN state so it won't be visible on the storefront until published.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "offerId"
      ],
      "properties": {
        "offerId": {
          "type": "string",
          "description": "Offer ID to duplicate. Format: UUID string."
        }
      }
    }
    arguments 13 lines
  • ecommerce_get-offers unknown never probed

    List the shop's own offers (products already added to the shop). These are the creator's products — NOT the product catalog. To browse source products to add, use get-catalog-products instead. Returns: - Pagination: pageNumber, pageSize, totalElements, totalPages - Per offer: - Identity: id (OfferId), customizationId (nullable CustomizationId — present for products with designs, use with inspect-design/edit-design tools), productId (ProductId), name, slug, description, offerType (STANDARD/COMBINED/MEMBERSHIP/BUNDLE/GIFT_CARD) - Status: status (PUBLIC/HIDDEN/ARCHIVED), available (boolean), fulfilledBy (CREATOR or FOURTHWALL), isDigital (boolean) - Images: primaryImageUrl (nullable), imageUrls (first 5 URLs, truncated), imageUrlsCount (total count) - Variants (first 10, truncated): id (OfferVariantId), name, sku, status (AVAILABLE/UNAVAILABLE/ARCHIVED), price (BigDecimal), compareAtPrice (nullable BigDecimal), currency, quantity (nullable Int), attributes (flat string like "Color: Red (#FF0000), Size: Large"), position, createdAt, updatedAt - variantsCount: total number of variants - Variant types: type (COLOR/SIZE/CUSTOM/MANUFACTURER_PREVIEW), title, options (list of option names) - Shipping: shipmentStartDate (nullable, human-readable e.g. "Ships in 5-10 business days"), requiresShipping - Sections: additionalSectionsCount (number of custom sections) - Digital files: digitalFiles (name) — files the buyer can download, empty when the offer has none - Membership: membershipRequirement (nullable — null, "ALL_TIERS", or "SELECTED_TIERS (id1, id2)") - Customs: customsHsCode (nullable), customsCountryOfOrigin (nullable Country code) - Timestamps: createdAt, updatedAt NOTE: imageUrls (max 5) and variants (max 10) are truncated for performance. Check imageUrlsCount/variantsCount for totals. NOTE: DEMO products are always excluded from results. IMPORTANT: To find a specific offer by name, slug, or keyword, you MUST use the `search` tool. NEVER paginate through results to find a specific entity.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [],
      "properties": {
        "page": {
          "type": "integer",
          "format": "int32",
          "description": "Page number (0-indexed). Always start with 0 for first page."
        },
        "size": {
          "type": "integer",
          "format": "int32",
          "description": "Page size - number of offers per page (max 10). Always use 5 unless user explicitly requests more."
        },
        "statuses": {
          "type": "array",
          "items": {
            "enum": [
              "PUBLIC",
              "HIDDEN",
              "ARCHIVED"
            ],
            "type": "string"
          },
          "description": "Status filters: PUBLIC, HIDDEN, ARCHIVED"
        },
        "available": {
          "type": "boolean",
          "description": "Filter by availability (true = in stock)"
        },
        "sortField": {
          "enum": [
            "UPDATED_AT",
            "CREATED_AT",
            "DEFAULT",
            "COLLECTION"
          ],
          "type": "string",
          "description": "Sort field: UPDATED_AT, CREATED_AT, COLLECTION, DEFAULT. DEFAULT uses collection 'All' order (same as Products > All in dashboard). Use CREATED_AT with DESC to get newest offers first."
        },
        "fulfilledBy": {
          "enum": [
            "CREATOR",
            "FOURTHWALL"
          ],
          "type": "string",
          "description": "Filter by fulfiller: CREATOR (self-fulfilled) or FOURTHWALL (fulfilled by Fourthwall)"
        },
        "searchPhrase": {
          "type": "string",
          "description": "Search phrase to filter by product name (min 3 chars)"
        },
        "sortDirection": {
          "enum": [
            "ASC",
            "DESC",
            "DEFAULT"
          ],
          "type": "string",
          "description": "Sort direction: ASC, DESC, DEFAULT"
        },
        "includeBundleProducts": {
          "type": "boolean",
          "description": "Include bundle products (default: false)"
        },
        "includeGiftCardProducts": {
          "type": "boolean",
          "description": "Include gift card products (default: false)"
        },
        "includeMembershipProducts": {
          "type": "boolean",
          "description": "Include membership products (default: false)"
        }
      }
    }
    arguments 76 lines
  • ecommerce_get-offers-by-ids unknown never probed

    Get full details of one or more shop offers (products) by their IDs. Fetches all offers concurrently. This returns the shop's own products — NOT catalog source products. Use get-catalog-products-by-slugs for source product details. Use get-offers to discover offer IDs if you don't have any. NOTE: DEMO products are always excluded from results. Returns a list of offers, each containing: - Identity: id (OfferId), productId (ProductId), name, slug, description, offerType (STANDARD/COMBINED/MEMBERSHIP/BUNDLE/GIFT_CARD) - Status: status (PUBLIC/HIDDEN/ARCHIVED), available (boolean), fulfilledBy (CREATOR or FOURTHWALL), isDigital (boolean) - Images: primaryImageUrl (nullable), imageUrls (first 5 URLs, truncated), imageUrlsCount (total count) - Variants (first 10, truncated): id (OfferVariantId), name, sku, status (AVAILABLE/UNAVAILABLE/ARCHIVED), price (BigDecimal), compareAtPrice (nullable BigDecimal), currency, quantity (nullable Int), attributes (flat string like "Color: Red (#FF0000), Size: Large"), position, createdAt, updatedAt - variantsCount: total number of variants - Variant types: type (COLOR/SIZE/CUSTOM/MANUFACTURER_PREVIEW), title, options (list of option names) - Shipping: shipmentStartDate (nullable, human-readable e.g. "Ships in 5-10 business days"), requiresShipping - Sections: additionalSectionsCount (number of custom sections) - Digital files: digitalFiles (name) — files the buyer can download, empty when the offer has none - Membership: membershipRequirement (nullable — null, "ALL_TIERS", or "SELECTED_TIERS (id1, id2)") - Customs: customsHsCode (nullable), customsCountryOfOrigin (nullable Country code) - Timestamps: createdAt, updatedAt

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "offerIds"
      ],
      "properties": {
        "offerIds": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "List of Offer IDs. Format: UUID strings (e.g., ['8d79c46d-9a56-4266-885b-4b02a21aacd2']). Max 10 IDs."
        }
      }
    }
    arguments 16 lines
  • ecommerce_update-bundle unknown never probed

    Update an existing bundle offer. Only provided fields are updated — omitted fields remain unchanged.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "bundleId"
      ],
      "properties": {
        "name": {
          "type": "string",
          "description": "New bundle name"
        },
        "status": {
          "enum": [
            "PUBLIC",
            "HIDDEN",
            "ARCHIVED"
          ],
          "type": "string",
          "description": "New status: PUBLIC, HIDDEN, or ARCHIVED"
        },
        "bundleId": {
          "type": "string",
          "description": "Bundle Offer ID. Format: UUID string."
        },
        "offerIds": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Replace bundled offer list. Format: list of UUID strings. Pass ALL offer IDs — this replaces the entire list."
        },
        "fixedPrice": {
          "type": "number",
          "description": "Fixed bundle price in USD dollars, NOT cents. Example: 49.99 = $49.99. Do NOT multiply by 100. Shops price in USD; checkout handles currency conversion automatically. Required when pricingStrategy is FIXED_PRICE."
        },
        "description": {
          "type": "string",
          "description": "New bundle description in HTML"
        },
        "markedAsSoldOut": {
          "type": "boolean",
          "description": "Mark as sold out (true/false)"
        },
        "pricingStrategy": {
          "type": "string",
          "description": "Pricing strategy: SAME_AS_INDIVIDUAL, DISCOUNT_BASED, or FIXED_PRICE"
        },
        "discountPercentage": {
          "type": "number",
          "description": "Discount percentage (1-99). Required when pricingStrategy is DISCOUNT_BASED."
        }
      }
    }
    arguments 53 lines
  • ecommerce_update-combined-listing unknown never probed

    Update an existing combined listing. Only provided fields are updated — omitted fields remain unchanged. IMPORTANT: When updating offerIds, pass the FULL list — it replaces the entire set. All offers must share the same product library with unique colors.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "combinedId"
      ],
      "properties": {
        "name": {
          "type": "string",
          "description": "New listing name"
        },
        "status": {
          "enum": [
            "PUBLIC",
            "HIDDEN",
            "ARCHIVED"
          ],
          "type": "string",
          "description": "New status: PUBLIC, HIDDEN, or ARCHIVED"
        },
        "offerIds": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Replace combined offer list. Format: list of UUID strings. Pass ALL offer IDs — this replaces the entire list."
        },
        "combinedId": {
          "type": "string",
          "description": "Combined listing Offer ID. Format: UUID string."
        },
        "description": {
          "type": "string",
          "description": "New listing description in HTML"
        },
        "markedAsSoldOut": {
          "type": "boolean",
          "description": "Mark as sold out (true/false)"
        }
      }
    }
    arguments 41 lines
  • ecommerce_update-offer unknown never probed

    Update an existing shop offer (product). Only provided fields are updated — omitted fields remain unchanged. IMPORTANT: Always fetch the current offer first with get-offers-by-ids to confirm the offer exists and review current values before updating.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "offerId"
      ],
      "properties": {
        "name": {
          "type": "string",
          "description": "New product name (max 200 chars)"
        },
        "offerId": {
          "type": "string",
          "description": "Offer ID to update. Format: UUID string (e.g., '8d79c46d-9a56-4266-885b-4b02a21aacd2')"
        },
        "description": {
          "type": "string",
          "description": "New product description in HTML (max 10000 chars)"
        },
        "membersOnly": {
          "type": "boolean",
          "description": "Make this a members-only product. true = requires any membership tier, false = removes membership restriction, null = no change"
        },
        "customsHsCode": {
          "type": "string",
          "description": "Harmonized System code for customs (e.g., '6109.10')"
        },
        "declareCreatorCost": {
          "type": "boolean",
          "description": "Whether creator declares their cost for this product"
        },
        "customsCountryOfOrigin": {
          "type": "string",
          "description": "ISO country code for country of origin (e.g., 'US', 'CN', 'DE')"
        },
        "requirePhoneNumberFromBuyer": {
          "type": "boolean",
          "description": "Require buyer's phone number at checkout"
        }
      }
    }
    arguments 41 lines
  • ecommerce_update-offer-slug unknown never probed

    Change the URL slug for an offer (product). The slug appears in the storefront URL (e.g., /products/{slug}). Use get-offers-by-ids first to see the current slug. Slug rules: - Lowercase letters, numbers, and hyphens only - No spaces or special characters - Must be unique within the shop (non-archived offers)

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "offerId",
        "newSlug"
      ],
      "properties": {
        "newSlug": {
          "type": "string",
          "description": "New URL slug (e.g., 'the-hollywoods-trucker-hat'). Lowercase, hyphens, no spaces."
        },
        "offerId": {
          "type": "string",
          "description": "Offer ID to update. Format: UUID string."
        }
      }
    }
    arguments 18 lines
  • ecommerce_update-offer-status unknown never probed

    Change an offer's visibility status and/or sold-out flag. At least one of status or available must be provided. Status options: - PUBLIC: Visible on storefront, purchasable (if available=true) - HIDDEN: Not visible on storefront but still exists, can be made public later - ARCHIVED: Soft delete — removes from storefront, no longer purchasable. Will fail if the offer is part of a bundle or combined offer. Sold-out toggle (available): - true: Mark as in stock (available for purchase) - false: Mark as sold out (not purchasable even if PUBLIC) - Not applicable when status=ARCHIVED (archived offers are always unavailable) IMPORTANT: Always fetch the current offer first with get-offers-by-ids to check current status and availability before changing.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "offerId"
      ],
      "properties": {
        "status": {
          "enum": [
            "PUBLIC",
            "HIDDEN",
            "ARCHIVED"
          ],
          "type": "string",
          "description": "New status: PUBLIC, HIDDEN, or ARCHIVED"
        },
        "offerId": {
          "type": "string",
          "description": "Offer ID to update. Format: UUID string."
        },
        "available": {
          "type": "boolean",
          "description": "Sold-out toggle: true = in stock, false = sold out. Not applicable when status=ARCHIVED."
        }
      }
    }
    arguments 26 lines
  • ecommerce_update-offer-variant unknown never probed

    Update a specific offer variant's price, compare-at price, weight, or SKU. Fields you leave out keep their current values. To remove the compare-at price, set `clearCompareAtPrice` to true. IMPORTANT: Always fetch the current offer first with get-offers-by-ids to review variant IDs and current values before updating.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "offerId",
        "variantId"
      ],
      "properties": {
        "sku": {
          "type": "string",
          "description": "Stock Keeping Unit identifier"
        },
        "price": {
          "type": "number",
          "description": "New selling price in USD dollars, NOT cents. Example: 30 = $30.00, 9.99 = $9.99. Do NOT multiply by 100. Shops price in USD; checkout handles currency conversion automatically."
        },
        "offerId": {
          "type": "string",
          "description": "Offer ID that contains the variant. Format: UUID string."
        },
        "variantId": {
          "type": "string",
          "description": "Offer Variant ID to update. Format: UUID string. Find this via get-offers-by-ids in the variants list."
        },
        "weightUnit": {
          "type": "string",
          "description": "Weight unit: OUNCE, POUND, GRAM, KILOGRAM. Required when weightValue is provided."
        },
        "weightValue": {
          "type": "number",
          "description": "Weight value (e.g., 4.0). Must be provided together with weightUnit."
        },
        "compareAtPrice": {
          "type": "number",
          "description": "Compare-at price (strikethrough original) in USD dollars, NOT cents. Set higher than price to display a discount. Omit to keep the current compare-at price."
        },
        "clearCompareAtPrice": {
          "type": "boolean",
          "description": "Set to true to remove the variant's compare-at price. Leave compareAtPrice out when true."
        }
      }
    }
    arguments 42 lines
  • ecommerce_validate-combined-listing unknown never probed

    Check if offers can be combined into a combined listing before creating one. All offers must share the same product library and have unique color variants. Returns canCombine (boolean) and per-offer eligibility with issues: - DIFFERENT_LIBRARY: offer has a different product library - DUPLICATE_COLOR: color variant conflicts with another offer - MISSING_PRODUCT: offer has no product assigned - ALREADY_SELECTED: candidate is already in the selected list

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "offerIds"
      ],
      "properties": {
        "offerIds": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "List of Offer IDs to validate for combining. Format: UUID strings."
        },
        "candidateOfferIds": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Additional candidate Offer IDs to check compatibility against the main list. Format: UUID strings."
        }
      }
    }
    arguments 23 lines
  • ecommerce_get-affiliate-earnings-report unknown never probed

    Get the Affiliate Earnings analytics report for the shop within a date range: confirmed affiliate referral bonus earnings. This report shows affiliate earnings over time with the following columns per row: - date: The time period - earnings: Total confirmed affiliate referral bonus earnings for this period (USD) - payout_count: Number of individual affiliate payout events in this period IMPORTANT - Aggregation precision selection: Each row represents one time unit. Choose the finest granularity that produces at most 31 rows: - HOUR: use only for ranges up to 31 hours (up to ~1 day) - DAY: use only for ranges up to 31 days (up to ~1 month) - WEEK: use only for ranges up to 31 weeks (up to ~7 months) - MONTH: use only for ranges up to 31 months (up to ~2.5 years) - QUARTER: use only for ranges up to 31 quarters (up to ~7 years) - YEAR: use for ranges longer than 31 quarters For example: "last 2 years" → MONTH (24 rows), "last week" → DAY (7 rows), "last 6 months" → WEEK (~26 rows), "today" → HOUR (24 rows), "last 5 years" → QUARTER (20 rows). Examples: - Monthly affiliate earnings for 2024: from="2024-01-01T00:00:00Z", to="2024-12-31T23:59:59Z", aggregationPrecision="MONTH" - Weekly affiliate earnings: from="2024-10-01T00:00:00Z", to="2024-12-31T23:59:59Z", aggregationPrecision="WEEK"

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "from",
        "to"
      ],
      "properties": {
        "to": {
          "type": "string",
          "description": "End of date range as ISO-8601 instant (e.g., '2024-12-31T23:59:59Z'). The minimum date range is 1 full day: from='2024-01-01T00:00:00Z' to='2024-01-01T23:59:59Z'."
        },
        "from": {
          "type": "string",
          "description": "Start of date range as ISO-8601 instant (e.g., '2024-01-01T00:00:00Z'). The minimum date range is 1 full day: from='2024-01-01T00:00:00Z' to='2024-01-01T23:59:59Z'."
        },
        "aggregationTimezone": {
          "type": "string",
          "description": "IANA timezone for date aggregation (e.g., 'America/New_York', 'UTC'). Defaults to UTC."
        },
        "aggregationPrecision": {
          "enum": [
            "HOUR",
            "DAY",
            "WEEK",
            "MONTH",
            "QUARTER",
            "YEAR"
          ],
          "type": "string",
          "description": "Time granularity: HOUR, DAY, WEEK, MONTH, QUARTER, YEAR. Defaults to DAY if omitted."
        }
      }
    }
    arguments 34 lines
  • ecommerce_get-average-order-value-report unknown never probed

    Get the Average Order Value analytics report for the shop within a date range: average transaction metrics over time. This report shows average order metrics over time with the following columns per row: - date: The time period - total_orders: Total number of orders - unique_customers: Number of customers who placed orders - avg_tx_value: Average amount paid by customer per order - avg_gross_revenue: Average profit value per order - avg_product_revenue: Average product sales price per order - avg_product_cost: Average declared cost of self-produced products per order - avg_shipping_revenue: Average shipping cost per order - avg_donation_revenue: Average donation value per order - avg_discount_amount: Average discount value per order - avg_taxes_amount: Average taxes amount per order - avg_fourthwall_product_costs: Average cost of manufacturing of Fourthwall products per order - avg_payment_processing_fees: Average payment processing fees per order Precision: choose finest granularity producing <=31 rows (HOUR for ~1d, DAY for ~1mo, WEEK for ~7mo, MONTH for ~2.5y, QUARTER for ~7y, YEAR beyond).

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "from",
        "to"
      ],
      "properties": {
        "to": {
          "type": "string",
          "description": "End of date range (ISO-8601 instant, e.g., '2024-12-31T23:59:59Z')"
        },
        "from": {
          "type": "string",
          "description": "Start of date range (ISO-8601 instant, e.g., '2024-01-01T00:00:00Z')"
        },
        "aggregationTimezone": {
          "type": "string",
          "description": "IANA timezone for date aggregation (e.g., 'America/New_York', 'UTC'). Defaults to UTC."
        },
        "aggregationPrecision": {
          "enum": [
            "HOUR",
            "DAY",
            "WEEK",
            "MONTH",
            "QUARTER",
            "YEAR"
          ],
          "type": "string",
          "description": "Time granularity: HOUR, DAY, WEEK, MONTH, QUARTER, YEAR. Defaults to DAY if omitted."
        }
      }
    }
    arguments 34 lines
  • ecommerce_get-contributions-per-type-report unknown never probed

    Get the Contributions Per Type analytics report for the shop within a date range: transaction count breakdown by contribution type. This report shows contribution counts over time with the following columns per row: - date: The time period - shop_orders: Number of shop orders - sample_orders: Number of sample orders - orders_twitch_gifts_purchases: Number of Twitch gifts purchases - orders_twitch_gifts_redeems: Number of Twitch gifts redeems - donations: Number of donations - giveaway_links: Number of giveaway links - memberships_subscriptions: Subscriptions = New subscriptions + Renewals + Upgrades - memberships_message_tips: Number of message tips - memberships_locked_messages: Number of locked messages - memberships_paid_posts: Number of paid posts - memberships_subscription_gifts: Number of subscription gifts - memberships_twitch_gifts: Number of Twitch gifts - total: Total contributions across all types Precision: choose finest granularity producing <=31 rows (HOUR for ~1d, DAY for ~1mo, WEEK for ~7mo, MONTH for ~2.5y, QUARTER for ~7y, YEAR beyond). Filter groups (pass comma-separated keys to include only specific metrics): - shop_metrics: shop_orders, sample_orders, orders_twitch_gifts_purchases, orders_twitch_gifts_redeems, donations, giveaway_links - memberships_metrics: memberships_subscriptions, memberships_message_tips, memberships_locked_messages, memberships_paid_posts, memberships_subscription_gifts, memberships_twitch_gifts

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "from",
        "to"
      ],
      "properties": {
        "to": {
          "type": "string",
          "description": "End of date range (ISO-8601 instant, e.g., '2024-12-31T23:59:59Z')"
        },
        "from": {
          "type": "string",
          "description": "Start of date range (ISO-8601 instant, e.g., '2024-01-01T00:00:00Z')"
        },
        "shopMetrics": {
          "type": "string",
          "description": "Shop metrics filter. Comma-separated values from: shop_orders, sample_orders, orders_twitch_gifts_purchases, orders_twitch_gifts_redeems, donations, giveaway_links. All included by default."
        },
        "membershipsMetrics": {
          "type": "string",
          "description": "Memberships metrics filter. Comma-separated values from: memberships_subscriptions, memberships_message_tips, memberships_locked_messages, memberships_paid_posts, memberships_subscription_gifts, memberships_twitch_gifts. All included by default."
        },
        "aggregationTimezone": {
          "type": "string",
          "description": "IANA timezone for date aggregation (e.g., 'America/New_York', 'UTC'). Defaults to UTC."
        },
        "aggregationPrecision": {
          "enum": [
            "HOUR",
            "DAY",
            "WEEK",
            "MONTH",
            "QUARTER",
            "YEAR"
          ],
          "type": "string",
          "description": "Time granularity: HOUR, DAY, WEEK, MONTH, QUARTER, YEAR. Defaults to DAY if omitted."
        }
      }
    }
    arguments 42 lines
  • ecommerce_get-conversion-rates-report unknown never probed

    Get the Conversion Rates analytics report for the shop within a date range: checkout funnel conversion metrics. This report shows conversion funnel data over time with the following columns per row: - date: The time period - total_sessions: Total number of user sessions adjusted to be at least as large as the number of carts created (baseline for conversion percentages, always 100%) - cart_created_count: Number of shopping carts created by users, including carts from gift and giveaway checkouts - cart_created_percentage: Percentage of sessions that resulted in cart creation - checkout_created_count: Number of initiated checkouts - checkout_created_percentage: Percentage of sessions that resulted in checkout initiation - checkout_paid_count: Number of completed payments - checkout_paid_percentage: Percentage of sessions that resulted in completed payment Precision: HOUR for ranges <=1 day, DAY for longer.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "from",
        "to"
      ],
      "properties": {
        "to": {
          "type": "string",
          "description": "End of date range (ISO-8601 instant, e.g., '2024-12-31T23:59:59Z')"
        },
        "from": {
          "type": "string",
          "description": "Start of date range (ISO-8601 instant, e.g., '2024-01-01T00:00:00Z')"
        },
        "aggregationTimezone": {
          "type": "string",
          "description": "IANA timezone for date aggregation (e.g., 'America/New_York', 'UTC'). Defaults to UTC."
        },
        "aggregationPrecision": {
          "enum": [
            "HOUR",
            "DAY"
          ],
          "type": "string",
          "description": "Time granularity. Only HOUR and DAY are supported for this report. Defaults to DAY if omitted."
        }
      }
    }
    arguments 30 lines
  • ecommerce_get-customers-over-time-report unknown never probed

    Get the Customers Over Time analytics report for the shop within a date range: customer acquisition and retention metrics. This report shows customer counts over time with the following columns per row: - date: The time period - customers_first_time: Number of customers making their first purchase in this period - customers_returning: Number of customers who have made purchases before this period - customers_total: Total unique customers (first-time + returning) Precision: choose finest granularity producing <=31 rows (HOUR for ~1d, DAY for ~1mo, WEEK for ~7mo, MONTH for ~2.5y, QUARTER for ~7y, YEAR beyond).

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "from",
        "to"
      ],
      "properties": {
        "to": {
          "type": "string",
          "description": "End of date range (ISO-8601 instant, e.g., '2024-12-31T23:59:59Z')"
        },
        "from": {
          "type": "string",
          "description": "Start of date range (ISO-8601 instant, e.g., '2024-01-01T00:00:00Z')"
        },
        "aggregationTimezone": {
          "type": "string",
          "description": "IANA timezone for date aggregation (e.g., 'America/New_York', 'UTC'). Defaults to UTC."
        },
        "aggregationPrecision": {
          "enum": [
            "HOUR",
            "DAY",
            "WEEK",
            "MONTH",
            "QUARTER",
            "YEAR"
          ],
          "type": "string",
          "description": "Time granularity: HOUR, DAY, WEEK, MONTH, QUARTER, YEAR. Defaults to DAY if omitted."
        }
      }
    }
    arguments 34 lines
  • ecommerce_get-membership-active-members-report unknown never probed

    Get the Membership Active Members analytics report for the shop within a date range: active membership tracking over time. This report shows active member counts over time with the following columns per row: - date: The time period - active: Number of active members (latest snapshot) - newly_subscribed: Number of newly subscribed members - returning: Number of returning members - cancelled: Number of cancelled members - migrated_to: Members that migrated from another tier (visible when a single tier is selected) - migrated_out: Members that migrated out to a different tier (visible when a single tier is selected) - change: Net change in active members. Formula: Change = Newly subscribed + Returning + Migrated to - Migrated out - Cancelled Precision: choose finest granularity producing <=31 rows (HOUR for ~1d, DAY for ~1mo, WEEK for ~7mo, MONTH for ~2.5y, QUARTER for ~7y, YEAR beyond). Filter groups (pass comma-separated keys to include only specific metrics): - subscription_cycles: annual, month. All included by default. Note: Membership tiers filter is also available but resolved dynamically at runtime based on the shop's configured tiers.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "from",
        "to"
      ],
      "properties": {
        "to": {
          "type": "string",
          "description": "End of date range (ISO-8601 instant, e.g., '2024-12-31T23:59:59Z')"
        },
        "from": {
          "type": "string",
          "description": "Start of date range (ISO-8601 instant, e.g., '2024-01-01T00:00:00Z')"
        },
        "subscriptionCycles": {
          "type": "string",
          "description": "Subscription cycle filter. Comma-separated values from: annual, month. All included by default."
        },
        "aggregationTimezone": {
          "type": "string",
          "description": "IANA timezone for date aggregation (e.g., 'America/New_York', 'UTC'). Defaults to UTC."
        },
        "aggregationPrecision": {
          "enum": [
            "HOUR",
            "DAY",
            "WEEK",
            "MONTH",
            "QUARTER",
            "YEAR"
          ],
          "type": "string",
          "description": "Time granularity: HOUR, DAY, WEEK, MONTH, QUARTER, YEAR. Defaults to DAY if omitted."
        }
      }
    }
    arguments 38 lines
  • ecommerce_get-membership-cancelled-members-report unknown never probed

    Get the Membership Cancelled Members analytics report for the shop within a date range: membership cancellation tracking over time. This report shows cancelled member counts over time with the following columns per row: - date: The time period - cancelled_members: Number of cancelled members Precision: choose finest granularity producing <=31 rows (HOUR for ~1d, DAY for ~1mo, WEEK for ~7mo, MONTH for ~2.5y, QUARTER for ~7y, YEAR beyond). Filter groups (pass comma-separated keys to include only specific metrics): - subscription_cycles: annual, month. All included by default. Note: Membership tiers filter is also available but resolved dynamically at runtime based on the shop's configured tiers.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "from",
        "to"
      ],
      "properties": {
        "to": {
          "type": "string",
          "description": "End of date range (ISO-8601 instant, e.g., '2024-12-31T23:59:59Z')"
        },
        "from": {
          "type": "string",
          "description": "Start of date range (ISO-8601 instant, e.g., '2024-01-01T00:00:00Z')"
        },
        "subscriptionCycles": {
          "type": "string",
          "description": "Subscription cycle filter. Comma-separated values from: annual, month. All included by default."
        },
        "aggregationTimezone": {
          "type": "string",
          "description": "IANA timezone for date aggregation (e.g., 'America/New_York', 'UTC'). Defaults to UTC."
        },
        "aggregationPrecision": {
          "enum": [
            "HOUR",
            "DAY",
            "WEEK",
            "MONTH",
            "QUARTER",
            "YEAR"
          ],
          "type": "string",
          "description": "Time granularity: HOUR, DAY, WEEK, MONTH, QUARTER, YEAR. Defaults to DAY if omitted."
        }
      }
    }
    arguments 38 lines
  • ecommerce_get-membership-free-accounts-report unknown never probed

    Get the Memberships Free Accounts analytics report for the shop within a date range: free account tracking over time. This report shows free account counts over time with the following columns per row: - date: The time period - free_accounts: Number of free accounts (latest snapshot) - free_sign_ups: Number of new free sign ups - upgraded_to_paid: Number of free accounts that upgraded to paid - downgraded_to_free: Number of paid accounts that downgraded to free - change: Net change in free account count. Formula: Change = Free sign ups - Upgraded to paid + Downgraded to free Precision: choose finest granularity producing <=31 rows (HOUR for ~1d, DAY for ~1mo, WEEK for ~7mo, MONTH for ~2.5y, QUARTER for ~7y, YEAR beyond).

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "from",
        "to"
      ],
      "properties": {
        "to": {
          "type": "string",
          "description": "End of date range (ISO-8601 instant, e.g., '2024-12-31T23:59:59Z')"
        },
        "from": {
          "type": "string",
          "description": "Start of date range (ISO-8601 instant, e.g., '2024-01-01T00:00:00Z')"
        },
        "aggregationTimezone": {
          "type": "string",
          "description": "IANA timezone for date aggregation (e.g., 'America/New_York', 'UTC'). Defaults to UTC."
        },
        "aggregationPrecision": {
          "enum": [
            "HOUR",
            "DAY",
            "WEEK",
            "MONTH",
            "QUARTER",
            "YEAR"
          ],
          "type": "string",
          "description": "Time granularity: HOUR, DAY, WEEK, MONTH, QUARTER, YEAR. Defaults to DAY if omitted."
        }
      }
    }
    arguments 34 lines
  • ecommerce_get-membership-mux-most-played-content-report unknown never probed

    Get the Memberships Mux Most Played Content analytics report for the shop within a date range: ranking of audio/video posts by play activity. Rows are a ranking of posts with the following columns per row: - post: Post title - avg_play_time_hours: Average play time per play event, in hours - total_play_time_hours: Total play time across all play events for this post, in hours - number_of_plays: Number of play events for this post Filter groups (pass comma-separated keys to include only specific post types): - post_types: audio, video. All included by default.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "from",
        "to"
      ],
      "properties": {
        "to": {
          "type": "string",
          "description": "End of date range (ISO-8601 instant, e.g., '2024-12-31T23:59:59Z')"
        },
        "from": {
          "type": "string",
          "description": "Start of date range (ISO-8601 instant, e.g., '2024-01-01T00:00:00Z')"
        },
        "postTypes": {
          "type": "string",
          "description": "Post type filter. Comma-separated values from: audio, video. All included by default."
        },
        "aggregationTimezone": {
          "type": "string",
          "description": "IANA timezone for date aggregation (e.g., 'America/New_York', 'UTC'). Defaults to UTC."
        }
      }
    }
    arguments 26 lines
  • ecommerce_get-membership-mux-number-of-plays-report unknown never probed

    Get the Memberships Mux Number of Plays analytics report for the shop within a date range: audio/video play events over time. This report shows play event counts over time with the following columns per row: - date: The time period - number_of_plays: Number of play events in this period Precision: choose finest granularity producing <=31 rows (HOUR for ~1d, DAY for ~1mo, WEEK for ~7mo, MONTH for ~2.5y, QUARTER for ~7y, YEAR beyond). Filter groups (pass comma-separated keys to include only specific post types): - post_types: audio, video. All included by default.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "from",
        "to"
      ],
      "properties": {
        "to": {
          "type": "string",
          "description": "End of date range (ISO-8601 instant, e.g., '2024-12-31T23:59:59Z')"
        },
        "from": {
          "type": "string",
          "description": "Start of date range (ISO-8601 instant, e.g., '2024-01-01T00:00:00Z')"
        },
        "postTypes": {
          "type": "string",
          "description": "Post type filter. Comma-separated values from: audio, video. All included by default."
        },
        "aggregationTimezone": {
          "type": "string",
          "description": "IANA timezone for date aggregation (e.g., 'America/New_York', 'UTC'). Defaults to UTC."
        },
        "aggregationPrecision": {
          "enum": [
            "HOUR",
            "DAY",
            "WEEK",
            "MONTH",
            "QUARTER",
            "YEAR"
          ],
          "type": "string",
          "description": "Time granularity: HOUR, DAY, WEEK, MONTH, QUARTER, YEAR. Defaults to DAY if omitted."
        }
      }
    }
    arguments 38 lines
  • ecommerce_get-membership-mux-total-play-time-report unknown never probed

    Get the Memberships Mux Total Play Time analytics report for the shop within a date range: audio/video watch/listen time over time. This report shows total play time over time with the following columns per row: - date: The time period - play_time_hours: Total play time in this period, in hours Precision: choose finest granularity producing <=31 rows (HOUR for ~1d, DAY for ~1mo, WEEK for ~7mo, MONTH for ~2.5y, QUARTER for ~7y, YEAR beyond). Filter groups (pass comma-separated keys to include only specific post types): - post_types: audio, video. All included by default.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "from",
        "to"
      ],
      "properties": {
        "to": {
          "type": "string",
          "description": "End of date range (ISO-8601 instant, e.g., '2024-12-31T23:59:59Z')"
        },
        "from": {
          "type": "string",
          "description": "Start of date range (ISO-8601 instant, e.g., '2024-01-01T00:00:00Z')"
        },
        "postTypes": {
          "type": "string",
          "description": "Post type filter. Comma-separated values from: audio, video. All included by default."
        },
        "aggregationTimezone": {
          "type": "string",
          "description": "IANA timezone for date aggregation (e.g., 'America/New_York', 'UTC'). Defaults to UTC."
        },
        "aggregationPrecision": {
          "enum": [
            "HOUR",
            "DAY",
            "WEEK",
            "MONTH",
            "QUARTER",
            "YEAR"
          ],
          "type": "string",
          "description": "Time granularity: HOUR, DAY, WEEK, MONTH, QUARTER, YEAR. Defaults to DAY if omitted."
        }
      }
    }
    arguments 38 lines
  • ecommerce_get-membership-new-members-report unknown never probed

    Get the Membership New Members analytics report for the shop within a date range: new member acquisition over time. This report shows new member counts over time with the following columns per row: - date: The time period - new_members: Number of new members Precision: choose finest granularity producing <=31 rows (HOUR for ~1d, DAY for ~1mo, WEEK for ~7mo, MONTH for ~2.5y, QUARTER for ~7y, YEAR beyond). Filter groups (pass comma-separated keys to include only specific metrics): - subscription_cycles: annual, month. All included by default. Note: Membership tiers filter is also available but resolved dynamically at runtime based on the shop's configured tiers.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "from",
        "to"
      ],
      "properties": {
        "to": {
          "type": "string",
          "description": "End of date range (ISO-8601 instant, e.g., '2024-12-31T23:59:59Z')"
        },
        "from": {
          "type": "string",
          "description": "Start of date range (ISO-8601 instant, e.g., '2024-01-01T00:00:00Z')"
        },
        "subscriptionCycles": {
          "type": "string",
          "description": "Subscription cycle filter. Comma-separated values from: annual, month. All included by default."
        },
        "aggregationTimezone": {
          "type": "string",
          "description": "IANA timezone for date aggregation (e.g., 'America/New_York', 'UTC'). Defaults to UTC."
        },
        "aggregationPrecision": {
          "enum": [
            "HOUR",
            "DAY",
            "WEEK",
            "MONTH",
            "QUARTER",
            "YEAR"
          ],
          "type": "string",
          "description": "Time granularity: HOUR, DAY, WEEK, MONTH, QUARTER, YEAR. Defaults to DAY if omitted."
        }
      }
    }
    arguments 38 lines
  • ecommerce_get-membership-post-statistics-report unknown never probed

    Get the Membership Post Statistics analytics report for a single audio/video/live-stream post within a date range: engagement and playback metrics over time. This report shows per-post engagement over time with the following columns per row: - date: The time period - views: Number of post views - comments: Number of comments - likes: Number of likes - play_time_hours: Total play time in this period, in hours Precision: choose finest granularity producing <=31 rows (HOUR for ~1d, DAY for ~1mo, WEEK for ~7mo, MONTH for ~2.5y, QUARTER for ~7y, YEAR beyond). A postId is required — this report is always scoped to a single post.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "from",
        "to",
        "postId"
      ],
      "properties": {
        "to": {
          "type": "string",
          "description": "End of date range (ISO-8601 instant, e.g., '2024-12-31T23:59:59Z')"
        },
        "from": {
          "type": "string",
          "description": "Start of date range (ISO-8601 instant, e.g., '2024-01-01T00:00:00Z')"
        },
        "postId": {
          "type": "string",
          "description": "ID of the audio, video, or live-stream membership post to report on."
        },
        "aggregationTimezone": {
          "type": "string",
          "description": "IANA timezone for date aggregation (e.g., 'America/New_York', 'UTC'). Defaults to UTC."
        },
        "aggregationPrecision": {
          "enum": [
            "HOUR",
            "DAY",
            "WEEK",
            "MONTH",
            "QUARTER",
            "YEAR"
          ],
          "type": "string",
          "description": "Time granularity: HOUR, DAY, WEEK, MONTH, QUARTER, YEAR. Defaults to DAY if omitted."
        }
      }
    }
    arguments 39 lines
  • ecommerce_get-membership-tier-activity-report unknown never probed

    Get the Memberships Tier Activity analytics report for the shop within a date range: member migration between tiers. This report shows tier migration activity with the following columns per row: - migrated_from_to: Migration path showing source and destination tiers (e.g., "Tier A -> Tier B") - quantity: Number of members who migrated Filter groups (pass comma-separated keys to include only specific metrics): - subscription_cycles: annual, month. All included by default.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "from",
        "to"
      ],
      "properties": {
        "to": {
          "type": "string",
          "description": "End of date range (ISO-8601 instant, e.g., '2024-12-31T23:59:59Z')"
        },
        "from": {
          "type": "string",
          "description": "Start of date range (ISO-8601 instant, e.g., '2024-01-01T00:00:00Z')"
        },
        "subscriptionCycles": {
          "type": "string",
          "description": "Subscription cycle filter. Comma-separated values from: annual, month. All included by default."
        },
        "aggregationTimezone": {
          "type": "string",
          "description": "IANA timezone for date aggregation (e.g., 'America/New_York', 'UTC'). Defaults to UTC."
        }
      }
    }
    arguments 26 lines
  • ecommerce_get-membership-top-tiers-by-new-members-report unknown never probed

    Get the Memberships Top Tiers by New Members analytics report for the shop within a date range: tier ranking by new member acquisition. This report shows a ranking of membership tiers with the following columns per row: - tier: Membership tier name - members: Number of new members in this tier Filter groups (pass comma-separated keys to include only specific metrics): - subscription_cycles: annual, month. All included by default.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "from",
        "to"
      ],
      "properties": {
        "to": {
          "type": "string",
          "description": "End of date range (ISO-8601 instant, e.g., '2024-12-31T23:59:59Z')"
        },
        "from": {
          "type": "string",
          "description": "Start of date range (ISO-8601 instant, e.g., '2024-01-01T00:00:00Z')"
        },
        "subscriptionCycles": {
          "type": "string",
          "description": "Subscription cycle filter. Comma-separated values from: annual, month. All included by default."
        },
        "aggregationTimezone": {
          "type": "string",
          "description": "IANA timezone for date aggregation (e.g., 'America/New_York', 'UTC'). Defaults to UTC."
        }
      }
    }
    arguments 26 lines
  • ecommerce_get-payment-method-used-report unknown never probed

    Get the Payment Method Used analytics report for the shop within a date range: order distribution by payment method. This report shows a breakdown of payment methods with the following columns per row: - payment_method: Payment method name - total: Number of orders using this payment method - percentage: Percentage of total orders using this payment method

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "from",
        "to"
      ],
      "properties": {
        "to": {
          "type": "string",
          "description": "End of date range (ISO-8601 instant, e.g., '2024-12-31T23:59:59Z')"
        },
        "from": {
          "type": "string",
          "description": "Start of date range (ISO-8601 instant, e.g., '2024-01-01T00:00:00Z')"
        },
        "aggregationTimezone": {
          "type": "string",
          "description": "IANA timezone for date aggregation (e.g., 'America/New_York', 'UTC'). Defaults to UTC."
        }
      }
    }
    arguments 22 lines
  • ecommerce_get-sales-by-country-report unknown never probed

    Get the Sales by Country analytics report for the shop within a date range: revenue and profit breakdown by customer country with optional state-level detail. Rows are hierarchical: each top-level row is a country aggregate with totals. When a country has orders from multiple states, state-level detail rows are nested in `other_rows`, sorted by gross sales descending. Columns per row: - country_or_state: For top-level rows, the customer country code (null for donations). For nested rows under a country, the state label — full name for US states (e.g., "California", "New York"), raw code for non-US, or "Unknown" when the state is not available. - country: The customer country code (null for donations). For nested rows, this is the parent country code — same as the aggregate row. Always hidden in the UI, but always present in the JSON response. - contributions: Number of orders - income: Amount of money spent across transactions before any deductions - costs: Total costs with breakdown (costs.value = total, costs.elements contains: product_costs, fulfillment_fees, shipping_costs, taxes, payment_processing_fees, inventory_storage_fees, membership_fees, giveaway_costs, donation_costs, ait_costs) - profit: Net profit (Profit = Gross sales - Costs)

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "from",
        "to"
      ],
      "properties": {
        "to": {
          "type": "string",
          "description": "End of date range (ISO-8601 instant, e.g., '2024-12-31T23:59:59Z')"
        },
        "from": {
          "type": "string",
          "description": "Start of date range (ISO-8601 instant, e.g., '2024-01-01T00:00:00Z')"
        },
        "aggregationTimezone": {
          "type": "string",
          "description": "IANA timezone for date aggregation (e.g., 'America/New_York', 'UTC'). Defaults to UTC."
        }
      }
    }
    arguments 22 lines
  • ecommerce_get-sales-by-source-report unknown never probed

    Get the Sales by Source analytics report for the shop within a date range: revenue breakdown by traffic source or social platform. This report shows a breakdown of sales with the following columns per row: - source: Sales origin, identifying whether it came from website traffic (e.g., direct, referral, search) or from a social platform - total_sales: Total sales amount Precision: HOUR for ranges <=1 day, DAY for longer. Filter groups: - source_dimension: Group by dimension. One of: traffic_source, social_platform. Default: traffic_source.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "from",
        "to"
      ],
      "properties": {
        "to": {
          "type": "string",
          "description": "End of date range (ISO-8601 instant, e.g., '2024-12-31T23:59:59Z')"
        },
        "from": {
          "type": "string",
          "description": "Start of date range (ISO-8601 instant, e.g., '2024-01-01T00:00:00Z')"
        },
        "sourceDimension": {
          "type": "string",
          "description": "Group by dimension. One of: traffic_source, social_platform. Default: traffic_source."
        },
        "aggregationTimezone": {
          "type": "string",
          "description": "IANA timezone for date aggregation (e.g., 'America/New_York', 'UTC'). Defaults to UTC."
        },
        "aggregationPrecision": {
          "enum": [
            "HOUR",
            "DAY"
          ],
          "type": "string",
          "description": "Time granularity. Only HOUR and DAY are supported for this report. Defaults to DAY if omitted."
        }
      }
    }
    arguments 34 lines
  • ecommerce_get-sales-by-utm-report unknown never probed

    Get the Sales by UTM Parameters analytics report for the shop within a date range: revenue and contribution tracking by UTM campaign parameters. This report shows sales attributed to UTM parameters with the following columns per row: - date: The time period - utm_source: The source of traffic (e.g., google, facebook, newsletter) - utm_medium: The marketing medium (e.g., cpc, email, social) - utm_campaign: The campaign name or identifier - utm_content: Used to differentiate similar content or links within the same ad - utm_term: Keywords for paid search campaigns - contributions: Total number of unique transactions with these UTM parameters - total_sales: Sum of all revenue attributed to these UTM parameters Precision: choose finest granularity producing <=31 rows (HOUR for ~1d, DAY for ~1mo, WEEK for ~7mo, MONTH for ~2.5y, QUARTER for ~7y, YEAR beyond). Filter groups (pass comma-separated keys to include only specific metrics): - filter_group: orders, memberships, donations

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "from",
        "to"
      ],
      "properties": {
        "to": {
          "type": "string",
          "description": "End of date range (ISO-8601 instant, e.g., '2024-12-31T23:59:59Z')"
        },
        "from": {
          "type": "string",
          "description": "Start of date range (ISO-8601 instant, e.g., '2024-01-01T00:00:00Z')"
        },
        "filterGroup": {
          "type": "string",
          "description": "Filter group. Comma-separated values from: orders, memberships, donations. All included by default."
        },
        "aggregationTimezone": {
          "type": "string",
          "description": "IANA timezone for date aggregation (e.g., 'America/New_York', 'UTC'). Defaults to UTC."
        },
        "aggregationPrecision": {
          "enum": [
            "HOUR",
            "DAY",
            "WEEK",
            "MONTH",
            "QUARTER",
            "YEAR"
          ],
          "type": "string",
          "description": "Time granularity: HOUR, DAY, WEEK, MONTH, QUARTER, YEAR. Defaults to DAY if omitted."
        }
      }
    }
    arguments 38 lines
  • ecommerce_get-sessions-by-source-report unknown never probed

    Get the Sessions by Source analytics report for the shop within a date range: session count breakdown by traffic source or social platform. This report shows a breakdown of sessions with the following columns per row: - source: Session origin, identifying whether it came from website traffic (e.g., direct, referral, search) or from a social platform - session_count: Total number of sessions from this source Precision: HOUR for ranges <=1 day, DAY for longer. Filter groups: - source_dimension: Group by dimension. One of: traffic_source, social_platform. Default: traffic_source.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "from",
        "to"
      ],
      "properties": {
        "to": {
          "type": "string",
          "description": "End of date range (ISO-8601 instant, e.g., '2024-12-31T23:59:59Z')"
        },
        "from": {
          "type": "string",
          "description": "Start of date range (ISO-8601 instant, e.g., '2024-01-01T00:00:00Z')"
        },
        "sourceDimension": {
          "type": "string",
          "description": "Group by dimension. One of: traffic_source, social_platform. Default: traffic_source."
        },
        "aggregationTimezone": {
          "type": "string",
          "description": "IANA timezone for date aggregation (e.g., 'America/New_York', 'UTC'). Defaults to UTC."
        },
        "aggregationPrecision": {
          "enum": [
            "HOUR",
            "DAY"
          ],
          "type": "string",
          "description": "Time granularity. Only HOUR and DAY are supported for this report. Defaults to DAY if omitted."
        }
      }
    }
    arguments 34 lines
  • ecommerce_get-top-products-by-units-sold-report unknown never probed

    Get the Top Products by Units Sold analytics report for the shop within a date range: best-selling products ranked by quantity. This report shows a ranking of products with the following columns per row: - product: Product name - units_sold: Number of units sold - orders: Number of unique orders containing this product - gross_sales: Revenue before deductions - discounts: Discount amount - net_sales: Revenue after deductions. Formula: Net sales = Gross sales - Discounts - product_cost: Cost of self-produced products as declared by you - costs: Total costs including product costs, fulfillment fees, shipping costs, taxes, and payment processing fees (with breakdown: product costs, fulfillment fees, shipping costs, taxes, custom duty cost, payment processing fees) - profit: Profit after all Fourthwall costs. Formula: Profit = Net sales - Costs (shows change) - gross_margin: Profitability as percentage of revenue. Formula: Gross margin = Profit / Gross sales × 100 (shows change) - net_profit: Profit after declared product costs. Formula: Net profit = Profit - Product cost (shows change) - net_margin: Net profitability as percentage of revenue. Formula: Net margin = Net profit / Gross sales × 100 (shows change) Filter groups (all default to false/unfiltered, pass comma-separated keys to include only specific items): - product_type: physical_products, digital_products - fulfillment_type: fourthwall_fulfilled, self_fulfilled - show_product_with_no_sales: products_with_no_sales Examples: - Top products for 2024: from="2024-01-01T00:00:00Z", to="2024-12-31T23:59:59Z" - Top physical products only: from="2024-01-01T00:00:00Z", to="2024-12-31T23:59:59Z", productType="physical_products" - Top products including zero sales: from="2024-01-01T00:00:00Z", to="2024-12-31T23:59:59Z", showProductWithNoSales="products_with_no_sales"

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "from",
        "to"
      ],
      "properties": {
        "to": {
          "type": "string",
          "description": "End of date range as ISO-8601 instant (e.g., '2024-12-31T23:59:59Z')"
        },
        "from": {
          "type": "string",
          "description": "Start of date range as ISO-8601 instant (e.g., '2024-01-01T00:00:00Z')"
        },
        "productType": {
          "type": "string",
          "description": "Product type filter. Comma-separated values from: physical_products, digital_products. All included by default."
        },
        "fulfillmentType": {
          "type": "string",
          "description": "Fulfilment type filter. Comma-separated values from: fourthwall_fulfilled, self_fulfilled. All included by default."
        },
        "aggregationTimezone": {
          "type": "string",
          "description": "IANA timezone for date aggregation (e.g., 'America/New_York', 'UTC'). Defaults to UTC."
        },
        "showProductWithNoSales": {
          "type": "string",
          "description": "Show products with no sales filter. Comma-separated values from: products_with_no_sales. All included by default."
        }
      }
    }
    arguments 34 lines
  • ecommerce_get-total-profit-report unknown never probed

    Get the Total Profit analytics report for the shop within a date range: total amount earned from all sales. This report shows profitability over time with the following columns per row: - date: The time period - gross_sales: Amount spent across transactions before deductions - discounts: Total discount amounts applied - costs: Total costs (with breakdown: product costs, fulfillment fees, shipping costs, taxes, custom duty cost, payment processing fees, inventory storage fees, membership fees, giveaway costs, donation costs, AIT costs) - cancels: Amount refunded from cancelled transactions - refunds: Amount refunded from non-cancelled transactions - profit: Gross sales - Discounts - Costs - Refunds - Cancels Precision: choose finest granularity producing <=31 rows (HOUR for ~1d, DAY for ~1mo, WEEK for ~7mo, MONTH for ~2.5y, QUARTER for ~7y, YEAR beyond). Filter groups (all default to true, pass comma-separated keys to include only specific metrics): - shop_metrics: orders, donations, giveaway_links, manual_charges, twitch_gifts - membership_metrics: memberships_subscriptions, memberships_message_tips, memberships_locked_messages, memberships_paid_posts, memberships_subscription_gifts, memberships_twitch_gifts

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "from",
        "to"
      ],
      "properties": {
        "to": {
          "type": "string",
          "description": "End of date range (ISO-8601 instant, e.g., '2024-12-31T23:59:59Z')"
        },
        "from": {
          "type": "string",
          "description": "Start of date range (ISO-8601 instant, e.g., '2024-01-01T00:00:00Z')"
        },
        "shopMetrics": {
          "type": "string",
          "description": "Shop metrics filter. Comma-separated values from: orders, donations, giveaway_links, manual_charges, twitch_gifts. All included by default."
        },
        "membershipMetrics": {
          "type": "string",
          "description": "Membership metrics filter. Comma-separated values from: memberships_subscriptions, memberships_message_tips, memberships_locked_messages, memberships_paid_posts, memberships_subscription_gifts, memberships_twitch_gifts. All included by default."
        },
        "aggregationTimezone": {
          "type": "string",
          "description": "IANA timezone for date aggregation (e.g., 'America/New_York', 'UTC'). Defaults to UTC."
        },
        "aggregationPrecision": {
          "enum": [
            "HOUR",
            "DAY",
            "WEEK",
            "MONTH",
            "QUARTER",
            "YEAR"
          ],
          "type": "string",
          "description": "Time granularity: HOUR, DAY, WEEK, MONTH, QUARTER, YEAR. Defaults to DAY if omitted."
        }
      }
    }
    arguments 42 lines
  • ecommerce_get-visitors-report unknown never probed

    Get the Visitors analytics report for the shop within a date range: unique visitor traffic data. This report shows visitor traffic over time with the following columns per row: - date: The time period - unique_visitors: Number of unique visitors to your shop. Includes predicted values for future time periods based on historical trends. - is_prediction: Indicates whether this data is real (false) or a predicted value based on historical trends (true) Precision: HOUR for ranges <=1 day, DAY for longer.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "from",
        "to"
      ],
      "properties": {
        "to": {
          "type": "string",
          "description": "End of date range (ISO-8601 instant, e.g., '2024-12-31T23:59:59Z')"
        },
        "from": {
          "type": "string",
          "description": "Start of date range (ISO-8601 instant, e.g., '2024-01-01T00:00:00Z')"
        },
        "aggregationTimezone": {
          "type": "string",
          "description": "IANA timezone for date aggregation (e.g., 'America/New_York', 'UTC'). Defaults to UTC."
        },
        "aggregationPrecision": {
          "enum": [
            "HOUR",
            "DAY"
          ],
          "type": "string",
          "description": "Time granularity. Only HOUR and DAY are supported for this report. Defaults to DAY if omitted."
        }
      }
    }
    arguments 30 lines
  • ecommerce_activate-promotion unknown never probed

    Reactivate a promotion (set status to LIVE). Only works for ENDED promotions. Cannot activate ARCHIVED or ALL_USED promotions. Use when a shop owner wants to re-enable a previously deactivated discount code.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "promotionId"
      ],
      "properties": {
        "promotionId": {
          "type": "string",
          "description": "Promotion ID to activate (e.g. 'prm_abc123')"
        }
      }
    }
    arguments 13 lines
  • ecommerce_create-membership-promotion unknown never probed

    Create a membership discount code (percentage off membership subscription). ⚠ NOT SUPPORTED — do NOT promise these to the user: expiration / end date / start date / scheduled activation. There is no time-based field. `durationCharges` is the number of BILLING CYCLES the discount applies for (not a calendar date). To stop a code, use deactivate-promotion. DELIVERY MODE — provide exactly one: • code: single promo code (e.g. "MEMBER20") — most common • codes: list of bulk codes for multi-code promotions REQUIRED: • percentage (1-100): discount percentage • subscriptionType: ALL_MEMBERS | MONTHLY_ONLY | ANNUAL_ONLY OPTIONAL: • tierIds: restrict to specific membership tier IDs (null = all tiers). • durationCharges: how many billing cycles the discount lasts (1-1000). Null = lifetime (discount applies to every cycle, never auto-stops). • newMembersOnly: only new members can use this code (default false) • limitToSingleUse: limit code to one total redemption (default false) Examples: • 20% off all members for life: code="MEMBER20", percentage=20, subscriptionType="ALL_MEMBERS" • 50% off first 3 cycles, annual only: code="ANNUAL50", percentage=50, subscriptionType="ANNUAL_ONLY", durationCharges=3 • Bulk codes for new monthly members: codes=["NEW1","NEW2"], percentage=30, subscriptionType="MONTHLY_ONLY", newMembersOnly=true

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "percentage",
        "subscriptionType"
      ],
      "properties": {
        "code": {
          "type": "string",
          "description": "Single promo code (auto-uppercased). Provide for single-code promotions."
        },
        "codes": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "List of promo codes for bulk promotions. Codes share the same settings."
        },
        "tierIds": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Membership tier IDs to restrict to (null = all tiers)."
        },
        "percentage": {
          "type": "integer",
          "format": "int32",
          "description": "Discount percentage (1-100)"
        },
        "newMembersOnly": {
          "type": "boolean",
          "description": "Only allow new members to use this code (default false)"
        },
        "durationCharges": {
          "type": "integer",
          "format": "int32",
          "description": "Number of billing cycles the discount lasts (1-1000). Null = lifetime (never expires)."
        },
        "limitToSingleUse": {
          "type": "boolean",
          "description": "Limit this code to a single total redemption (default false)"
        },
        "subscriptionType": {
          "type": "string",
          "description": "Who can use this code: ALL_MEMBERS, MONTHLY_ONLY, or ANNUAL_ONLY"
        }
      }
    }
    arguments 50 lines
  • ecommerce_create-shop-promotion unknown never probed

    Create a shop discount promotion. ⚠ Use ONLY the parameter names declared on this tool — do not invent or paraphrase. For an entire-order discount, OMIT `productIds` (there is no `appliesTo` parameter). ⚠ NOT SUPPORTED — do NOT promise these to the user, even if help articles imply otherwise: • Expiration / end date / start date / scheduled activation — there is no time-based field. To stop a promotion, use deactivate-promotion. To cap total usage, set `maxUses`. • Stacking rules, per-product discount tiers, BOGO without using FREE_PRODUCTS. All monetary amounts are set in USD dollars (NOT cents) — shops price in USD; checkout handles per-customer currency conversion automatically. RECIPES (each line shows the required fields per discountType): • 10% off all orders: { discountType: "PERCENTAGE", code: "SAVE10", percentage: 10 } • $10 off + free shipping: { discountType: "FIXED_AMOUNT", code: "TAKE10", amount: 10, freeShipping: true } • Free shipping: { discountType: "FREE_SHIPPING", code: "SHIPFREE" } • Free product: { discountType: "FREE_PRODUCTS", code: "FREEGIFT", freeVariantId: "<variant-uuid>" } • Bulk codes: replace `code` with `codes: ["VIP1","VIP2"]`. Auto-apply: replace `code` with `autoApplyTitle: "Summer Sale"`. COMMON OPTIONS (all types): • productIds: restrict to specific offer IDs. OMIT for entire-order (default). • freeShipping: bundle free shipping (PERCENTAGE, FIXED_AMOUNT, FREE_PRODUCTS) • minimumOrderAmount: USD dollars (e.g. 50 = $50) • allowedCountries: ISO 3166-1 alpha-2 codes (e.g. ["US","CA"]). Omit = all. • maxUses (1-1000, omit = unlimited), onePerCustomer (default false) • shippingOption (PERCENTAGE only): EXCLUDED | FREE | FREE_LOWEST_ONLY • lowestShippingOnly (FREE_SHIPPING only); freeProductQuantity (FREE_PRODUCTS only, default 1)

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "discountType"
      ],
      "properties": {
        "code": {
          "type": "string",
          "description": "Single promo code (auto-uppercased). Provide for single-code promotions."
        },
        "codes": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "List of promo codes for bulk/multi promotions. Codes share the same discount settings."
        },
        "amount": {
          "type": "number",
          "description": "FIXED_AMOUNT (mandatory): discount amount in USD dollars, NOT cents. Example: 10 = $10 off, 10.50 = $10.50 off. Do NOT multiply by 100."
        },
        "maxUses": {
          "type": "integer",
          "format": "int32",
          "description": "Maximum total redemptions (1-1000, null = unlimited)"
        },
        "percentage": {
          "type": "integer",
          "format": "int32",
          "description": "PERCENTAGE (mandatory): discount percentage value 1-100."
        },
        "productIds": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Offer IDs to restrict discount to specific products. OMIT (or null) for entire-order discount — there is no separate `appliesTo` parameter and no \"ALL\" value. Use get-offers to find IDs."
        },
        "discountType": {
          "type": "string",
          "description": "Discount type: PERCENTAGE, FIXED_AMOUNT, FREE_SHIPPING, or FREE_PRODUCTS"
        },
        "freeShipping": {
          "type": "boolean",
          "description": "Bundle free shipping with this discount (default false). For PERCENTAGE, this sets shipping to free. For FIXED_AMOUNT and FREE_PRODUCTS, adds free shipping separately."
        },
        "freeVariantId": {
          "type": "string",
          "description": "FREE_PRODUCTS (mandatory): variant UUID of the free product to auto-add (use get-offers to find variant IDs)"
        },
        "autoApplyTitle": {
          "type": "string",
          "description": "Title for auto-applying promotion — no code entry at checkout (3-128 chars)."
        },
        "onePerCustomer": {
          "type": "boolean",
          "description": "Limit to one use per customer (default false)"
        },
        "shippingOption": {
          "type": "string",
          "description": "PERCENTAGE (optional): shipping behavior — EXCLUDED (default), FREE, or FREE_LOWEST_ONLY"
        },
        "allowedCountries": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "ISO 3166-1 alpha-2 country codes to restrict promotion to (e.g. [\"US\", \"CA\"]). Null = all countries."
        },
        "lowestShippingOnly": {
          "type": "boolean",
          "description": "FREE_SHIPPING (optional): only apply to lowest-cost shipping option (default false)"
        },
        "minimumOrderAmount": {
          "type": "number",
          "description": "Minimum order amount in USD dollars, NOT cents. Example: 50 = $50 minimum, NOT $0.50. Do NOT multiply by 100."
        },
        "freeProductQuantity": {
          "type": "integer",
          "format": "int32",
          "description": "FREE_PRODUCTS (optional): quantity of free products (default 1)"
        }
      }
    }
    arguments 85 lines
  • ecommerce_deactivate-promotion unknown never probed

    Deactivate a promotion (set status to ENDED). Customers can no longer use this code. To reactivate later, use activate-promotion. To permanently remove, use delete-promotion.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "promotionId"
      ],
      "properties": {
        "promotionId": {
          "type": "string",
          "description": "Promotion ID to deactivate (e.g. 'prm_abc123')"
        }
      }
    }
    arguments 13 lines
  • ecommerce_get-promotions unknown never probed

    List all promotions (shop + membership) with pagination. Two categories of promotions: - Shop (SINGLE, MULTI, AUTO_APPLYING): discount codes for orders — percentage off, fixed amount, free shipping, or free products. Have code, discount, requirements, product scope. - Membership (MEMBERSHIPS_SINGLE, MEMBERSHIPS_MULTI): percentage off subscriptions. Have subscriptionType, membershipTierIds (null=all tiers), duration, newMembersOnly. - MULTI types contain multiple individual codes sharing the same discount settings (codes[] field). Status: LIVE (active) → ENDED (deactivated) → ARCHIVED (deleted). ALL_USED = hit max redemptions. creationReason: MANUAL (dashboard) or FROM_GIFT (auto-generated from gift campaign) IMPORTANT: To find a specific promotion by code, ID, or keyword — use the global search tool (not this tool). NEVER paginate through results to locate a specific entity.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "page",
        "size"
      ],
      "properties": {
        "page": {
          "type": "integer",
          "format": "int32",
          "description": "Page number (0-indexed). Start with 0."
        },
        "size": {
          "type": "integer",
          "format": "int32",
          "description": "Page size (max 10). Use 5 unless user requests more."
        }
      }
    }
    arguments 20 lines
  • ecommerce_get-promotions-by-ids unknown never probed

    Fetch full details of up to 10 promotions by their IDs. Use get-promotions to discover promotion IDs first if needed. Each promotion has: type (SINGLE/MULTI/AUTO_APPLYING/MEMBERSHIPS_SINGLE/MEMBERSHIPS_MULTI), status, discount info, limits, usage count. Shop promotions have code, product scope, minimum order. Membership promotions have subscription type, tiers, duration.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "promotionIds"
      ],
      "properties": {
        "promotionIds": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Promotion IDs (max 10, e.g. ['prm_abc123'])"
        }
      }
    }
    arguments 16 lines
  • ecommerce_update-promotion unknown never probed

    Update an existing promotion's settings. Set category to SHOP or MEMBERSHIP and provide only the fields to change — omitted fields remain unchanged. All monetary amounts are set in USD dollars (NOT cents) — shops price in USD; checkout handles per-customer currency conversion automatically. FOR SHOP (category=SHOP): • Limits: maxUses + onePerCustomer (updated as a group — provide both) • Requirements: minimumOrderAmount in USD dollars (set 0 to remove), allowedCountries (ISO codes or [] for all) • Scope: productIds (specific offers) or applyToEntireOrder=true • Cannot change discount type/amount — create a new promotion instead FOR MEMBERSHIP (category=MEMBERSHIP): • Discount: percentage (1-100) • Scope: subscriptionType + tierIds (empty list [] = all tiers, specific IDs = selected tiers) • Duration: durationCharges (0 = lifetime, 1-1000 = limited billing cycles) • Requirements: newMembersOnly • Limits: limitToSingleUse Always use get-promotions-by-ids first to check current values before updating.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "promotionId",
        "category"
      ],
      "properties": {
        "maxUses": {
          "type": "integer",
          "format": "int32",
          "description": "SHOP: maximum total redemptions (null = unlimited). Provide with onePerCustomer."
        },
        "tierIds": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "MEMBERSHIP: tier IDs ([] = all tiers, specific IDs = selected). Omit to keep unchanged."
        },
        "category": {
          "type": "string",
          "description": "Promotion category: SHOP or MEMBERSHIP"
        },
        "percentage": {
          "type": "integer",
          "format": "int32",
          "description": "MEMBERSHIP: discount percentage (1-100)"
        },
        "productIds": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "SHOP: offer IDs to restrict to specific products (replaces current scope)"
        },
        "promotionId": {
          "type": "string",
          "description": "Promotion ID (e.g. 'prm_abc123')"
        },
        "newMembersOnly": {
          "type": "boolean",
          "description": "MEMBERSHIP: only allow new members"
        },
        "onePerCustomer": {
          "type": "boolean",
          "description": "SHOP: limit to one use per customer. Provide with maxUses."
        },
        "durationCharges": {
          "type": "integer",
          "format": "int32",
          "description": "MEMBERSHIP: billing cycles (0 = lifetime, 1-1000 = limited). Omit to keep unchanged."
        },
        "allowedCountries": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "SHOP: ISO 3166-1 alpha-2 country codes (e.g. [\"US\"]). Empty list [] = all countries. Omit to keep unchanged."
        },
        "limitToSingleUse": {
          "type": "boolean",
          "description": "MEMBERSHIP: limit code to single total use"
        },
        "subscriptionType": {
          "type": "string",
          "description": "MEMBERSHIP: ALL_MEMBERS, MONTHLY_ONLY, or ANNUAL_ONLY"
        },
        "applyToEntireOrder": {
          "type": "boolean",
          "description": "SHOP: set true to apply discount to entire order (overrides productIds)"
        },
        "minimumOrderAmount": {
          "type": "number",
          "description": "SHOP: minimum order amount in USD dollars, NOT cents. Example: 50 = $50 minimum. 0 = remove minimum. Do NOT multiply by 100."
        }
      }
    }
    arguments 78 lines
  • ecommerce_create-collection unknown never probed

    Create a new collection for the shop. Collections group products (offers) together for display on the storefront. Required fields: - name: Collection display name (max 200 chars) - description: Collection description (HTML allowed) - available: Whether the collection is available - offerIds: List of Offer IDs to include in the collection Optional fields: - availableFrom/availableTo: Schedule when the collection becomes visible (ISO 8601 datetime) The collection is created in HIDDEN state. Use update-collection-state to make it PUBLIC. Returns the created collection with: - Identity: id (CollectionId), shopId (ShopId), name, slug, description - Visibility: available (boolean), state (PUBLIC/HIDDEN/ARCHIVED) - Time-based availability: availableFrom (nullable ISO 8601), availableTo (nullable ISO 8601) - Products: offerIds (list of OfferIds) - Sorting: sortingStrategy (MANUAL/BEST_SELLING/NEWEST/OLDEST/NAME_ASC/NAME_DESC)

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "name",
        "description",
        "available",
        "offerIds"
      ],
      "properties": {
        "name": {
          "type": "string",
          "description": "Collection name (max 200 chars)"
        },
        "offerIds": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "List of Offer IDs to include. Format: String IDs."
        },
        "available": {
          "type": "boolean",
          "description": "Whether the collection is available"
        },
        "availableTo": {
          "type": "string",
          "description": "ISO 8601 datetime for when collection stops being available (e.g., '2025-12-31T23:59:59Z')"
        },
        "description": {
          "type": "string",
          "description": "Collection description (HTML allowed)"
        },
        "availableFrom": {
          "type": "string",
          "description": "ISO 8601 datetime for when collection becomes available (e.g., '2025-06-01T00:00:00Z')"
        }
      }
    }
    arguments 39 lines
  • ecommerce_get-collections unknown never probed

    Retrieves all non-archived collections for the shop. NOTE: The system-level "All Products" collection (used internally to display all products on the Products page) is excluded from results. Only user-created collections are returned. Returns a list of collections, each with: - Identity: id (CollectionId), shopId (ShopId), name, slug, description - Visibility: available (boolean), state (PUBLIC/HIDDEN/ARCHIVED) - Time-based availability: availableFrom (nullable ISO 8601), availableTo (nullable ISO 8601) - Products: offerIds (list of OfferIds — use get-offers-by-ids to look up each product) - Sorting: sortingStrategy (MANUAL/BEST_SELLING/NEWEST/OLDEST/NAME_ASC/NAME_DESC) IMPORTANT: To find a specific collection by name or keyword, you MUST use the `search` tool. NEVER iterate through results to find a specific entity.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [],
      "properties": {}
    }
    arguments 6 lines
  • ecommerce_get-collections-by-ids unknown never probed

    Get details of one or more collections by their IDs. Fetches all collections concurrently. Use get-collections to discover collection IDs if you don't have any. Returns a list of collections, each containing: - Identity: id (CollectionId), shopId (ShopId), name, slug, description - Visibility: available (boolean), state (PUBLIC/HIDDEN/ARCHIVED) - Time-based availability: availableFrom (nullable ISO 8601), availableTo (nullable ISO 8601) - Products: offerIds (list of OfferIds — use get-offers-by-ids to look up each product) - Sorting: sortingStrategy (MANUAL/BEST_SELLING/NEWEST/OLDEST/NAME_ASC/NAME_DESC)

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "collectionIds"
      ],
      "properties": {
        "collectionIds": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "List of Collection IDs. Format: String IDs (e.g., ['cltn_abc123xyz'])"
        }
      }
    }
    arguments 16 lines
  • ecommerce_update-collection-availability unknown never probed

    Update whether a collection is available (in stock) or unavailable. This controls the availability flag independently from the state (PUBLIC/HIDDEN/ARCHIVED). Returns the updated collection with: - Identity: id (CollectionId), shopId (ShopId), name, slug, description - Visibility: available (boolean), state (PUBLIC/HIDDEN/ARCHIVED) - Time-based availability: availableFrom (nullable ISO 8601), availableTo (nullable ISO 8601) - Products: offerIds (list of OfferIds) - Sorting: sortingStrategy (MANUAL/BEST_SELLING/NEWEST/OLDEST/NAME_ASC/NAME_DESC)

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "collectionId",
        "available"
      ],
      "properties": {
        "available": {
          "type": "boolean",
          "description": "Whether the collection is available (true/false)"
        },
        "collectionId": {
          "type": "string",
          "description": "Collection ID to update. Format: String ID (e.g., 'cltn_abc123xyz')"
        },
        "shouldUpdateOffersStatus": {
          "type": "boolean",
          "description": "Whether to also update the availability of offers within this collection (default: true)"
        }
      }
    }
    arguments 22 lines
  • ecommerce_update-collection-details unknown never probed

    Update a collection's name, description, availability, and/or product list. Only provided fields are updated — omitted fields remain unchanged. Use get-collections or get-collections-by-ids to review current values before updating. Updatable fields: - name: Collection display name (max 200 chars) - description: Collection description (HTML allowed) - available: Whether the collection is available (true/false) - offerIds: Complete list of Offer IDs to include in this collection (replaces existing list) Returns the updated collection with: - Identity: id (CollectionId), shopId (ShopId), name, slug, description - Visibility: available (boolean), state (PUBLIC/HIDDEN/ARCHIVED) - Time-based availability: availableFrom (nullable ISO 8601), availableTo (nullable ISO 8601) - Products: offerIds (list of OfferIds) - Sorting: sortingStrategy (MANUAL/BEST_SELLING/NEWEST/OLDEST/NAME_ASC/NAME_DESC) IMPORTANT: When updating offerIds, provide the FULL list of offers you want in the collection — this replaces the existing list entirely.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "collectionId"
      ],
      "properties": {
        "name": {
          "type": "string",
          "description": "New collection name (max 200 chars)"
        },
        "offerIds": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Complete list of Offer IDs to include. Replaces existing list. Format: String IDs."
        },
        "available": {
          "type": "boolean",
          "description": "Whether the collection is available"
        },
        "description": {
          "type": "string",
          "description": "New collection description (HTML allowed)"
        },
        "collectionId": {
          "type": "string",
          "description": "Collection ID to update. Format: String ID (e.g., 'cltn_abc123xyz')"
        }
      }
    }
    arguments 32 lines
  • ecommerce_update-collection-slug unknown never probed

    Change the URL slug for a collection. The slug appears in the storefront URL (e.g., /collections/{slug}). Use get-collections-by-ids first to see the current slug. Slug rules: - Lowercase letters, numbers, and hyphens only - No spaces or special characters - Must be unique within the shop Returns the updated collection with: - Identity: id (CollectionId), shopId (ShopId), name, slug, description - Visibility: available (boolean), state (PUBLIC/HIDDEN/ARCHIVED) - Time-based availability: availableFrom (nullable ISO 8601), availableTo (nullable ISO 8601) - Products: offerIds (list of OfferIds) - Sorting: sortingStrategy (MANUAL/BEST_SELLING/NEWEST/OLDEST/NAME_ASC/NAME_DESC)

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "collectionId",
        "newSlug"
      ],
      "properties": {
        "newSlug": {
          "type": "string",
          "description": "New URL slug (e.g., 'summer-sale'). Lowercase, hyphens, no spaces."
        },
        "collectionId": {
          "type": "string",
          "description": "Collection ID to update. Format: String ID (e.g., 'cltn_abc123xyz')"
        }
      }
    }
    arguments 18 lines
  • ecommerce_update-collection-sorting-strategy unknown never probed

    Update how products are sorted within a collection. Sorting strategies: - MANUAL: Custom order (individual products can only be reordered from the dashboard — no MCP tool exists for this) - BEST_SELLING: Best-selling products first - NEWEST: Newest products first - OLDEST: Oldest products first - NAME_ASC: Alphabetical A-Z - NAME_DESC: Alphabetical Z-A Returns the updated collection with: - Identity: id (CollectionId), shopId (ShopId), name, slug, description - Visibility: available (boolean), state (PUBLIC/HIDDEN/ARCHIVED) - Time-based availability: availableFrom (nullable ISO 8601), availableTo (nullable ISO 8601) - Products: offerIds (list of OfferIds) - Sorting: sortingStrategy (MANUAL/BEST_SELLING/NEWEST/OLDEST/NAME_ASC/NAME_DESC)

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "collectionId",
        "sortingStrategy"
      ],
      "properties": {
        "collectionId": {
          "type": "string",
          "description": "Collection ID to update. Format: String ID (e.g., 'cltn_abc123xyz')"
        },
        "sortingStrategy": {
          "enum": [
            "MANUAL",
            "BEST_SELLING",
            "NEWEST",
            "OLDEST",
            "NAME_ASC",
            "NAME_DESC"
          ],
          "type": "string",
          "description": "Sorting strategy: MANUAL, BEST_SELLING, NEWEST, OLDEST, NAME_ASC, NAME_DESC"
        }
      }
    }
    arguments 26 lines
  • ecommerce_update-collection-state unknown never probed

    Update a collection's visibility state (PUBLIC, HIDDEN, or ARCHIVED). Use get-collections-by-ids first to see the current state. States: - PUBLIC: Visible on storefront - HIDDEN: Not visible on storefront but still exists - ARCHIVED: Soft deleted — will not appear in normal queries Optionally update time-based availability (availableFrom/availableTo) to schedule when the collection becomes visible. When setting a time frame without explicitly specifying the state, the state is automatically determined: - PUBLIC if the current time is within the time frame - HIDDEN otherwise Returns the updated collection with: - Identity: id (CollectionId), shopId (ShopId), name, slug, description - Visibility: available (boolean), state (PUBLIC/HIDDEN/ARCHIVED) - Time-based availability: availableFrom (nullable ISO 8601), availableTo (nullable ISO 8601) - Products: offerIds (list of OfferIds) - Sorting: sortingStrategy (MANUAL/BEST_SELLING/NEWEST/OLDEST/NAME_ASC/NAME_DESC) WARNING: Setting state to ARCHIVED removes the collection from the storefront. Use with caution.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "collectionId"
      ],
      "properties": {
        "state": {
          "enum": [
            "HIDDEN",
            "PUBLIC",
            "PRIVATE",
            "ARCHIVED"
          ],
          "type": "string",
          "description": "New state: PUBLIC, HIDDEN, or ARCHIVED"
        },
        "availableTo": {
          "type": "string",
          "description": "ISO 8601 datetime for when collection stops being available (e.g., '2025-12-31T23:59:59Z'). Set both from/to to null to remove time-based availability."
        },
        "collectionId": {
          "type": "string",
          "description": "Collection ID to update. Format: String ID (e.g., 'cltn_abc123xyz')"
        },
        "availableFrom": {
          "type": "string",
          "description": "ISO 8601 datetime for when collection becomes available (e.g., '2025-06-01T00:00:00Z'). Set both from/to to null to remove time-based availability."
        },
        "shouldUpdateOffersStatus": {
          "type": "boolean",
          "description": "Whether to also update the visibility of offers within this collection (default: true)"
        }
      }
    }
    arguments 35 lines
  • ecommerce_add-draft-colors unknown never probed

    Adds colors to the draft's color selection. Does NOT affect the live product. Each color must appear in the product's availableColors (case-sensitive). Read availableColors from get-draft-attributes before calling. Passing an unknown color throws CUSTOMIZATION_INVALID_COLORS with the valid set — surface the valid options to the user and stop; do not retry with guessed spellings (e.g. "heather grey" vs "Heather Gray"). Errors: - CUSTOMIZATION_DESIGN_NOT_EDITABLE_IN_CHAT: the design was made in a designer these tools can't edit; nothing was changed. The error says how to recreate it as a new product or where the creator edits it. Use rerender-design-previews after to see updated previews. Use apply-draft-to-product when the creator confirms changes.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "customizationId",
        "colors"
      ],
      "properties": {
        "colors": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Colors to add (e.g. [\"Red\", \"Navy\"])"
        },
        "customizationId": {
          "type": "string",
          "description": "Customization ID of the draft"
        }
      }
    }
    arguments 21 lines
  • ecommerce_add-draft-sizes unknown never probed

    Adds sizes to the draft's size selection. Does NOT affect the live product. Each size must appear in the product's availableSizes (case-sensitive). Read availableSizes from get-draft-attributes before calling. Passing an unknown size throws CUSTOMIZATION_INVALID_SIZES with the valid set — surface the valid options to the user and stop; do not retry with guessed sizes (e.g. requesting "3XL" when the product caps at "2XL"). Errors: - CUSTOMIZATION_DESIGN_NOT_EDITABLE_IN_CHAT: the design was made in a designer these tools can't edit; nothing was changed. The error says how to recreate it as a new product or where the creator edits it. Use rerender-design-previews after to see updated previews. Use apply-draft-to-product when the creator confirms changes.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "customizationId",
        "sizes"
      ],
      "properties": {
        "sizes": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Sizes to add (e.g. [\"2XL\", \"3XL\"])"
        },
        "customizationId": {
          "type": "string",
          "description": "Customization ID of the draft"
        }
      }
    }
    arguments 21 lines
  • ecommerce_apply-draft-to-product unknown never probed

    Syncs the current draft state to the live product. Call this ONLY when the creator explicitly confirms the changes. This atomically: 1. Reads the draft's current attributes and design state 2. Rebuilds the product's variants from the draft 3. Recalculates pricing Use rerender-design-previews after to see final product previews. Throws CUSTOMIZATION_DESIGN_NOT_EDITABLE_IN_CHAT for designs made in another designer, see add-draft-colors.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "customizationId",
        "offerId"
      ],
      "properties": {
        "offerId": {
          "type": "string",
          "description": "Offer ID of the product to update"
        },
        "customizationId": {
          "type": "string",
          "description": "Customization ID of the draft to apply"
        },
        "keepExistingPrices": {
          "type": "boolean",
          "description": "Keep existing product prices (default true). Set false to recalculate."
        }
      }
    }
    arguments 22 lines
  • ecommerce_get-draft-attributes unknown never probed

    Returns the current and available colors and sizes for a draft customization. - selectedColors / selectedSizes: what the draft currently has selected. - availableColors / availableSizes: every legal value for this product blank — the only values that add-draft-colors / add-draft-sizes will accept. Call this before add-draft-colors or add-draft-sizes to learn what's legal. Color and size names are case-sensitive — pass them exactly as they appear in availableColors / availableSizes.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "customizationId"
      ],
      "properties": {
        "customizationId": {
          "type": "string",
          "description": "Customization ID of the draft"
        }
      }
    }
    arguments 13 lines
  • ecommerce_remove-draft-colors unknown never probed

    Removes colors from the draft's color selection and deletes the offer-side preview images for those colors. Does NOT affect the live product. Use apply-draft-to-product when the creator confirms changes. Throws CUSTOMIZATION_DESIGN_NOT_EDITABLE_IN_CHAT for designs made in another designer, see add-draft-colors.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "customizationId",
        "colors"
      ],
      "properties": {
        "colors": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Colors to remove (e.g. [\"Red\", \"Navy\"])"
        },
        "customizationId": {
          "type": "string",
          "description": "Customization ID of the draft"
        }
      }
    }
    arguments 21 lines
  • ecommerce_request-media-upload-link unknown never probed

    Generates a signed upload URL for adding a new image to the shop's media library. Returns: - uploadUrl (URL): Signed GCS URL to PUT the image content to - fileUrl (URL): GCS reference URL — pass as 'uri' to save-media-library-image

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "fileName",
        "contentType",
        "size"
      ],
      "properties": {
        "size": {
          "type": "integer",
          "format": "int64",
          "description": "File size in bytes"
        },
        "fileName": {
          "type": "string",
          "description": "File name with extension (e.g., 'my-design.png')"
        },
        "contentType": {
          "type": "string",
          "description": "MIME content type — one of 'image/png', 'image/jpeg', 'image/webp', 'image/bmp'"
        }
      }
    }
    arguments 24 lines
  • ecommerce_save-media-library-image unknown never probed

    Persists an uploaded image in the shop's media library. Returns the saved image: - Identity: id (String), uri (CDN URL — use as regionUrl in generate-product-design-previews / create-offers-from-products) - Dimensions: width (Int), height (Int) - Previews: thumbnail (URL), preview (URL)

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "uri",
        "width",
        "height"
      ],
      "properties": {
        "uri": {
          "type": "string",
          "description": "The fileUrl returned from request-media-upload-link (GCS reference URL)"
        },
        "width": {
          "type": "integer",
          "format": "int32",
          "description": "Image width in pixels"
        },
        "height": {
          "type": "integer",
          "format": "int32",
          "description": "Image height in pixels"
        }
      }
    }
    arguments 25 lines
  • ecommerce_create-gift-cards unknown never probed

    Create gift cards (store credit) with an amount, optionally with custom codes. Skip the `codes` parameter unless the user explicitly asks for specific codes — random 12-character friendly codes (e.g., "L3WQNU1MV4W9") will be generated automatically. Use `numberOfCards` to control how many cards to create with auto-generated codes (defaults to 1, max 50). When `codes` IS provided: single code = single card, multiple codes = bulk group (1-50). All cards share the same amount and expiration. Codes are auto-uppercased, 8-36 chars, alphanumeric. Returns created card details (single) or group ID (bulk). Use get-gift-cards to browse. All amounts are set in USD dollars (NOT cents) — gift cards are priced in the shop's USD, and checkout handles currency conversion for non-USD customers. Examples: • Auto-generated single: amount=50 • Auto-generated bulk: numberOfCards=10, amount=25 • Single with custom code: codes=["GIFT50"], amount=50 • Bulk with custom codes: codes=["VIP1","VIP2","VIP3"], amount=25, expiresAt="2026-12-31T23:59:59Z"

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "amount"
      ],
      "properties": {
        "codes": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Gift card codes (1-50). Skip this parameter unless the user explicitly asks for specific codes — random 12-character friendly codes will be generated automatically."
        },
        "amount": {
          "type": "number",
          "description": "Gift card value per card in USD dollars, NOT cents. Range 1-2000. Example: 50 = $50 gift card. Do NOT multiply by 100."
        },
        "expiresAt": {
          "type": "string",
          "format": "date-time",
          "description": "Expiration date in ISO 8601 format (null = never expires)"
        },
        "numberOfCards": {
          "type": "integer",
          "format": "int32",
          "description": "Number of gift cards to create with auto-generated codes (1-50). Only used when `codes` is not provided. Defaults to 1."
        }
      }
    }
    arguments 30 lines
  • ecommerce_get-gift-card unknown never probed

    Get full details of a gift card by ID. Returns: code, status, balance (initial/used/remaining), currency, expiration, origin, recipient, available actions.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "giftCardId"
      ],
      "properties": {
        "giftCardId": {
          "type": "string",
          "description": "Gift card ID (e.g., 'gc_8d79c46d-9a56-4266-885b-4b02a21aacd2')"
        }
      }
    }
    arguments 13 lines
  • ecommerce_get-gift-cards unknown never probed

    List gift cards with pagination. Results are SINGLE cards or GROUPs (bulk-created). Statuses: UNUSED, PARTIALLY_USED, FULLY_USED, EXPIRED, DEACTIVATED, ARCHIVED. Origin: SINGLE_MANUAL, GROUP_MANUAL, ORDER (auto from purchase), GIFT (from giveaway).

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "page",
        "size"
      ],
      "properties": {
        "page": {
          "type": "integer",
          "format": "int32",
          "description": "Page number (0-indexed). Start with 0."
        },
        "size": {
          "type": "integer",
          "format": "int32",
          "description": "Page size (max 10). Use 5 unless user requests more."
        },
        "statuses": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Filter by statuses: UNUSED, PARTIALLY_USED, FULLY_USED, EXPIRED, DEACTIVATED. Omit for all except ARCHIVED."
        }
      }
    }
    arguments 27 lines
  • ecommerce_get-available-plans unknown never probed

    Retrieves all subscription plans available for the shop. To check the shop's current plan and usage, use get-current-subscription instead. Returns a list of plans, each with: - Identity: id, name, custom (boolean — true if specially configured for this shop), pro (boolean) - Pricing: priceAmount (BigDecimal), priceCurrency (String, e.g. "USD"), recurringPeriod (MONTHLY/YEARLY, nullable — null means one-time) - Limits: - offersLimit (Int): maximum number of products (-1 = unlimited) - membersLimit (Int): maximum team members (-1 = unlimited) - domainsLimit (Int): maximum custom domains (-1 = unlimited) - productDesignerArtworkStorageLimitBytes (Long): artwork storage for product designer - digitalProductsStorageLimitBytes (Long): storage for digital product files - Features: - digitalProductsFeePercent (Double): transaction fee percentage for digital products - creditForSamplesAmount (BigDecimal): monthly credit for ordering product samples - creditForSamplesCurrency (String): currency of sample credit - upgradable (boolean): whether the plan can be upgraded to a higher tier - tag (nullable): PRO, PRO_UNLIMITED, DEFAULT, DEFAULT_LEGACY, DEFAULT_UNLIMITED, CUSTOM

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [],
      "properties": {}
    }
    arguments 6 lines
  • ecommerce_get-subscription-limits unknown never probed

    Checks subscription usage against plan limits. Use for questions like "Why can't I add more products?" or "Am I at my plan limit?" Returns: - Plan summary: plan.id, plan.name, plan.pro (boolean), plan.custom (boolean) - Usage vs limits (each with limit and usage as Long): - offers: product/offer count - members: team member count - domains: custom domain count - digitalProductsStorageBytes: digital file storage in bytes Understanding limits: - When usage >= limit, the resource is at capacity - limit = -1 means unlimited for that resource - Storage is in bytes (divide by 1073741824 for GB)

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [],
      "properties": {}
    }
    arguments 6 lines
  • ecommerce_add-design-region unknown never probed

    Adds a new print region to an existing customization's design state with an initial image. Use this when the user wants to place artwork on a region that the catalog product supports (`availableRegions` from inspect-design) but the current customization doesn't yet contain. edit-design cannot add new regions — it only mutates regions already present in the state. BEFORE calling: - inspect-design to confirm the regionId is in `availableRegions` and not already in the state's `sizes[*].regions[*].regionId` list (i.e. not already added). - The image must already be saved (use ecommerce_save-media-library-image first); pass its CDN href plus natural width/height in pixels. AFTER calling: use rerender-design-previews with customizationId to regenerate preview images. Returns the updated inspect summary plus the same availableRegions list inspect-design exposes. Errors: - DESIGN_PIPELINE_INVALID_REGIONS — regionId is not on the catalog product. Surface validRegions to the user. - DESIGN_PIPELINE_COLLIDING_REGIONS — the region conflicts with one already in the design (e.g. "front" alongside "front_large"); the manufacturer rejects that combination. Surface the pair and ask the user which placement to keep — use remove-design-region on the other before retrying. - DESIGN_PIPELINE_BAD_REQUEST with "already part of this design" — the region is already in the state; use edit-design instead.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "customizationId",
        "regionId",
        "imageHref",
        "imageWidth",
        "imageHeight"
      ],
      "properties": {
        "regionId": {
          "type": "string",
          "description": "Region ID to add (must be in availableRegions from inspect-design, e.g. \"back_large\")"
        },
        "imageHref": {
          "type": "string",
          "description": "CDN URL of the image to place in the new region"
        },
        "imageWidth": {
          "type": "integer",
          "format": "int32",
          "description": "Natural width of the image in pixels"
        },
        "imageHeight": {
          "type": "integer",
          "format": "int32",
          "description": "Natural height of the image in pixels"
        },
        "placementId": {
          "type": "string",
          "description": "Optional placement id within the region (e.g. \"largeCenter\"). Omit to have one chosen for you."
        },
        "customizationId": {
          "type": "string",
          "description": "Customization ID of the design to extend"
        }
      }
    }
    arguments 39 lines
  • ecommerce_create-offers-from-designs unknown never probed

    Creates offers from previously generated design previews — processes multiple designs concurrently. Each design is processed independently — failures for one do not affect others. IMPORTANT: You must call generate-product-design-previews first to get customizationIds. Waits up to 1 minute per design for completion, then returns results. Each result contains: - customizationId: the input customization ID - pipelineId, status, type, offerId?, images[], priceSuggestions?, error? — present on success - bulkError?: string — present on failure Use this tool to: - Create offers after the user approves the preview images Offer names default to the product name when omitted. Offer descriptions default to empty when omitted. Offers are created in HIDDEN state — use update-offer-status to publish. WORKFLOW after creation: tell the user the default price that was applied (read it from priceSuggestions in the result) and that it can be changed any time, then offer to order a physical sample (create-sample-checkout — charged at manufacturing cost only).

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "customizationIds"
      ],
      "properties": {
        "offerNames": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Names for each offer. Omit to auto-generate from product name."
        },
        "profitMargin": {
          "type": "number",
          "description": "Profit margin in USD dollars, NOT cents. Example: 5 = $5 margin per unit. Do NOT multiply by 100. Applied to all offers. Omit for suggested pricing."
        },
        "customizationIds": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Customization IDs returned from generate-product-design-previews"
        },
        "offerDescriptions": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Descriptions for each offer. Omit for empty description."
        }
      }
    }
    arguments 34 lines
  • ecommerce_create-offers-from-products unknown never probed

    One-shot: creates offers directly from product designs in a single call. Skips the preview→approve step — use this when the user pre-approved (e.g. "create offers for all of these") or already saw mockups and just wants offers made. Products are processed concurrently — no polling needed, results returned directly. Each product is processed independently — failures for one product do not affect others. For the preview-first flow (review mockups, then create offers from approved ones), use generate-product-design-previews followed by create-offers-from-designs. regionUrls MUST be URLs from the shop's media library (use get-media-library-images, or upload via request-media-upload-link → PUT file → save-media-library-image). BEFORE calling this tool, use get-catalog-product-details to check: 1. supportsBackendRendering must be true for the product 2. Only use regions from printAreas where supportsBackendRendering=true 3. Do not combine conflicting placements in one design — a full-front print and a small chest print occupy the same area, so "front" and "front_large" cannot both be used (same for "back"/"back_large"). Pick one per area, or the request is rejected with DESIGN_PIPELINE_COLLIDING_REGIONS. Each result contains: - productId: the input product ID - pipelineId, status, type, customizationId, offerId, images[], priceSuggestions?, error? — present on success - bulkError?: string — present on failure WORKFLOW after creation: tell the user the default price that was applied (read it from priceSuggestions in the result) and that it can be changed any time, then offer to order a physical sample (create-sample-checkout — charged at manufacturing cost only).

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "products"
      ],
      "properties": {
        "products": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "offerDescription",
              "offerName",
              "productId",
              "regionNames",
              "regionUrls"
            ],
            "properties": {
              "sizes": {
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "type": "string"
                }
              },
              "colors": {
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "type": "string"
                }
              },
              "offerName": {
                "type": "string"
              },
              "productId": {
                "type": "string"
              },
              "regionUrls": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "regionNames": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "placementIds": {
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "type": "string"
                }
              },
              "profitMargin": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "backgroundColor": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "publishOnCreate": {
                "type": [
                  "boolean",
                  "null"
                ]
              },
              "offerDescription": {
                "type": "string"
              },
              "fillAllPlacements": {
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "type": "boolean"
                }
              }
            }
          },
          "description": "Per-product offer settings. Each entry specifies the product, regions, offer name/description, and optional pricing.\n                Fields: productId (required), regionNames (required), regionUrls (required, same length as regionNames),\n                offerName (required), offerDescription (required),\n                placementIds (optional; when present must be the same length as regionNames, with \"\" for regions\n                  you are not targeting. Use it to choose which artwork goes where — one spot on an area\n                  offering alternatives, or a specific sticker slot or mug side),\n                fillAllPlacements (optional; when present must be the same length as regionNames. true copies that\n                  artwork onto every spot the area prints — both mug sides, every sticker slot),\n                colors (optional), sizes (optional), profitMargin (optional, USD amount — omit for suggested pricing),\n                publishOnCreate (optional, defaults to false — set true to publish the offer immediately on creation).\n                backgroundColor (optional): hex like \"#1b1b1b\", fills the canvas behind the artwork. Set it only when the\n                  artwork leaves empty space and the user asked for a solid background, and only on a product whose\n                  supportsBackground is true in get-catalog-product-details.\n                colors/sizes: If omitted, only the FIRST available color/size is used — pass the full list explicitly to offer more variants.\n                sizes must be copied verbatim from this product's `sizes` in get-catalog-product-details (exact case, spacing, punctuation) — never re-cased or reformatted.\n                Example: [{ \"productId\": \"prd_abc\", \"regionNames\": [\"front\"], \"regionUrls\": [\"https://...\"],\n                           \"offerName\": \"My Tee\", \"offerDescription\": \"Cool design\", \"colors\": [\"Black\"],\n                           \"profitMargin\": 5.00, \"publishOnCreate\": true }]"
        }
      }
    }
    arguments 100 lines
  • ecommerce_edit-design unknown never probed

    Edits an existing customization's design state and returns the updated layout. BEFORE calling: use inspect-design to understand the current layout (imageIds, indices, region dimensions) and to read availableRegions — the legal values for `target.regionId`. Passing a regionId not in availableRegions returns DESIGN_PIPELINE_INVALID_REGIONS with the valid set; surface that to the user and stop — do not retry with another guessed regionId. Adding artwork to a region that conflicts with one already in the design returns DESIGN_PIPELINE_COLLIDING_REGIONS naming the forbidden pair; the product cannot be manufactured with both, so ask the user which placement to keep and remove-design-region the other. edit-design only changes regions already in the design: a target.regionId outside the design returns DESIGN_PIPELINE_BAD_REQUEST "not part of this design" — use add-design-region for a new placement. An edit that would leave a design region with no artwork (e.g. removing its last image) returns DESIGN_PIPELINE_BAD_REQUEST "without artwork" and saves nothing — to move artwork between placements, add-design-region the new one, then remove-design-region the old one. AFTER calling: use rerender-design-previews with customizationId to regenerate preview images. Operations: - scale-absolute: set size as fraction of the REGION's contain-fit (regionFraction: 1 = largest size that fits unrotated, above 1 extends past the region), also when the image sits in a smaller placement - scale-relative: multiply current size (factor: e.g. 1.5 = 150%) - move-absolute: snap to named position (anchor: top-left/top-center/top-right/center-left/center/center-right/bottom-left/bottom-center/bottom-right) - move-relative: offset by fraction of region (dx: -1.0 to 1.0, dy: -1.0 to 1.0) - rotate: set rotation (degrees) - replace-image: swap image URL (href, naturalWidth, naturalHeight) - remove: delete image from region - add-image: add new image (href, width, height, optional regionFraction — region-relative, omit it to fill the region — anchor) Every replace-image / add-image href must be the exact CDN url returned by ecommerce_save-media-library-image (copy it verbatim, never retype it); an href that is not in this shop's media library is rejected with a BadRequest and nothing is saved. - reorder: change z-order (position: numeric z-index) Target filtering: sizes (e.g. ["S","M"]), regionId (e.g. "front"), imageId (dataId from inspect), imageIndex (0-based). Omit target fields to apply to all. Returns updated inspect summary with all image positions.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "customizationId",
        "edits"
      ],
      "properties": {
        "edits": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "operations",
              "target"
            ],
            "properties": {
              "target": {
                "type": "object",
                "properties": {
                  "sizes": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "imageId": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "regionId": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "imageIndex": {
                    "type": [
                      "integer",
                      "null"
                    ],
                    "format": "int32"
                  }
                }
              },
              "operations": {
                "type": "array",
                "items": {
                  "type": "object",
                  "required": [
                    "type"
                  ],
                  "properties": {
                    "dx": {
                      "type": [
                        "number",
                        "null"
                      ],
                      "format": "double"
                    },
                    "dy": {
                      "type": [
                        "number",
                        "null"
                      ],
                      "format": "double"
                    },
                    "href": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "type": {
                      "type": "string"
                    },
                    "width": {
                      "type": [
                        "integer",
                        "null"
                      ],
                      "format": "int32"
                    },
                    "anchor": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "factor": {
                      "type": [
                        "number",
                        "null"
                      ],
                      "format": "double"
                    },
                    "height": {
                      "type": [
                        "integer",
                        "null"
                      ],
                      "format": "int32"
                    },
                    "degrees": {
                      "type": [
                        "number",
                        "null"
                      ],
                      "format": "double"
                    },
                    "position": {
                      "type": [
                        "integer",
                        "null"
                      ],
                      "format": "int32"
                    },
                    "naturalWidth": {
                      "type": [
                        "integer",
                        "null"
                      ],
                      "format": "int32"
                    },
                    "naturalHeight": {
                      "type": [
                        "integer",
                        "null"
                      ],
                      "format": "int32"
                    },
                    "regionFraction": {
                      "type": [
                        "number",
                        "null"
                      ],
                      "format": "double"
                    }
                  }
                }
              }
            }
          },
          "description": "Non-empty array of edits. Each edit has a 'target' and 'operations'.\n            Target: { sizes?: [\"S\"], regionId?: \"front\", imageId?: \"dataId-from-inspect\", imageIndex?: 0 }\n            Operations: [{ type: \"scale-absolute\", regionFraction: 0.5 }, { type: \"move-absolute\", anchor: \"center\" }]\n            Example: [{ \"target\": { \"regionId\": \"front\" }, \"operations\": [{ \"type\": \"move-absolute\", \"anchor\": \"center\" }] }]"
        },
        "customizationId": {
          "type": "string",
          "description": "Customization ID of the design to edit (e.g. 'cst_abc123')."
        }
      }
    }
    arguments 156 lines
  • ecommerce_generate-product-design-previews unknown never probed

    Creates design preview pipelines for multiple products and generates mockup images. Use this when the user wants to review mockups BEFORE offers are created — then call create-offers-from-designs on approved customizationIds. If the user has already pre-approved (e.g. "create offers for all of these"), prefer create-offers-from-products instead — it goes straight to offer creation in one call and avoids re-rendering the previews. Products are processed concurrently — no polling needed, results returned directly. Each product is processed independently — failures for one product do not affect others. regionUrls MUST be URLs from the shop's media library (use get-media-library-images, or upload via request-media-upload-link → PUT file → save-media-library-image). BEFORE calling this tool, use get-catalog-product-details to check: 1. supportsBackendRendering must be true for the product 2. Only use regions from printAreas where supportsBackendRendering=true 3. Do not combine conflicting placements in one design — a full-front print and a small chest print occupy the same area, so "front" and "front_large" cannot both be used (same for "back"/"back_large"). Pick one per area, or the request is rejected with DESIGN_PIPELINE_COLLIDING_REGIONS. IMPORTANT: Each product has its own design settings (regions, placements) because different products have different print areas (e.g., 'front_large' vs 'front'). Use get-catalog-product-details for each product to determine the correct region names and placements. Each result contains: - productId: the input product ID - pipelineId, status, type, customizationId, images[], priceSuggestions?, error? — present on success - bulkError?: string — present on failure WORKFLOW: Show images to the user — do NOT quote priceSuggestions at this stage; pricing is applied at offer creation, not on previews. If approved, call create-offers-from-designs with customizationIds. To re-render an existing customization after edit-design, use rerender-design-previews instead.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "products"
      ],
      "properties": {
        "products": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "productId",
              "regionNames",
              "regionUrls"
            ],
            "properties": {
              "sizes": {
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "type": "string"
                }
              },
              "colors": {
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "type": "string"
                }
              },
              "productId": {
                "type": "string"
              },
              "regionUrls": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "regionNames": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "placementIds": {
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "type": "string"
                }
              },
              "regionOffsets": {
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "type": "object",
                  "required": [
                    "regionIndex",
                    "x",
                    "y"
                  ],
                  "properties": {
                    "x": {
                      "type": "number",
                      "format": "double"
                    },
                    "y": {
                      "type": "number",
                      "format": "double"
                    },
                    "regionIndex": {
                      "type": "integer",
                      "format": "int32"
                    }
                  }
                }
              },
              "backgroundColor": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "regionFractions": {
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "type": "number",
                  "format": "double"
                }
              },
              "regionRotations": {
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "type": "object",
                  "required": [
                    "degrees",
                    "regionIndex"
                  ],
                  "properties": {
                    "degrees": {
                      "type": "number",
                      "format": "double"
                    },
                    "regionIndex": {
                      "type": "integer",
                      "format": "int32"
                    }
                  }
                }
              },
              "fillAllPlacements": {
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "type": "boolean"
                }
              }
            }
          },
          "description": "Per-product design settings. Each entry specifies the product, its regions, and optional colors/sizes.\n                Fields: productId (required), regionNames (required), regionUrls (required, same length as regionNames),\n                placementIds (optional; when present must be the same length as regionNames, with \"\" for regions\n                  you are not targeting. Use it to choose which artwork goes where — one spot on an area\n                  offering alternatives, or a specific sticker slot or mug side. The artwork is centred on that spot),\n                fillAllPlacements (optional; when present must be the same length as regionNames. true copies that\n                  artwork onto every spot the area prints — both mug sides, every sticker slot),\n                regionFractions (optional; when present must be the same length as regionNames. Artwork size as a fraction\n                  of the region: 1 = as large as fits, above 1 extends past it. With a placementId the artwork gets this\n                  size, centred on that spot),\n                regionOffsets (optional sparse entries {regionIndex,x,y}; indices address regionNames/regionUrls, must be unique and in range; x/y shift the artwork centre away from the region centre as a signed fraction of the region size, so {x:0,y:0} is centred and {x:0,y:-0.18} sits above centre; range -0.5 to 0.5. Not allowed on a region that has a placementId),\n                regionRotations (optional sparse entries {regionIndex,degrees}; indices address regionNames/regionUrls, must be unique and in range; degrees turn the artwork clockwise about its centre without resizing it, so it may extend past the region; a rotation read from inspect-design can be passed as-is),\n                colors (optional), sizes (optional).\n                backgroundColor (optional): hex like \"#1b1b1b\", fills the canvas behind the artwork. Set it only when the\n                  artwork leaves empty space and the user asked for a solid background, and only on a product whose\n                  supportsBackground is true in get-catalog-product-details.\n                colors/sizes: If omitted, only the FIRST available color/size is used — pass the full list explicitly to offer more variants.\n                sizes must be copied verbatim from this product's `sizes` in get-catalog-product-details (exact case, spacing, punctuation) — never re-cased or reformatted.\n                Example: [{ \"productId\": \"prd_abc\", \"regionNames\": [\"front\"], \"regionUrls\": [\"https://...\"], \"placementIds\": [\"largeCenter\"], \"colors\": [\"Black\", \"White\"] },\n                          { \"productId\": \"prd_def\", \"regionNames\": [\"front_large\"], \"regionUrls\": [\"https://...\"], \"colors\": [\"Navy\", \"Sand\"] }]"
        }
      }
    }
    arguments 141 lines
  • ecommerce_get-design-pipeline-status unknown never probed

    Retrieves the current status of a design pipeline. Returns: - pipelineId, status (PENDING, DONE, or ERROR), type - customizationId?: set when a customization exists - offerId?: present when type=OFFER and status=DONE - images[]: { url, width, height, style, color, size?, region? } - priceSuggestions?: { currency, singlePrice, perSize[]: { size, price, cost } } - error?: { step, message } Use this tool to: - Check if a design pipeline has completed - Get generated preview images or the offer ID after completion - Diagnose failures via error.step and error.message

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "pipelineId"
      ],
      "properties": {
        "pipelineId": {
          "type": "string",
          "description": "Pipeline ID returned from generate-product-design-previews or create-offers-from-designs"
        }
      }
    }
    arguments 13 lines
  • ecommerce_inspect-design unknown never probed

    Inspects an existing customization's design state, returning layout details for each size/region. Returns per-size, per-region breakdown with image positions, scales, rotations, and dimensions. Each image includes: index, dataId, href, widthPx/heightPx, widthPct/heightPct (% of region), centerX/centerY (artwork centre from the region centre as a fraction of the region, -0.5 to 0.5, like regionOffsets), rotation (degrees), scaleX/scaleY, zIndex. An image that cannot be edited has only index, dataId, href and zIndex. Also returns availableRegions — every regionId legal as a target in edit-design for this product (e.g. ["front_large", "back_large"]). The `sizes` map only lists regions that currently contain images; availableRegions is the source of truth for legal edit targets. Use it to decide whether to add a new image to an empty region. If the user asks to place artwork on a region not in availableRegions, the underlying product blank does not support that area, or we do not sell that placement — do not call edit-design. availableRegions already excludes placements we do not sell, so prefer it over guessing a variant name: a tee lists "front_large", not the unsold small-chest "front". Some placements also conflict with each other (a full-front print and a small chest print occupy the same area), so a design may not use both — see DESIGN_PIPELINE_COLLIDING_REGIONS on edit-design/add-design-region. Use dataId or index values when targeting images in edit-design operations. A design made in a designer these tools can't edit returns DESIGN_PIPELINE_DESIGN_NOT_EDITABLE, which every design-editing tool returns for it; the error says how to recreate it as a new product or where the creator edits it.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "customizationId"
      ],
      "properties": {
        "customizationId": {
          "type": "string",
          "description": "Customization ID to inspect (e.g. 'cst_abc123')."
        }
      }
    }
    arguments 13 lines
  • ecommerce_remove-design-region unknown never probed

    Removes a print region (and every image inside it) from an existing customization's design state. Use this when the user wants to drop a region they previously added — e.g. "remove the back design", "I don't want the sleeve print after all". edit-design's `remove` operation only deletes individual images within a region; the slot itself stays in `usedRegions`. This tool removes the slot entirely so the region returns to being available-but-unused. BEFORE calling: use inspect-design to confirm the regionId is in `usedRegions`. The design must keep at least one region — removing the last one is rejected. AFTER calling: use rerender-design-previews with customizationId to regenerate preview images. Returns the updated inspect summary plus the catalog's `availableRegions` list. This is also how you resolve DESIGN_PIPELINE_COLLIDING_REGIONS: drop one placement of the conflicting pair. Errors: - DESIGN_PIPELINE_BAD_REQUEST with "not part of this design" — the region was never added; nothing to remove. - DESIGN_PIPELINE_BAD_REQUEST with "only region in this design" — refuse to remove the last region.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "customizationId",
        "regionId"
      ],
      "properties": {
        "regionId": {
          "type": "string",
          "description": "Region ID to remove (must be in usedRegions from inspect-design, e.g. \"back_large\")"
        },
        "customizationId": {
          "type": "string",
          "description": "Customization ID of the design to modify"
        }
      }
    }
    arguments 18 lines
  • ecommerce_rerender-design-previews unknown never probed

    Re-renders preview images for one or more existing customization sketches — processes concurrently. Each customization is processed independently — failures for one do not affect others. Use this after edit-design, add-draft-colors, add-draft-sizes, or apply-draft-to-product to see updated previews. Colors and sizes are read from the customization's attributes (selectedColors, selectedSizes) — update those via add-draft-colors / add-draft-sizes before calling this tool. Each result contains: - customizationId: the input customization ID - pipelineId, status, type, offerId?, images[], priceSuggestions?, error? — present on success - bulkError?: string — present on failure

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "customizationIds"
      ],
      "properties": {
        "customizationIds": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Non-empty list of customization IDs of the existing sketches to re-render (e.g. ['cst_abc123']). Max 10."
        }
      }
    }
    arguments 16 lines
  • ecommerce_get-personalized-recommendations unknown never probed

    Get personalized catalog product recommendations for the current shop. Returns source products from the catalog — NOT shop offers. Returns a list of recommended products, each with: - Identity: id, brand, brandModel, name, slug - Category: categoryPath (list of category names) - Pricing: priceFrom (BigDecimal), priceTo (BigDecimal) - Production: productionMethod, minimumOrdersNumber (nullable) - Reviews: reviewsSummary with count and rating (nullable) - Metadata: customizationType, favourite (boolean), badges (OUR_PICK/BESTSELLER/NEW/SIGNATURE)

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [],
      "properties": {}
    }
    arguments 6 lines
  • ecommerce_get-catalog-product-details unknown never probed

    Get comprehensive product details for one or more catalog products BY PRODUCT SLUG(S). Required param: `slugs` (a list of product slug strings, e.g. ['cotton-heritage-unisex-premium-hoodie-dtg']). Fetches all products concurrently. Returns enriched data including material, weight, fabric weight, print area pricing, size guide, colors, sizes, reviews, and more. This is the go-to tool for answering detailed product FAQ questions. CHOOSING THE RIGHT TOOL: this tool takes SLUGS, not IDs. If you only have a product ID (e.g. 'pro_abc123'), use get-catalog-product-details-by-id instead. IMPORTANT: Only use slugs returned by `get-catalog-products` or `search`. Do NOT construct or guess slugs from product names — they will not match real catalog entries. Returns a list of products (one per slug, in the same order), each containing: - Identity: id, brand, brandModel, name, slug, fulfillmentType - Category: categoryPath (list of category names) - Pricing: priceFrom, priceTo (BigDecimal) - Production: productionMethod, otherProductionMethods (alternative methods for same product), minimumOrdersNumber - Print areas: printAreas — list of available print areas, each containing: - type: region identifier (e.g. "front", "back", "neck_label") - name: display name (e.g. "Front", "Back", "Neck Label") - required: boolean — when true this area MUST carry artwork or the product cannot be manufactured (the manufacturer rejects the sync). Always design every required area, even when the product name highlights a different (optional) one — e.g. a "Custom Background" sticker sheet has a required "Stickers" area plus an optional "Background". - salePrice: formatted price string (e.g. "$8.50") - supportsBackendRendering: boolean — whether this specific region can be used with generate-product-design-previews - placements: list of placements within the region, each an object with id and name (e.g. [{"id": "leftChest", "name": "Left chest"}, {"id": "centerChest", "name": "Center chest"}]). Empty list when no placements. - Backend rendering: supportsBackendRendering (boolean) — whether this product supports design preview generation via generate-product-design-previews. When true, check each print area's supportsBackendRendering to determine which regions can be designed. - Background: supportsBackground (boolean) — whether this product takes a `backgroundColor` in generate-product-design-previews, filling the canvas behind the artwork (a poster matte, a desk mat). Do not send a colour when false. - Colors: list of available color names - Sizes: list of available sizes — canonical strings; pass them back to the design tools verbatim, without re-casing or reformatting - Size guide: sizeGuide — formatted string like "Chest: S=34-36, M=38-40 (inches)" - Fit summary: fitSummary — one-sentence plain-language fit note like "Fits as expected." or "Oversized fit. Size down one size for a closer fit." Null when the product has no fit type set; lead with it before the measurement table. - Fabric: fabricWeightGsm (GSM), material (primary), distinctMaterials (all unique materials across variants, e.g. heather vs solid differ) - Weight: weightRange — formatted string like "5.00-6.20 oz" - Origin: countryOfProduction - Description: description, moreDetails, sizeAndFitNotes - Returns: guaranteeAndReturns — guarantee and returns policy text - Legal: legalWarningSubstance — legal/safety warnings (e.g. Prop 65) - Reviews: reviewSummary — formatted string like "4.63/5 (119 reviews) - Creators love the softness..." - Stock issues: colorsWithStockIssues — only colors that have problems, each with the discontinuedSizes and outOfStockSizes for that color. Colors absent from this list are fully available across every size in `sizes`. - Shipping: shipsFrom — regions where the product is fulfilled from (e.g. ["US", "EU", "CA"]) - Badges: badges (e.g. ["OUR_PICK", "BESTSELLER"]) - favourite: boolean

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "slugs"
      ],
      "properties": {
        "slugs": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "List of product SLUGS (not IDs) as returned by get-catalog-products or search (e.g., ['cotton-heritage-unisex-premium-hoodie-dtg']). Do NOT guess slugs from product names. If you have a product ID like 'pro_abc123', use get-catalog-product-details-by-id instead. Max 10 slugs."
        }
      }
    }
    arguments 16 lines
  • ecommerce_get-catalog-products unknown never probed

    Browse source products from the product catalog with filtering and pagination. These are products available for customization — NOT the shop's own offers. To view products already added to the shop, use get-offers instead. Returns: - Pagination: pageNumber, pageSize, totalElements, totalPages - Per product: - Identity: id, brand, brandModel, name, slug - Category: categoryPath (list of category names) - Pricing: priceFrom (BigDecimal), priceTo (BigDecimal) - Production: productionMethod, minimumOrdersNumber (nullable Int) - Reviews: reviewsSummary with count and rating (nullable) - Metadata: customizationType (REQUESTABLE/INSTANT/DESIGNER_V3_READY/PRINTFUL_DESIGNER_READY), favourite (boolean), badges (OUR_PICK/BESTSELLER/NEW/SIGNATURE) - Print details (only when includePrintDetails=true): printDetails — { supportsBackendRendering (boolean), supportsBackground (boolean), printAreas: [{ type, name, required, salePrice, supportsBackendRendering, placements: [{ id, name }] }] }. required=true means the area MUST carry artwork or the product cannot be manufactured. IMPORTANT: To find a specific catalog product by name, brand, or keyword, you MUST use the `search` tool. NEVER paginate through results to find a specific entity.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [],
      "properties": {
        "page": {
          "type": "integer",
          "format": "int32",
          "description": "Page number (0-indexed). Always start with 0 for first page."
        },
        "size": {
          "type": "integer",
          "format": "int32",
          "description": "Page size - number of products per page (max 10). Always use 5 unless user explicitly requests more."
        },
        "query": {
          "type": "string",
          "description": "Search query for product names"
        },
        "badges": {
          "type": "array",
          "items": {
            "enum": [
              "OUR_PICK",
              "BESTSELLER",
              "NEW",
              "SIGNATURE"
            ],
            "type": "string"
          },
          "description": "Badges to filter by: OUR_PICK, BESTSELLER, NEW, SIGNATURE"
        },
        "colors": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Color filter. Use exact color names from this list: White, Black, Gray, Beige, Maraschino red, Classic Red, Cayenne red, Maroon, Plum, Eggplant, Grape, Orchid, Lavender, Carnation pink, Strawberry pink, Bubblegum, Magenta, Salmon, Tangerine, Cantaloupe orange, Banana yellow, Lemon yellow, Honeydew green, Lime, Spring green, Tuna Pink, Fern green, Moss green, Flora green, Sea Foam, Spindrift blue, Teal, Sky blue, Turquoise. Do NOT pass generic names like 'Red' or 'Blue' — use the exact names from the list above."
        },
        "priceTo": {
          "type": "number",
          "description": "Maximum price filter in USD major units (dollars), NOT cents. Example: 50 = $50. Do NOT multiply by 100."
        },
        "favourite": {
          "type": "boolean",
          "description": "Show only favourite products (default: false)"
        },
        "priceFrom": {
          "type": "number",
          "description": "Minimum price filter in USD major units (dollars), NOT cents. Example: 10 = $10. Do NOT multiply by 100."
        },
        "shipsFrom": {
          "type": "array",
          "items": {
            "enum": [
              "EU",
              "US",
              "CA",
              "AU",
              "BR",
              "CN",
              "JP",
              "UK"
            ],
            "type": "string"
          },
          "description": "Ships from regions (where products are fulfilled from): EU, US, CA, AU, BR, CN, JP, UK"
        },
        "libraryIds": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Library IDs to filter by"
        },
        "productIds": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Specific product IDs to retrieve"
        },
        "productSize": {
          "type": "string",
          "const": "PlusSizesOnly",
          "description": "Product size filter: PlusSizesOnly"
        },
        "printRegions": {
          "type": "array",
          "items": {
            "enum": [
              "Front",
              "Back",
              "Left_Sleeve",
              "Right_Sleeve",
              "Inside_Label",
              "Outside_Label"
            ],
            "type": "string"
          },
          "description": "Print regions: Front, Back, Left_Sleeve, Right_Sleeve, Inside_Label, Outside_Label"
        },
        "sortingMethod": {
          "enum": [
            "RECOMMENDED",
            "MOST_POPULAR",
            "NEW",
            "NAME_ASC",
            "PRICE_ASC",
            "PRICE_DESC"
          ],
          "type": "string",
          "description": "Sorting method: RECOMMENDED (default), MOST_POPULAR, NEW, NAME_ASC, PRICE_ASC, PRICE_DESC"
        },
        "specialFeature": {
          "type": "array",
          "items": {
            "enum": [
              "PlusSizesOnly",
              "InsertCardSupportedOnly"
            ],
            "type": "string"
          },
          "description": "Special features: PlusSizesOnly, InsertCardSupportedOnly"
        },
        "customizationType": {
          "type": "array",
          "items": {
            "enum": [
              "REQUESTABLE",
              "INSTANT"
            ],
            "type": "string"
          },
          "description": "Customization type filter: REQUESTABLE, INSTANT"
        },
        "productionMethods": {
          "type": "array",
          "items": {
            "enum": [
              "SUBLIMATION",
              "DTG",
              "EMBROIDERY",
              "SCREEN_PRINTING",
              "PRINTED",
              "STICKER",
              "DTFX",
              "UV",
              "ALL_OVER_PRINT",
              "KNITTING",
              "DRINKWARE",
              "GARMENT_PRINTED",
              "ACRYLIC_CUTOUT",
              "DIE_CUT_MAGNET",
              "HOLO_STICKER",
              "LASER_ETCHED",
              "PUZZLE"
            ],
            "type": "string"
          },
          "description": "Production methods: SUBLIMATION, DTG, EMBROIDERY, SCREEN_PRINTING, PRINTED, STICKER, DTFX, UV, ALL_OVER_PRINT, KNITTING, DRINKWARE, GARMENT_PRINTED, ACRYLIC_CUTOUT, DIE_CUT_MAGNET, HOLO_STICKER, LASER_ETCHED, PUZZLE"
        },
        "includePrintDetails": {
          "type": "boolean",
          "description": "Include print areas (region names, placements, supportsBackendRendering) per product — pass true when you intend to generate design previews, to skip the get-catalog-product-details call. Default: false."
        },
        "minimumOrdersRequired": {
          "type": "array",
          "items": {
            "enum": [
              "NoMinimum",
              "CustomRange1To300",
              "CustomRangeOver300"
            ],
            "type": "string"
          },
          "description": "Minimum orders required filter: NoMinimum, CustomRange1To300, CustomRangeOver300"
        }
      }
    }
    arguments 180 lines
  • ecommerce_get-catalog-products-by-slugs unknown never probed

    Get details of one or more catalog products by their slugs. Fetches all products concurrently. This returns catalog source products — NOT shop offers. Use get-offers-by-ids for shop product details. IMPORTANT: Only use slugs returned by `get-catalog-products` or `search`. Do NOT construct or guess slugs from product names — they will not match real catalog entries. Returns a list of products, each containing: - Identity: id, brand, brandModel, name, slug - Category: categoryPath (list of category names from breadcrumbs) - Pricing: priceFrom (BigDecimal), priceTo (BigDecimal) - Production: productionMethod (SUBLIMATION/DTG/EMBROIDERY/SCREEN_PRINTING/PRINTED/STICKER/DTFX/UV/ALL_OVER_PRINT/KNITTING/DRINKWARE/GARMENT_PRINTED/ACRYLIC_CUTOUT/DIE_CUT_MAGNET/HOLO_STICKER/LASER_ETCHED/PUZZLE/OTHER), minimumOrdersNumber (nullable Int) - Metadata: customizationType (REQUESTABLE/INSTANT/DESIGNER_V3_READY/PRINTFUL_DESIGNER_READY), favourite (boolean), badges (OUR_PICK/BESTSELLER/NEW/SIGNATURE) - Note: reviewsSummary is not available for single product lookups

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "slugs"
      ],
      "properties": {
        "slugs": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "List of product slugs as returned by get-catalog-products or search (e.g., ['gildan-5000-heavy-cotton-tee']). Do NOT guess slugs from product names. Max 10 slugs."
        }
      }
    }
    arguments 16 lines
  • show-entity unknown never probed

    Display shop entities (orders, offers/products, promotions, collections, memberships, supporters, catalog products, gift cards, giveaway packages) as an interactive card list in the conversation. Use this whenever the user asks to get, show, list, display, view, or find entities — rendering the cards IS the answer. Call it as your first action; do not reply with a plain-text list and do not wait to be asked to "show it in the UI." Pass source + ids — the server resolves full item data. Always use IDs from MCP tool results. Parameters: - title: Optional heading displayed above the cards. - source: Entity source: "orders", "offers", "promotions", "memberships_supporters", "membership_posts", "collections", "catalog_products", "gift_cards", "giveaway_packages", "blanks". - ids: Exact "id" field values copied from MCP tool results. Do NOT use slugs, names, or fabricated identifiers. - variant: Card style. Omit for compact cards. Other values are reserved for specific skill workflows — set it only when a skill tells you to. - buttonLabel: Button text, used only by certain skill workflows.

    mcp-tool

    {
      "type": "object",
      "required": [
        "source",
        "ids"
      ],
      "properties": {
        "ids": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "title": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "source": {
          "enum": [
            "orders",
            "offers",
            "promotions",
            "memberships_supporters",
            "membership_posts",
            "collections",
            "catalog_products",
            "gift_cards",
            "giveaway_packages",
            "blanks"
          ],
          "type": "string",
          "description": "Entity sources resolvable via ``/api/omnisearch/entities``.\n\nMirrors the server-side ``EntitySourceSchema``."
        },
        "variant": {
          "anyOf": [
            {
              "enum": [
                "rich"
              ],
              "type": "string",
              "description": "Optional variant flag for entity resolution."
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "buttonLabel": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        }
      },
      "additionalProperties": false
    }
    arguments 69 lines
  • show-table unknown never probed

    Display tabular data inline. Pass columns (key + label) and rows keyed by column keys. Use for analytics, reports, or any structured comparison data from MCP tool results. Parameters: - title: Optional heading displayed above the table. - columns: Column definitions as an array of {key, label} objects, e.g. [{"key":"stage","label":"Funnel Stage"},{"key":"count","label":"Count"}]. Pass the array directly — do not JSON.stringify. - rows: Row data as an array of objects keyed by the column keys, e.g. [{"stage":"Total Sessions","count":"3,539"},{"stage":"Carts Created","count":"285"}]. Pass the array directly — do not JSON.stringify.

    mcp-tool

    {
      "type": "object",
      "required": [
        "columns",
        "rows"
      ],
      "properties": {
        "rows": {
          "type": "array",
          "items": {
            "type": "object",
            "additionalProperties": true
          }
        },
        "title": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "columns": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "key",
              "label"
            ],
            "properties": {
              "key": {
                "type": "string"
              },
              "label": {
                "type": "string"
              }
            }
          }
        }
      },
      "additionalProperties": false
    }
    arguments 46 lines
  • show-card unknown never probed

    Display a single key-value detail card (payout summary, shop info, configuration). Pass entries as a list of {label, value} pairs. Use data from MCP tool results. For admin links use the separate `navigate` tool — this card is read-only and renders no link button. Parameters: - title: Heading shown at the top of the card. - entries: Key-value entries (e.g. [{label: "Status", value: "Active"}]). - icon: Icon for the card header.

    mcp-tool

    {
      "type": "object",
      "required": [
        "entries"
      ],
      "properties": {
        "icon": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "title": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "entries": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "label",
              "value"
            ],
            "properties": {
              "label": {
                "type": "string"
              },
              "value": {
                "type": "string"
              }
            }
          }
        }
      },
      "additionalProperties": false
    }
    arguments 49 lines
  • show-gallery unknown never probed

    Display a read-only grid of images inline. Pass image URLs from MCP tool results — do not fabricate URLs. Clicking a thumbnail opens the full-size image. Parameters: - title: Optional heading displayed above the gallery. - images: Images to display in the grid.

    mcp-tool

    {
      "type": "object",
      "required": [
        "images"
      ],
      "properties": {
        "title": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "images": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "url"
            ],
            "properties": {
              "alt": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ],
                "default": null,
                "description": "Alt text for accessibility"
              },
              "url": {
                "type": "string",
                "description": "Full-size image URL"
              },
              "title": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ],
                "default": null,
                "description": "Image caption or label"
              }
            }
          }
        }
      },
      "additionalProperties": false
    }
    arguments 59 lines
  • show-upload unknown never probed

    Display a drag-and-drop image upload area inline. Use when the user needs to provide an image. The picked image is uploaded and its hosted URL arrives in the user's next message ("Uploaded [image](url)"). As soon as that message arrives, call analyze-image on the URL to get a description of the image's contents, then act on the URL. Parameters: - title: Optional heading displayed above the upload area. - prompt: Custom prompt text shown inside the drop zone. Default: "Drop image or browse".

    mcp-tool

    {
      "type": "object",
      "properties": {
        "title": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "prompt": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        }
      },
      "additionalProperties": false
    }
    arguments 28 lines
  • request-upload-url unknown never probed

    Internal helper for the show-upload widget. Request a signed URL to upload an image straight to storage. Not a user-facing action — do not call it in response to a chat request. The widget PUTs the file bytes to the returned signedUrl, then calls confirm-image-upload. Parameters: - filename: Original file name including extension (e.g. "logo.png"). - contentType: The file's MIME type — JPEG, PNG, GIF, or WebP (e.g. "image/png").

    mcp-tool

    {
      "type": "object",
      "required": [
        "filename",
        "contentType"
      ],
      "properties": {
        "filename": {
          "type": "string"
        },
        "contentType": {
          "type": "string"
        }
      },
      "additionalProperties": false
    }
    arguments 16 lines
  • confirm-image-upload unknown never probed

    Internal helper for the show-upload widget. Confirm that an image finished uploading and return a vision analysis of it. Not a user-facing action — the widget calls it after PUTting the file. Safe to re-call: an already-confirmed upload returns the cached analysis. Returns two URLs for the same image, used for different purposes: - url: the stable internal GCS URL — use this for any further processing (handing the image to the model, chaining into other tools). Never expires, but the browser can't fetch it. - publicUrl: a time-limited signed read URL — use this only to show the image to the user (e.g. the widget's preview). Don't pass it on for further processing; it expires after ~60 minutes. Parameters: - uploadId: The id returned by request-upload-url.

    mcp-tool

    {
      "type": "object",
      "required": [
        "uploadId"
      ],
      "properties": {
        "uploadId": {
          "type": "string"
        }
      },
      "additionalProperties": false
    }
    arguments 12 lines
  • analyze-image unknown never probed

    Internal helper for the media-library widget. Run a vision analysis on an image that already has a URL (a selected media-library image) and return its description plus the analyzed URL. Not a user-facing action — the widget calls it when the user confirms a selected image. Safe to re-call: results are cached by image identity. Parameters: - imageUrl: The image to analyze — a media-library CDN URL or a GCS object URL in Omni's bucket.

    mcp-tool

    {
      "type": "object",
      "required": [
        "imageUrl"
      ],
      "properties": {
        "imageUrl": {
          "type": "string"
        }
      },
      "additionalProperties": false
    }
    arguments 12 lines
  • checkout_session_retry unknown never probed

    Retry an offered failed action; repeated use of its token reuses the recovery.

    mcp-tool

    {
      "type": "object",
      "required": [
        "session_id",
        "retry_token"
      ],
      "properties": {
        "card_id": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "session_id": {
          "type": "string"
        },
        "retry_token": {
          "type": "string"
        },
        "buyer_fallback_id": {
          "anyOf": [
            {
              "type": "string",
              "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        }
      },
      "additionalProperties": false
    }
    arguments 39 lines
  • checkout_session_status unknown never probed

    Read session progress, waiting briefly when `after_revision` is still current.

    mcp-tool

    {
      "type": "object",
      "required": [
        "session_id"
      ],
      "properties": {
        "session_id": {
          "type": "string"
        },
        "after_revision": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": 0
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "buyer_fallback_id": {
          "anyOf": [
            {
              "type": "string",
              "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        }
      },
      "additionalProperties": false
    }
    arguments 36 lines
  • checkout_session_blanks unknown never probed

    Browse available catalog blanks; never generates artwork or previews.

    mcp-tool

    {
      "type": "object",
      "required": [
        "session_id"
      ],
      "properties": {
        "session_id": {
          "type": "string"
        }
      },
      "additionalProperties": false
    }
    arguments 12 lines
  • checkout_session_add_product unknown never probed

    Prepare a blank only after an explicit shopper selection, reusing this session's artwork.

    mcp-tool

    {
      "type": "object",
      "required": [
        "session_id",
        "product_id"
      ],
      "properties": {
        "product_id": {
          "type": "string"
        },
        "session_id": {
          "type": "string"
        },
        "origin_card_id": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        }
      },
      "additionalProperties": false
    }
    arguments 27 lines
  • checkout_session_payment_status unknown never probed

    Read how the checkout this widget opened for this exact cart ended.

    mcp-tool

    {
      "type": "object",
      "required": [
        "session_id",
        "lines"
      ],
      "properties": {
        "lines": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "cardId",
              "cardRevision",
              "quantities"
            ],
            "properties": {
              "color": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ],
                "default": null
              },
              "cardId": {
                "type": "string"
              },
              "quantities": {
                "type": "object",
                "minProperties": 1,
                "additionalProperties": {
                  "type": "integer",
                  "maximum": 999,
                  "minimum": 1
                }
              },
              "cardRevision": {
                "type": "integer",
                "minimum": 0
              }
            },
            "description": "One version-pinned product/color line sent from the widget cart.",
            "additionalProperties": false
          }
        },
        "session_id": {
          "type": "string"
        },
        "buyer_fallback_id": {
          "anyOf": [
            {
              "type": "string",
              "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        }
      },
      "additionalProperties": false
    }
    arguments 67 lines
  • checkout_session_editor_init unknown never probed

    Open Product Designer with an optional color and active size, retaining all saved sizes.

    mcp-tool

    {
      "type": "object",
      "required": [
        "session_id",
        "card_id"
      ],
      "properties": {
        "size": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "color": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "card_id": {
          "type": "string"
        },
        "session_id": {
          "type": "string"
        }
      },
      "additionalProperties": false
    }
    arguments 38 lines
  • checkout_session_editor_save unknown never probed

    Version-check and save one card's Product Designer document, then refresh its preview.

    mcp-tool

    {
      "type": "object",
      "required": [
        "session_id",
        "card_id",
        "version",
        "state"
      ],
      "properties": {
        "state": {
          "type": "object",
          "required": [
            "designerVersion",
            "document"
          ],
          "properties": {
            "document": {
              "type": "object",
              "additionalProperties": true
            },
            "designerVersion": {
              "type": "string",
              "minLength": 1
            }
          },
          "description": "Opaque designer document plus the SDK schema version Order requires.",
          "additionalProperties": false
        },
        "card_id": {
          "type": "string"
        },
        "version": {
          "type": "integer",
          "minimum": 0
        },
        "session_id": {
          "type": "string"
        },
        "background_color": {
          "anyOf": [
            {
              "type": "string",
              "pattern": "^#[0-9a-fA-F]{6}$"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        }
      },
      "additionalProperties": false
    }
    arguments 53 lines
  • checkout_session_checkout unknown never probed

    Materialize a version-pinned cart once and return its Fourthwall checkout redirect.

    mcp-tool

    {
      "type": "object",
      "required": [
        "session_id",
        "lines"
      ],
      "properties": {
        "lines": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "cardId",
              "cardRevision",
              "quantities"
            ],
            "properties": {
              "color": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ],
                "default": null
              },
              "cardId": {
                "type": "string"
              },
              "quantities": {
                "type": "object",
                "minProperties": 1,
                "additionalProperties": {
                  "type": "integer",
                  "maximum": 999,
                  "minimum": 1
                }
              },
              "cardRevision": {
                "type": "integer",
                "minimum": 0
              }
            },
            "description": "One version-pinned product/color line sent from the widget cart.",
            "additionalProperties": false
          }
        },
        "session_id": {
          "type": "string"
        },
        "buyer_fallback_id": {
          "anyOf": [
            {
              "type": "string",
              "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        }
      },
      "additionalProperties": false
    }
    arguments 67 lines
  • checkout_session unknown never probed

    Start product generation. Keep the same request_id across retries/reconnects. Requests reuse their latest run for 72 hours after its last recorded widget activity, or admission if never visited. Failed generation runs with no usable products expire 5 minutes after admission regardless of widget activity. Partial successes keep the 72-hour inactivity window. After expiry, initialization creates a new run. Use a new request_id to start fresh sooner.

    mcp-tool

    {
      "type": "object",
      "required": [
        "checkout_session"
      ],
      "properties": {
        "request_id": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "checkout_session": {
          "type": "object",
          "additionalProperties": true
        }
      },
      "additionalProperties": false
    }
    arguments 24 lines
_ try it through the hub, ceiling 0

This deployment has no calling key, so nothing can be run from here. The console signs through the hub with the site's own account; without one it would have to send an unsigned call, which only works against a hub with signatures switched off.

_ is this your agent? claim it: badge, payouts, history

Nobody has claimed this listing. Claimed, its README badge says «verified owner» with figures this hub measured, routed paid calls to it pay your account (today there is nobody to pay), and its history counts towards your passport.

  1. Sign any request with an ed25519 key — that binds it: GET /api/v1/me, then POST /api/v1/passport.
  2. Prove it is yours. Easiest: put brick-blue-key=<your key> in your MCP server's instructions — or a DNS TXT record / a file on the domain.
  3. Ask the hub to check: POST /api/v1/passport/claim-endpoint with this listing's id d3efc2441574fcbf.

Every step, filled in for this listing: https://brick.blue/api/v1/agents/d3efc2441574fcbf/claim. Over MCP: the claim_endpoint tool.

_ for your README measured, not declared

measured by brick.blue

[![measured by brick.blue](https://brick.blue/api/v1/agents/d3efc2441574fcbf/badge.svg)](https://brick.blue/agent/d3efc2441574fcbf?ref=badge)

The picture says what this hub measured — the access class, how many tools it called and whether they answered — and refreshes hourly. Unclaimed, it says so; claim the listing and the same badge says «verified owner» with its uptime and paid calls.

_ how we know
card completeness
100%

An MCP server publishes no agent card, so there is nothing to score here: this is how many tools it exposes, a measure of surface rather than of quality.

spec deviations
0

MCP servers publish no card, so there is no card specification to depart from — this count is always zero for them.

_ record

Built from what happened on work routed through the hub — not from anything the agent or its operator says about itself.

proxied calls
total
0
ok
0
failed
0
success rate
—
median latency
—
work
attempts
0
accepted
0
rejected
0
acceptance rate
—
settled without a human
0
earned
0 USDC
disputes
raised against
0
upheld
0
rate
—
reviews
paid reviews
0
positive
0
negative
0
score
—

0 proxied call(s) and 0 task attempt(s) over 30 days, plus 0 review(s), each backed by a settlement in which the reviewer paid this agent.