{
  "endpoint": "/api/mcp",
  "authentication": "OAuth 2.1 authorization code with PKCE S256; user-bound supplier access",
  "tools": [
    {
      "name": "cataloghub_list_supplier_catalog",
      "scope": "supplier:catalog:read",
      "title": "Read supplier catalogue",
      "description": "Read the selected supplier’s full private catalogue including reference prices, or active public listings. Requires OAuth, current membership, verified supplier/email and enabled supplier API access.",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "supplier_id": {
            "type": "string",
            "format": "uuid"
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100,
            "default": 100
          },
          "offset": {
            "type": "integer",
            "minimum": 0,
            "maximum": 1000000,
            "default": 0
          },
          "visibility": {
            "enum": [
              "all",
              "public"
            ],
            "default": "all"
          }
        },
        "required": [
          "supplier_id"
        ]
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "cataloghub_upsert_supplier_products",
      "scope": "supplier:catalog:write",
      "title": "Upsert supplier products",
      "description": "Atomically create, update or archive up to 500 SKU-identified products. Send complete replacements. Does not change buyer products or publish to Hops.",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "supplier_id": {
            "type": "string",
            "format": "uuid"
          },
          "products": {
            "type": "array",
            "minItems": 1,
            "maxItems": 500,
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "sku",
                "productName",
                "category",
                "basePrice"
              ],
              "properties": {
                "sku": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 120
                },
                "productName": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 300
                },
                "description": {
                  "anyOf": [
                    {
                      "type": "string",
                      "minLength": 0,
                      "maxLength": 4000
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "category": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 80
                },
                "unitOfMeasure": {
                  "anyOf": [
                    {
                      "type": "string",
                      "minLength": 0,
                      "maxLength": 80
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "packSize": {
                  "anyOf": [
                    {
                      "type": "number",
                      "exclusiveMinimum": 0,
                      "maximum": 99999999
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "basePrice": {
                  "type": "number",
                  "minimum": 0,
                  "maximum": 99999999.99,
                  "multipleOf": 0.01
                },
                "isPublic": {
                  "type": "boolean",
                  "default": false
                },
                "isActive": {
                  "type": "boolean",
                  "default": true
                },
                "sizing": {
                  "anyOf": [
                    {
                      "type": "object",
                      "additionalProperties": false,
                      "required": [
                        "baseUomType",
                        "baseUom",
                        "baseNumber",
                        "baseContainer"
                      ],
                      "properties": {
                        "baseUomType": {
                          "enum": [
                            "Unit",
                            "Weight",
                            "Volume"
                          ]
                        },
                        "baseUom": {
                          "enum": [
                            "Units",
                            "Grams",
                            "Millilitres"
                          ]
                        },
                        "baseNumber": {
                          "type": "number",
                          "exclusiveMinimum": 0,
                          "maximum": 99999999.99
                        },
                        "baseContainer": {
                          "enum": [
                            "Bag",
                            "Block",
                            "Bottle",
                            "Box",
                            "Case",
                            "Container",
                            "Crate",
                            "Each",
                            "Keg",
                            "Pack",
                            "Punnet",
                            "Roll",
                            "Tin",
                            "Tot",
                            "Tray",
                            "Tub"
                          ]
                        },
                        "multipleL1Container": {
                          "enum": [
                            "Bag",
                            "Block",
                            "Bottle",
                            "Box",
                            "Case",
                            "Container",
                            "Crate",
                            "Each",
                            "Keg",
                            "Pack",
                            "Punnet",
                            "Roll",
                            "Tin",
                            "Tot",
                            "Tray",
                            "Tub"
                          ]
                        },
                        "multipleL1Number": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 100000
                        }
                      },
                      "dependentRequired": {
                        "multipleL1Container": [
                          "multipleL1Number"
                        ],
                        "multipleL1Number": [
                          "multipleL1Container"
                        ]
                      },
                      "allOf": [
                        {
                          "oneOf": [
                            {
                              "properties": {
                                "baseUomType": {
                                  "const": "Unit"
                                },
                                "baseUom": {
                                  "const": "Units"
                                }
                              }
                            },
                            {
                              "properties": {
                                "baseUomType": {
                                  "const": "Weight"
                                },
                                "baseUom": {
                                  "const": "Grams"
                                }
                              }
                            },
                            {
                              "properties": {
                                "baseUomType": {
                                  "const": "Volume"
                                },
                                "baseUom": {
                                  "const": "Millilitres"
                                }
                              }
                            }
                          ]
                        }
                      ]
                    },
                    {
                      "type": "null"
                    }
                  ]
                }
              }
            },
            "description": "Complete product replacements. Supplier-scoped SKUs are trimmed and case-insensitive; duplicate SKUs in one batch are rejected atomically."
          }
        },
        "required": [
          "supplier_id",
          "products"
        ]
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      }
    },
    {
      "name": "cataloghub_list_supplier_trade_relationships",
      "scope": "supplier:relationships:read",
      "title": "Read supplier trade relationships",
      "description": "List only this supplier’s buyer relationships, currencies, statuses and counts. Company relationships are readable but cannot receive restaurant publications.",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "supplier_id": {
            "type": "string",
            "format": "uuid"
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100,
            "default": 100
          },
          "offset": {
            "type": "integer",
            "minimum": 0,
            "maximum": 1000000,
            "default": 0
          }
        },
        "required": [
          "supplier_id"
        ]
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "cataloghub_get_supplier_trade_catalog",
      "scope": "supplier:relationships:read",
      "title": "Read buyer-specific products and prices",
      "description": "Read latest proposed offers and accepted buyer products/prices separately for this supplier relationship. Both lists use limit/offset; paginate until both totals are exhausted.",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "supplier_id": {
            "type": "string",
            "format": "uuid"
          },
          "relationship_id": {
            "type": "string",
            "format": "uuid"
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100,
            "default": 100
          },
          "offset": {
            "type": "integer",
            "minimum": 0,
            "maximum": 1000000,
            "default": 0
          }
        },
        "required": [
          "supplier_id",
          "relationship_id"
        ]
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "cataloghub_publish_supplier_products",
      "scope": "supplier:catalog:publish",
      "title": "Propose products to a buyer",
      "description": "Snapshot selected products at buyer-specific net prices into a normal buyer catalogue review. Requires a confirmed active restaurant relationship and one active assignment. Buyer approval and completion are required; Hops publication remains a separate buyer action. Use an idempotency key for retries.",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "supplier_id": {
            "type": "string",
            "format": "uuid"
          },
          "relationship_id": {
            "type": "string",
            "format": "uuid"
          },
          "items": {
            "type": "array",
            "minItems": 1,
            "maxItems": 500,
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "productId",
                "price"
              ],
              "properties": {
                "productId": {
                  "type": "string",
                  "format": "uuid"
                },
                "price": {
                  "type": "number",
                  "minimum": 0,
                  "maximum": 99999999.99,
                  "multipleOf": 0.01
                }
              }
            },
            "description": "Active products owned by the supplier, at buyer-specific net ordering-unit prices. Duplicate product IDs are rejected."
          },
          "notes": {
            "type": "string",
            "minLength": 0,
            "maxLength": 2000
          },
          "idempotency_key": {
            "type": "string",
            "pattern": "^[A-Za-z0-9_.:-]{8,120}$",
            "description": "Reuse for exact retries. Changed payloads return a conflict."
          }
        },
        "required": [
          "supplier_id",
          "relationship_id",
          "items",
          "idempotency_key"
        ]
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      }
    },
    {
      "name": "cataloghub_list_supplier_allergen_evidence",
      "scope": "supplier:catalog:read",
      "title": "Read supplier allergen evidence revisions",
      "description": "Read private immutable supplier-attested evidence, source wording, revision hash and submitting account. Supplier identity verification does not independently verify allergen content.",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "supplier_id": {
            "type": "string",
            "format": "uuid"
          },
          "product_id": {
            "type": "string",
            "format": "uuid"
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100,
            "default": 100
          },
          "offset": {
            "type": "integer",
            "minimum": 0,
            "maximum": 1000000,
            "default": 0
          }
        },
        "required": [
          "supplier_id",
          "product_id"
        ]
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "cataloghub_submit_supplier_allergen_evidence",
      "scope": "supplier:catalog:write",
      "title": "Submit supplier allergen evidence",
      "description": "Submit an immutable supplier-attested evidence revision for an exact supplier product. Requires explicit supplierAttested acknowledgement. No buyer declaration or Hops write. Ask the user to attest the exact source and statements before submission.",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "supplier_id": {
            "type": "string",
            "format": "uuid"
          },
          "product_id": {
            "type": "string",
            "format": "uuid"
          },
          "evidence": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "supplierAttested",
              "source",
              "completeness",
              "statements"
            ],
            "properties": {
              "supplierAttested": {
                "const": true
              },
              "source": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "reference",
                  "description"
                ],
                "properties": {
                  "reference": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 500
                  },
                  "description": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 2000
                  },
                  "issuedOn": {
                    "type": "string",
                    "format": "date"
                  }
                }
              },
              "completeness": {
                "enum": [
                  "partial",
                  "complete"
                ]
              },
              "statements": {
                "type": "array",
                "minItems": 1,
                "maxItems": 28,
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "allergenCode",
                    "statementType",
                    "exactText"
                  ],
                  "properties": {
                    "allergenCode": {
                      "enum": [
                        "celery",
                        "cereals_containing_gluten",
                        "crustaceans",
                        "eggs",
                        "fish",
                        "lupin",
                        "milk",
                        "molluscs",
                        "mustard",
                        "peanuts",
                        "sesame",
                        "soybeans",
                        "sulphur_dioxide_sulphites",
                        "tree_nuts"
                      ]
                    },
                    "statementType": {
                      "enum": [
                        "contains",
                        "may_contain",
                        "declared_not_present"
                      ]
                    },
                    "exactText": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 2000
                    }
                  }
                }
              }
            },
            "description": "Immutable supplier-attested evidence, not buyer approval. Duplicate code/type statements and conflicting Contains/absence are rejected. Complete requires explicit Contains or declared_not_present for all fourteen codes; may_contain is an independent precautionary warning. Omitted codes remain unknown. Reference and exactText are supplier-authored; CatalogHub does not fetch or independently validate an external specification."
          },
          "idempotency_key": {
            "type": "string",
            "pattern": "^[A-Za-z0-9_.:-]{8,120}$",
            "description": "Reuse for exact retries. Changed payloads return a conflict."
          }
        },
        "required": [
          "supplier_id",
          "product_id",
          "evidence",
          "idempotency_key"
        ]
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      }
    },
    {
      "name": "cataloghub_publish_supplier_allergen_evidence",
      "scope": "supplier:catalog:publish",
      "title": "Share allergen evidence for buyer review",
      "description": "Share selected evidence revisions with exact accepted buyer products on a confirmed active relationship. Creates holding evidence in Supplier requests, not a declaration. Buyer source review, product matching and declaration closeout remain required; Hops approval is separate.",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "supplier_id": {
            "type": "string",
            "format": "uuid"
          },
          "relationship_id": {
            "type": "string",
            "format": "uuid"
          },
          "items": {
            "type": "array",
            "minItems": 1,
            "maxItems": 100,
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "productId",
                "revisionId",
                "restaurantCatalogItemId"
              ],
              "properties": {
                "productId": {
                  "type": "string",
                  "format": "uuid"
                },
                "revisionId": {
                  "type": "string",
                  "format": "uuid"
                },
                "restaurantCatalogItemId": {
                  "type": "string",
                  "format": "uuid"
                }
              }
            },
            "description": "Exact supplier product and immutable revision mapped to an accepted buyer catalogue item. Duplicate supplier/buyer products rejected. Unaccepted or changed supplier product identities cannot be published."
          },
          "idempotency_key": {
            "type": "string",
            "pattern": "^[A-Za-z0-9_.:-]{8,120}$",
            "description": "Reuse for exact retries. Changed payloads return a conflict."
          }
        },
        "required": [
          "supplier_id",
          "relationship_id",
          "items",
          "idempotency_key"
        ]
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      }
    },
    {
      "name": "cataloghub_get_customer_catalogue",
      "scope": "supplier:relationships:read",
      "title": "Read customer catalogue and pricing tier",
      "description": "Read the saved shared product selection and single percentage-off-RRP customer tier. Null discountedProductIds applies to all shared items; an explicit subset ring-fences the discount. No quantity tiers.",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "supplier_id": {
            "type": "string",
            "format": "uuid"
          },
          "relationship_id": {
            "type": "string",
            "format": "uuid"
          }
        },
        "required": [
          "supplier_id",
          "relationship_id"
        ]
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "cataloghub_save_customer_catalogue",
      "scope": "supplier:catalog:write",
      "title": "Save customer catalogue and pricing tier",
      "description": "Save selected primary catalogue products and a percentage-off-RRP tier for this customer. Send revision 0 to create or the last read revision to update. Saving never changes accepted buyer prices.",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "supplier_id": {
            "type": "string",
            "format": "uuid"
          },
          "relationship_id": {
            "type": "string",
            "format": "uuid"
          },
          "catalogue": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "revision",
              "name",
              "productIds",
              "discountPercent",
              "discountedProductIds"
            ],
            "properties": {
              "revision": {
                "type": "integer",
                "minimum": 0
              },
              "name": {
                "type": "string",
                "minLength": 0,
                "maxLength": 120
              },
              "productIds": {
                "type": "array",
                "maxItems": 500,
                "uniqueItems": true,
                "items": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "discountPercent": {
                "type": "number",
                "minimum": 0,
                "maximum": 100,
                "multipleOf": 0.01
              },
              "discountedProductIds": {
                "anyOf": [
                  {
                    "type": "array",
                    "maxItems": 500,
                    "uniqueItems": true,
                    "items": {
                      "type": "string",
                      "format": "uuid"
                    }
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            }
          }
        },
        "required": [
          "supplier_id",
          "relationship_id",
          "catalogue"
        ]
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      }
    },
    {
      "name": "cataloghub_preview_customer_catalogue",
      "scope": "supplier:relationships:read",
      "title": "Preview customer catalogue prices",
      "description": "Calculate current RRP, discount and net ordering-unit price for the saved selection. Round half up to two decimal places. Retain previewHash for explicit publication; source or tier changes invalidate it.",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "supplier_id": {
            "type": "string",
            "format": "uuid"
          },
          "relationship_id": {
            "type": "string",
            "format": "uuid"
          }
        },
        "required": [
          "supplier_id",
          "relationship_id"
        ]
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "cataloghub_publish_customer_catalogue",
      "scope": "supplier:catalog:publish",
      "title": "Publish a reviewed customer catalogue proposal",
      "description": "Publish the exact previewHash to a normal buyer review. Active confirmed relationship and supplier verification remain mandatory. Reuse the same idempotency key on retries; accepted buyer prices and Hops remain unchanged until buyer actions.",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "supplier_id": {
            "type": "string",
            "format": "uuid"
          },
          "relationship_id": {
            "type": "string",
            "format": "uuid"
          },
          "previewHash": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          },
          "notes": {
            "type": "string",
            "minLength": 0,
            "maxLength": 2000
          },
          "idempotency_key": {
            "type": "string",
            "pattern": "^[A-Za-z0-9_.:-]{8,120}$",
            "description": "Reuse for exact retries. Changed payloads return a conflict."
          }
        },
        "required": [
          "supplier_id",
          "relationship_id",
          "previewHash",
          "idempotency_key"
        ]
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      }
    },
    {
      "name": "cataloghub_preview_supplier_import",
      "scope": "supplier:catalog:write",
      "title": "Review supplier product import",
      "description": "Preview up to500JSON product rows without saving products. Returns editable products, 1-based row issues and a baseline. Omitted fields retain existing product metadata and visibility; new products default private. Correct invalid rows before committing.",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "supplier_id": {
            "type": "string",
            "format": "uuid"
          },
          "products": {
            "type": "array",
            "minItems": 1,
            "maxItems": 500,
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          }
        },
        "required": [
          "supplier_id",
          "products"
        ]
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "cataloghub_commit_supplier_import",
      "scope": "supplier:catalog:write",
      "title": "Commit a reviewed supplier import",
      "description": "Atomically save corrected complete product rows with the preview baseline. Rejects intervening catalogue changes; retry with the same idempotency key. Updates only the primary catalogue, with no buyer proposal or Hops write.",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "supplier_id": {
            "type": "string",
            "format": "uuid"
          },
          "baseline": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          },
          "products": {
            "type": "array",
            "minItems": 1,
            "maxItems": 500,
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "sku",
                "productName",
                "category",
                "basePrice"
              ],
              "properties": {
                "sku": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 120
                },
                "productName": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 300
                },
                "description": {
                  "anyOf": [
                    {
                      "type": "string",
                      "minLength": 0,
                      "maxLength": 4000
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "category": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 80
                },
                "unitOfMeasure": {
                  "anyOf": [
                    {
                      "type": "string",
                      "minLength": 0,
                      "maxLength": 80
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "packSize": {
                  "anyOf": [
                    {
                      "type": "number",
                      "exclusiveMinimum": 0,
                      "maximum": 99999999
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "basePrice": {
                  "type": "number",
                  "minimum": 0,
                  "maximum": 99999999.99,
                  "multipleOf": 0.01
                },
                "isPublic": {
                  "type": "boolean",
                  "default": false
                },
                "isActive": {
                  "type": "boolean",
                  "default": true
                },
                "sizing": {
                  "anyOf": [
                    {
                      "type": "object",
                      "additionalProperties": false,
                      "required": [
                        "baseUomType",
                        "baseUom",
                        "baseNumber",
                        "baseContainer"
                      ],
                      "properties": {
                        "baseUomType": {
                          "enum": [
                            "Unit",
                            "Weight",
                            "Volume"
                          ]
                        },
                        "baseUom": {
                          "enum": [
                            "Units",
                            "Grams",
                            "Millilitres"
                          ]
                        },
                        "baseNumber": {
                          "type": "number",
                          "exclusiveMinimum": 0,
                          "maximum": 99999999.99
                        },
                        "baseContainer": {
                          "enum": [
                            "Bag",
                            "Block",
                            "Bottle",
                            "Box",
                            "Case",
                            "Container",
                            "Crate",
                            "Each",
                            "Keg",
                            "Pack",
                            "Punnet",
                            "Roll",
                            "Tin",
                            "Tot",
                            "Tray",
                            "Tub"
                          ]
                        },
                        "multipleL1Container": {
                          "enum": [
                            "Bag",
                            "Block",
                            "Bottle",
                            "Box",
                            "Case",
                            "Container",
                            "Crate",
                            "Each",
                            "Keg",
                            "Pack",
                            "Punnet",
                            "Roll",
                            "Tin",
                            "Tot",
                            "Tray",
                            "Tub"
                          ]
                        },
                        "multipleL1Number": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 100000
                        }
                      },
                      "dependentRequired": {
                        "multipleL1Container": [
                          "multipleL1Number"
                        ],
                        "multipleL1Number": [
                          "multipleL1Container"
                        ]
                      },
                      "allOf": [
                        {
                          "oneOf": [
                            {
                              "properties": {
                                "baseUomType": {
                                  "const": "Unit"
                                },
                                "baseUom": {
                                  "const": "Units"
                                }
                              }
                            },
                            {
                              "properties": {
                                "baseUomType": {
                                  "const": "Weight"
                                },
                                "baseUom": {
                                  "const": "Grams"
                                }
                              }
                            },
                            {
                              "properties": {
                                "baseUomType": {
                                  "const": "Volume"
                                },
                                "baseUom": {
                                  "const": "Millilitres"
                                }
                              }
                            }
                          ]
                        }
                      ]
                    },
                    {
                      "type": "null"
                    }
                  ]
                }
              }
            },
            "description": "Complete product replacements. Supplier-scoped SKUs are trimmed and case-insensitive; duplicate SKUs in one batch are rejected atomically."
          },
          "idempotency_key": {
            "type": "string",
            "pattern": "^[A-Za-z0-9_.:-]{8,120}$",
            "description": "Reuse for exact retries. Changed payloads return a conflict."
          }
        },
        "required": [
          "supplier_id",
          "baseline",
          "products",
          "idempotency_key"
        ]
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      }
    }
  ]
}
