Skip to main content
Glama

Search products across merchants

global_search
Read-onlyIdempotent

Use this when a user wants to find or compare product candidates across participating WooCommerce merchants. Search cards include bounded variants_compact and variant_option_values from the merchant snapshot. Option values are independent and do not prove a purchasable combination. Verify the selected variant, price and stock through its merchant Bridge handoff before confirming an offer. For a request with multiple distinct items, search each item independently (calls may run in parallel), then pass the selected p2209_id values together to verify_basket. Each offer states checkout_quote_available: only those merchants can return a WooCommerce-calculated delivered total (verify_basket quote:true). Use get_product only when a search card lacks needed indexed details.

Input Schema

NameRequiredDescriptionDefault
qNoFree-text product query. Each term must match as a whole word in the native merchant catalog text (name, short description, description) or in the canonical category path, so English category terms reach catalogs written in other languages: q="mattress" returns products under home.bedroom.mattress even when their text is Italian. There is no server-side translation of product text; for language-neutral retrieval by category use leaf and the canonical filters.
leafNoCanonical category node. Accepts a terminal leaf (e.g. beverages.alcohol.sparkling_prosecco) or any parent node (e.g. jewellery, home.bedroom): a parent matches the node and its whole subtree, so you can widen or narrow the search by moving up or down the tree. Use list_categories to browse the tree.
brandNoBrand facet filter (normalized, e.g. "nike")
colorNoBridge color family (e.g. "blue"). Common aliases are resolved to a family available in the active index. A family match does not guarantee an exact shade; read filter_semantics.color and verify the chosen product via handoff.bridge_product_url.
limitNoMax offers per page (1-25, default 10). Use next_cursor for the next page.
cursorNoOpaque next_cursor from a previous global_search with the SAME arguments; returns the next page. A cursor from a different query is rejected.
genderNoCanonical gender facet. Filtering is discovery-tolerant: untagged and unisex products can remain candidates, so verify the chosen product. Allowed values: female, male, unisex.
variantNoConstraints that must ALL hold on the SAME variant. Keys and values are the merchant's own, in any language or script (read variant_vocabulary first): {"pa_taglia":"L"}, {"size":["L","Large"]}, {"*":["rouge","rosso"]} (* = any option), or [{"keys":["pa_taglia","size"],"values":["L","Large"]}] across merchants. KaliCart never translates: pass every value you accept. match.kind: exact (ignoring case, Latin accents, separators) or normalized (same number+unit symbol, NxN, size code). Indexed snapshot: verify on the merchant before quoting.
in_stockNotrue filters product-level stock in the indexed snapshot. Does not verify a selected variant or a booking slot.
merchantNoRestrict to one merchant: merchant_id as returned in result_facets.merchants or offers (e.g. "duinshop-it") or its domain.
max_priceNoUpper bound in major currency units (for example 1550 means EUR 1,550 for EUR offers). A matching range may include variants above this bound; verify the chosen variant. Per-offer currency, no FX conversion.
min_priceNoLower bound in major currency units (for example 50 means EUR 50 for EUR offers). Matches overlapping variant price ranges in each offer currency; no FX conversion. Verify the chosen variant.
result_facetsNotrue adds result_facets: counts over ALL matching offers (not just this page) by merchant, category leaf, brand, availability, and price quartiles per currency. Use them to narrow the next call.
variant_limitNoMax matching variants returned per offer (1-500, default 50); matching_variant_count is always the full count
price_currencyNoISO 4217 currency of min_price/max_price (e.g. EUR). With it, only offers priced in that currency are returned; without it the bounds compare numbers in each offer's own currency. Needs min_price or max_price.
variant_facetsNotrue adds variant_vocabulary: real option keys and values with variant and in-stock counts, for the offers returned or, with no q, for the merchant (or all merchants). Use it to choose the values to pass in variant.
variant_in_stockNotrue keeps only variants whose own availability is in_stock
variant_price_maxNoUpper bound on the variant price (major units)
variant_price_minNoLower bound on the variant price (major units)
variant_facets_limitNoMax values per option key in variant_vocabulary (1-200, default 40); values_total is always the full count
variant_price_currencyNoISO 4217 currency of variant_price_min/max (e.g. EUR). With it, only variants priced in that currency satisfy the bound; no FX conversion. Without it, bounds compare numbers in each variant's own currency.

Output Schema

NameRequiredDescriptionDefault
errorNo
scopeNo
offersNo
coverageNo
federatedNo
result_countNo
guidance_codeNo
applied_filtersNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • addedInput schema / properties / price_currency
      Added value: +{
      +  "description": "ISO 4217 currency of min_price/max_price (e.g. EUR). With it, only offers priced in that currency are returned; without it the bounds compare numbers in each offer's own currency. Needs min_price or max_price.",
      +  "pattern": "^[A-Za-z]{3}$",
      +  "type": "string"
      +}
  2. Changed1 schema field changed
    • addedInput schema / properties / variant_price_currency
      Added value: +{
      +  "description": "ISO 4217 currency of variant_price_min/max (e.g. EUR). With it, only variants priced in that currency satisfy the bound; no FX conversion. Without it, bounds compare numbers in each variant's own currency.",
      +  "pattern": "^[A-Za-z]{3}$",
      +  "type": "string"
      +}
  3. Changed4 schema fields changed
    • addedInput schema / properties / cursor
      Added value: +{
      +  "description": "Opaque next_cursor from a previous global_search with the SAME arguments; returns the next page. A cursor from a different query is rejected.",
      +  "maxLength": 512,
      +  "type": "string"
      +}
    • changedInput schema / properties / limit / description
      Previous value: -"Max offers to return (1-25, default 10). No pagination; raise to get more in one call"New value: +"Max offers per page (1-25, default 10). Use next_cursor for the next page."
    • addedInput schema / properties / merchant
      Added value: +{
      +  "description": "Restrict to one merchant: merchant_id as returned in result_facets.merchants or offers (e.g. \"duinshop-it\") or its domain.",
      +  "maxLength": 253,
      +  "type": "string"
      +}
    • addedInput schema / properties / result_facets
      Added value: +{
      +  "description": "true adds result_facets: counts over ALL matching offers (not just this page) by merchant, category leaf, brand, availability, and price quartiles per currency. Use them to narrow the next call.",
      +  "type": "boolean"
      +}
  4. Changed7 schema fields changed
    • addedInput schema / properties / variant
      Added value: +{
      +  "anyOf": [
      +    {
      +      "additionalProperties": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "items": {
      +              "type": "string"
      +            },
      +            "maxItems": 32,
      +            "type": "array"
      +          }
      +        ]
      +      },
      +      "type": "object"
      +    },
      +    {
      +      "items": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "keys": {
      +            "items": {
      +              "type": "string"
      +            },
      +            "maxItems": 16,
      +            "type": "array"
      +          },
      +          "values": {
      +            "items": {
      +              "type": "string"
      +            },
      +            "maxItems": 32,
      +            "minItems": 1,
      +            "type": "array"
      +          }
      +        },
      +        "required": [
      +          "values"
      +        ],
      +        "type": "object"
      +      },
      +      "maxItems": 4,
      +      "type": "array"
      +    }
      +  ],
      +  "description": "Constraints that must ALL hold on the SAME variant. Keys and values are the merchant's own, in any language or script (read variant_vocabulary first): {\"pa_taglia\":\"L\"}, {\"size\":[\"L\",\"Large\"]}, {\"*\":[\"rouge\",\"rosso\"]} (* = any option), or [{\"keys\":[\"pa_taglia\",\"size\"],\"values\":[\"L\",\"Large\"]}] across merchants. KaliCart never translates: pass every value you accept. match.kind: exact (ignoring case, Latin accents, separators) or normalized (same number+unit symbol, NxN, size code). Indexed snapshot: verify on the merchant before quoting."
      +}
    • addedInput schema / properties / variant_facets
      Added value: +{
      +  "description": "true adds variant_vocabulary: real option keys and values with variant and in-stock counts, for the offers returned or, with no q, for the merchant (or all merchants). Use it to choose the values to pass in variant.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / variant_facets_limit
      Added value: +{
      +  "description": "Max values per option key in variant_vocabulary (1-200, default 40); values_total is always the full count",
      +  "maximum": 200,
      +  "minimum": 1,
      +  "type": "integer"
      +}
    • addedInput schema / properties / variant_in_stock
      Added value: +{
      +  "description": "true keeps only variants whose own availability is in_stock",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / variant_limit
      Added value: +{
      +  "description": "Max matching variants returned per offer (1-500, default 50); matching_variant_count is always the full count",
      +  "maximum": 500,
      +  "minimum": 1,
      +  "type": "integer"
      +}
    • addedInput schema / properties / variant_price_max
      Added value: +{
      +  "description": "Upper bound on the variant price (major units)",
      +  "minimum": 0,
      +  "type": "number"
      +}
    • addedInput schema / properties / variant_price_min
      Added value: +{
      +  "description": "Lower bound on the variant price (major units)",
      +  "minimum": 0,
      +  "type": "number"
      +}
  5. Changed8 schema fields changed
    • changedInput schema / properties / gender / description
      Previous value: -"Gender facet. Use a value from get_meta.accepted_filters.gender; aliases may be normalized. If the value is unknown, the search returns an explicit error rather than broadening the result."New value: +"Canonical gender facet. Filtering is discovery-tolerant: untagged and unisex products can remain candidates, so verify the chosen product. Allowed values: female, male, unisex."
    • addedInput schema / properties / gender / enum
      Added value: +[
      +  "female",
      +  "male",
      +  "unisex"
      +]
    • removedInput schema / properties / gender / maxLength
      Removed value: -64
    • changedInput schema / properties / max_price / description
      Previous value: -"Upper bound of the requested interval. A matching range may include variants above this bound; verify the chosen variant. Per-offer currency, no FX conversion."New value: +"Upper bound in major currency units (for example 1550 means EUR 1,550 for EUR offers). A matching range may include variants above this bound; verify the chosen variant. Per-offer currency, no FX conversion."
    • addedInput schema / properties / max_price / minimum
      Added value: +0
    • changedInput schema / properties / min_price / description
      Previous value: -"Lower bound of the requested interval. Matches overlapping variant price ranges in each offer currency; no FX conversion. Verify the chosen variant."New value: +"Lower bound in major currency units (for example 50 means EUR 50 for EUR offers). Matches overlapping variant price ranges in each offer currency; no FX conversion. Verify the chosen variant."
    • addedInput schema / properties / min_price / minimum
      Added value: +0
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "$schema": "http://json-schema.org/draft-07/schema#",
      +  "additionalProperties": true,
      +  "properties": {
      +    "applied_filters": {
      +      "additionalProperties": {},
      +      "type": "object"
      +    },
      +    "coverage": {
      +      "additionalProperties": true,
      +      "properties": {
      +        "limit": {
      +          "exclusiveMinimum": 0,
      +          "type": "integer"
      +        },
      +        "more_results_possible": {
      +          "type": "boolean"
      +        },
      +        "returned": {
      +          "minimum": 0,
      +          "type": "integer"
      +        },
      +        "total_known": {
      +          "type": "boolean"
      +        }
      +      },
      +      "required": [
      +        "returned",
      +        "limit",
      +        "total_known",
      +        "more_results_possible"
      +      ],
      +      "type": "object"
      +    },
      +    "error": {
      +      "type": "string"
      +    },
      +    "federated": {
      +      "type": "boolean"
      +    },
      +    "guidance_code": {
      +      "type": "string"
      +    },
      +    "offers": {
      +      "items": {
      +        "additionalProperties": true,
      +        "properties": {
      +          "availability_status": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "category_leaf": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "handoff": {},
      +          "merchant_domain": {
      +            "type": "string"
      +          },
      +          "name": {
      +            "type": "string"
      +          },
      +          "p2209_id": {
      +            "type": "string"
      +          },
      +          "price": {},
      +          "provenance": {}
      +        },
      +        "required": [
      +          "p2209_id",
      +          "merchant_domain",
      +          "name"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "result_count": {
      +      "minimum": 0,
      +      "type": "integer"
      +    },
      +    "scope": {
      +      "additionalProperties": true,
      +      "properties": {
      +        "type": {
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "type"
      +      ],
      +      "type": "object"
      +    }
      +  },
      +  "type": "object"
      +}
  6. Changed6 schema fields changed
    • changedInput schema / properties / gender / description
      Previous value: -"Gender facet (normalized): male, female, unisex, kids"New value: +"Gender facet. Use a value from get_meta.accepted_filters.gender; aliases may be normalized. If the value is unknown, the search returns an explicit error rather than broadening the result."
    • removedInput schema / properties / gender / enum
      Removed value: -[
      -  "male",
      -  "female",
      -  "unisex",
      -  "kids"
      -]
    • addedInput schema / properties / gender / maxLength
      Added value: +64
    • changedInput schema / properties / in_stock / description
      Previous value: -"Only offers with availability_status=in_stock"New value: +"true filters product-level stock in the indexed snapshot. Does not verify a selected variant or a booking slot."
    • changedInput schema / properties / max_price / description
      Previous value: -"Maximum price filter (numeric; per-offer merchant currency, no FX conversion)"New value: +"Upper bound of the requested interval. A matching range may include variants above this bound; verify the chosen variant. Per-offer currency, no FX conversion."
    • changedInput schema / properties / min_price / description
      Previous value: -"Minimum price filter (numeric; per-offer merchant currency, no FX conversion)"New value: +"Lower bound of the requested interval. Matches overlapping variant price ranges in each offer currency; no FX conversion. Verify the chosen variant."
  7. Changed1 schema field changed
    • changedInput schema / properties / color / description
      Previous value: -"Color family (e.g. \"blue\")"New value: +"Bridge color family (e.g. \"blue\"). Common aliases are resolved to a family available in the active index. A family match does not guarantee an exact shade; read filter_semantics.color and verify the chosen product via handoff.bridge_product_url."
  8. Changed1 schema field changed
    • changedInput schema / properties / leaf / description
      Previous value: -"Canonical category leaf (e.g. beverages.alcohol.sparkling_prosecco)"New value: +"Canonical category node. Accepts a terminal leaf (e.g. beverages.alcohol.sparkling_prosecco) or any parent node (e.g. jewellery, home.bedroom): a parent matches the node and its whole subtree, so you can widen or narrow the search by moving up or down the tree. Use list_categories to browse the tree."
  9. Changed1 schema field changed
    • changedInput schema / properties / q / description
      Previous value: -"Free-text product query matched against native merchant catalog text; no server-side translation. Translate when needed, or use leaf and canonical filters for language-neutral retrieval."New value: +"Free-text product query. Each term must match as a whole word in the native merchant catalog text (name, short description, description) or in the canonical category path, so English category terms reach catalogs written in other languages: q=\"mattress\" returns products under home.bedroom.mattress even when their text is Italian. There is no server-side translation of product text; for language-neutral retrieval by category use leaf and the canonical filters."
  10. Changed1 schema field changed
    • changedInput schema / properties / q / description
      Previous value: -"Free-text query, any language (e.g. \"prosecco\", \"materasso memory foam\")"New value: +"Free-text product query matched against native merchant catalog text; no server-side translation. Translate when needed, or use leaf and canonical filters for language-neutral retrieval."
  11. Changed4 schema fields changed
    • addedInput schema / properties / gender / description
      Added value: +"Gender facet (normalized): male, female, unisex, kids"
    • addedInput schema / properties / limit / description
      Added value: +"Max offers to return (1-25, default 10). No pagination; raise to get more in one call"
    • addedInput schema / properties / max_price / description
      Added value: +"Maximum price filter (numeric; per-offer merchant currency, no FX conversion)"
    • addedInput schema / properties / min_price / description
      Added value: +"Minimum price filter (numeric; per-offer merchant currency, no FX conversion)"
  12. First observed

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive, and the description adds what annotations cannot: that cards carry bounded snapshot data, that option values never prove a purchasable combination, and that price/stock must be re-verified via the merchant handoff before confirming an offer. That is behavior an agent would otherwise infer incorrectly.

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?

Six sentences, front-loaded with the trigger condition, then caveats, then the verification workflow and the get_product fallback — every sentence carries a distinct instruction. It is slightly dense with snapshot/verify language that recurs, but nothing is padded.

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 21-parameter open-world search with an output schema, the description supplies exactly the missing pieces: the multi-item workflow, the snapshot-vs-verified distinction, the checkout_quote_available gating, and the escalation paths to verify_basket and get_product. Return-format detail is correctly left to the output schema.

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

Parameters3/5

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

Schema description coverage is 100% and the schema documents every parameter in depth (q matching, leaf subtree semantics, cursor reuse rules, variant key translation), so the description adds no per-parameter meaning beyond it. Its only added nuance is a workflow point (calling once per item) that maps to no single parameter. Baseline 3 is appropriate.

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?

States a specific verb (find or compare) and resource (product candidates) scoped to participating WooCommerce merchants, and explicitly sets itself apart from get_product and verify_basket by naming when those siblings apply instead. An agent can distinguish this from every sibling tool without opening the schema.

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?

Explicit routing: use this for discovery, search each distinct item independently (possibly in parallel), pass selected ids to verify_basket, and fall back to get_product only when a card lacks indexed detail. It also names a real exclusion ('only those merchants [with checkout_quote_available] can return a calculated delivered total'), so the when/when-not boundary is concrete.

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.