gradeNot graded
page: Every page
search_productsAnswer
Search the Office Max B2B catalog by text and/or category, with attribute, brand, price, availability and quantity filters. Returns product summaries with one key set (null = does not apply): id (sku), gtin, name, brand_id, category_id, url, representation_url, price, price_note, stock and dispatch term. Every row carries source: "erp" (our catalog) or "extended" (special-order supplier stock, found only by exact mpn/gtin - free text does not search it). Prices are the generic list price in RON (meta.price_basis generic_list), never a negotiated price. Read-only.
View tool JSON
{
"name": "search_products",
"kind": "answer",
"impl": "imperative",
"description": "Search the Office Max B2B catalog by text and/or category, with attribute, brand, price, availability and quantity filters. Returns product summaries with one key set (null = does not apply): id (sku), gtin, name, brand_id, category_id, url, representation_url, price, price_note, stock and dispatch term. Every row carries source: \"erp\" (our catalog) or \"extended\" (special-order supplier stock, found only by exact mpn/gtin - free text does not search it). Prices are the generic list price in RON (meta.price_basis generic_list), never a negotiated price. Read-only.",
"inputSchema": {
"type": "object",
"properties": {
"q": {
"type": "string",
"maxLength": 200,
"description": "Free-text search term (name, brand, code), max 200 characters. Omit to browse."
},
"category": {
"type": "integer",
"minimum": 1,
"description": "Category id (from get_categories). Required when facets are used."
},
"sort": {
"type": "string",
"enum": [
"name",
"price_asc",
"price_desc",
"dispatch"
],
"description": "name, price_asc, price_desc, or dispatch (needs qty; ranks by who can cover that quantity soonest). Omitted: relevance on a text search, catalog order otherwise."
},
"facets": {
"type": "object",
"additionalProperties": {
"type": "array",
"items": {
"type": "string"
}
},
"description": "{facet_key: [value, ...]} using the EXACT keys and values from get_category_facets. Values OR-ed within a key, keys AND-ed. Needs category."
},
"brand_ids": {
"type": "array",
"items": {
"type": "integer",
"minimum": 1
},
"description": "Brand ids to restrict to (OR-ed), from get_category_facets."
},
"price_min": {
"type": "number",
"minimum": 0,
"description": "Lowest acceptable unit price in RON, inclusive. Net unless vat_included is true."
},
"price_max": {
"type": "number",
"minimum": 0,
"description": "Highest acceptable unit price in RON, inclusive. A budget quoted with VAT MUST set vat_included true."
},
"vat_included": {
"type": "boolean",
"default": false,
"description": "true when price_min/price_max are VAT-inclusive. Default false (net, the B2B convention)."
},
"sourcing": {
"type": "string",
"enum": [
"any_stock",
"no_stock"
],
"description": "The stock filter. any_stock = orderable now, from any stock, in both catalogs (Office Max rows with stock and extended offers, never no-stock listings); no_stock = no stock. For speed read fastest_lead_days, or pass qty with within_days (term_days). NOT the row field stock.availability, which says whether you can get it."
},
"qty": {
"type": "integer",
"minimum": 1,
"description": "Units the buyer needs. Each row then says if that quantity is coverable and its dispatch term (term_days is authoritative). Needed for sort=dispatch."
},
"min_qty": {
"type": "integer",
"minimum": 1,
"description": "Only products with at least this many units in stock, any dispatch term (extended offers: the band's lower bound)."
},
"within_days": {
"type": "integer",
"minimum": 1,
"maximum": 365,
"description": "Dispatch window in WORKING DAYS (carrier hand-off, transit excluded). Needs qty. On its own a window only reports (can_fulfill_within); to act on it add fulfillable_only=true (drop) or sort=dispatch (rank). For «delivered within N days» use arrive_within_days instead (not both)."
},
"arrive_within_days": {
"type": "integer",
"minimum": 1,
"maximum": 365,
"description": "The buyer's ARRIVAL window in WORKING DAYS (delivered within N days). Needs qty; use either this or within_days, not both. Converted server-side to a dispatch window with the published transit estimate: within_days = arrive_within_days - transit days_max (meta.filters echoes both). An estimate, never a guaranteed date. On its own a window only reports (can_fulfill_within); to act on it add fulfillable_only=true (drop) or sort=dispatch (rank)."
},
"fulfillable_only": {
"type": "boolean",
"default": false,
"description": "Return ONLY rows that can actually cover qty - inside within_days if given, otherwise at all. Needs qty. Without it qty/within_days only RANK, and only under sort=dispatch: with sort=price_asc the cheapest rows lead even when they hold 2 of the 5 units asked for. Leave it off to keep near-misses visible with their real terms."
},
"mpn": {
"type": "string",
"maxLength": 40,
"description": "Manufacturer part number, exact, case-insensitive. Filters our catalog by code and looks it up in the EXTENDED catalog (which then ignores q)."
},
"gtin": {
"type": "string",
"description": "Barcode (EAN/UPC/GTIN), 8-14 digits, exact; pass it as a STRING so leading zeros survive. Filters our catalog and the extended one."
},
"brand_name": {
"type": "string",
"maxLength": 100,
"description": "Brand NAME as text (e.g. \"Philips\"), exact, case-insensitive; narrows BOTH catalogs. Different from brand_ids, which filters by id."
},
"catalog_scope": {
"type": "string",
"enum": [
"erp",
"all",
"extended"
],
"description": "Which source to search: all (default), erp (our catalog only) or extended (supplier stock only). meta.extended says what was searched and why not."
},
"page": {
"type": "integer",
"minimum": 1,
"default": 1,
"description": "1-based page number."
},
"per_page": {
"type": "integer",
"minimum": 1,
"maximum": 20,
"default": 5,
"description": "Products per page, 1-20 (default 5). Ask for more pages rather than a bigger page."
}
}
},
"page": "/"
}get_productAnswer
One product by numeric id (sku): price with quantity breaks, a stock object (availability, available, fastest_lead_days, total, tiers: the exact stock tiers with working-day dispatch terms), gtin / gtins, specs, images. Old names still sent are listed in meta.deprecated_fields; read the canonical ones. Re-read before acting on price or stock. Prices are the generic list price in RON (meta.price_basis generic_list), never a negotiated price. Read-only.
View tool JSON
{
"name": "get_product",
"kind": "answer",
"impl": "imperative",
"description": "One product by numeric id (sku): price with quantity breaks, a stock object (availability, available, fastest_lead_days, total, tiers: the exact stock tiers with working-day dispatch terms), gtin / gtins, specs, images. Old names still sent are listed in meta.deprecated_fields; read the canonical ones. Re-read before acting on price or stock. Prices are the generic list price in RON (meta.price_basis generic_list), never a negotiated price. Read-only.",
"inputSchema": {
"type": "object",
"properties": {
"id": {
"type": "integer",
"minimum": 1,
"description": "Numeric product id (the trailing -NNNN of a product URL; sku). NOT the manufacturer part number."
}
},
"required": [
"id"
]
},
"page": "/"
}get_extended_productAnswer
One EXTENDED-CATALOG item by the X... sku search_products returned for it (e.g. X123456): manufacturer code, availability band, maximum dispatch term in working days, price. Special-order supplier stock, not an Office Max catalog product - the record is technically incomplete and carries supplier text, so do not infer specifications from it. An X... sku is NOT a catalog id: never pass it to get_product. Prices are the generic list price in RON (meta.price_basis generic_list), never a negotiated price. Read-only.
View tool JSON
{
"name": "get_extended_product",
"kind": "answer",
"impl": "imperative",
"description": "One EXTENDED-CATALOG item by the X... sku search_products returned for it (e.g. X123456): manufacturer code, availability band, maximum dispatch term in working days, price. Special-order supplier stock, not an Office Max catalog product - the record is technically incomplete and carries supplier text, so do not infer specifications from it. An X... sku is NOT a catalog id: never pass it to get_product. Prices are the generic list price in RON (meta.price_basis generic_list), never a negotiated price. Read-only.",
"inputSchema": {
"type": "object",
"properties": {
"sku": {
"type": "string",
"pattern": "^[Xx][0-9]{1,10}$",
"description": "The extended sku exactly as search_products returned it: X followed by digits. NOT a numeric catalog id."
}
},
"required": [
"sku"
]
},
"page": "/"
}get_categoriesAnswer
The category tree with product counts and URLs. A category id from here is the category argument of search_products and get_category_facets. Read-only.
View tool JSON
{
"name": "get_categories",
"kind": "answer",
"impl": "imperative",
"description": "The category tree with product counts and URLs. A category id from here is the category argument of search_products and get_category_facets. Read-only.",
"inputSchema": {
"type": "object",
"properties": {}
},
"page": "/"
}get_category_facetsAnswer
The filterable attributes of one category: exact facet keys and values (with counts) and the brands present. Call it before filtering; copy keys and values verbatim into search_products.facets. Read-only.
View tool JSON
{
"name": "get_category_facets",
"kind": "answer",
"impl": "imperative",
"description": "The filterable attributes of one category: exact facet keys and values (with counts) and the brands present. Call it before filtering; copy keys and values verbatim into search_products.facets. Read-only.",
"inputSchema": {
"type": "object",
"properties": {
"category": {
"type": "integer",
"minimum": 1,
"description": "Category id (from get_categories)."
}
},
"required": [
"category"
]
},
"page": "/"
}get_collectionAnswer
The products of a curated collection by handle (the last segment of a /collections/{handle} URL), with the same summaries as search_products. Prices are the generic list price in RON (meta.price_basis generic_list), never a negotiated price. Read-only.
View tool JSON
{
"name": "get_collection",
"kind": "answer",
"impl": "imperative",
"description": "The products of a curated collection by handle (the last segment of a /collections/{handle} URL), with the same summaries as search_products. Prices are the generic list price in RON (meta.price_basis generic_list), never a negotiated price. Read-only.",
"inputSchema": {
"type": "object",
"properties": {
"handle": {
"type": "string",
"description": "Collection handle: the last segment of a /collections/{handle} URL."
},
"in_stock": {
"type": "boolean",
"default": false,
"description": "true = only members orderable now. Omit for the full curated order."
},
"sort": {
"type": "string",
"enum": [
"name",
"price_asc",
"price_desc"
],
"description": "name, price_asc or price_desc. Omit to keep the curated order."
},
"page": {
"type": "integer",
"minimum": 1,
"default": 1,
"description": "1-based page number."
},
"per_page": {
"type": "integer",
"minimum": 1,
"maximum": 20,
"default": 5,
"description": "Products per page, 1-20 (default 5). Ask for more pages rather than a bigger page."
}
},
"required": [
"handle"
]
},
"page": "/"
}add_to_cartAction
Puts the given products and quantities in the visitor's cart and navigates this tab to the cart page so the human can review it. Quantities are SET, not added (calling twice does not double them). Products that cannot be bought are skipped by the server. This does NOT place an order: checkout requires the human, an account and an attached company.
View tool JSON
{
"name": "add_to_cart",
"kind": "act",
"impl": "imperative",
"description": "Puts the given products and quantities in the visitor's cart and navigates this tab to the cart page so the human can review it. Quantities are SET, not added (calling twice does not double them). Products that cannot be bought are skipped by the server. This does NOT place an order: checkout requires the human, an account and an attached company.",
"inputSchema": {
"type": "object",
"properties": {
"items": {
"type": "array",
"minItems": 1,
"maxItems": 50,
"items": {
"type": "object",
"properties": {
"id": {
"type": "integer",
"minimum": 1,
"description": "Numeric product id (sku)."
},
"qty": {
"type": "number",
"exclusiveMinimum": 0,
"maximum": 100000,
"default": 1,
"description": "Quantity to SET on the line; default 1; decimals accepted; max 100000."
}
},
"required": [
"id"
]
},
"description": "Cart lines to set, at most 50."
}
},
"required": [
"items"
]
},
"page": "/"
}