Skip to main content
Glama

Search Products

search_products
Read-onlyIdempotent

Search 100M+ products across thousands of retailers for one product type. Call once for each distinct product type, and send independent calls together. Put relevant constraints in query. Returns up to 8 product cards plus structured product data. The result includes a thread_id. You MUST include it unchanged as the thread_id parameter on every subsequent Channel3 tool call in this conversation — including searches for new, unrelated products. Never omit it once you have one.

Input Schema

NameRequiredDescriptionDefault
queryNoOne product type and its constraints in natural language (brand, color, material, size, price, gender). Good: "red leather jacket under $200"; "leather golf glove under $40". Bad: "gift ideas for dad"; "cool sneakers"; "golf glove or rangefinder".
image_urlNoPublic image URL for visual search. Combine with `query` for text + image.
thread_idNoConversation thread ID. Omit ONLY on the very first Channel3 call of a conversation. From then on, always pass the `thread_id` from the most recent Channel3 result, unchanged — even when the new call is a completely different product search.

Output Schema

NameRequiredDescriptionDefault
seqNo
as_ofYesISO timestamp of when this result was produced; prices are live as of this moment.
queryNoThe text query this result answers.
productsYes
image_urlNoThe image URL this result answers.
thread_idYesConversation thread ID. Pass it back unchanged as `thread_id` on every follow-up call in this conversation.
session_idNoPostHog MCP session ID for analytics correlation.
server_originNoOrigin of this MCP server; the storefront UI posts analytics events here.
next_page_tokenYesOpaque pagination token used by the storefront UI; not usable via this tool.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed4 schema fields changed
    • removedOutput schema / properties / next_page_token / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / next_page_token / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / products / items / properties / offers / items / properties / price / properties / compare_at_price / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / products / items / properties / offers / items / properties / price / properties / compare_at_price / type
      Added value: +[
      +  "number",
      +  "null"
      +]
  2. Changed5 schema fields changed
    • addedInput schema / properties / thread_id
      Added value: +{
      +  "description": "Conversation thread ID. Omit ONLY on the very first Channel3 call of a conversation. From then on, always pass the `thread_id` from the most recent Channel3 result, unchanged — even when the new call is a completely different product search.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / server_origin
      Added value: +{
      +  "description": "Origin of this MCP server; the storefront UI posts analytics events here.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / session_id
      Added value: +{
      +  "description": "PostHog MCP session ID for analytics correlation.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / thread_id
      Added value: +{
      +  "description": "Conversation thread ID. Pass it back unchanged as `thread_id` on every follow-up call in this conversation.",
      +  "type": "string"
      +}
    • changedOutput schema / required
      Previous value: -[
      -  "products",
      -  "next_page_token",
      -  "as_of"
      -]New value: +[
      +  "products",
      +  "next_page_token",
      +  "as_of",
      +  "thread_id"
      +]
  3. Changed6 schema fields changed
    • removedOutput schema / properties / products / items / properties / age
      Removed value: -{
      -  "anyOf": [
      -    {
      -      "enum": [
      -        "newborn",
      -        "infant",
      -        "toddler",
      -        "kids",
      -        "adult"
      -      ],
      -      "type": "string"
      -    },
      -    {
      -      "type": "null"
      -    }
      -  ]
      -}
    • removedOutput schema / properties / products / items / properties / category
      Removed value: -{
      -  "anyOf": [
      -    {
      -      "additionalProperties": {},
      -      "properties": {
      -        "has_children": {
      -          "type": "boolean"
      -        },
      -        "slug": {
      -          "type": "string"
      -        },
      -        "title": {
      -          "type": "string"
      -        }
      -      },
      -      "required": [
      -        "slug",
      -        "title",
      -        "has_children"
      -      ],
      -      "type": "object"
      -    },
      -    {
      -      "type": "null"
      -    }
      -  ]
      -}
    • removedOutput schema / properties / products / items / properties / description
      Removed value: -{
      -  "anyOf": [
      -    {
      -      "type": "string"
      -    },
      -    {
      -      "type": "null"
      -    }
      -  ]
      -}
    • removedOutput schema / properties / products / items / properties / gender
      Removed value: -{
      -  "anyOf": [
      -    {
      -      "enum": [
      -        "male",
      -        "female",
      -        "unisex"
      -      ],
      -      "type": "string"
      -    },
      -    {
      -      "type": "null"
      -    }
      -  ]
      -}
    • removedOutput schema / properties / products / items / properties / structured_attributes
      Removed value: -{
      -  "additionalProperties": {
      -    "items": {
      -      "type": "string"
      -    },
      -    "type": "array"
      -  },
      -  "propertyNames": {
      -    "type": "string"
      -  },
      -  "type": "object"
      -}
    • addedOutput schema / properties / seq
      Added value: +{
      +  "maximum": 9007199254740991,
      +  "minimum": -9007199254740991,
      +  "type": "integer"
      +}
  4. Changed5 schema fields changed
    • changedInput schema / properties / image_url / description
      Previous value: -"A public URL of an image. The tool finds products that look like the image. Add `query` to search with text and the image together."New value: +"Public image URL for visual search. Combine with `query` for text + image."
    • changedInput schema / properties / query / description
      Previous value: -"One product with its objective attributes, as a retailer prints them on the product page. This tool has no filter parameters. Put every constraint in this text: brand, retailer, color, material, size, price, gender.\nCorrect: \"red leather jacket under $200\"\nCorrect: \"low-top off-white suede sneakers\"\nCorrect: \"leather golf glove under $40\"\nWrong: \"cool sneakers\"\nWrong: \"good birthday gifts for dad\"\nDo not write an opinion word, for example \"cool\", \"stylish\", or \"best\". The search engine matches an opinion word to the names of products. The query \"cool sneakers\" returns a shoe line with the name \"Cool\". Write the attributes that cause the opinion."New value: +"One product type and its constraints in natural language (brand, color, material, size, price, gender).\nGood: \"red leather jacket under $200\"; \"leather golf glove under $40\".\nBad: \"gift ideas for dad\"; \"cool sneakers\"; \"golf glove or rangefinder\"."
    • addedInput schema / properties / query / minLength
      Added value: +1
    • addedOutput schema / properties / image_url
      Added value: +{
      +  "description": "The image URL this result answers.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / query
      Added value: +{
      +  "description": "The text query this result answers.",
      +  "type": "string"
      +}
  5. Changed2 schema fields changed
    • changedInput schema / properties / image_url / description
      Previous value: -"Public image URL for visual search. Combine with `query` for text+image search."New value: +"A public URL of an image. The tool finds products that look like the image. Add `query` to search with text and the image together."
    • changedInput schema / properties / query / description
      Previous value: -"One specific product, described concretely: item type plus attributes, e.g. 'self-stirring coffee mug' or 'red leather jacket under $200'. This is semantic (meaning-based) search, not keyword matching - synonym lists and generic category words like 'good birthday gifts' dilute the embedding and return generic results. One concrete idea per call; run separate searches for separate ideas. Constraints (brand, retailer, color, size, price range, gender) go inline in the description."New value: +"One product with its objective attributes, as a retailer prints them on the product page. This tool has no filter parameters. Put every constraint in this text: brand, retailer, color, material, size, price, gender.\nCorrect: \"red leather jacket under $200\"\nCorrect: \"low-top off-white suede sneakers\"\nCorrect: \"leather golf glove under $40\"\nWrong: \"cool sneakers\"\nWrong: \"good birthday gifts for dad\"\nDo not write an opinion word, for example \"cool\", \"stylish\", or \"best\". The search engine matches an opinion word to the names of products. The query \"cool sneakers\" returns a shoe line with the name \"Cool\". Write the attributes that cause the opinion."
  6. Changed11 schema fields changed
    • changedInput schema / properties / query / description
      Previous value: -"Natural-language product search. Include any constraints inline (brand, retailer, category, color, size, price range, gender, etc.). Required unless `image_url` is given."New value: +"One specific product, described concretely: item type plus attributes, e.g. 'self-stirring coffee mug' or 'red leather jacket under $200'. This is semantic (meaning-based) search, not keyword matching - synonym lists and generic category words like 'good birthday gifts' dilute the embedding and return generic results. One concrete idea per call; run separate searches for separate ideas. Constraints (brand, retailer, color, size, price range, gender) go inline in the description."
    • addedOutput schema / properties / as_of
      Added value: +{
      +  "description": "ISO timestamp of when this result was produced; prices are live as of this moment.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / next_page_token
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Opaque pagination token used by the storefront UI; not usable via this tool."
      +}
    • changedOutput schema / properties / products / items / properties / age / anyOf
      Previous value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "enum": [
      +      "newborn",
      +      "infant",
      +      "toddler",
      +      "kids",
      +      "adult"
      +    ],
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedOutput schema / properties / products / items / properties / brand
      Removed value: -{
      -  "type": "string"
      -}
    • addedOutput schema / properties / products / items / properties / brands
      Added value: +{
      +  "items": {
      +    "additionalProperties": {},
      +    "properties": {
      +      "id": {
      +        "type": "string"
      +      },
      +      "name": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "id",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • changedOutput schema / properties / products / items / properties / category / anyOf
      Previous value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": {},
      +    "properties": {
      +      "has_children": {
      +        "type": "boolean"
      +      },
      +      "slug": {
      +        "type": "string"
      +      },
      +      "title": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "slug",
      +      "title",
      +      "has_children"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedOutput schema / properties / products / items / properties / gender / anyOf
      Previous value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "enum": [
      +      "male",
      +      "female",
      +      "unisex"
      +    ],
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedOutput schema / properties / products / items / properties / image
      Removed value: -{
      -  "type": "string"
      -}
    • addedOutput schema / properties / products / items / properties / images
      Added value: +{
      +  "items": {
      +    "additionalProperties": {},
      +    "properties": {
      +      "url": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "url"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • changedOutput schema / required
      Previous value: -[
      -  "products"
      -]New value: +[
      +  "products",
      +  "next_page_token",
      +  "as_of"
      +]
  7. Changed2 schema fields changed
    • changedInput schema / $schema
      Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "$schema": "https://json-schema.org/draft/2020-12/schema",
      +  "additionalProperties": false,
      +  "properties": {
      +    "products": {
      +      "items": {
      +        "additionalProperties": {},
      +        "properties": {
      +          "age": {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ]
      +          },
      +          "brand": {
      +            "type": "string"
      +          },
      +          "category": {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ]
      +          },
      +          "description": {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ]
      +          },
      +          "gender": {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ]
      +          },
      +          "id": {
      +            "type": "string"
      +          },
      +          "image": {
      +            "type": "string"
      +          },
      +          "offers": {
      +            "items": {
      +              "additionalProperties": {},
      +              "properties": {
      +                "availability": {
      +                  "enum": [
      +                    "InStock",
      +                    "OutOfStock"
      +                  ],
      +                  "type": "string"
      +                },
      +                "domain": {
      +                  "type": "string"
      +                },
      +                "price": {
      +                  "additionalProperties": false,
      +                  "properties": {
      +                    "compare_at_price": {
      +                      "anyOf": [
      +                        {
      +                          "type": "number"
      +                        },
      +                        {
      +                          "type": "null"
      +                        }
      +                      ]
      +                    },
      +                    "currency": {
      +                      "type": "string"
      +                    },
      +                    "price": {
      +                      "type": "number"
      +                    }
      +                  },
      +                  "required": [
      +                    "currency",
      +                    "price"
      +                  ],
      +                  "type": "object"
      +                },
      +                "url": {
      +                  "type": "string"
      +                }
      +              },
      +              "required": [
      +                "availability",
      +                "domain",
      +                "price",
      +                "url"
      +              ],
      +              "type": "object"
      +            },
      +            "type": "array"
      +          },
      +          "structured_attributes": {
      +            "additionalProperties": {
      +              "items": {
      +                "type": "string"
      +              },
      +              "type": "array"
      +            },
      +            "propertyNames": {
      +              "type": "string"
      +            },
      +            "type": "object"
      +          },
      +          "title": {
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "id",
      +          "title"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    }
      +  },
      +  "required": [
      +    "products"
      +  ],
      +  "type": "object"
      +}
  8. Added

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive/openWorld, so the safety profile is covered. The description adds genuinely non-obvious behavior: the return payload is up to 8 product cards plus structured data, it emits a `thread_id`, and that ID must be threaded through every subsequent Channel3 call. That session-continuation contract is real context beyond the annotations.

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 the capability, then usage rules, then the return/thread contract. It is dense and purposeful, though the thread_id obligation is stated in both the description and the schema, which is mild redundancy rather than waste.

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

Completeness4/5

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

An output schema exists, so return values need not be fully explained, and the description still flags the card count and structured data. Combined with the thread_id lifecycle and batching rules, an agent has what it needs to call correctly; only the sibling tool selection is left unspecified.

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%, including examples of good vs bad `query` strings and the thread_id omission rule, so the baseline is 3. The description reinforces the 'one product type per query' semantics and the thread_id persistence rule but adds no syntax or meaning the schema does not already carry.

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

Purpose4/5

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

States a specific verb+resource with scope: 'Search 100M+ products across thousands of retailers for one product type.' An agent immediately knows this is the broad product-discovery search. It does not, however, differentiate itself from siblings like browse_products or get_products, so the boundary between the search tools must be inferred.

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

Usage Guidelines4/5

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

Gives concrete operational guidance: call once per distinct product type, batch independent calls together, and keep the `query` to a single product type. What is missing is when to reach for this tool versus the sibling search/browse tools, which is exactly the choice an agent faces.

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