discover_products

Use discover_products for all product search. It works best with concrete, noun-led natural-language queries - one or two modifiers - like "oversized wool coat", "black leather jacket", "summer linen shirt", or "linen shirt for a beach wedding under $200". Combine with structured filters like category, gender, min_price for precision. AI-powered semantic search with vector embeddings handles intent, not just keywords. Price phrases like "under 200 zł" inside the query are parsed automatically.

Avoid stacking many descriptive qualifiers ("breathable", "perfect for") with multiple filter axes (season + price + material) in the same query - over-constrained queries can return empty. Push the axes you care about into structured filters (max_price, materials) instead of layering them into the query string.

Soft descriptors (occasion, season, styles, silhouette, pattern, neckline, sleeves) are already captured by the query field via semantic ranking. Set them ONLY when the user explicitly named that exact attribute - populating them otherwise is the most common cause of zero-result calls.

Parameters

Core query

ParameterTypeRequiredDefaultDescription
querystringNo-Natural language search query - be descriptive for best results. Price phrases like "under 200 zł" are parsed automatically. Provide at least one of query or a structured filter.

Filters

ParameterTypeRequiredDefaultDescription
categorystringNo-Category slug from get_filters, e.g. clothing, clothing/jackets, clothing/jackets/bomber-jackets. Last-segment shortcuts are accepted when unambiguous (e.g. loafers-and-slip-ons resolves the same as shoes/loafers-and-slip-ons).
colorsstring[]No-Filter by colors, e.g. ["black", "navy", "sage green"]
exclude_colorsstring[]No-Colors to exclude from results
color_matchstringNoany"any" (default): product has at least one queried color. "exact": at least one image is exclusively the queried colors - use for mono-color searches like "all black".
materialsstring[]No-Filter by materials, e.g. ["cotton", "silk", "leather"]
exclude_materialsstring[]No-Materials to exclude from results
genderstringNo-Gender filter - call get_filters for current values
occasionstringNo-Soft descriptor - set only when the user explicitly named the occasion. query already captures it semantically. Call get_filters for valid values.
seasonstringNo-Soft descriptor - set only when the user explicitly named the season. query already captures it semantically.
stylesstring[]No-Soft descriptor - style filter (OR semantics — a product matches if any of its styles is in this list). Pass a single value to filter by one style; pass several to span a related set, e.g. ["basics","minimalist","preppy","sportswear"] for a "Casual" bucket. Set only when the user explicitly named one or more styles.
silhouettestringNo-Soft descriptor - set only when the user explicitly named the fit. query already captures it semantically.
patternstringNo-Soft descriptor - set only when the user explicitly named the pattern (e.g. solid, stripe, checked, floral). Default "solid" leaks into queries and zeros the candidate set; omit when unsure.
necklinestringNo-Soft descriptor - set only when the user explicitly named the neckline (e.g. crewneck, v-neck, turtleneck). Do not infer from category or query.
sleevesstringNo-Soft descriptor - set only when the user explicitly named the sleeve style (e.g. short-sleeve, long-sleeve, sleeveless). Do not infer from category or query.
available_sizesstring[]No-Filter by available size labels, e.g. ["s", "m", "38"]
is_sustainablebooleanNo-Only products with explicit sustainability claims
brandstringNo-Filter by brand name
store_domainstringNo-Filter by a single store domain (e.g. "thereformation.com")

Pricing

ParameterTypeRequiredDefaultDescription
min_pricenumberNo-Minimum price (in currency, or USD if omitted). Positive float; extra decimals beyond two are floored silently (e.g. 19.99919.99).
max_pricenumberNo-Maximum price. Same rules as min_price. If set below min_price, results come back empty.
currencystringNoUSDISO 4217 code for min_price/max_price and returned prices (e.g. "EUR", "PLN").

Pagination

ParameterTypeRequiredDefaultDescription
limitnumberNo12Page size (max 20)
pagenumberNo1Page number.

Location

ParameterTypeRequiredDefaultDescription
countrystringNo-Optional shopper location, ISO-3166-1 alpha-2 (e.g. "US", "GB", "DE"). Improves future offer matching; recorded for analytics. Distinct from the request IP country.

Response

Returns products ranked by semantic relevance, the current page, and a hasNextPage flag:

{
  "page": 1,
  "hasNextPage": true,
  "results": [
    {
      "id": "665a1f...",
      "title": "Coastal Breeze Linen Dress",
      "summary": "A flowing linen midi in soft sage with subtle pleating.",
      "brand": "Reformation",
      "price": 178,
      "currency": "USD",
      "compareAtPrice": null,
      "category": "clothing/dresses",
      "colors": ["sage green"],
      "materials": ["linen"],
      "gender": "women",
      "silhouette": "relaxed",
      "neckline": "v-neck",
      "sleeves": "short",
      "closures": [],
      "tags": ["casual", "summer", "minimalist", "solid"],
      "isSustainable": true,
      "inStock": true,
      "images": ["https://..."],
      "productUrl": "https://vistoya.com/p/665a1f...?src=mcp",
      "availability": {
        "dimensions": ["color", "size"],
        "color": [
          {
            "colorKey": "sage-green",
            "color": "sage green",
            "label": "Sage Green",
            "imageUrls": ["https://..."],
            "availableSizes": [
              { "label": "xs", "inStock": true },
              { "label": "s",  "inStock": true },
              { "label": "m",  "inStock": false }
            ]
          }
        ],
        "sizes": [
          { "label": "xs", "inStock": true },
          { "label": "s",  "inStock": true },
          { "label": "m",  "inStock": false }
        ]
      },
      "relevanceScore": 0.92
    }
  ]
}

Fields

FieldDescription
pageCurrent result page
hasNextPageTrue when another page of results is available
idProduct identifier - pass to get_product for full details
titleProduct title
summaryAI-generated shopping summary. Not merchant copy - call get_product for merchantDescription
priceCurrent price rendered in currency
currencyPrice currency code
compareAtPriceOriginal price before discount (nullable - present when on sale)
categoryMost specific available category value, preferring subcategory over broad category
colorsProduct colors
materialsProduct materials
genderTarget gender
silhouetteFit/silhouette
necklineNeckline value
sleevesSleeve style
closuresClosure types (e.g. zipper, button)
tagsDescriptive tags
isSustainableHas explicit sustainability claims
inStockAny variant is in stock
imagesProduct image URLs
productUrlClick-tracked Vistoya redirect URL
brandBrand name
availabilityCompact color/size availability matrix. Full SKU-level variants come from get_product
relevanceScoreSemantic similarity score (0–1) - how closely the product matches the query

Examples

Natural language with price filter:

{
  "name": "discover_products",
  "arguments": {
    "query": "black leather jacket for going out",
    "max_price": 300
  }
}

Price in a non-USD currency:

{
  "name": "discover_products",
  "arguments": {
    "query": "white wool coat",
    "max_price": 1000,
    "currency": "PLN"
  }
}

Size + sustainability filter:

{
  "name": "discover_products",
  "arguments": {
    "query": "organic cotton t-shirt",
    "available_sizes": ["m", "l"],
    "is_sustainable": true
  }
}

Multi-style filter for a "Casual" bucket:

{
  "name": "discover_products",
  "arguments": {
    "query": "easy weekend layers",
    "styles": ["basics", "minimalist", "preppy", "sportswear"],
    "season": "fall"
  }
}

After a result, call get_product for the full merchant description, all images, and SKU-level variants. Use find_similar_products with a result's id for "more like this." When called from a UI-capable host (ChatGPT Apps SDK, Claude Desktop, Cursor, VS Code Copilot, Goose), the same response renders inline as a visual product grid via the embedded widget - no separate render call needed.

Call get_filters once at the start of a session to learn which category, colors, materials, style, and other enum values are valid in the current catalog.