Skip to main content
Glama

Vitrine: Trending Fashion, Luxury, Sneakers & Design

Search the index

search
Read-onlyIdempotent

Find fashion, accessories or interior pieces for a shopper's request. Use this first for any need stated in words ('a quiet luxury bag for work under $1,000'); use trending when there is no specific need, and find_similar to vary an item you already have. Hard filters (category, gender, tier, price, colors, size, brand, availability, ship_to) exclude items outright; filters.gender 'men' or 'women' also keeps unisex pieces unless gender_exact is true. Words like "men's" or "for her" in the query only rerank, like the optional taste_profile. Returns up to 20 items ranked by text match, taste and trend, each with price, availability, image, trend status, a one-line 'why' and an outbound_url to the retailer, where checkout happens. No pagination; an empty list means nothing fits, so loosen filters. Read-only. Without a key, results are capped at 5 and omit trend data and match reasons; a free key (POST https://vitrine.fashion/v1/keys, sent as 'Authorization: Bearer ') unlocks them. Rate limits: 10 calls a minute anonymous, 60 with a key. With a key, each item also carries trend_reason (why it has its trend status), trend_sources (the signals behind it: source, url, signal type, date, contribution; [] when the status comes from curation alone) and trend_review (when the status last changed and whether a human reviewer approved it).

Input Schema

NameRequiredDescriptionDefault
agentNo
limitNoMaximum results, 1 to 20. Anonymous callers get at most 5. No pagination.
queryNoFree text, e.g. 'relaxed linen trousers for a summer trip'. Max 300 characters.
filtersNoHard filters. Applied before ranking; an item that fails any of them is never returned.
taste_profileNo

Output Schema

NameRequiredDescriptionDefault
metaYes
countYes
resultsYes
query_idNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • changedInput schema / properties / limit / description
      Previous value: -"Maximum results, 5 to 20. Anonymous callers get 5. No pagination."New value: +"Maximum results, 1 to 20. Anonymous callers get at most 5. No pagination."
    • changedInput schema / properties / limit / minimum
      Previous value: -5New value: +1
  2. Changed4 schema fields changed
    • addedInput schema / properties / filters / properties / gender
      Added value: +{
      +  "anyOf": [
      +    {
      +      "enum": [
      +        "women",
      +        "men",
      +        "unisex"
      +      ],
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Department: women, men or unisex. 'men' returns men's and unisex pieces, 'women' returns women's and unisex pieces, 'unisex' returns unisex pieces only. Set gender_exact to true to drop the unisex pieces."
      +}
    • addedInput schema / properties / filters / properties / gender_exact
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "boolean"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "With gender, true matches that department only, without unisex pieces."
      +}
    • changedInput schema / properties / taste_profile / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "description": "Soft preferences from the shopper's agent. Used for ranking, never for exclusion.\nDescribe taste only: no names, emails or other personal data.",
      -    "properties": {
      -      "avoided_colors": {
      -        "items": {
      -          "maxLength": 40,
      -          "minLength": 1,
      -          "type": "string"
      -        },
      -        "maxItems": 20,
      -        "type": "array"
      -      },
      -      "preferred_colors": {
      -        "items": {
      -          "maxLength": 40,
      -          "minLength": 1,
      -          "type": "string"
      -        },
      -        "maxItems": 20,
      -        "type": "array"
      -      },
      -      "price_comfort": {
      -        "anyOf": [
      -          {
      -            "properties": {
      -              "max": {
      -                "anyOf": [
      -                  {
      -                    "minimum": 0,
      -                    "type": "number"
      -                  },
      -                  {
      -                    "type": "null"
      -                  }
      -                ],
      -                "default": null
      -              },
      -              "min": {
      -                "anyOf": [
      -                  {
      -                    "minimum": 0,
      -                    "type": "number"
      -                  },
      -                  {
      -                    "type": "null"
      -                  }
      -                ],
      -                "default": null
      -              }
      -            },
      -            "type": "object"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "default": null
      -      },
      -      "style_tags": {
      -        "description": "e.g. minimal, tailored, relaxed, vintage",
      -        "items": {
      -          "maxLength": 40,
      -          "minLength": 1,
      -          "type": "string"
      -        },
      -        "maxItems": 20,
      -        "type": "array"
      -      }
      -    },
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "description": "Soft preferences from the shopper's agent. Used for ranking, never for exclusion.\nDescribe taste only: no names, emails or other personal data.",
      +    "properties": {
      +      "avoided_colors": {
      +        "items": {
      +          "maxLength": 40,
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "maxItems": 20,
      +        "type": "array"
      +      },
      +      "gender": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "women",
      +              "men",
      +              "unisex"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "Soft department preference (women, men, unisex): ranks that department and unisex pieces first, never excludes. Use filters.gender to exclude."
      +      },
      +      "preferred_colors": {
      +        "items": {
      +          "maxLength": 40,
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "maxItems": 20,
      +        "type": "array"
      +      },
      +      "price_comfort": {
      +        "anyOf": [
      +          {
      +            "properties": {
      +              "max": {
      +                "anyOf": [
      +                  {
      +                    "minimum": 0,
      +                    "type": "number"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ],
      +                "default": null
      +              },
      +              "min": {
      +                "anyOf": [
      +                  {
      +                    "minimum": 0,
      +                    "type": "number"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ],
      +                "default": null
      +              }
      +            },
      +            "type": "object"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null
      +      },
      +      "style_tags": {
      +        "description": "e.g. minimal, tailored, relaxed, vintage",
      +        "items": {
      +          "maxLength": 40,
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "maxItems": 20,
      +        "type": "array"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • addedOutput schema / properties / results / items / properties / gender
      Added value: +{
      +  "description": "Department. Accessories and interior are usually unisex.",
      +  "enum": [
      +    "women",
      +    "men",
      +    "unisex"
      +  ],
      +  "type": "string"
      +}
  3. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "properties": {
      +    "count": {
      +      "type": "integer"
      +    },
      +    "meta": {
      +      "properties": {
      +        "access": {
      +          "enum": [
      +            "full",
      +            "basic"
      +          ],
      +          "type": "string"
      +        },
      +        "terms": {
      +          "type": "string"
      +        },
      +        "upgrade": {
      +          "type": "string"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "query_id": {
      +      "type": "integer"
      +    },
      +    "results": {
      +      "items": {
      +        "properties": {
      +          "availability": {
      +            "enum": [
      +              "in_stock",
      +              "low_stock",
      +              "preorder",
      +              "out_of_stock"
      +            ],
      +            "type": "string"
      +          },
      +          "brand": {
      +            "type": "string"
      +          },
      +          "category": {
      +            "type": "string"
      +          },
      +          "currency": {
      +            "type": "string"
      +          },
      +          "id": {
      +            "type": "string"
      +          },
      +          "image_url": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "outbound_url": {
      +            "description": "Tracked link to the retailer's product page. Checkout happens there.",
      +            "type": "string"
      +          },
      +          "price": {
      +            "type": "number"
      +          },
      +          "title": {
      +            "type": "string"
      +          },
      +          "trend_score": {
      +            "description": "0 to 100. With a key.",
      +            "type": "integer"
      +          },
      +          "trend_status": {
      +            "description": "With a key.",
      +            "enum": [
      +              "hot",
      +              "rising",
      +              "steady",
      +              "fading"
      +            ],
      +            "type": "string"
      +          },
      +          "why": {
      +            "description": "One-line reason it matches. With a key.",
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "id",
      +          "title",
      +          "brand",
      +          "price",
      +          "currency",
      +          "availability",
      +          "outbound_url"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    }
      +  },
      +  "required": [
      +    "count",
      +    "results",
      +    "meta"
      +  ],
      +  "type": "object"
      +}
  4. First observed

TDQS

A4.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, non-destructive, so 'Read-only' is redundant rather than additive. The description does carry real behavioral load beyond the annotations - anonymous capping at 5 results, omitted trend data and match reasons, the bearer-key unlock path, and the 10/min vs 60/min rate limits - which is exactly the kind of operational context annotations cannot express. It stops short of describing failure modes (invalid key, over-limit responses) or result ordering ties, so it is strong but not fully transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and routing first, then filter semantics, then output and access constraints - a sensible order for an agent reading top-down. Nearly every sentence carries information, though the gender/unisex rule is stated in the description and again in the schema, and the long parenthetical about key-gated trend fields is dense enough to slow scanning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a five-parameter, nested-schema tool with an output schema, this covers everything an agent needs: access tiers, rate limits, result count, no pagination, what an empty list means, and where checkout happens. Nothing material is missing for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

At 60% schema coverage the description must compensate, and it does for the highest-risk semantics: hard filters 'exclude items outright' versus soft taste_profile and query wording that 'only rerank', plus the gender/unisex interaction unless gender_exact is true. The key endpoint and session/agent fields get no description-level explanation beyond the schema, so it is not exhaustive.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource ('Find fashion, accessories or interior pieces') and frames it around the shopper's request in words, which cleanly separates it from the catalog-browsing siblings. An agent can tell at a glance that this is the free-text discovery tool rather than trending or find_similar.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states explicitly when to use this tool first ('any need stated in words'), when to use the alternatives ('trending when there is no specific need, and find_similar to vary an item you already have'), and when to relax inputs ('an empty list means nothing fits, so loosen filters'). Both positive selection and exclusion conditions are named with sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources