Federated commerce search across independent WooCommerce merchants. Keyless, read-only MCP server.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Deterministic estimate from the merchant's own data: item price x quantity plus the shipping options the store declares for the destination (flat rate = declared base rate; free shipping with its threshold, whether this quantity reaches it and how much is missing). Lists what is not included (shipping classes, cost formulas, duties, taxes on shipping). Pass variation_id for variable products. Valid within max_age_seconds of the last merchant confirmation; live=true reads the merchant now. The checkout is the only authority.
ISO 3166-1 country, optionally with region: "IT" or "IT:CB".
Deterministic estimate from the merchant's own data: item price x quantity plus the shipping options the store declares for the destination (flat rate = declared base rate; free shipping with its threshold, whether this quantity reaches it and how much is missing). Lists what is not included (shipping classes, cost formulas, duties, taxes on shipping). Pass variation_id for variable products. Valid within max_age_seconds of the last merchant confirmation; live=true reads the merchant now. The checkout is the only authority.
| Argument | Type | Description |
|---|---|---|
| live | boolean | |
| p2209_id* | string | |
| quantity | integer | |
| destination* | string | ISO 3166-1 country, optionally with region: "IT" or "IT:CB". |
| variation_id | integer | |
| max_age_seconds | integer |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"p2209_id",
"destination"
],
"properties": {
"live": {
"type": "boolean"
},
"p2209_id": {
"type": "string",
"maxLength": 200
},
"quantity": {
"type": "integer",
"maximum": 999,
"minimum": 1
},
"destination": {
"type": "string",
"maxLength": 16,
"description": "ISO 3166-1 country, optionally with region: \"IT\" or \"IT:CB\"."
},
"variation_id": {
"type": "integer",
"exclusiveMinimum": 0
},
"max_age_seconds": {
"type": "integer",
"maximum": 2592000,
"minimum": 60
}
},
"additionalProperties": false
}Returns a cryptographic proof that this offer's product row is exactly the one the merchant signed in its catalog snapshot: the signed row, its bucket hashes, the Ed25519-signed manifest, the merchant public key and step-by-step verification. Trust is anchored on the merchant domain (key fingerprint published at key_anchor), not on KaliCart. It proves the row as signed at snapshot.generated_at, not the current price or stock: the checkout is authoritative. Independent verifier: https://global.kalicart.com/ucp/tools/verify-offer-attestation.js
| Argument | Type | Description |
|---|---|---|
| p2209_id* | string | Offer id from global_search (e.g. prod_duinshop-it_446678). |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"p2209_id"
],
"properties": {
"p2209_id": {
"type": "string",
"maxLength": 200,
"description": "Offer id from global_search (e.g. prod_duinshop-it_446678)."
}
},
"additionalProperties": false
}Use this after global_search when the selected candidate needs indexed details that are not already on its search card. The p2209_id must come from global_search. Variant options and colors are merchant-declared snapshot evidence matched by variation ID. This remains a snapshot, not live merchant verification; follow the returned handoff before confirming variant, price, or stock. Skip this call when the search card already answers the question.
| Argument | Type | Description |
|---|---|---|
| p2209_id* | string | KaliCart product ID (e.g. prod_duinshop-it_432395) |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"p2209_id"
],
"properties": {
"p2209_id": {
"type": "string",
"minLength": 1,
"description": "KaliCart product ID (e.g. prod_duinshop-it_432395)"
}
},
"additionalProperties": false
}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.
| Argument | Type | Description |
|---|---|---|
| q | string | 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. |
| leaf | string | 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. |
| brand | string | Brand facet filter (normalized, e.g. "nike") |
| color | string | 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. |
| limit |
Use this to discover the canonical category paths currently represented in KaliCart Global before calling global_search with leaf. An optional parent returns that node and its full subtree. This lists category vocabulary and counts; it does not return products.
| Argument | Type | Description |
|---|---|---|
| parent | string | Optional canonical node to restrict results to that node and its subtree (for example apparel or home.bedroom) |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"parent": {
"type": "string",
"description": "Optional canonical node to restrict results to that node and its subtree (for example apparel or home.bedroom)"
}
},
"additionalProperties": false
}Use this to inspect which WooCommerce merchants currently participate in the searchable KaliCart Global catalog and how much catalog coverage each contributes. It returns stable merchant identifiers, domains, storefront URLs, product counts, and sync time. Do not use it to find products; use global_search instead.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Max merchants to return (default 20, max 50), ordered by product count descending. No pagination |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"limit": {
"type": "integer",
"default": 20,
"maximum": 50,
"minimum": 1,
"description": "Max merchants to return (default 20, max 50), ordered by product count descending. No pagination"
}
},
"additionalProperties": false
}Use this when the user already knows a merchant domain and needs to check whether it publishes a KaliCart Bridge catalog, its latest observed access state, or its federation consent. This tool only reads the Global registry and never probes or modifies the merchant. Do not use it to discover products; use global_search instead.
| Argument | Type | Description |
|---|---|---|
| domain* | string | Merchant domain, e.g. shop.example.com |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"domain"
],
"properties": {
"domain": {
"type": "string",
"minLength": 4,
"description": "Merchant domain, e.g. shop.example.com"
}
},
"additionalProperties": false
}Checks a basket of offers (up to 40 lines, any merchants) against the merchants' own data. Per line: variant_selected, available, quantity (declared stock) and price_unchanged (pass expected_unit_price), each true / false / unknown with evidence. Per merchant: subtotal, declared shipping options for the destination computed on that merchant's basket subtotal (free-shipping threshold, amount missing), and the exact checkout-session request (endpoint + body) to send to the merchant ONLY after the user decides. KaliCart creates no session and no order; totals are estimates and the merchant checkout is the only authority.
| Argument | Type | Description |
|---|---|---|
| live | boolean | true reads each merchant now (at most 10 lines). |
| items* | array | |
| destination | string | ISO 3166-1 country, optionally with region: "IT" or "IT:CB". Needed for shipping. |
| max_age_seconds | integer |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"items"
],
"properties": {
"live": {
"type": "boolean",
"description": "true reads each merchant now (at most 10 lines)."
},
"items": {
"type": "array",
"items": {
"type": "object",
"required": [
"p2209_id"
],
"properties": {
"p2209_id": {
"type": "string",
"maxLength": 200
},
"quantity": {
"type": "integer",
"maximum": 999,
"minimum": 1
},
"variation_id": {
"type": "integer",
"exclusiveMinimum": 0
},
"expected_unit_price": {
"type": "number",
"minimum": 0,
"description": "The unit price you showed the user; checked as price_unchanged."
}
},
"additionalProperties": false
},
"maxItems": 40,
"minItems": 1
},
"destination": {
"type": "string",
"maxLength": 16,
"description": "ISO 3166-1 country, optionally with region: \"IT\" or \"IT:CB\". Needed for shipping."
},
"max_age_seconds": {
"type": "integer",
"maximum": 2592000,
"minimum": 60
}
},
"additionalProperties": false
}Checks ONE offer (optionally a selected variant) and returns true, false or unknown per constraint with evidence. Pass constraints as an ARRAY, for example [{"field":"available"},{"field":"price","max":300,"currency":"EUR"},{"field":"ships_to","value":"IT:CB"}]. available has no expected key: ask for the fact and read its result. For a merchant-declared variant option use {"field":"option","keys":["pa_color"],"values":["black"]}; use only native merchant values, with variation_id for a specific variant. Nothing is inferred or translated. Results are unknown outside max_age_seconds (default 86400); live=true reads the merchant now. Checkout is the final authority.
| Argument | Type | Description |
|---|---|---|
| live | boolean | true reads the merchant Bridge now (one request). |
| p2209_id* | string | Offer id from global_search (e.g. prod_duinshop-it_446678). |
| constraints* | array | Required array of 1-8 objects. Each object has field and only the keys shown by its schema. Examples: [{"field":"available"}], [{"field":"price","max":50,"currency":"EUR"}]. |
| variation_id | integer | Variant to check (from matching_variants or variants_compact). Without it, variant-dependent constraints may be unknown. |
| max_age_seconds | integer |
| integer |
| Max offers per page (1-25, default 10). Use next_cursor for the next page. |
| cursor | string | Opaque next_cursor from a previous global_search with the SAME arguments; returns the next page. A cursor from a different query is rejected. |
| gender | string | Canonical gender facet. Filtering is discovery-tolerant: untagged and unisex products can remain candidates, so verify the chosen product. Allowed values: female, male, unisex. |
| variant | any | 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. |
| in_stock | boolean | true filters product-level stock in the indexed snapshot. Does not verify a selected variant or a booking slot. |
| merchant | string | Restrict to one merchant: merchant_id as returned in result_facets.merchants or offers (e.g. "duinshop-it") or its domain. |
| max_price | number | 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. |
| min_price | number | 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. |
| result_facets | boolean | 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. |
| variant_limit | integer | Max matching variants returned per offer (1-500, default 50); matching_variant_count is always the full count |
| variant_facets | boolean | 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. |
| variant_in_stock | boolean | true keeps only variants whose own availability is in_stock |
| variant_price_max | number | Upper bound on the variant price (major units) |
| variant_price_min | number | Lower bound on the variant price (major units) |
| variant_facets_limit | integer | Max values per option key in variant_vocabulary (1-200, default 40); values_total is always the full count |
| variant_price_currency | string | 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. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"q": {
"type": "string",
"description": "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."
},
"leaf": {
"type": "string",
"description": "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."
},
"brand": {
"type": "string",
"description": "Brand facet filter (normalized, e.g. \"nike\")"
},
"color": {
"type": "string",
"description": "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."
},
"limit": {
"type": "integer",
"maximum": 25,
"minimum": 1,
"description": "Max offers per page (1-25, default 10). Use next_cursor for the next page."
},
"cursor": {
"type": "string",
"maxLength": 512,
"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."
},
"gender": {
"enum": [
"female",
"male",
"unisex"
],
"type": "string",
"description": "Canonical gender facet. Filtering is discovery-tolerant: untagged and unisex products can remain candidates, so verify the chosen product. Allowed values: female, male, unisex."
},
"variant": {
"anyOf": [
{
"type": "object",
"additionalProperties": {
"anyOf": [
{
"type": "string"
},
{
"type": "array",
"items": {
"type": "string"
},
"maxItems": 32
}
]
}
},
{
"type": "array",
"items": {
"type": "object",
"required": [
"values"
],
"properties": {
"keys": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 16
},
"values": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 32,
"minItems": 1
}
},
"additionalProperties": false
},
"maxItems": 4
}
],
"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."
},
"in_stock": {
"type": "boolean",
"description": "true filters product-level stock in the indexed snapshot. Does not verify a selected variant or a booking slot."
},
"merchant": {
"type": "string",
"maxLength": 253,
"description": "Restrict to one merchant: merchant_id as returned in result_facets.merchants or offers (e.g. \"duinshop-it\") or its domain."
},
"max_price": {
"type": "number",
"minimum": 0,
"description": "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."
},
"min_price": {
"type": "number",
"minimum": 0,
"description": "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."
},
"result_facets": {
"type": "boolean",
"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."
},
"variant_limit": {
"type": "integer",
"maximum": 500,
"minimum": 1,
"description": "Max matching variants returned per offer (1-500, default 50); matching_variant_count is always the full count"
},
"variant_facets": {
"type": "boolean",
"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."
},
"variant_in_stock": {
"type": "boolean",
"description": "true keeps only variants whose own availability is in_stock"
},
"variant_price_max": {
"type": "number",
"minimum": 0,
"description": "Upper bound on the variant price (major units)"
},
"variant_price_min": {
"type": "number",
"minimum": 0,
"description": "Lower bound on the variant price (major units)"
},
"variant_facets_limit": {
"type": "integer",
"maximum": 200,
"minimum": 1,
"description": "Max values per option key in variant_vocabulary (1-200, default 40); values_total is always the full count"
},
"variant_price_currency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$",
"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."
}
},
"additionalProperties": false
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"p2209_id",
"constraints"
],
"properties": {
"live": {
"type": "boolean",
"description": "true reads the merchant Bridge now (one request)."
},
"p2209_id": {
"type": "string",
"maxLength": 200,
"description": "Offer id from global_search (e.g. prod_duinshop-it_446678)."
},
"constraints": {
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"required": [
"field"
],
"properties": {
"max": {
"type": "number",
"minimum": 0
},
"min": {
"type": "number",
"minimum": 0
},
"field": {
"type": "string",
"const": "price"
},
"currency": {
"type": "string",
"pattern": "^[A-Z]{3}$"
}
},
"additionalProperties": false
},
{
"type": "object",
"required": [
"field"
],
"properties": {
"field": {
"type": "string",
"const": "available"
}
},
"additionalProperties": false
},
{
"type": "object",
"required": [
"field",
"values"
],
"properties": {
"keys": {
"type": "array",
"items": {
"type": "string",
"minLength": 1
},
"maxItems": 16
},
"field": {
"type": "string",
"const": "option"
},
"values": {
"type": "array",
"items": {
"type": "string",
"minLength": 1
},
"maxItems": 32,
"minItems": 1
}
},
"additionalProperties": false
},
{
"type": "object",
"required": [
"field",
"values"
],
"properties": {
"field": {
"type": "string",
"const": "brand"
},
"values": {
"$ref": "#/properties/constraints/items/anyOf/2/properties/values"
}
},
"additionalProperties": false
},
{
"type": "object",
"required": [
"field",
"values"
],
"properties": {
"field": {
"type": "string",
"const": "merchant"
},
"values": {
"$ref": "#/properties/constraints/items/anyOf/2/properties/values"
}
},
"additionalProperties": false
},
{
"type": "object",
"required": [
"field",
"values"
],
"properties": {
"keys": {
"$ref": "#/properties/constraints/items/anyOf/2/properties/keys"
},
"field": {
"type": "string",
"const": "attribute"
},
"values": {
"$ref": "#/properties/constraints/items/anyOf/2/properties/values"
}
},
"additionalProperties": false
},
{
"type": "object",
"required": [
"field",
"values"
],
"properties": {
"field": {
"type": "string",
"const": "barcode"
},
"values": {
"$ref": "#/properties/constraints/items/anyOf/2/properties/values"
}
},
"additionalProperties": false
},
{
"type": "object",
"required": [
"field",
"value"
],
"properties": {
"field": {
"type": "string",
"const": "ships_to"
},
"value": {
"type": "string",
"pattern": "^[A-Z]{2}(:[A-Z0-9-]{1,10})?$"
}
},
"additionalProperties": false
}
]
},
"maxItems": 8,
"minItems": 1,
"description": "Required array of 1-8 objects. Each object has field and only the keys shown by its schema. Examples: [{\"field\":\"available\"}], [{\"field\":\"price\",\"max\":50,\"currency\":\"EUR\"}]."
},
"variation_id": {
"type": "integer",
"description": "Variant to check (from matching_variants or variants_compact). Without it, variant-dependent constraints may be unknown.",
"exclusiveMinimum": 0
},
"max_age_seconds": {
"type": "integer",
"maximum": 2592000,
"minimum": 60
}
},
"additionalProperties": false
}