Skip to main content
Glama

get-products

Read-only

Get a paginated list of products. Authenticated via bearer token. Supports filtering by SKU or tag and optionally includes variants.

EACH ROW IS LEAN BY DEFAULT: id, sku, title, price, inventory, imageUrl, tags. fields IS THE NORMAL WAY TO READ PRODUCTS: name exactly the top-level fields you need, and description, images (the whole gallery — imageUrl is its first picture), customAttributes, brand, categoryId and the rest come back only when named. The list replaces the default rather than adding to it. For one whole product use get-product.

Every row carries its tags in tags, and its attribute values in customAttributes when asked for, so there is no separate call needed to see how a product is tagged or what attributes it holds. A product in a mature catalog can carry a hundred or more inherited attribute rows; leaving customAttributes out of fields skips that join entirely rather than just hiding it, so a sweep like "find products with no brand" costs a fraction of a full read. Same for tags, variants and inventory.

To find products by something other than SKU or tag — brand, quantity, or "has no tags at all" — pass a filters tree, or the id of a saved segment as segmentId (get-segments lists them). Either beats paging the whole catalog and filtering client-side.

Tool call template

This tool declares no required parameters. Add optional parameters from the input schema as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {},
    "name": "get-products"
  }
}

Input Schema

NameRequiredDescriptionDefault
skuNoFilter by SKU
pageNo
tagsNoOnly return products carrying at least one of these tag names (case-insensitive). Combines with tagIds as OR.
limitNo
fieldsNoTop-level fields to return; `id` is always included. Omitted means the lean default (id, sku, title, price, inventory, imageUrl, tags); a list replaces that default, so name everything you need. Omitting `customAttributes` or `tags` skips their join, so this is a real cost saving and not just a smaller payload.
tagIdsNoOnly return products carrying at least one of these tag IDs (tag IDs come back in each record's `tags` field)
filtersNoFilter tree, same shape a segment stores — a condition is { property, type, option, value }. This is how you filter by anything other than SKU or tag: brand, price, warehouses.on_hand_quantity, or { property: "tags.tag_id", type: "array", option: "is none" } for "has no tags at all". Far cheaper than paging the catalog and filtering client-side. Full operator and field reference: usage.filters from get-action-catalog
segmentIdNoFilter to products covered by a segment (from the get-segments tool)
withVariantsNoInclude each product's variants. Adds `variants` to the default row; with `fields`, list `variants` there as well.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed3 schema fields changed
    • changedInput schema / properties / fields / description
      Previous value: -"Return only these top-level fields; `id` is always included. Omitting `customAttributes` or `tags` skips their join, so this is a real cost saving and not just a smaller payload."New value: +"Top-level fields to return; `id` is always included. Omitted means the lean default (id, sku, title, price, inventory, imageUrl, tags); a list replaces that default, so name everything you need. Omitting `customAttributes` or `tags` skips their join, so this is a real cost saving and not just a smaller payload."
    • changedInput schema / properties / fields / items / enum
      Previous value: -[
      -  "id",
      -  "sku",
      -  "title",
      -  "subtitle",
      -  "description",
      -  "shortDescription",
      -  "seoKeywords",
      -  "modelNumber",
      -  "condition",
      -  "conditionNote",
      -  "brand",
      -  "manufacturer",
      -  "categoryId",
      -  "notes",
      -  "updatedAt",
      -  "createdAt",
      -  "variants",
      -  "references",
      -  "images",
      -  "price",
      -  "inventory",
      -  "dimensions",
      -  "package",
      -  "customAttributes",
      -  "tags"
      -]New value: +[
      +  "id",
      +  "sku",
      +  "title",
      +  "subtitle",
      +  "description",
      +  "shortDescription",
      +  "seoKeywords",
      +  "modelNumber",
      +  "condition",
      +  "conditionNote",
      +  "brand",
      +  "manufacturer",
      +  "categoryId",
      +  "notes",
      +  "updatedAt",
      +  "createdAt",
      +  "variants",
      +  "references",
      +  "imageUrl",
      +  "images",
      +  "price",
      +  "inventory",
      +  "dimensions",
      +  "package",
      +  "customAttributes",
      +  "tags"
      +]
    • addedInput schema / properties / withVariants / description
      Added value: +"Include each product's variants. Adds `variants` to the default row; with `fields`, list `variants` there as well."
  2. First observed

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, but the description adds substantial operational behavior beyond them: bearer-token authentication, a lean default projection, the fact that fields replaces rather than extends the default, and the real cost saving from omitting joins like customAttributes and tags. These are meaningful execution details, not restatements of the safety hints.

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?

The description is front-loaded and organized: purpose first, then field projection behavior, then filtering alternatives. It repeats the lean-default and join-skipping cost idea across paragraphs and uses several emphatic asides, so it could be tightened, but the length is reasonable for a nine-parameter query tool with complex filtering.

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?

With no output schema and a relatively complex filter tree, the description supplies the missing context an agent needs: default row shape, how to request full field sets, how to find products by non-SKU/tag criteria, and where to look up filter syntax. It is complete enough to invoke the tool correctly.

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

Parameters5/5

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

Although the schema covers 78% of parameters, the description adds critical semantics for fields (default set, replacement behavior, join-skipping cost), filters (condition shape, examples such as brand or 'has no tags at all', and the get-action-catalog reference), segmentId provenance, and how withVariants interacts with fields. This meaning goes well beyond the structured schema text.

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?

Starts with a specific verb and resource: 'Get a paginated list of products,' then scopes it with pagination, authentication, filtering, and optional variants. It explicitly distinguishes this from get-product for a single product and points to get-segments and get-action-catalog for related needs, so an agent can identify the right 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?

States when to use this tool and names concrete alternatives: use filters or segmentId for criteria other than SKU/tag, use get-product for one whole product, and use get-segments to list segments. It also warns against paging the entire catalog and filtering client-side, which directly guides invocation strategy.

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.