{
 "openapi": "3.1.0",
 "info": {
  "title": "UnoKeeper public storefront API",
  "version": "2026-08-29",
  "summary": "Read-only catalog, cart and agent-discovery endpoints of unokeeper.com (Shopify online store).",
  "description": "Public, unauthenticated endpoints of the UnoKeeper goalkeeper store (unokeeper.com). Catalog and search are read-only; cart endpoints act on the caller's own session cookie. Payment/checkout is a human step: agents must never complete a purchase without contemporaneous buyer approval — use the UCP MCP endpoint (`/api/ucp/mcp`) or the Shop skill (https://shop.app/SKILL.md) for agent checkout.\n\nMoney: `*.json` endpoints return decimal strings in MXN (e.g. `\"1299.00\"`); `*.js` endpoints and `/cart*.js` return integer cents (e.g. `129900`).\n\nErrors are JSON (`{status, message, description}`) on every JSON endpoint; unknown handles return HTTP 404 with an `application/json` body. Rate limits apply per IP (HTTP 429 → back off).\n\nStart with `/agents.md` (agent instructions, when-to-use guidance) and `/.well-known/ucp` (UCP merchant profile).",
  "termsOfService": "https://unokeeper.com/policies/terms-of-service",
  "contact": {
   "name": "UnoKeeper",
   "url": "https://unokeeper.com/pages/contacto"
  },
  "x-logo": {
   "url": "https://unokeeper.com/cdn/shop/files/UnoKeeper_Logo_Blanco_314.png"
  }
 },
 "externalDocs": {
  "description": "Agent instructions (agents.md / llms.txt)",
  "url": "https://unokeeper.com/agents.md"
 },
 "servers": [
  {
   "url": "https://unokeeper.com",
   "description": "Production storefront"
  }
 ],
 "security": [],
 "tags": [
  {
   "name": "catalog",
   "description": "Products and collections (read-only)."
  },
  {
   "name": "search",
   "description": "Predictive search and recommendations (read-only)."
  },
  {
   "name": "cart",
   "description": "Session cart (cookie-scoped). No payment happens here."
  },
  {
   "name": "agents",
   "description": "Discovery documents and MCP endpoints for AI agents."
  }
 ],
 "paths": {
  "/products.json": {
   "get": {
    "tags": [
     "catalog"
    ],
    "operationId": "listProducts",
    "summary": "List all published products",
    "description": "Paginated list of published products with variants, images and options. Prices are decimal strings in MXN. Use `limit=250` and iterate `page` until an empty `products` array is returned.",
    "parameters": [
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "description": "Items per page (1–250).",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 250,
       "default": 30
      }
     },
     {
      "name": "page",
      "in": "query",
      "required": false,
      "description": "1-based page number.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "default": 1
      }
     }
    ],
    "responses": {
     "200": {
      "description": "Product list.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/ProductListResponse"
        }
       }
      }
     },
     "429": {
      "description": "Rate limited (per IP). Back off exponentially and retry.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/ErrorResponse"
        }
       }
      }
     }
    }
   }
  },
  "/collections.json": {
   "get": {
    "tags": [
     "catalog"
    ],
    "operationId": "listCollections",
    "summary": "List collections",
    "description": "Paginated list of published collections (brand, size, category collections). Use the `handle` with `/collections/{handle}/products.json`.",
    "parameters": [
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "description": "Items per page (1–250).",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 250,
       "default": 30
      }
     },
     {
      "name": "page",
      "in": "query",
      "required": false,
      "description": "1-based page number.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "default": 1
      }
     }
    ],
    "responses": {
     "200": {
      "description": "Collection list.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/CollectionListResponse"
        }
       }
      }
     },
     "429": {
      "description": "Rate limited (per IP). Back off exponentially and retry.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/ErrorResponse"
        }
       }
      }
     }
    }
   }
  },
  "/collections/{handle}/products.json": {
   "get": {
    "tags": [
     "catalog"
    ],
    "operationId": "listCollectionProducts",
    "summary": "List products in a collection",
    "description": "Products of one collection, in the collection's sort order. Key handles: `all` (everything), `guantes-de-portero` (all goalkeeper gloves).",
    "parameters": [
     {
      "name": "handle",
      "in": "path",
      "required": true,
      "description": "Collection handle, e.g. `guantes-de-portero`.",
      "schema": {
       "type": "string"
      }
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "description": "Items per page (1–250).",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 250,
       "default": 30
      }
     },
     {
      "name": "page",
      "in": "query",
      "required": false,
      "description": "1-based page number.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "default": 1
      }
     }
    ],
    "responses": {
     "200": {
      "description": "Product list.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/ProductListResponse"
        }
       }
      }
     },
     "404": {
      "description": "Unknown handle or id. Body is JSON (empty object or `{\"errors\":\"Not Found\"}`).",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/ErrorResponse"
        }
       }
      }
     },
     "429": {
      "description": "Rate limited (per IP). Back off exponentially and retry.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/ErrorResponse"
        }
       }
      }
     }
    }
   }
  },
  "/products/{handle}.json": {
   "get": {
    "tags": [
     "catalog"
    ],
    "operationId": "getProduct",
    "summary": "Get one product (admin-style JSON)",
    "description": "Full product with `body_html`, variants (price as decimal string MXN, `sku`, `barcode`, option values such as size), images and options. Does not include per-variant stock; use `getProductStorefront` for `available`.",
    "parameters": [
     {
      "name": "handle",
      "in": "path",
      "required": true,
      "description": "Product handle from the product URL, e.g. `guantes-de-portero-rinat-ares-prime`.",
      "schema": {
       "type": "string"
      }
     }
    ],
    "responses": {
     "200": {
      "description": "Product wrapper.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/ProductResponse"
        }
       }
      }
     },
     "404": {
      "description": "Unknown handle or id. Body is JSON (empty object or `{\"errors\":\"Not Found\"}`).",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/ErrorResponse"
        }
       }
      }
     },
     "429": {
      "description": "Rate limited (per IP). Back off exponentially and retry.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/ErrorResponse"
        }
       }
      }
     }
    }
   }
  },
  "/products/{handle}.js": {
   "get": {
    "tags": [
     "catalog"
    ],
    "operationId": "getProductStorefront",
    "summary": "Get one product (storefront JSON, availability included)",
    "description": "Storefront representation: prices in integer cents (MXN), `available` per variant, `featured_image`, `options` with values. Content-Type is `text/javascript` but the body is plain JSON.",
    "parameters": [
     {
      "name": "handle",
      "in": "path",
      "required": true,
      "description": "Product handle.",
      "schema": {
       "type": "string"
      }
     }
    ],
    "responses": {
     "200": {
      "description": "Storefront product.",
      "content": {
       "text/javascript": {
        "schema": {
         "$ref": "#/components/schemas/StorefrontProduct"
        }
       }
      }
     },
     "404": {
      "description": "Unknown handle or id. Body is JSON (empty object or `{\"errors\":\"Not Found\"}`).",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/ErrorResponse"
        }
       }
      }
     },
     "429": {
      "description": "Rate limited (per IP). Back off exponentially and retry.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/ErrorResponse"
        }
       }
      }
     }
    }
   }
  },
  "/search/suggest.json": {
   "get": {
    "tags": [
     "search"
    ],
    "operationId": "searchSuggest",
    "summary": "Predictive search",
    "description": "Fast search across products, collections, pages, articles and query suggestions. Returns up to `resources[limit]` results per type.",
    "parameters": [
     {
      "name": "q",
      "in": "query",
      "required": true,
      "description": "Search terms, e.g. `rinat asimetrik talla 9`.",
      "schema": {
       "type": "string"
      }
     },
     {
      "name": "resources[type]",
      "in": "query",
      "required": false,
      "description": "Comma-separated resource types.",
      "schema": {
       "type": "string",
       "enum": [
        "product",
        "collection",
        "page",
        "article",
        "query"
       ],
       "default": "product"
      }
     },
     {
      "name": "resources[limit]",
      "in": "query",
      "required": false,
      "description": "Max results per type (1–10).",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 10,
       "default": 10
      }
     },
     {
      "name": "resources[options][unavailable_products]",
      "in": "query",
      "required": false,
      "description": "How to treat sold-out products.",
      "schema": {
       "type": "string",
       "enum": [
        "show",
        "hide",
        "last"
       ],
       "default": "last"
      }
     },
     {
      "name": "resources[options][fields]",
      "in": "query",
      "required": false,
      "description": "Comma-separated fields to match (`title,product_type,variants.title,variants.sku,vendor,tag`).",
      "schema": {
       "type": "string"
      }
     }
    ],
    "responses": {
     "200": {
      "description": "Search results grouped by resource type.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/SearchSuggestResponse"
        }
       }
      }
     },
     "422": {
      "description": "Validation error. JSON body with `status`, `message` and a human-readable `description` explaining how to fix the request.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/ErrorResponse"
        },
        "example": {
         "status": 422,
         "message": "Cart Error",
         "description": "Cannot find variant"
        }
       }
      }
     },
     "429": {
      "description": "Rate limited (per IP). Back off exponentially and retry.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/ErrorResponse"
        }
       }
      }
     }
    }
   }
  },
  "/recommendations/products.json": {
   "get": {
    "tags": [
     "search"
    ],
    "operationId": "getProductRecommendations",
    "summary": "Related / complementary products",
    "description": "Products related to (or complementary to) a given product id.",
    "parameters": [
     {
      "name": "product_id",
      "in": "query",
      "required": true,
      "description": "Numeric product id (from `listProducts`).",
      "schema": {
       "type": "integer",
       "format": "int64"
      }
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "description": "Max products (1–10).",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 10,
       "default": 10
      }
     },
     {
      "name": "intent",
      "in": "query",
      "required": false,
      "description": "Recommendation intent.",
      "schema": {
       "type": "string",
       "enum": [
        "related",
        "complementary"
       ],
       "default": "related"
      }
     }
    ],
    "responses": {
     "200": {
      "description": "Recommended products (storefront shape).",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/StorefrontProductListResponse"
        }
       }
      }
     },
     "404": {
      "description": "Unknown handle or id. Body is JSON (empty object or `{\"errors\":\"Not Found\"}`).",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/ErrorResponse"
        }
       }
      }
     },
     "422": {
      "description": "Validation error. JSON body with `status`, `message` and a human-readable `description` explaining how to fix the request.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/ErrorResponse"
        },
        "example": {
         "status": 422,
         "message": "Cart Error",
         "description": "Cannot find variant"
        }
       }
      }
     },
     "429": {
      "description": "Rate limited (per IP). Back off exponentially and retry.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/ErrorResponse"
        }
       }
      }
     }
    }
   }
  },
  "/cart.js": {
   "get": {
    "tags": [
     "cart"
    ],
    "operationId": "getCart",
    "summary": "Read the session cart",
    "description": "Current cart for the caller's cookie session. Prices in integer cents (MXN).",
    "responses": {
     "200": {
      "description": "Cart.",
      "content": {
       "text/javascript": {
        "schema": {
         "$ref": "#/components/schemas/Cart"
        }
       }
      }
     },
     "429": {
      "description": "Rate limited (per IP). Back off exponentially and retry.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/ErrorResponse"
        }
       }
      }
     }
    }
   }
  },
  "/cart/add.js": {
   "post": {
    "tags": [
     "cart"
    ],
    "operationId": "addToCart",
    "summary": "Add variants to the session cart",
    "description": "Adds one or more variants. Personalization (name/number) is passed as line-item `properties` on eligible products. This does NOT charge anything; checkout is a human step at `/checkout`.",
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/CartAddRequest"
       },
       "example": {
        "items": [
         {
          "id": 44444444444444,
          "quantity": 1
         }
        ]
       }
      }
     }
    },
    "responses": {
     "200": {
      "description": "Added line items.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/CartAddResponse"
        }
       }
      }
     },
     "422": {
      "description": "Validation error. JSON body with `status`, `message` and a human-readable `description` explaining how to fix the request.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/ErrorResponse"
        },
        "example": {
         "status": 422,
         "message": "Cart Error",
         "description": "Cannot find variant"
        }
       }
      }
     },
     "429": {
      "description": "Rate limited (per IP). Back off exponentially and retry.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/ErrorResponse"
        }
       }
      }
     }
    }
   }
  },
  "/cart/change.js": {
   "post": {
    "tags": [
     "cart"
    ],
    "operationId": "changeCartLine",
    "summary": "Change or remove one cart line",
    "description": "Set `quantity` for a line by variant `id` or 1-based `line`. `quantity: 0` removes it.",
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/CartChangeRequest"
       },
       "example": {
        "id": 44444444444444,
        "quantity": 0
       }
      }
     }
    },
    "responses": {
     "200": {
      "description": "Updated cart.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Cart"
        }
       }
      }
     },
     "422": {
      "description": "Validation error. JSON body with `status`, `message` and a human-readable `description` explaining how to fix the request.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/ErrorResponse"
        },
        "example": {
         "status": 422,
         "message": "Cart Error",
         "description": "Cannot find variant"
        }
       }
      }
     },
     "429": {
      "description": "Rate limited (per IP). Back off exponentially and retry.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/ErrorResponse"
        }
       }
      }
     }
    }
   }
  },
  "/cart/update.js": {
   "post": {
    "tags": [
     "cart"
    ],
    "operationId": "updateCart",
    "summary": "Update several lines, note or attributes",
    "description": "`updates` maps variant id → quantity. Also sets cart `note` and `attributes`.",
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/CartUpdateRequest"
       }
      }
     }
    },
    "responses": {
     "200": {
      "description": "Updated cart.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Cart"
        }
       }
      }
     },
     "422": {
      "description": "Validation error. JSON body with `status`, `message` and a human-readable `description` explaining how to fix the request.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/ErrorResponse"
        },
        "example": {
         "status": 422,
         "message": "Cart Error",
         "description": "Cannot find variant"
        }
       }
      }
     },
     "429": {
      "description": "Rate limited (per IP). Back off exponentially and retry.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/ErrorResponse"
        }
       }
      }
     }
    }
   }
  },
  "/cart/clear.js": {
   "post": {
    "tags": [
     "cart"
    ],
    "operationId": "clearCart",
    "summary": "Empty the session cart",
    "description": "Removes every line item from the caller's cart.",
    "responses": {
     "200": {
      "description": "Empty cart.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Cart"
        }
       }
      }
     },
     "429": {
      "description": "Rate limited (per IP). Back off exponentially and retry.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/ErrorResponse"
        }
       }
      }
     }
    }
   }
  },
  "/agents.md": {
   "get": {
    "tags": [
     "agents"
    ],
    "operationId": "getAgentInstructions",
    "summary": "Agent instructions (agents.md / llms.txt)",
    "description": "Markdown document with when-to-use guidance, endpoints, rules and policies. Also served at `/llms.txt` and `/llms-full.txt`.",
    "responses": {
     "200": {
      "description": "Markdown.",
      "content": {
       "text/markdown": {
        "schema": {
         "$ref": "#/components/schemas/MarkdownDocument"
        }
       }
      }
     }
    }
   }
  },
  "/.well-known/ucp": {
   "get": {
    "tags": [
     "agents"
    ],
    "operationId": "getUcpProfile",
    "summary": "UCP merchant profile",
    "description": "Universal Commerce Protocol discovery document: supported versions, services, capabilities and payment handlers.",
    "responses": {
     "200": {
      "description": "UCP profile.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/UcpProfile"
        }
       }
      }
     }
    }
   }
  },
  "/.well-known/mcp.json": {
   "get": {
    "tags": [
     "agents"
    ],
    "operationId": "getMcpManifest",
    "summary": "MCP manifest",
    "description": "Lists the store's MCP endpoints (Storefront MCP and UCP MCP) and their transports.",
    "responses": {
     "200": {
      "description": "MCP manifest.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/McpManifest"
        }
       }
      }
     }
    }
   }
  },
  "/api/mcp": {
   "post": {
    "tags": [
     "agents"
    ],
    "operationId": "storefrontMcp",
    "summary": "Storefront MCP (Streamable HTTP, JSON-RPC 2.0)",
    "description": "Model Context Protocol server for browsing: `initialize`, `tools/list`, `tools/call`. Tools: `search_catalog`, `get_product_details`, `get_cart`, `update_cart`, `search_shop_policies_and_faqs`. No authentication.",
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/JsonRpcRequest"
       },
       "example": {
        "jsonrpc": "2.0",
        "id": 1,
        "method": "tools/list",
        "params": {}
       }
      }
     }
    },
    "responses": {
     "200": {
      "description": "JSON-RPC response.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/JsonRpcResponse"
        }
       }
      }
     },
     "429": {
      "description": "Rate limited (per IP). Back off exponentially and retry.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/ErrorResponse"
        }
       }
      }
     }
    }
   }
  },
  "/api/ucp/mcp": {
   "post": {
    "tags": [
     "agents"
    ],
    "operationId": "ucpMcp",
    "summary": "UCP MCP (checkout-capable, JSON-RPC 2.0)",
    "description": "UCP shopping service over MCP: `search_catalog`, `lookup_catalog`, `get_product`, `create_cart`, `update_cart`, `create_checkout`, `update_checkout`, `complete_checkout`, `get_order`… Every request must carry the agent profile in `params.arguments.meta.ucp-agent.profile`. Completing a checkout requires explicit buyer approval.",
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/JsonRpcRequest"
       },
       "example": {
        "jsonrpc": "2.0",
        "id": 1,
        "method": "tools/list",
        "params": {
         "arguments": {
          "meta": {
           "ucp-agent": {
            "profile": "https://example.com/.well-known/ucp-agent.json"
           }
          }
         }
        }
       }
      }
     }
    },
    "responses": {
     "200": {
      "description": "JSON-RPC response.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/JsonRpcResponse"
        }
       }
      }
     },
     "429": {
      "description": "Rate limited (per IP). Back off exponentially and retry.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/ErrorResponse"
        }
       }
      }
     }
    }
   }
  },
  "/sitemap.xml": {
   "get": {
    "tags": [
     "agents"
    ],
    "operationId": "getSitemap",
    "summary": "Sitemap index",
    "description": "XML sitemap index linking product, collection, page and blog sitemaps.",
    "responses": {
     "200": {
      "description": "Sitemap index XML.",
      "content": {
       "application/xml": {
        "schema": {
         "type": "string"
        }
       }
      }
     }
    }
   }
  }
 },
 "components": {
  "securitySchemes": {
   "none": {
    "type": "apiKey",
    "in": "header",
    "name": "X-No-Auth-Required",
    "description": "Placeholder documenting that NO credential is required for any operation in this spec. Cart operations are scoped to the caller's own session cookie. Checkout/payment is never exposed to agents without buyer approval (UCP `complete_checkout` enforces it)."
   }
  },
  "schemas": {
   "ErrorResponse": {
    "type": "object",
    "description": "JSON error envelope returned by the storefront JSON endpoints.",
    "properties": {
     "status": {
      "type": "integer",
      "description": "HTTP status code."
     },
     "message": {
      "type": "string",
      "description": "Short error class, e.g. `Cart Error`."
     },
     "description": {
      "type": "string",
      "description": "Human-readable resolution hint, e.g. `Cannot find variant`."
     },
     "errors": {
      "description": "Alternative error payload (string or object) on some 404s."
     }
    }
   },
   "MoneyDecimal": {
    "type": "string",
    "description": "Decimal amount in MXN as a string, e.g. `\"1299.00\"`.",
    "pattern": "^[0-9]+(\\.[0-9]{1,2})?$"
   },
   "MoneyCents": {
    "type": "integer",
    "description": "Amount in MXN cents, e.g. `129900` = $1,299.00 MXN."
   },
   "Image": {
    "type": "object",
    "properties": {
     "id": {
      "type": "integer",
      "format": "int64"
     },
     "src": {
      "type": "string",
      "format": "uri"
     },
     "width": {
      "type": "integer"
     },
     "height": {
      "type": "integer"
     },
     "alt": {
      "type": [
       "string",
       "null"
      ]
     },
     "position": {
      "type": "integer"
     },
     "variant_ids": {
      "type": "array",
      "items": {
       "type": "integer",
       "format": "int64"
      }
     }
    }
   },
   "Option": {
    "type": "object",
    "properties": {
     "name": {
      "type": "string",
      "description": "e.g. `Talla`"
     },
     "position": {
      "type": "integer"
     },
     "values": {
      "type": "array",
      "items": {
       "type": "string"
      }
     }
    }
   },
   "Variant": {
    "type": "object",
    "properties": {
     "id": {
      "type": "integer",
      "format": "int64",
      "description": "Variant id — use it with `addToCart`."
     },
     "title": {
      "type": "string",
      "description": "Option values, e.g. `9`."
     },
     "option1": {
      "type": [
       "string",
       "null"
      ]
     },
     "option2": {
      "type": [
       "string",
       "null"
      ]
     },
     "option3": {
      "type": [
       "string",
       "null"
      ]
     },
     "sku": {
      "type": [
       "string",
       "null"
      ]
     },
     "barcode": {
      "type": [
       "string",
       "null"
      ]
     },
     "price": {
      "$ref": "#/components/schemas/MoneyDecimal"
     },
     "compare_at_price": {
      "oneOf": [
       {
        "$ref": "#/components/schemas/MoneyDecimal"
       },
       {
        "type": "null"
       }
      ]
     },
     "available": {
      "type": "boolean",
      "description": "Present in `*.js` responses only."
     },
     "grams": {
      "type": "integer"
     },
     "requires_shipping": {
      "type": "boolean"
     },
     "taxable": {
      "type": "boolean"
     },
     "featured_image": {
      "oneOf": [
       {
        "$ref": "#/components/schemas/Image"
       },
       {
        "type": "null"
       }
      ]
     }
    },
    "required": [
     "id",
     "title",
     "price"
    ]
   },
   "Product": {
    "type": "object",
    "properties": {
     "id": {
      "type": "integer",
      "format": "int64"
     },
     "title": {
      "type": "string"
     },
     "handle": {
      "type": "string"
     },
     "body_html": {
      "type": "string",
      "description": "HTML description (Spanish)."
     },
     "published_at": {
      "type": "string",
      "format": "date-time"
     },
     "created_at": {
      "type": "string",
      "format": "date-time"
     },
     "updated_at": {
      "type": "string",
      "format": "date-time"
     },
     "vendor": {
      "type": "string",
      "description": "Brand, e.g. `Rinat`."
     },
     "product_type": {
      "type": "string"
     },
     "tags": {
      "type": "array",
      "items": {
       "type": "string"
      }
     },
     "variants": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/Variant"
      }
     },
     "images": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/Image"
      }
     },
     "options": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/Option"
      }
     }
    },
    "required": [
     "id",
     "title",
     "handle",
     "variants"
    ]
   },
   "ProductResponse": {
    "type": "object",
    "properties": {
     "product": {
      "$ref": "#/components/schemas/Product"
     }
    },
    "required": [
     "product"
    ]
   },
   "ProductListResponse": {
    "type": "object",
    "properties": {
     "products": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/Product"
      }
     }
    },
    "required": [
     "products"
    ]
   },
   "StorefrontVariant": {
    "type": "object",
    "properties": {
     "id": {
      "type": "integer",
      "format": "int64"
     },
     "title": {
      "type": "string"
     },
     "options": {
      "type": "array",
      "items": {
       "type": "string"
      }
     },
     "price": {
      "$ref": "#/components/schemas/MoneyCents"
     },
     "compare_at_price": {
      "oneOf": [
       {
        "$ref": "#/components/schemas/MoneyCents"
       },
       {
        "type": "null"
       }
      ]
     },
     "available": {
      "type": "boolean"
     },
     "sku": {
      "type": [
       "string",
       "null"
      ]
     },
     "featured_image": {
      "oneOf": [
       {
        "$ref": "#/components/schemas/Image"
       },
       {
        "type": "null"
       }
      ]
     }
    },
    "required": [
     "id",
     "title",
     "price",
     "available"
    ]
   },
   "StorefrontProduct": {
    "type": "object",
    "properties": {
     "id": {
      "type": "integer",
      "format": "int64"
     },
     "title": {
      "type": "string"
     },
     "handle": {
      "type": "string"
     },
     "description": {
      "type": "string",
      "description": "HTML description."
     },
     "vendor": {
      "type": "string"
     },
     "type": {
      "type": "string"
     },
     "tags": {
      "type": "array",
      "items": {
       "type": "string"
      }
     },
     "price": {
      "$ref": "#/components/schemas/MoneyCents"
     },
     "price_min": {
      "$ref": "#/components/schemas/MoneyCents"
     },
     "price_max": {
      "$ref": "#/components/schemas/MoneyCents"
     },
     "available": {
      "type": "boolean"
     },
     "compare_at_price": {
      "oneOf": [
       {
        "$ref": "#/components/schemas/MoneyCents"
       },
       {
        "type": "null"
       }
      ]
     },
     "variants": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/StorefrontVariant"
      }
     },
     "images": {
      "type": "array",
      "items": {
       "type": "string",
       "format": "uri"
      }
     },
     "featured_image": {
      "type": [
       "string",
       "null"
      ]
     },
     "options": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/Option"
      }
     },
     "url": {
      "type": "string"
     }
    },
    "required": [
     "id",
     "title",
     "handle",
     "price",
     "available",
     "variants"
    ]
   },
   "StorefrontProductListResponse": {
    "type": "object",
    "properties": {
     "products": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/StorefrontProduct"
      }
     }
    },
    "required": [
     "products"
    ]
   },
   "Collection": {
    "type": "object",
    "properties": {
     "id": {
      "type": "integer",
      "format": "int64"
     },
     "handle": {
      "type": "string"
     },
     "title": {
      "type": "string"
     },
     "description": {
      "type": "string"
     },
     "published_at": {
      "type": "string",
      "format": "date-time"
     },
     "updated_at": {
      "type": "string",
      "format": "date-time"
     },
     "products_count": {
      "type": "integer"
     },
     "image": {
      "oneOf": [
       {
        "$ref": "#/components/schemas/Image"
       },
       {
        "type": "null"
       }
      ]
     }
    },
    "required": [
     "id",
     "handle",
     "title"
    ]
   },
   "CollectionListResponse": {
    "type": "object",
    "properties": {
     "collections": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/Collection"
      }
     }
    },
    "required": [
     "collections"
    ]
   },
   "SearchSuggestResponse": {
    "type": "object",
    "properties": {
     "resources": {
      "type": "object",
      "properties": {
       "results": {
        "type": "object",
        "properties": {
         "products": {
          "type": "array",
          "items": {
           "$ref": "#/components/schemas/SearchProduct"
          }
         },
         "collections": {
          "type": "array",
          "items": {
           "type": "object"
          }
         },
         "pages": {
          "type": "array",
          "items": {
           "type": "object"
          }
         },
         "articles": {
          "type": "array",
          "items": {
           "type": "object"
          }
         },
         "queries": {
          "type": "array",
          "items": {
           "type": "object"
          }
         }
        }
       }
      }
     }
    }
   },
   "SearchProduct": {
    "type": "object",
    "properties": {
     "id": {
      "type": "integer",
      "format": "int64"
     },
     "title": {
      "type": "string"
     },
     "handle": {
      "type": "string"
     },
     "url": {
      "type": "string"
     },
     "available": {
      "type": "boolean"
     },
     "price": {
      "$ref": "#/components/schemas/MoneyDecimal"
     },
     "price_min": {
      "$ref": "#/components/schemas/MoneyDecimal"
     },
     "price_max": {
      "$ref": "#/components/schemas/MoneyDecimal"
     },
     "vendor": {
      "type": "string"
     },
     "type": {
      "type": "string"
     },
     "tags": {
      "type": "array",
      "items": {
       "type": "string"
      }
     },
     "image": {
      "type": [
       "string",
       "null"
      ]
     },
     "variants": {
      "type": "array",
      "items": {
       "type": "object"
      }
     }
    }
   },
   "CartItem": {
    "type": "object",
    "properties": {
     "id": {
      "type": "integer",
      "format": "int64",
      "description": "Variant id."
     },
     "key": {
      "type": "string",
      "description": "Line key."
     },
     "quantity": {
      "type": "integer"
     },
     "title": {
      "type": "string"
     },
     "product_title": {
      "type": "string"
     },
     "variant_title": {
      "type": [
       "string",
       "null"
      ]
     },
     "handle": {
      "type": "string"
     },
     "url": {
      "type": "string"
     },
     "price": {
      "$ref": "#/components/schemas/MoneyCents"
     },
     "line_price": {
      "$ref": "#/components/schemas/MoneyCents"
     },
     "final_line_price": {
      "$ref": "#/components/schemas/MoneyCents"
     },
     "sku": {
      "type": [
       "string",
       "null"
      ]
     },
     "vendor": {
      "type": "string"
     },
     "properties": {
      "type": [
       "object",
       "null"
      ],
      "additionalProperties": {
       "type": "string"
      }
     },
     "image": {
      "type": [
       "string",
       "null"
      ]
     }
    }
   },
   "Cart": {
    "type": "object",
    "properties": {
     "token": {
      "type": "string"
     },
     "note": {
      "type": [
       "string",
       "null"
      ]
     },
     "attributes": {
      "type": "object"
     },
     "currency": {
      "type": "string",
      "example": "MXN"
     },
     "item_count": {
      "type": "integer"
     },
     "total_price": {
      "$ref": "#/components/schemas/MoneyCents"
     },
     "items_subtotal_price": {
      "$ref": "#/components/schemas/MoneyCents"
     },
     "total_discount": {
      "$ref": "#/components/schemas/MoneyCents"
     },
     "items": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/CartItem"
      }
     },
     "requires_shipping": {
      "type": "boolean"
     }
    },
    "required": [
     "token",
     "item_count",
     "total_price",
     "items"
    ]
   },
   "CartAddRequest": {
    "type": "object",
    "properties": {
     "items": {
      "type": "array",
      "minItems": 1,
      "items": {
       "type": "object",
       "properties": {
        "id": {
         "type": "integer",
         "format": "int64",
         "description": "Variant id."
        },
        "quantity": {
         "type": "integer",
         "minimum": 1,
         "default": 1
        },
        "properties": {
         "type": "object",
         "description": "Line-item properties, e.g. personalization name/number.",
         "additionalProperties": {
          "type": "string"
         }
        }
       },
       "required": [
        "id"
       ]
      }
     }
    },
    "required": [
     "items"
    ]
   },
   "CartAddResponse": {
    "type": "object",
    "properties": {
     "items": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/CartItem"
      }
     }
    },
    "required": [
     "items"
    ]
   },
   "CartChangeRequest": {
    "type": "object",
    "properties": {
     "id": {
      "type": [
       "integer",
       "string"
      ],
      "description": "Variant id or line key."
     },
     "line": {
      "type": "integer",
      "minimum": 1,
      "description": "1-based line index (alternative to `id`)."
     },
     "quantity": {
      "type": "integer",
      "minimum": 0
     },
     "properties": {
      "type": "object",
      "additionalProperties": {
       "type": "string"
      }
     }
    },
    "required": [
     "quantity"
    ]
   },
   "CartUpdateRequest": {
    "type": "object",
    "properties": {
     "updates": {
      "type": "object",
      "description": "Map of variant id → quantity.",
      "additionalProperties": {
       "type": "integer",
       "minimum": 0
      }
     },
     "note": {
      "type": "string"
     },
     "attributes": {
      "type": "object",
      "additionalProperties": {
       "type": "string"
      }
     }
    }
   },
   "MarkdownDocument": {
    "type": "string",
    "description": "Markdown text."
   },
   "UcpProfile": {
    "type": "object",
    "description": "UCP merchant profile (see https://ucp.dev).",
    "properties": {
     "ucp": {
      "type": "object",
      "properties": {
       "version": {
        "type": "string"
       },
       "supported_versions": {
        "type": "object"
       },
       "services": {
        "type": "object"
       },
       "capabilities": {
        "type": "object"
       },
       "payment": {
        "type": "object"
       }
      }
     }
    },
    "required": [
     "ucp"
    ]
   },
   "McpManifest": {
    "type": "object",
    "properties": {
     "name": {
      "type": "string"
     },
     "description": {
      "type": "string"
     },
     "servers": {
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "name": {
         "type": "string"
        },
        "url": {
         "type": "string",
         "format": "uri"
        },
        "transport": {
         "type": "string"
        },
        "authentication": {
         "type": "string"
        },
        "tools": {
         "type": "array",
         "items": {
          "type": "string"
         }
        }
       },
       "required": [
        "name",
        "url",
        "transport"
       ]
      }
     }
    },
    "required": [
     "name",
     "servers"
    ]
   },
   "JsonRpcRequest": {
    "type": "object",
    "properties": {
     "jsonrpc": {
      "type": "string",
      "const": "2.0"
     },
     "id": {
      "type": [
       "integer",
       "string"
      ]
     },
     "method": {
      "type": "string",
      "examples": [
       "initialize",
       "tools/list",
       "tools/call"
      ]
     },
     "params": {
      "type": "object"
     }
    },
    "required": [
     "jsonrpc",
     "method"
    ]
   },
   "JsonRpcResponse": {
    "type": "object",
    "properties": {
     "jsonrpc": {
      "type": "string",
      "const": "2.0"
     },
     "id": {
      "type": [
       "integer",
       "string",
       "null"
      ]
     },
     "result": {
      "type": "object"
     },
     "error": {
      "type": "object",
      "properties": {
       "code": {
        "type": "integer"
       },
       "message": {
        "type": "string"
       },
       "data": {}
      }
     }
    },
    "required": [
     "jsonrpc"
    ]
   }
  }
 }
}