{
  "server": {
    "name": "com.camdentools/shop",
    "version": "1.2.0+db1d1f2",
    "description": "Camden Tools shopping tools for AI agents: search the catalogue, get prices ex/inc VAT and stock, compare products, check delivery options and promotions, track orders, build a basket link the shopper opens to pay, and (in the shopper's browser) manage the basket.",
    "endpoint": "https://camdentools.com/mcp",
    "protocol_versions": [
      "2025-11-25",
      "2025-06-18",
      "2025-03-26",
      "2024-11-05"
    ],
    "endpoints": [
      {
        "name": "MCP server",
        "path": "/mcp",
        "notes": "POST JSON-RPC 2.0 (Streamable HTTP, stateless, JSON responses): initialize, ping, tools/*, resources/*, prompts/*."
      },
      {
        "name": "MCP server (account)",
        "path": "/mcp/account",
        "notes": "Same server with an OAuth bearer token: the account tools become available. Answers 401 with a WWW-Authenticate challenge that starts sign-in; 404 until OAuth is enabled."
      },
      {
        "name": "A2A agent",
        "path": "/a2a",
        "notes": "POST JSON-RPC: SendMessage (message/send), GetTask, CancelTask. Deterministic shopping skills."
      },
      {
        "name": "Capabilities catalogue",
        "path": "/api/agent-capabilities",
        "notes": "This document: tools by category with JSON Schema inputs, resources, prompts, skills, in-page tools, changelog."
      },
      {
        "name": "MCP server card",
        "path": "/.well-known/mcp/server-card.json",
        "notes": "Server identity, endpoint and capabilities."
      },
      {
        "name": "A2A agent card",
        "path": "/.well-known/agent-card.json",
        "notes": "A2A v1.0 card with skills."
      },
      {
        "name": "API catalog",
        "path": "/.well-known/api-catalog",
        "notes": "RFC 9727 linkset."
      },
      {
        "name": "OpenAPI",
        "path": "/.well-known/openapi.json",
        "notes": "OpenAPI 3.1 for the public endpoints."
      },
      {
        "name": "Agent skills",
        "path": "/.well-known/agent-skills/index.json",
        "notes": "Agent Skills discovery index and the generated SKILL.md."
      },
      {
        "name": "ai-catalog",
        "path": "/.well-known/ai-catalog.json",
        "notes": "ARD capability manifest."
      },
      {
        "name": "Key directory",
        "path": "/.well-known/http-message-signatures-directory",
        "notes": "Web Bot Auth: Ed25519 public keys that verify requests signed by Camden Tools."
      },
      {
        "name": "ACP discovery",
        "path": "/.well-known/acp.json",
        "notes": "Agentic Commerce Protocol discovery document; 404 until agentic checkout is enabled."
      },
      {
        "name": "OAuth protected resource",
        "path": "/.well-known/oauth-protected-resource/mcp/account",
        "notes": "RFC 9728 metadata for the account endpoint (authorization server, scopes); 404 until OAuth is enabled."
      },
      {
        "name": "auth.md",
        "path": "/auth.md",
        "notes": "Authentication and registration rules for agents."
      },
      {
        "name": "llms.txt",
        "path": "/llms.txt",
        "notes": "Site overview for language models; llms-full.txt adds policies and the tool catalogue."
      }
    ]
  },
  "categories": [
    {
      "id": "catalogue",
      "label": "Catalogue",
      "description": "Search and browse products, full product details, live stock, side-by-side comparisons, documents, categories and brands.",
      "tools": [
        {
          "name": "search_products",
          "title": "Search products",
          "description": "Full-text search of the Camden Tools catalogue (hand tools, power tools, accessories, safety equipment). Returns compact products with prices ex/inc VAT, stock and a link. Use page/per_page to paginate and brand/min_price/max_price to narrow down.",
          "category": "catalogue",
          "availability": "public",
          "annotations": {
            "readOnlyHint": true,
            "openWorldHint": true
          },
          "inputSchema": {
            "type": "object",
            "properties": {
              "query": {
                "type": "string",
                "minLength": 1,
                "maxLength": 200,
                "description": "What the shopper is looking for, e.g. 'cordless combi drill 18v'."
              },
              "express": {
                "description": "Only products eligible for Website Express same-day dispatch (UK).",
                "type": "boolean"
              },
              "page": {
                "description": "Page number, starting at 1.",
                "type": "integer",
                "minimum": 1,
                "maximum": 500
              },
              "per_page": {
                "description": "Results per page: 15, 30, 50 or 100 (default 15).",
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              "sort": {
                "description": "Sort order: price_low, price_high, name_asc, name_desc or newest. Omit for the default (most popular) order.",
                "type": "string",
                "maxLength": 40
              },
              "brand": {
                "description": "Brand slug to filter by.",
                "type": "string",
                "maxLength": 80
              },
              "min_price": {
                "description": "Minimum price in the locale currency.",
                "type": "number",
                "minimum": 0
              },
              "max_price": {
                "description": "Maximum price in the locale currency.",
                "type": "number",
                "minimum": 0
              },
              "locale": {
                "description": "Storefront locale such as en-GB (default), en-US, de, fr-FR, es-ES, it-IT, nl-NL, pl. Controls product names, slugs and prices.",
                "type": "string",
                "minLength": 2,
                "maxLength": 5
              }
            },
            "required": [
              "query"
            ]
          }
        },
        {
          "name": "list_products",
          "title": "List products",
          "description": "Browse a product collection: most popular, newest, on sale, Website Express eligible, or a category by slug (see list_categories). Supports paging, sorting and brand/price filters.",
          "category": "catalogue",
          "availability": "public",
          "annotations": {
            "readOnlyHint": true,
            "openWorldHint": true
          },
          "inputSchema": {
            "type": "object",
            "properties": {
              "collection": {
                "type": "string",
                "enum": [
                  "popular",
                  "new",
                  "on-sale",
                  "express",
                  "category"
                ],
                "description": "Which collection to list."
              },
              "category_slug": {
                "description": "Required when collection is 'category'.",
                "type": "string",
                "maxLength": 120
              },
              "min_discount": {
                "description": "Minimum discount percentage (on-sale listings).",
                "type": "number",
                "minimum": 0,
                "maximum": 100
              },
              "page": {
                "description": "Page number, starting at 1.",
                "type": "integer",
                "minimum": 1,
                "maximum": 500
              },
              "per_page": {
                "description": "Results per page: 15, 30, 50 or 100 (default 15).",
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              "sort": {
                "description": "Sort order: price_low, price_high, name_asc, name_desc or newest. Omit for the default (most popular) order.",
                "type": "string",
                "maxLength": 40
              },
              "brand": {
                "description": "Brand slug to filter by.",
                "type": "string",
                "maxLength": 80
              },
              "min_price": {
                "description": "Minimum price in the locale currency.",
                "type": "number",
                "minimum": 0
              },
              "max_price": {
                "description": "Maximum price in the locale currency.",
                "type": "number",
                "minimum": 0
              },
              "locale": {
                "description": "Storefront locale such as en-GB (default), en-US, de, fr-FR, es-ES, it-IT, nl-NL, pl. Controls product names, slugs and prices.",
                "type": "string",
                "minLength": 2,
                "maxLength": 5
              }
            },
            "required": [
              "collection"
            ]
          }
        },
        {
          "name": "get_product",
          "title": "Get product",
          "description": "Full details for one product by slug, SKU or id: description, specifications, prices ex/inc VAT with bulk breaks, stock, variants, safety/spec documents and the canonical page URL. Provide exactly one of slug, sku or id.",
          "category": "catalogue",
          "availability": "public",
          "annotations": {
            "readOnlyHint": true,
            "openWorldHint": true
          },
          "inputSchema": {
            "type": "object",
            "properties": {
              "slug": {
                "description": "Product slug from a product URL (…/product/<slug>).",
                "type": "string",
                "maxLength": 200
              },
              "sku": {
                "description": "Product SKU.",
                "type": "string",
                "maxLength": 64
              },
              "id": {
                "description": "Numeric product id.",
                "type": "integer",
                "exclusiveMinimum": 0,
                "maximum": 9007199254740991
              },
              "locale": {
                "description": "Storefront locale such as en-GB (default), en-US, de, fr-FR, es-ES, it-IT, nl-NL, pl. Controls product names, slugs and prices.",
                "type": "string",
                "minLength": 2,
                "maxLength": 5
              }
            }
          }
        },
        {
          "name": "get_products",
          "title": "Get several products",
          "description": "Look up up to 50 products at once by SKU or by numeric id. Returns compact products (name, price ex/inc VAT, stock, link).",
          "category": "catalogue",
          "availability": "public",
          "annotations": {
            "readOnlyHint": true,
            "openWorldHint": true
          },
          "inputSchema": {
            "type": "object",
            "properties": {
              "skus": {
                "minItems": 1,
                "maxItems": 50,
                "type": "array",
                "items": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 64,
                  "description": "Product SKU exactly as shown on the site."
                }
              },
              "ids": {
                "minItems": 1,
                "maxItems": 50,
                "type": "array",
                "items": {
                  "type": "integer",
                  "exclusiveMinimum": 0,
                  "maximum": 9007199254740991
                }
              },
              "locale": {
                "description": "Storefront locale such as en-GB (default), en-US, de, fr-FR, es-ES, it-IT, nl-NL, pl. Controls product names, slugs and prices.",
                "type": "string",
                "minLength": 2,
                "maxLength": 5
              }
            }
          }
        },
        {
          "name": "get_stock_level",
          "title": "Get stock level",
          "description": "Live availability check for a SKU (is it available now and how many are in the London warehouse).",
          "category": "catalogue",
          "availability": "public",
          "annotations": {
            "readOnlyHint": true,
            "openWorldHint": true
          },
          "inputSchema": {
            "type": "object",
            "properties": {
              "sku": {
                "type": "string",
                "minLength": 1,
                "maxLength": 64,
                "description": "Product SKU exactly as shown on the site."
              }
            },
            "required": [
              "sku"
            ]
          }
        },
        {
          "name": "compare_products",
          "title": "Compare products",
          "description": "Side-by-side comparison of 2 to 5 products by SKU: price ex/inc VAT, stock, brand, weight and the specification bullet points, so an agent can recommend between options.",
          "category": "catalogue",
          "availability": "public",
          "annotations": {
            "readOnlyHint": true,
            "openWorldHint": true
          },
          "inputSchema": {
            "type": "object",
            "properties": {
              "skus": {
                "minItems": 2,
                "maxItems": 5,
                "type": "array",
                "items": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 64,
                  "description": "Product SKU exactly as shown on the site."
                }
              },
              "locale": {
                "description": "Storefront locale such as en-GB (default), en-US, de, fr-FR, es-ES, it-IT, nl-NL, pl. Controls product names, slugs and prices.",
                "type": "string",
                "minLength": 2,
                "maxLength": 5
              }
            },
            "required": [
              "skus"
            ]
          }
        },
        {
          "name": "get_related_products",
          "title": "Get related products",
          "description": "Variants, similar products, recommendations and 'you may also like' items for a product (by slug or SKU). Useful for alternatives when something is out of stock.",
          "category": "catalogue",
          "availability": "public",
          "annotations": {
            "readOnlyHint": true,
            "openWorldHint": true
          },
          "inputSchema": {
            "type": "object",
            "properties": {
              "slug": {
                "description": "Product slug from a product URL (…/product/<slug>).",
                "type": "string",
                "maxLength": 200
              },
              "sku": {
                "description": "Product SKU.",
                "type": "string",
                "maxLength": 64
              },
              "locale": {
                "description": "Storefront locale such as en-GB (default), en-US, de, fr-FR, es-ES, it-IT, nl-NL, pl. Controls product names, slugs and prices.",
                "type": "string",
                "minLength": 2,
                "maxLength": 5
              }
            }
          }
        },
        {
          "name": "get_product_documents",
          "title": "Get product documents",
          "description": "Safety data sheets, specification sheets and COSHH hazard codes for a product (by slug or SKU). Returns document URLs.",
          "category": "catalogue",
          "availability": "public",
          "annotations": {
            "readOnlyHint": true,
            "openWorldHint": true
          },
          "inputSchema": {
            "type": "object",
            "properties": {
              "slug": {
                "description": "Product slug from a product URL (…/product/<slug>).",
                "type": "string",
                "maxLength": 200
              },
              "sku": {
                "description": "Product SKU.",
                "type": "string",
                "maxLength": 64
              },
              "locale": {
                "description": "Storefront locale such as en-GB (default), en-US, de, fr-FR, es-ES, it-IT, nl-NL, pl. Controls product names, slugs and prices.",
                "type": "string",
                "minLength": 2,
                "maxLength": 5
              }
            }
          }
        },
        {
          "name": "list_categories",
          "title": "List categories",
          "description": "Product categories with slugs and links. Use popular_only for the curated set shown on the site; otherwise the full list.",
          "category": "catalogue",
          "availability": "public",
          "annotations": {
            "readOnlyHint": true,
            "openWorldHint": true
          },
          "inputSchema": {
            "type": "object",
            "properties": {
              "popular_only": {
                "description": "Only the popular categories (default false).",
                "type": "boolean"
              },
              "limit": {
                "description": "Maximum categories to return (default 100).",
                "type": "integer",
                "minimum": 1,
                "maximum": 200
              },
              "locale": {
                "description": "Storefront locale such as en-GB (default), en-US, de, fr-FR, es-ES, it-IT, nl-NL, pl. Controls product names, slugs and prices.",
                "type": "string",
                "minLength": 2,
                "maxLength": 5
              }
            }
          }
        },
        {
          "name": "get_category",
          "title": "Get category",
          "description": "A category's name, description and its products (paged) by category slug.",
          "category": "catalogue",
          "availability": "public",
          "annotations": {
            "readOnlyHint": true,
            "openWorldHint": true
          },
          "inputSchema": {
            "type": "object",
            "properties": {
              "slug": {
                "type": "string",
                "minLength": 1,
                "maxLength": 120,
                "description": "Category slug from list_categories."
              },
              "page": {
                "description": "Page number, starting at 1.",
                "type": "integer",
                "minimum": 1,
                "maximum": 500
              },
              "per_page": {
                "description": "Results per page: 15, 30, 50 or 100 (default 15).",
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              "sort": {
                "description": "Sort order: price_low, price_high, name_asc, name_desc or newest. Omit for the default (most popular) order.",
                "type": "string",
                "maxLength": 40
              },
              "locale": {
                "description": "Storefront locale such as en-GB (default), en-US, de, fr-FR, es-ES, it-IT, nl-NL, pl. Controls product names, slugs and prices.",
                "type": "string",
                "minLength": 2,
                "maxLength": 5
              }
            },
            "required": [
              "slug"
            ]
          }
        },
        {
          "name": "list_brands",
          "title": "List brands",
          "description": "Brands sold by Camden Tools (DeWalt, Makita, Milwaukee, Bosch, Stanley …). Without a query returns the popular brands; with a query searches brand names.",
          "category": "catalogue",
          "availability": "public",
          "annotations": {
            "readOnlyHint": true,
            "openWorldHint": true
          },
          "inputSchema": {
            "type": "object",
            "properties": {
              "query": {
                "description": "Brand name search text.",
                "type": "string",
                "maxLength": 80
              },
              "page": {
                "description": "Page number, starting at 1.",
                "type": "integer",
                "minimum": 1,
                "maximum": 500
              },
              "per_page": {
                "description": "Results per page: 15, 30, 50 or 100 (default 15).",
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              "sort": {
                "description": "Sort order: price_low, price_high, name_asc, name_desc or newest. Omit for the default (most popular) order.",
                "type": "string",
                "maxLength": 40
              }
            }
          }
        },
        {
          "name": "get_brand_products",
          "title": "Get brand products",
          "description": "A brand's details, its active promotions and its products (paged) by brand slug.",
          "category": "catalogue",
          "availability": "public",
          "annotations": {
            "readOnlyHint": true,
            "openWorldHint": true
          },
          "inputSchema": {
            "type": "object",
            "properties": {
              "slug": {
                "type": "string",
                "minLength": 1,
                "maxLength": 80,
                "description": "Brand slug from list_brands."
              },
              "page": {
                "description": "Page number, starting at 1.",
                "type": "integer",
                "minimum": 1,
                "maximum": 500
              },
              "per_page": {
                "description": "Results per page: 15, 30, 50 or 100 (default 15).",
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              "locale": {
                "description": "Storefront locale such as en-GB (default), en-US, de, fr-FR, es-ES, it-IT, nl-NL, pl. Controls product names, slugs and prices.",
                "type": "string",
                "minLength": 2,
                "maxLength": 5
              }
            },
            "required": [
              "slug"
            ]
          }
        }
      ]
    },
    {
      "id": "offers",
      "label": "Offers and bundles",
      "description": "Current promotions, per-product deals, curated bundles and basket-level promotion checks.",
      "tools": [
        {
          "name": "list_offers",
          "title": "List offers",
          "description": "Current storefront promotions (percentage/fixed discounts and free gifts), optionally grouped by brand or category. Also points at the /offers page.",
          "category": "offers",
          "availability": "public",
          "annotations": {
            "readOnlyHint": true,
            "openWorldHint": true
          },
          "inputSchema": {
            "type": "object",
            "properties": {
              "group_by": {
                "description": "Grouping (default all).",
                "type": "string",
                "enum": [
                  "all",
                  "brand",
                  "category"
                ]
              },
              "locale": {
                "description": "Storefront locale such as en-GB (default), en-US, de, fr-FR, es-ES, it-IT, nl-NL, pl. Controls product names, slugs and prices.",
                "type": "string",
                "minLength": 2,
                "maxLength": 5
              }
            }
          }
        },
        {
          "name": "get_product_promotions",
          "title": "Get product promotions",
          "description": "Active promotions that apply to one SKU (discounts, free gifts, end dates).",
          "category": "offers",
          "availability": "public",
          "annotations": {
            "readOnlyHint": true,
            "openWorldHint": true
          },
          "inputSchema": {
            "type": "object",
            "properties": {
              "sku": {
                "type": "string",
                "minLength": 1,
                "maxLength": 64,
                "description": "Product SKU exactly as shown on the site."
              },
              "locale": {
                "description": "Storefront locale such as en-GB (default), en-US, de, fr-FR, es-ES, it-IT, nl-NL, pl. Controls product names, slugs and prices.",
                "type": "string",
                "minLength": 2,
                "maxLength": 5
              }
            },
            "required": [
              "sku"
            ]
          }
        },
        {
          "name": "list_bundles",
          "title": "List bundles",
          "description": "Curated product bundles (kits) with their items and prices.",
          "category": "offers",
          "availability": "public",
          "annotations": {
            "readOnlyHint": true,
            "openWorldHint": true
          },
          "inputSchema": {
            "type": "object",
            "properties": {
              "locale": {
                "description": "Storefront locale such as en-GB (default), en-US, de, fr-FR, es-ES, it-IT, nl-NL, pl. Controls product names, slugs and prices.",
                "type": "string",
                "minLength": 2,
                "maxLength": 5
              }
            }
          }
        },
        {
          "name": "get_cart_promotions",
          "title": "Get basket promotions",
          "description": "Evaluate a prospective basket for a destination country: whether it can be fulfilled, which promotions apply (including free-delivery style offers and free gifts) and the adjusted basket value. Same check the checkout runs.",
          "category": "offers",
          "availability": "public",
          "annotations": {
            "readOnlyHint": true,
            "openWorldHint": true
          },
          "inputSchema": {
            "type": "object",
            "properties": {
              "country_code": {
                "type": "string",
                "pattern": "^[A-Za-z]{2}$",
                "description": "Destination country (ISO alpha-2)."
              },
              "items": {
                "minItems": 1,
                "maxItems": 50,
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "integer",
                      "exclusiveMinimum": 0,
                      "maximum": 9007199254740991,
                      "description": "Product id from search/product tools."
                    },
                    "quantity": {
                      "default": 1,
                      "type": "integer",
                      "minimum": 1,
                      "maximum": 999
                    }
                  },
                  "required": [
                    "id"
                  ]
                },
                "description": "Basket lines as product ids with quantities."
              },
              "has_tax_id": {
                "description": "Whether the buyer has a VAT/tax id (business purchase).",
                "type": "boolean"
              },
              "locale": {
                "description": "Storefront locale such as en-GB (default), en-US, de, fr-FR, es-ES, it-IT, nl-NL, pl. Controls product names, slugs and prices.",
                "type": "string",
                "minLength": 2,
                "maxLength": 5
              }
            },
            "required": [
              "country_code",
              "items"
            ]
          }
        }
      ]
    },
    {
      "id": "delivery",
      "label": "Delivery",
      "description": "Website Express same-day dispatch, shipping availability by country, country pricing, delivery estimates and UK postcode lookup.",
      "tools": [
        {
          "name": "get_express_delivery_status",
          "title": "Get Website Express status",
          "description": "Whether Website Express (free same-working-day dispatch for eligible UK orders) is available right now, the order-by cutoff and the promised dispatch date.",
          "category": "delivery",
          "availability": "public",
          "annotations": {
            "readOnlyHint": true,
            "openWorldHint": true
          },
          "inputSchema": {
            "type": "object",
            "properties": {
              "locale": {
                "description": "Storefront locale such as en-GB (default), en-US, de, fr-FR, es-ES, it-IT, nl-NL, pl. Controls product names, slugs and prices.",
                "type": "string",
                "minLength": 2,
                "maxLength": 5
              }
            }
          }
        },
        {
          "name": "check_express_eligibility",
          "title": "Check Website Express eligibility",
          "description": "Whole-basket Website Express verdict for a set of product ids and quantities: every line must be eligible (no split shipments).",
          "category": "delivery",
          "availability": "public",
          "annotations": {
            "readOnlyHint": true,
            "openWorldHint": true
          },
          "inputSchema": {
            "type": "object",
            "properties": {
              "items": {
                "minItems": 1,
                "maxItems": 50,
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "integer",
                      "exclusiveMinimum": 0,
                      "maximum": 9007199254740991,
                      "description": "Product id from search/product tools."
                    },
                    "quantity": {
                      "default": 1,
                      "type": "integer",
                      "minimum": 1,
                      "maximum": 999
                    }
                  },
                  "required": [
                    "id"
                  ]
                },
                "description": "Basket lines as product ids with quantities."
              },
              "locale": {
                "description": "Storefront locale such as en-GB (default), en-US, de, fr-FR, es-ES, it-IT, nl-NL, pl. Controls product names, slugs and prices.",
                "type": "string",
                "minLength": 2,
                "maxLength": 5
              }
            },
            "required": [
              "items"
            ]
          }
        },
        {
          "name": "check_shipping_availability",
          "title": "Check shipping availability",
          "description": "Whether Camden Tools ships to a country, with any restriction message.",
          "category": "delivery",
          "availability": "public",
          "annotations": {
            "readOnlyHint": true,
            "openWorldHint": true
          },
          "inputSchema": {
            "type": "object",
            "properties": {
              "country_code": {
                "type": "string",
                "pattern": "^[A-Za-z]{2}$",
                "description": "ISO 3166-1 alpha-2 country code, e.g. GB, IE, DE, US."
              },
              "locale": {
                "description": "Storefront locale such as en-GB (default), en-US, de, fr-FR, es-ES, it-IT, nl-NL, pl. Controls product names, slugs and prices.",
                "type": "string",
                "minLength": 2,
                "maxLength": 5
              }
            },
            "required": [
              "country_code"
            ]
          }
        },
        {
          "name": "get_prices_for_country",
          "title": "Get prices for a country",
          "description": "Country-specific pricing for a set of products (the checkout applies the destination country's currency and pricing). Returns unit, sale and final prices plus the subtotal.",
          "category": "delivery",
          "availability": "public",
          "annotations": {
            "readOnlyHint": true,
            "openWorldHint": true
          },
          "inputSchema": {
            "type": "object",
            "properties": {
              "shipping_country": {
                "type": "string",
                "pattern": "^[A-Za-z]{2}$",
                "description": "ISO 3166-1 alpha-2 country code, e.g. GB, IE, DE, US."
              },
              "items": {
                "minItems": 1,
                "maxItems": 50,
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "integer",
                      "exclusiveMinimum": 0,
                      "maximum": 9007199254740991,
                      "description": "Product id from search/product tools."
                    },
                    "quantity": {
                      "default": 1,
                      "type": "integer",
                      "minimum": 1,
                      "maximum": 999
                    }
                  },
                  "required": [
                    "id"
                  ]
                },
                "description": "Basket lines as product ids with quantities."
              },
              "locale": {
                "description": "Storefront locale such as en-GB (default), en-US, de, fr-FR, es-ES, it-IT, nl-NL, pl. Controls product names, slugs and prices.",
                "type": "string",
                "minLength": 2,
                "maxLength": 5
              }
            },
            "required": [
              "shipping_country",
              "items"
            ]
          }
        },
        {
          "name": "estimate_delivery",
          "title": "Estimate delivery",
          "description": "Delivery services, charges and transit times for a basket to a destination (country plus postcode/ZIP and city). This is an estimate using placeholder contact details; exact rates are confirmed at checkout.",
          "category": "delivery",
          "availability": "public",
          "annotations": {
            "readOnlyHint": true,
            "openWorldHint": true
          },
          "inputSchema": {
            "type": "object",
            "properties": {
              "country_code": {
                "type": "string",
                "pattern": "^[A-Za-z]{2}$",
                "description": "ISO 3166-1 alpha-2 country code, e.g. GB, IE, DE, US."
              },
              "postcode": {
                "description": "Destination postcode / ZIP.",
                "type": "string",
                "maxLength": 20
              },
              "city": {
                "description": "Destination city.",
                "type": "string",
                "maxLength": 80
              },
              "items": {
                "minItems": 1,
                "maxItems": 50,
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "integer",
                      "exclusiveMinimum": 0,
                      "maximum": 9007199254740991,
                      "description": "Product id from search/product tools."
                    },
                    "quantity": {
                      "default": 1,
                      "type": "integer",
                      "minimum": 1,
                      "maximum": 999
                    }
                  },
                  "required": [
                    "id"
                  ]
                },
                "description": "Basket lines as product ids with quantities."
              },
              "locale": {
                "description": "Storefront locale such as en-GB (default), en-US, de, fr-FR, es-ES, it-IT, nl-NL, pl. Controls product names, slugs and prices.",
                "type": "string",
                "minLength": 2,
                "maxLength": 5
              }
            },
            "required": [
              "country_code",
              "items"
            ]
          }
        },
        {
          "name": "lookup_uk_postcode",
          "title": "Look up a UK postcode",
          "description": "Addresses for a UK postcode (rate limited upstream). Returns matching addresses or suggestions when the postcode is incomplete.",
          "category": "delivery",
          "availability": "public",
          "annotations": {
            "readOnlyHint": true,
            "openWorldHint": true
          },
          "inputSchema": {
            "type": "object",
            "properties": {
              "postcode": {
                "type": "string",
                "minLength": 2,
                "maxLength": 12,
                "description": "UK postcode, e.g. NW2 7JW."
              }
            },
            "required": [
              "postcode"
            ]
          }
        }
      ]
    },
    {
      "id": "basket",
      "label": "Basket",
      "description": "Prepare a basket the shopper opens on the site, reviews and pays for at checkout.",
      "tools": [
        {
          "name": "create_basket_link",
          "title": "Create a basket link",
          "description": "Turn product ids and quantities into one link that fills the shopper's basket on camdentools.com. Opening the link makes sure the basket holds at least those quantities (opening it twice does not double them); the shopper reviews the basket and pays at checkout themselves. The result says which lines are out of stock: those cannot be bought, so offer an alternative before sharing the link. Use it to finish a shopping conversation. Ids come from search_products, list_products or get_product.",
          "category": "basket",
          "availability": "public",
          "annotations": {
            "readOnlyHint": true,
            "idempotentHint": true,
            "openWorldHint": true
          },
          "inputSchema": {
            "type": "object",
            "properties": {
              "items": {
                "minItems": 1,
                "maxItems": 50,
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "integer",
                      "exclusiveMinimum": 0,
                      "maximum": 9007199254740991,
                      "description": "Product id from search/product tools."
                    },
                    "quantity": {
                      "default": 1,
                      "type": "integer",
                      "minimum": 1,
                      "maximum": 999
                    }
                  },
                  "required": [
                    "id"
                  ]
                },
                "description": "Basket lines as product ids with quantities."
              },
              "locale": {
                "description": "Storefront locale such as en-GB (default), en-US, de, fr-FR, es-ES, it-IT, nl-NL, pl. Controls product names, slugs and prices.",
                "type": "string",
                "minLength": 2,
                "maxLength": 5
              }
            },
            "required": [
              "items"
            ]
          }
        }
      ]
    },
    {
      "id": "orders",
      "label": "Orders",
      "description": "Track any order with its order number and delivery postcode.",
      "tools": [
        {
          "name": "track_guest_order",
          "title": "Track an order",
          "description": "Order status, tracking number/URL, shipping method and line items for any order, given the order number and the delivery postcode (no sign-in needed).",
          "category": "orders",
          "availability": "public",
          "annotations": {
            "readOnlyHint": true,
            "openWorldHint": true
          },
          "inputSchema": {
            "type": "object",
            "properties": {
              "order_number": {
                "type": "string",
                "minLength": 3,
                "maxLength": 40,
                "description": "Order number from the confirmation email."
              },
              "postcode": {
                "type": "string",
                "minLength": 2,
                "maxLength": 20,
                "description": "Delivery postcode / ZIP on the order."
              }
            },
            "required": [
              "order_number",
              "postcode"
            ]
          }
        }
      ]
    },
    {
      "id": "account",
      "label": "Account (browser session)",
      "description": "The signed-in shopper's profile and order history. Only from the shopper's own browser on camdentools.com, after they allow AI agent access.",
      "tools": [
        {
          "name": "get_my_profile",
          "title": "Get my profile",
          "description": "The signed-in shopper's name, email and saved addresses. Needs the shopper's browser session with AI agent access, or an OAuth token with the profile:read scope.",
          "category": "account",
          "availability": "same_origin",
          "annotations": {
            "readOnlyHint": true,
            "openWorldHint": false
          },
          "inputSchema": {
            "type": "object",
            "properties": {}
          }
        },
        {
          "name": "list_my_orders",
          "title": "List my orders",
          "description": "The signed-in shopper's order history (most recent first). Needs the shopper's browser session with AI agent access, or an OAuth token with the orders:read scope.",
          "category": "account",
          "availability": "same_origin",
          "annotations": {
            "readOnlyHint": true,
            "openWorldHint": false
          },
          "inputSchema": {
            "type": "object",
            "properties": {
              "page": {
                "description": "Page number, starting at 1.",
                "type": "integer",
                "minimum": 1,
                "maximum": 500
              }
            }
          }
        },
        {
          "name": "get_my_order",
          "title": "Get my order",
          "description": "One of the signed-in shopper's orders by order number, with status, tracking and line items. Needs the shopper's browser session with AI agent access, or an OAuth token with the orders:read scope.",
          "category": "account",
          "availability": "same_origin",
          "annotations": {
            "readOnlyHint": true,
            "openWorldHint": false
          },
          "inputSchema": {
            "type": "object",
            "properties": {
              "order_number": {
                "type": "string",
                "minLength": 3,
                "maxLength": 40
              }
            },
            "required": [
              "order_number"
            ]
          }
        }
      ]
    },
    {
      "id": "store",
      "label": "Store and help",
      "description": "Store facts, policies, the London collection point and the blog.",
      "tools": [
        {
          "name": "get_site_info",
          "title": "Get store information",
          "description": "Who Camden Tools is, how to contact them, VAT display rules, key page links, current announcements and a summary of each policy (delivery, returns, payment, FAQs). Call get_policy for the full text of a policy.",
          "category": "store",
          "availability": "public",
          "annotations": {
            "readOnlyHint": true,
            "openWorldHint": true
          },
          "inputSchema": {
            "type": "object",
            "properties": {
              "locale": {
                "description": "Storefront locale such as en-GB (default), en-US, de, fr-FR, es-ES, it-IT, nl-NL, pl. Controls product names, slugs and prices.",
                "type": "string",
                "minLength": 2,
                "maxLength": 5
              }
            }
          }
        },
        {
          "name": "get_policy",
          "title": "Get policy text",
          "description": "Full text (markdown) of a store policy: delivery, returns, payment-options, faqs or contact.",
          "category": "store",
          "availability": "public",
          "annotations": {
            "readOnlyHint": true,
            "openWorldHint": true
          },
          "inputSchema": {
            "type": "object",
            "properties": {
              "policy": {
                "type": "string",
                "enum": [
                  "delivery",
                  "returns",
                  "payment-options",
                  "faqs",
                  "contact"
                ]
              },
              "locale": {
                "description": "Storefront locale such as en-GB (default), en-US, de, fr-FR, es-ES, it-IT, nl-NL, pl. Controls product names, slugs and prices.",
                "type": "string",
                "minLength": 2,
                "maxLength": 5
              }
            },
            "required": [
              "policy"
            ]
          }
        },
        {
          "name": "get_collection_point_info",
          "title": "Get collection point info",
          "description": "The London Click & Collect warehouse: address, opening hours, whether it is open right now (Europe/London, bank holidays respected) and when it next opens.",
          "category": "store",
          "availability": "public",
          "annotations": {
            "readOnlyHint": true,
            "openWorldHint": true
          },
          "inputSchema": {
            "type": "object",
            "properties": {}
          }
        },
        {
          "name": "search_blog_posts",
          "title": "Search blog posts",
          "description": "Guides and articles from the Camden Tools blog (how-tos, buying guides, brand news).",
          "category": "store",
          "availability": "public",
          "annotations": {
            "readOnlyHint": true,
            "openWorldHint": true
          },
          "inputSchema": {
            "type": "object",
            "properties": {
              "query": {
                "description": "Search text; omit for the latest posts.",
                "type": "string",
                "maxLength": 120
              },
              "page": {
                "description": "Page number, starting at 1.",
                "type": "integer",
                "minimum": 1,
                "maximum": 500
              }
            }
          }
        },
        {
          "name": "get_blog_post",
          "title": "Get blog post",
          "description": "A blog post's full text (plain text) by slug.",
          "category": "store",
          "availability": "public",
          "annotations": {
            "readOnlyHint": true,
            "openWorldHint": true
          },
          "inputSchema": {
            "type": "object",
            "properties": {
              "slug": {
                "type": "string",
                "minLength": 1,
                "maxLength": 200
              },
              "locale": {
                "description": "Storefront locale such as en-GB (default), en-US, de, fr-FR, es-ES, it-IT, nl-NL, pl. Controls product names, slugs and prices.",
                "type": "string",
                "minLength": 2,
                "maxLength": 5
              }
            },
            "required": [
              "slug"
            ]
          }
        }
      ]
    }
  ],
  "tools": [
    {
      "name": "search_products",
      "title": "Search products",
      "description": "Full-text search of the Camden Tools catalogue (hand tools, power tools, accessories, safety equipment). Returns compact products with prices ex/inc VAT, stock and a link. Use page/per_page to paginate and brand/min_price/max_price to narrow down.",
      "category": "catalogue",
      "availability": "public",
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": true
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200,
            "description": "What the shopper is looking for, e.g. 'cordless combi drill 18v'."
          },
          "express": {
            "description": "Only products eligible for Website Express same-day dispatch (UK).",
            "type": "boolean"
          },
          "page": {
            "description": "Page number, starting at 1.",
            "type": "integer",
            "minimum": 1,
            "maximum": 500
          },
          "per_page": {
            "description": "Results per page: 15, 30, 50 or 100 (default 15).",
            "type": "integer",
            "minimum": -9007199254740991,
            "maximum": 9007199254740991
          },
          "sort": {
            "description": "Sort order: price_low, price_high, name_asc, name_desc or newest. Omit for the default (most popular) order.",
            "type": "string",
            "maxLength": 40
          },
          "brand": {
            "description": "Brand slug to filter by.",
            "type": "string",
            "maxLength": 80
          },
          "min_price": {
            "description": "Minimum price in the locale currency.",
            "type": "number",
            "minimum": 0
          },
          "max_price": {
            "description": "Maximum price in the locale currency.",
            "type": "number",
            "minimum": 0
          },
          "locale": {
            "description": "Storefront locale such as en-GB (default), en-US, de, fr-FR, es-ES, it-IT, nl-NL, pl. Controls product names, slugs and prices.",
            "type": "string",
            "minLength": 2,
            "maxLength": 5
          }
        },
        "required": [
          "query"
        ]
      }
    },
    {
      "name": "list_products",
      "title": "List products",
      "description": "Browse a product collection: most popular, newest, on sale, Website Express eligible, or a category by slug (see list_categories). Supports paging, sorting and brand/price filters.",
      "category": "catalogue",
      "availability": "public",
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": true
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "collection": {
            "type": "string",
            "enum": [
              "popular",
              "new",
              "on-sale",
              "express",
              "category"
            ],
            "description": "Which collection to list."
          },
          "category_slug": {
            "description": "Required when collection is 'category'.",
            "type": "string",
            "maxLength": 120
          },
          "min_discount": {
            "description": "Minimum discount percentage (on-sale listings).",
            "type": "number",
            "minimum": 0,
            "maximum": 100
          },
          "page": {
            "description": "Page number, starting at 1.",
            "type": "integer",
            "minimum": 1,
            "maximum": 500
          },
          "per_page": {
            "description": "Results per page: 15, 30, 50 or 100 (default 15).",
            "type": "integer",
            "minimum": -9007199254740991,
            "maximum": 9007199254740991
          },
          "sort": {
            "description": "Sort order: price_low, price_high, name_asc, name_desc or newest. Omit for the default (most popular) order.",
            "type": "string",
            "maxLength": 40
          },
          "brand": {
            "description": "Brand slug to filter by.",
            "type": "string",
            "maxLength": 80
          },
          "min_price": {
            "description": "Minimum price in the locale currency.",
            "type": "number",
            "minimum": 0
          },
          "max_price": {
            "description": "Maximum price in the locale currency.",
            "type": "number",
            "minimum": 0
          },
          "locale": {
            "description": "Storefront locale such as en-GB (default), en-US, de, fr-FR, es-ES, it-IT, nl-NL, pl. Controls product names, slugs and prices.",
            "type": "string",
            "minLength": 2,
            "maxLength": 5
          }
        },
        "required": [
          "collection"
        ]
      }
    },
    {
      "name": "get_product",
      "title": "Get product",
      "description": "Full details for one product by slug, SKU or id: description, specifications, prices ex/inc VAT with bulk breaks, stock, variants, safety/spec documents and the canonical page URL. Provide exactly one of slug, sku or id.",
      "category": "catalogue",
      "availability": "public",
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": true
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "slug": {
            "description": "Product slug from a product URL (…/product/<slug>).",
            "type": "string",
            "maxLength": 200
          },
          "sku": {
            "description": "Product SKU.",
            "type": "string",
            "maxLength": 64
          },
          "id": {
            "description": "Numeric product id.",
            "type": "integer",
            "exclusiveMinimum": 0,
            "maximum": 9007199254740991
          },
          "locale": {
            "description": "Storefront locale such as en-GB (default), en-US, de, fr-FR, es-ES, it-IT, nl-NL, pl. Controls product names, slugs and prices.",
            "type": "string",
            "minLength": 2,
            "maxLength": 5
          }
        }
      }
    },
    {
      "name": "get_products",
      "title": "Get several products",
      "description": "Look up up to 50 products at once by SKU or by numeric id. Returns compact products (name, price ex/inc VAT, stock, link).",
      "category": "catalogue",
      "availability": "public",
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": true
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "skus": {
            "minItems": 1,
            "maxItems": 50,
            "type": "array",
            "items": {
              "type": "string",
              "minLength": 1,
              "maxLength": 64,
              "description": "Product SKU exactly as shown on the site."
            }
          },
          "ids": {
            "minItems": 1,
            "maxItems": 50,
            "type": "array",
            "items": {
              "type": "integer",
              "exclusiveMinimum": 0,
              "maximum": 9007199254740991
            }
          },
          "locale": {
            "description": "Storefront locale such as en-GB (default), en-US, de, fr-FR, es-ES, it-IT, nl-NL, pl. Controls product names, slugs and prices.",
            "type": "string",
            "minLength": 2,
            "maxLength": 5
          }
        }
      }
    },
    {
      "name": "get_stock_level",
      "title": "Get stock level",
      "description": "Live availability check for a SKU (is it available now and how many are in the London warehouse).",
      "category": "catalogue",
      "availability": "public",
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": true
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "sku": {
            "type": "string",
            "minLength": 1,
            "maxLength": 64,
            "description": "Product SKU exactly as shown on the site."
          }
        },
        "required": [
          "sku"
        ]
      }
    },
    {
      "name": "compare_products",
      "title": "Compare products",
      "description": "Side-by-side comparison of 2 to 5 products by SKU: price ex/inc VAT, stock, brand, weight and the specification bullet points, so an agent can recommend between options.",
      "category": "catalogue",
      "availability": "public",
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": true
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "skus": {
            "minItems": 2,
            "maxItems": 5,
            "type": "array",
            "items": {
              "type": "string",
              "minLength": 1,
              "maxLength": 64,
              "description": "Product SKU exactly as shown on the site."
            }
          },
          "locale": {
            "description": "Storefront locale such as en-GB (default), en-US, de, fr-FR, es-ES, it-IT, nl-NL, pl. Controls product names, slugs and prices.",
            "type": "string",
            "minLength": 2,
            "maxLength": 5
          }
        },
        "required": [
          "skus"
        ]
      }
    },
    {
      "name": "get_related_products",
      "title": "Get related products",
      "description": "Variants, similar products, recommendations and 'you may also like' items for a product (by slug or SKU). Useful for alternatives when something is out of stock.",
      "category": "catalogue",
      "availability": "public",
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": true
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "slug": {
            "description": "Product slug from a product URL (…/product/<slug>).",
            "type": "string",
            "maxLength": 200
          },
          "sku": {
            "description": "Product SKU.",
            "type": "string",
            "maxLength": 64
          },
          "locale": {
            "description": "Storefront locale such as en-GB (default), en-US, de, fr-FR, es-ES, it-IT, nl-NL, pl. Controls product names, slugs and prices.",
            "type": "string",
            "minLength": 2,
            "maxLength": 5
          }
        }
      }
    },
    {
      "name": "get_product_documents",
      "title": "Get product documents",
      "description": "Safety data sheets, specification sheets and COSHH hazard codes for a product (by slug or SKU). Returns document URLs.",
      "category": "catalogue",
      "availability": "public",
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": true
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "slug": {
            "description": "Product slug from a product URL (…/product/<slug>).",
            "type": "string",
            "maxLength": 200
          },
          "sku": {
            "description": "Product SKU.",
            "type": "string",
            "maxLength": 64
          },
          "locale": {
            "description": "Storefront locale such as en-GB (default), en-US, de, fr-FR, es-ES, it-IT, nl-NL, pl. Controls product names, slugs and prices.",
            "type": "string",
            "minLength": 2,
            "maxLength": 5
          }
        }
      }
    },
    {
      "name": "list_categories",
      "title": "List categories",
      "description": "Product categories with slugs and links. Use popular_only for the curated set shown on the site; otherwise the full list.",
      "category": "catalogue",
      "availability": "public",
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": true
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "popular_only": {
            "description": "Only the popular categories (default false).",
            "type": "boolean"
          },
          "limit": {
            "description": "Maximum categories to return (default 100).",
            "type": "integer",
            "minimum": 1,
            "maximum": 200
          },
          "locale": {
            "description": "Storefront locale such as en-GB (default), en-US, de, fr-FR, es-ES, it-IT, nl-NL, pl. Controls product names, slugs and prices.",
            "type": "string",
            "minLength": 2,
            "maxLength": 5
          }
        }
      }
    },
    {
      "name": "get_category",
      "title": "Get category",
      "description": "A category's name, description and its products (paged) by category slug.",
      "category": "catalogue",
      "availability": "public",
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": true
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "slug": {
            "type": "string",
            "minLength": 1,
            "maxLength": 120,
            "description": "Category slug from list_categories."
          },
          "page": {
            "description": "Page number, starting at 1.",
            "type": "integer",
            "minimum": 1,
            "maximum": 500
          },
          "per_page": {
            "description": "Results per page: 15, 30, 50 or 100 (default 15).",
            "type": "integer",
            "minimum": -9007199254740991,
            "maximum": 9007199254740991
          },
          "sort": {
            "description": "Sort order: price_low, price_high, name_asc, name_desc or newest. Omit for the default (most popular) order.",
            "type": "string",
            "maxLength": 40
          },
          "locale": {
            "description": "Storefront locale such as en-GB (default), en-US, de, fr-FR, es-ES, it-IT, nl-NL, pl. Controls product names, slugs and prices.",
            "type": "string",
            "minLength": 2,
            "maxLength": 5
          }
        },
        "required": [
          "slug"
        ]
      }
    },
    {
      "name": "list_brands",
      "title": "List brands",
      "description": "Brands sold by Camden Tools (DeWalt, Makita, Milwaukee, Bosch, Stanley …). Without a query returns the popular brands; with a query searches brand names.",
      "category": "catalogue",
      "availability": "public",
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": true
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "query": {
            "description": "Brand name search text.",
            "type": "string",
            "maxLength": 80
          },
          "page": {
            "description": "Page number, starting at 1.",
            "type": "integer",
            "minimum": 1,
            "maximum": 500
          },
          "per_page": {
            "description": "Results per page: 15, 30, 50 or 100 (default 15).",
            "type": "integer",
            "minimum": -9007199254740991,
            "maximum": 9007199254740991
          },
          "sort": {
            "description": "Sort order: price_low, price_high, name_asc, name_desc or newest. Omit for the default (most popular) order.",
            "type": "string",
            "maxLength": 40
          }
        }
      }
    },
    {
      "name": "get_brand_products",
      "title": "Get brand products",
      "description": "A brand's details, its active promotions and its products (paged) by brand slug.",
      "category": "catalogue",
      "availability": "public",
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": true
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "slug": {
            "type": "string",
            "minLength": 1,
            "maxLength": 80,
            "description": "Brand slug from list_brands."
          },
          "page": {
            "description": "Page number, starting at 1.",
            "type": "integer",
            "minimum": 1,
            "maximum": 500
          },
          "per_page": {
            "description": "Results per page: 15, 30, 50 or 100 (default 15).",
            "type": "integer",
            "minimum": -9007199254740991,
            "maximum": 9007199254740991
          },
          "locale": {
            "description": "Storefront locale such as en-GB (default), en-US, de, fr-FR, es-ES, it-IT, nl-NL, pl. Controls product names, slugs and prices.",
            "type": "string",
            "minLength": 2,
            "maxLength": 5
          }
        },
        "required": [
          "slug"
        ]
      }
    },
    {
      "name": "list_offers",
      "title": "List offers",
      "description": "Current storefront promotions (percentage/fixed discounts and free gifts), optionally grouped by brand or category. Also points at the /offers page.",
      "category": "offers",
      "availability": "public",
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": true
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "group_by": {
            "description": "Grouping (default all).",
            "type": "string",
            "enum": [
              "all",
              "brand",
              "category"
            ]
          },
          "locale": {
            "description": "Storefront locale such as en-GB (default), en-US, de, fr-FR, es-ES, it-IT, nl-NL, pl. Controls product names, slugs and prices.",
            "type": "string",
            "minLength": 2,
            "maxLength": 5
          }
        }
      }
    },
    {
      "name": "get_product_promotions",
      "title": "Get product promotions",
      "description": "Active promotions that apply to one SKU (discounts, free gifts, end dates).",
      "category": "offers",
      "availability": "public",
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": true
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "sku": {
            "type": "string",
            "minLength": 1,
            "maxLength": 64,
            "description": "Product SKU exactly as shown on the site."
          },
          "locale": {
            "description": "Storefront locale such as en-GB (default), en-US, de, fr-FR, es-ES, it-IT, nl-NL, pl. Controls product names, slugs and prices.",
            "type": "string",
            "minLength": 2,
            "maxLength": 5
          }
        },
        "required": [
          "sku"
        ]
      }
    },
    {
      "name": "list_bundles",
      "title": "List bundles",
      "description": "Curated product bundles (kits) with their items and prices.",
      "category": "offers",
      "availability": "public",
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": true
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "locale": {
            "description": "Storefront locale such as en-GB (default), en-US, de, fr-FR, es-ES, it-IT, nl-NL, pl. Controls product names, slugs and prices.",
            "type": "string",
            "minLength": 2,
            "maxLength": 5
          }
        }
      }
    },
    {
      "name": "get_cart_promotions",
      "title": "Get basket promotions",
      "description": "Evaluate a prospective basket for a destination country: whether it can be fulfilled, which promotions apply (including free-delivery style offers and free gifts) and the adjusted basket value. Same check the checkout runs.",
      "category": "offers",
      "availability": "public",
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": true
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "country_code": {
            "type": "string",
            "pattern": "^[A-Za-z]{2}$",
            "description": "Destination country (ISO alpha-2)."
          },
          "items": {
            "minItems": 1,
            "maxItems": 50,
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "integer",
                  "exclusiveMinimum": 0,
                  "maximum": 9007199254740991,
                  "description": "Product id from search/product tools."
                },
                "quantity": {
                  "default": 1,
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 999
                }
              },
              "required": [
                "id"
              ]
            },
            "description": "Basket lines as product ids with quantities."
          },
          "has_tax_id": {
            "description": "Whether the buyer has a VAT/tax id (business purchase).",
            "type": "boolean"
          },
          "locale": {
            "description": "Storefront locale such as en-GB (default), en-US, de, fr-FR, es-ES, it-IT, nl-NL, pl. Controls product names, slugs and prices.",
            "type": "string",
            "minLength": 2,
            "maxLength": 5
          }
        },
        "required": [
          "country_code",
          "items"
        ]
      }
    },
    {
      "name": "get_express_delivery_status",
      "title": "Get Website Express status",
      "description": "Whether Website Express (free same-working-day dispatch for eligible UK orders) is available right now, the order-by cutoff and the promised dispatch date.",
      "category": "delivery",
      "availability": "public",
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": true
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "locale": {
            "description": "Storefront locale such as en-GB (default), en-US, de, fr-FR, es-ES, it-IT, nl-NL, pl. Controls product names, slugs and prices.",
            "type": "string",
            "minLength": 2,
            "maxLength": 5
          }
        }
      }
    },
    {
      "name": "check_express_eligibility",
      "title": "Check Website Express eligibility",
      "description": "Whole-basket Website Express verdict for a set of product ids and quantities: every line must be eligible (no split shipments).",
      "category": "delivery",
      "availability": "public",
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": true
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "items": {
            "minItems": 1,
            "maxItems": 50,
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "integer",
                  "exclusiveMinimum": 0,
                  "maximum": 9007199254740991,
                  "description": "Product id from search/product tools."
                },
                "quantity": {
                  "default": 1,
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 999
                }
              },
              "required": [
                "id"
              ]
            },
            "description": "Basket lines as product ids with quantities."
          },
          "locale": {
            "description": "Storefront locale such as en-GB (default), en-US, de, fr-FR, es-ES, it-IT, nl-NL, pl. Controls product names, slugs and prices.",
            "type": "string",
            "minLength": 2,
            "maxLength": 5
          }
        },
        "required": [
          "items"
        ]
      }
    },
    {
      "name": "check_shipping_availability",
      "title": "Check shipping availability",
      "description": "Whether Camden Tools ships to a country, with any restriction message.",
      "category": "delivery",
      "availability": "public",
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": true
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "country_code": {
            "type": "string",
            "pattern": "^[A-Za-z]{2}$",
            "description": "ISO 3166-1 alpha-2 country code, e.g. GB, IE, DE, US."
          },
          "locale": {
            "description": "Storefront locale such as en-GB (default), en-US, de, fr-FR, es-ES, it-IT, nl-NL, pl. Controls product names, slugs and prices.",
            "type": "string",
            "minLength": 2,
            "maxLength": 5
          }
        },
        "required": [
          "country_code"
        ]
      }
    },
    {
      "name": "get_prices_for_country",
      "title": "Get prices for a country",
      "description": "Country-specific pricing for a set of products (the checkout applies the destination country's currency and pricing). Returns unit, sale and final prices plus the subtotal.",
      "category": "delivery",
      "availability": "public",
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": true
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "shipping_country": {
            "type": "string",
            "pattern": "^[A-Za-z]{2}$",
            "description": "ISO 3166-1 alpha-2 country code, e.g. GB, IE, DE, US."
          },
          "items": {
            "minItems": 1,
            "maxItems": 50,
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "integer",
                  "exclusiveMinimum": 0,
                  "maximum": 9007199254740991,
                  "description": "Product id from search/product tools."
                },
                "quantity": {
                  "default": 1,
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 999
                }
              },
              "required": [
                "id"
              ]
            },
            "description": "Basket lines as product ids with quantities."
          },
          "locale": {
            "description": "Storefront locale such as en-GB (default), en-US, de, fr-FR, es-ES, it-IT, nl-NL, pl. Controls product names, slugs and prices.",
            "type": "string",
            "minLength": 2,
            "maxLength": 5
          }
        },
        "required": [
          "shipping_country",
          "items"
        ]
      }
    },
    {
      "name": "estimate_delivery",
      "title": "Estimate delivery",
      "description": "Delivery services, charges and transit times for a basket to a destination (country plus postcode/ZIP and city). This is an estimate using placeholder contact details; exact rates are confirmed at checkout.",
      "category": "delivery",
      "availability": "public",
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": true
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "country_code": {
            "type": "string",
            "pattern": "^[A-Za-z]{2}$",
            "description": "ISO 3166-1 alpha-2 country code, e.g. GB, IE, DE, US."
          },
          "postcode": {
            "description": "Destination postcode / ZIP.",
            "type": "string",
            "maxLength": 20
          },
          "city": {
            "description": "Destination city.",
            "type": "string",
            "maxLength": 80
          },
          "items": {
            "minItems": 1,
            "maxItems": 50,
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "integer",
                  "exclusiveMinimum": 0,
                  "maximum": 9007199254740991,
                  "description": "Product id from search/product tools."
                },
                "quantity": {
                  "default": 1,
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 999
                }
              },
              "required": [
                "id"
              ]
            },
            "description": "Basket lines as product ids with quantities."
          },
          "locale": {
            "description": "Storefront locale such as en-GB (default), en-US, de, fr-FR, es-ES, it-IT, nl-NL, pl. Controls product names, slugs and prices.",
            "type": "string",
            "minLength": 2,
            "maxLength": 5
          }
        },
        "required": [
          "country_code",
          "items"
        ]
      }
    },
    {
      "name": "lookup_uk_postcode",
      "title": "Look up a UK postcode",
      "description": "Addresses for a UK postcode (rate limited upstream). Returns matching addresses or suggestions when the postcode is incomplete.",
      "category": "delivery",
      "availability": "public",
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": true
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "postcode": {
            "type": "string",
            "minLength": 2,
            "maxLength": 12,
            "description": "UK postcode, e.g. NW2 7JW."
          }
        },
        "required": [
          "postcode"
        ]
      }
    },
    {
      "name": "create_basket_link",
      "title": "Create a basket link",
      "description": "Turn product ids and quantities into one link that fills the shopper's basket on camdentools.com. Opening the link makes sure the basket holds at least those quantities (opening it twice does not double them); the shopper reviews the basket and pays at checkout themselves. The result says which lines are out of stock: those cannot be bought, so offer an alternative before sharing the link. Use it to finish a shopping conversation. Ids come from search_products, list_products or get_product.",
      "category": "basket",
      "availability": "public",
      "annotations": {
        "readOnlyHint": true,
        "idempotentHint": true,
        "openWorldHint": true
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "items": {
            "minItems": 1,
            "maxItems": 50,
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "integer",
                  "exclusiveMinimum": 0,
                  "maximum": 9007199254740991,
                  "description": "Product id from search/product tools."
                },
                "quantity": {
                  "default": 1,
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 999
                }
              },
              "required": [
                "id"
              ]
            },
            "description": "Basket lines as product ids with quantities."
          },
          "locale": {
            "description": "Storefront locale such as en-GB (default), en-US, de, fr-FR, es-ES, it-IT, nl-NL, pl. Controls product names, slugs and prices.",
            "type": "string",
            "minLength": 2,
            "maxLength": 5
          }
        },
        "required": [
          "items"
        ]
      }
    },
    {
      "name": "track_guest_order",
      "title": "Track an order",
      "description": "Order status, tracking number/URL, shipping method and line items for any order, given the order number and the delivery postcode (no sign-in needed).",
      "category": "orders",
      "availability": "public",
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": true
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "order_number": {
            "type": "string",
            "minLength": 3,
            "maxLength": 40,
            "description": "Order number from the confirmation email."
          },
          "postcode": {
            "type": "string",
            "minLength": 2,
            "maxLength": 20,
            "description": "Delivery postcode / ZIP on the order."
          }
        },
        "required": [
          "order_number",
          "postcode"
        ]
      }
    },
    {
      "name": "get_my_profile",
      "title": "Get my profile",
      "description": "The signed-in shopper's name, email and saved addresses. Needs the shopper's browser session with AI agent access, or an OAuth token with the profile:read scope.",
      "category": "account",
      "availability": "same_origin",
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": false
      },
      "inputSchema": {
        "type": "object",
        "properties": {}
      }
    },
    {
      "name": "list_my_orders",
      "title": "List my orders",
      "description": "The signed-in shopper's order history (most recent first). Needs the shopper's browser session with AI agent access, or an OAuth token with the orders:read scope.",
      "category": "account",
      "availability": "same_origin",
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": false
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "page": {
            "description": "Page number, starting at 1.",
            "type": "integer",
            "minimum": 1,
            "maximum": 500
          }
        }
      }
    },
    {
      "name": "get_my_order",
      "title": "Get my order",
      "description": "One of the signed-in shopper's orders by order number, with status, tracking and line items. Needs the shopper's browser session with AI agent access, or an OAuth token with the orders:read scope.",
      "category": "account",
      "availability": "same_origin",
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": false
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "order_number": {
            "type": "string",
            "minLength": 3,
            "maxLength": 40
          }
        },
        "required": [
          "order_number"
        ]
      }
    },
    {
      "name": "get_site_info",
      "title": "Get store information",
      "description": "Who Camden Tools is, how to contact them, VAT display rules, key page links, current announcements and a summary of each policy (delivery, returns, payment, FAQs). Call get_policy for the full text of a policy.",
      "category": "store",
      "availability": "public",
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": true
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "locale": {
            "description": "Storefront locale such as en-GB (default), en-US, de, fr-FR, es-ES, it-IT, nl-NL, pl. Controls product names, slugs and prices.",
            "type": "string",
            "minLength": 2,
            "maxLength": 5
          }
        }
      }
    },
    {
      "name": "get_policy",
      "title": "Get policy text",
      "description": "Full text (markdown) of a store policy: delivery, returns, payment-options, faqs or contact.",
      "category": "store",
      "availability": "public",
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": true
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "policy": {
            "type": "string",
            "enum": [
              "delivery",
              "returns",
              "payment-options",
              "faqs",
              "contact"
            ]
          },
          "locale": {
            "description": "Storefront locale such as en-GB (default), en-US, de, fr-FR, es-ES, it-IT, nl-NL, pl. Controls product names, slugs and prices.",
            "type": "string",
            "minLength": 2,
            "maxLength": 5
          }
        },
        "required": [
          "policy"
        ]
      }
    },
    {
      "name": "get_collection_point_info",
      "title": "Get collection point info",
      "description": "The London Click & Collect warehouse: address, opening hours, whether it is open right now (Europe/London, bank holidays respected) and when it next opens.",
      "category": "store",
      "availability": "public",
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": true
      },
      "inputSchema": {
        "type": "object",
        "properties": {}
      }
    },
    {
      "name": "search_blog_posts",
      "title": "Search blog posts",
      "description": "Guides and articles from the Camden Tools blog (how-tos, buying guides, brand news).",
      "category": "store",
      "availability": "public",
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": true
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "query": {
            "description": "Search text; omit for the latest posts.",
            "type": "string",
            "maxLength": 120
          },
          "page": {
            "description": "Page number, starting at 1.",
            "type": "integer",
            "minimum": 1,
            "maximum": 500
          }
        }
      }
    },
    {
      "name": "get_blog_post",
      "title": "Get blog post",
      "description": "A blog post's full text (plain text) by slug.",
      "category": "store",
      "availability": "public",
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": true
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "slug": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "locale": {
            "description": "Storefront locale such as en-GB (default), en-US, de, fr-FR, es-ES, it-IT, nl-NL, pl. Controls product names, slugs and prices.",
            "type": "string",
            "minLength": 2,
            "maxLength": 5
          }
        },
        "required": [
          "slug"
        ]
      }
    }
  ],
  "resources": [
    {
      "name": "policy-delivery",
      "uri": "camdentools://policies/delivery",
      "title": "Policy: delivery",
      "description": "Camden Tools delivery policy as markdown.",
      "mimeType": "text/markdown"
    },
    {
      "name": "policy-returns",
      "uri": "camdentools://policies/returns",
      "title": "Policy: returns",
      "description": "Camden Tools returns policy as markdown.",
      "mimeType": "text/markdown"
    },
    {
      "name": "policy-payment-options",
      "uri": "camdentools://policies/payment-options",
      "title": "Policy: payment options",
      "description": "Camden Tools payment options policy as markdown.",
      "mimeType": "text/markdown"
    },
    {
      "name": "policy-faqs",
      "uri": "camdentools://policies/faqs",
      "title": "Policy: faqs",
      "description": "Camden Tools faqs policy as markdown.",
      "mimeType": "text/markdown"
    },
    {
      "name": "policy-contact",
      "uri": "camdentools://policies/contact",
      "title": "Policy: contact",
      "description": "Camden Tools contact policy as markdown.",
      "mimeType": "text/markdown"
    },
    {
      "name": "store-facts",
      "uri": "camdentools://store/facts",
      "title": "Store facts",
      "description": "Company details, contact points, collection point and VAT display rules.",
      "mimeType": "application/json"
    },
    {
      "name": "llms-txt",
      "uri": "camdentools://llms.txt",
      "title": "llms.txt",
      "description": "Site overview for language models (same content as https://camdentools.com/llms.txt).",
      "mimeType": "text/markdown"
    }
  ],
  "prompts": [
    {
      "name": "find_the_right_tool",
      "title": "Find the right tool",
      "description": "Help a shopper choose a product for a task, within a budget and brand preference, and hand them a basket link.",
      "args": [
        {
          "name": "task",
          "description": "What the shopper needs to do, e.g. 'drill into masonry for shelf brackets'.",
          "required": true
        },
        {
          "name": "budget",
          "description": "Budget, e.g. '£150'.",
          "required": false
        },
        {
          "name": "brand",
          "description": "Preferred brand, if any.",
          "required": false
        }
      ]
    },
    {
      "name": "check_delivery",
      "title": "Check delivery",
      "description": "Work out delivery options, cost and timing for a basket to a destination.",
      "args": [
        {
          "name": "country_code",
          "description": "ISO alpha-2 destination country.",
          "required": true
        },
        {
          "name": "postcode",
          "description": "Destination postcode / ZIP.",
          "required": false
        }
      ]
    },
    {
      "name": "compare",
      "title": "Compare products",
      "description": "Compare a few SKUs side by side and recommend one.",
      "args": [
        {
          "name": "skus",
          "description": "Comma-separated SKUs.",
          "required": true
        }
      ]
    }
  ],
  "a2a": {
    "endpoint": "https://camdentools.com/a2a",
    "skills": [
      {
        "id": "search-products",
        "name": "Search products",
        "description": "Find tools and equipment in the Camden Tools catalogue with prices, stock and links.",
        "tags": [
          "shopping",
          "search",
          "tools"
        ],
        "examples": [
          "cordless combi drill 18v",
          "Makita circular saw",
          "safety boots size 10"
        ]
      },
      {
        "id": "product-lookup",
        "name": "Product lookup",
        "description": "Full details for a product by SKU or slug: price ex/inc VAT, stock, variants, documents.",
        "tags": [
          "shopping",
          "product"
        ],
        "examples": [
          "{\"skill\":\"product-lookup\",\"sku\":\"DCD796P2\"}"
        ]
      },
      {
        "id": "compare-products",
        "name": "Compare products",
        "description": "Side-by-side comparison of two to five SKUs.",
        "tags": [
          "shopping",
          "comparison"
        ],
        "examples": [
          "DCD796P2, DHP485Z, M18FPD2"
        ]
      },
      {
        "id": "create-basket",
        "name": "Create basket link",
        "description": "Turn product ids and quantities into a link that fills the shopper's basket on camdentools.com; they review it and pay at checkout.",
        "tags": [
          "shopping",
          "basket"
        ],
        "examples": [
          "{\"skill\":\"create-basket\",\"items\":[{\"id\":27155,\"quantity\":2},{\"id\":4410,\"quantity\":1}]}"
        ]
      },
      {
        "id": "order-status",
        "name": "Order status",
        "description": "Track an order with its order number and delivery postcode.",
        "tags": [
          "orders",
          "tracking"
        ],
        "examples": [
          "order CT-102938 postcode NW2 7JW"
        ]
      },
      {
        "id": "shipping-availability",
        "name": "Shipping availability",
        "description": "Whether Camden Tools ships to a country (ISO alpha-2 code).",
        "tags": [
          "delivery"
        ],
        "examples": [
          "IE",
          "US"
        ]
      },
      {
        "id": "express-delivery-status",
        "name": "Website Express status",
        "description": "Whether same-working-day dispatch is available right now for UK orders.",
        "tags": [
          "delivery",
          "express"
        ],
        "examples": [
          "express delivery"
        ]
      }
    ]
  },
  "in_page_tools": [
    {
      "name": "cart_get",
      "title": "Get basket",
      "description": "The shopper's current basket on this site: lines (product id, SKU, name, quantity, unit price), item count, subtotal, promo code and the cart/checkout URLs.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      },
      "annotations": {
        "readOnlyHint": true
      },
      "group": "cart",
      "availableOn": "any"
    },
    {
      "name": "cart_add_item",
      "title": "Add to basket",
      "description": "Add a product to the shopper's basket by product id (from search_products / get_product). The shopper still pays at checkout.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "product_id": {
            "type": "integer",
            "description": "Product id."
          },
          "quantity": {
            "type": "integer",
            "minimum": 1,
            "maximum": 999,
            "default": 1
          },
          "product_name": {
            "type": "string",
            "description": "Product name, shown in the shopper's notification."
          }
        },
        "required": [
          "product_id"
        ]
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": false
      },
      "group": "cart",
      "availableOn": "any"
    },
    {
      "name": "cart_update_item",
      "title": "Update basket line",
      "description": "Set the quantity of a basket line (product id).",
      "inputSchema": {
        "type": "object",
        "properties": {
          "product_id": {
            "type": "integer",
            "description": "Product id."
          },
          "quantity": {
            "type": "integer",
            "minimum": 1,
            "maximum": 999
          }
        },
        "required": [
          "product_id",
          "quantity"
        ]
      },
      "annotations": {
        "readOnlyHint": false,
        "idempotentHint": true
      },
      "group": "cart",
      "availableOn": "any"
    },
    {
      "name": "cart_remove_item",
      "title": "Remove from basket",
      "description": "Remove a product from the basket by product id.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "product_id": {
            "type": "integer",
            "description": "Product id."
          }
        },
        "required": [
          "product_id"
        ]
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": true,
        "idempotentHint": true
      },
      "group": "cart",
      "availableOn": "any"
    },
    {
      "name": "cart_clear",
      "title": "Empty basket",
      "description": "Empty the shopper's basket.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": true,
        "idempotentHint": true
      },
      "group": "cart",
      "availableOn": "any"
    },
    {
      "name": "cart_apply_promo",
      "title": "Apply promo code",
      "description": "Apply a promo code to the basket. The shop validates codes against the shopper's email, so provide the email the order will use.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "code": {
            "type": "string"
          },
          "email": {
            "type": "string",
            "format": "email"
          }
        },
        "required": [
          "code",
          "email"
        ]
      },
      "annotations": {
        "readOnlyHint": false,
        "idempotentHint": true
      },
      "group": "cart",
      "availableOn": "any"
    },
    {
      "name": "cart_remove_promo",
      "title": "Remove promo code",
      "description": "Remove the applied promo code from the basket.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      },
      "annotations": {
        "readOnlyHint": false,
        "idempotentHint": true
      },
      "group": "cart",
      "availableOn": "any"
    },
    {
      "name": "wishlist_add",
      "title": "Add to wishlist",
      "description": "Save a product to the shopper's wishlist by product id.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "product_id": {
            "type": "integer",
            "description": "Product id."
          }
        },
        "required": [
          "product_id"
        ]
      },
      "annotations": {
        "readOnlyHint": false,
        "idempotentHint": true
      },
      "group": "wishlist",
      "availableOn": "any"
    },
    {
      "name": "wishlist_remove",
      "title": "Remove from wishlist",
      "description": "Remove a product from the shopper's wishlist by product id.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "product_id": {
            "type": "integer",
            "description": "Product id."
          }
        },
        "required": [
          "product_id"
        ]
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": true,
        "idempotentHint": true
      },
      "group": "wishlist",
      "availableOn": "any"
    },
    {
      "name": "page_get_context",
      "title": "Get page context",
      "description": "What the shopper is looking at right now: page type (product, category, search, cart, checkout…), the product on a product page (SKU, name, price), the search query, locale, VAT display mode, basket count and a basket handoff link for the current basket.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      },
      "annotations": {
        "readOnlyHint": true
      },
      "group": "page",
      "availableOn": "any"
    },
    {
      "name": "page_navigate",
      "title": "Navigate",
      "description": "Navigate the shopper's browser within camdentools.com: a product (slug), category (slug), search results (query), the basket, checkout, or any site path.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "destination": {
            "type": "string",
            "enum": [
              "product",
              "category",
              "search",
              "cart",
              "checkout",
              "path"
            ]
          },
          "slug": {
            "type": "string",
            "description": "Product or category slug."
          },
          "query": {
            "type": "string",
            "description": "Search text (destination search)."
          },
          "path": {
            "type": "string",
            "description": "Site path starting with / (destination path)."
          }
        },
        "required": [
          "destination"
        ]
      },
      "annotations": {
        "readOnlyHint": false,
        "idempotentHint": true
      },
      "group": "page",
      "availableOn": "any"
    },
    {
      "name": "page_set_vat_display",
      "title": "Set VAT display",
      "description": "Switch the site's price display between including and excluding VAT.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "inclusive": {
            "type": "boolean"
          }
        },
        "required": [
          "inclusive"
        ]
      },
      "annotations": {
        "readOnlyHint": false,
        "idempotentHint": true
      },
      "group": "page",
      "availableOn": "any"
    },
    {
      "name": "page_select_variant",
      "title": "Select variant",
      "description": "On a product page, switch to the variant matching the given options (e.g. {\"Colour\": \"Red\", \"Size\": \"M\"}) or SKU by navigating to its page.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "options": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            },
            "description": "Variation option values to match."
          },
          "sku": {
            "type": "string",
            "description": "Variant SKU to select."
          }
        }
      },
      "annotations": {
        "readOnlyHint": false,
        "idempotentHint": true
      },
      "group": "page",
      "availableOn": "product"
    },
    {
      "name": "page_prefill_checkout_address",
      "title": "Pre-fill checkout address",
      "description": "On the checkout page, pre-fill the delivery contact and address form. The shopper reviews it and completes payment themselves; nothing is submitted.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "full_name": {
            "type": "string"
          },
          "email": {
            "type": "string",
            "format": "email"
          },
          "phone_number_code": {
            "type": "string",
            "description": "Dialling code, e.g. +44."
          },
          "phone_number": {
            "type": "string"
          },
          "address_line_1": {
            "type": "string"
          },
          "address_line_2": {
            "type": "string"
          },
          "city": {
            "type": "string"
          },
          "postcode": {
            "type": "string"
          },
          "state": {
            "type": "string"
          },
          "country": {
            "type": "string",
            "description": "ISO 3166-1 alpha-2 country code."
          }
        }
      },
      "annotations": {
        "readOnlyHint": false,
        "idempotentHint": true
      },
      "group": "page",
      "availableOn": "checkout"
    },
    {
      "name": "page_request_account_access",
      "title": "Request account access",
      "description": "Ask the shopper to allow AI agent access to their account (orders, profile). Opens a consent prompt in the page; returns whether it was granted. Required before get_my_profile / list_my_orders / get_my_order.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      },
      "annotations": {
        "readOnlyHint": false,
        "idempotentHint": true
      },
      "group": "page",
      "availableOn": "any"
    }
  ],
  "counts": {
    "tools": 32,
    "public_tools": 29,
    "resources": 7,
    "prompts": 3,
    "a2a_skills": 7,
    "in_page_tools": 15
  },
  "identity": {
    "web_bot_auth": {
      "directory": "https://camdentools.com/.well-known/http-message-signatures-directory",
      "key_ids": [
        "iVuMkdK3A8DRGTiIkpemeEDzvwhDUm3Qo8frb5p_DCU"
      ]
    }
  },
  "commerce": {
    "acp": {
      "enabled": false,
      "discovery_url": "https://camdentools.com/.well-known/acp.json",
      "api_base_url": null
    }
  },
  "auth": {
    "oauth": {
      "enabled": true,
      "issuer": "https://api.camdentools.com",
      "resource": "https://camdentools.com/mcp/account",
      "resource_metadata": "https://camdentools.com/.well-known/oauth-protected-resource/mcp/account",
      "scopes": [
        "profile:read",
        "orders:read"
      ]
    }
  },
  "changelog": [
    {
      "date": "2026-09-17",
      "version": "1.2.0",
      "summary": "OAuth-ready account access for remote clients: POST /mcp/account with RFC 9728 protected resource metadata and a WWW-Authenticate challenge, account tools gated by the profile:read and orders:read scopes, and a generated /auth.md. The shopper signs in and approves the client on camdentools.com/connect; a grant that lacks a scope is reported as such (reconnect and approve it) rather than as a sign-in problem. Served once the Camden Tools authorization server is configured; until then the endpoint and its metadata return 404. create_basket_link now reports stock per line and lists out_of_stock_ids, and its link is idempotent: opening it makes sure the basket holds at least those quantities, so opening it twice never doubles them. Revoked or disconnected access tokens get the 401 invalid_token challenge."
    },
    {
      "date": "2026-09-17",
      "version": "1.1.0",
      "summary": "New create_basket_link tool and A2A create-basket skill: one link fills the shopper's basket on the site (/cart?add=id:qty). Account tools are no longer advertised to remote clients that cannot use them. Capabilities catalogue at /api/agent-capabilities; SKILL.md, OpenAPI and llms-full.txt are generated from it. Web Bot Auth key directory. ACP discovery document (served once agentic checkout is enabled)."
    },
    {
      "date": "2026-09-16",
      "version": "1.0.0",
      "summary": "Launch: MCP server with 31 tools, 7 resources and 3 prompts; A2A agent with 6 skills; in-page WebMCP tools for the basket, wishlist, navigation, VAT display, variants, checkout prefill and account consent; discovery documents (API catalog, MCP server card, A2A agent card, OpenAPI, agent skills, ai-catalog, auth.md, llms.txt, llms-full.txt)."
    }
  ],
  "links": {
    "developers": "https://camdentools.com/developers",
    "capabilities": "https://camdentools.com/api/agent-capabilities",
    "auth_md": "https://camdentools.com/auth.md",
    "openapi": "https://camdentools.com/.well-known/openapi.json",
    "api_catalog": "https://camdentools.com/.well-known/api-catalog",
    "server_card": "https://camdentools.com/.well-known/mcp/server-card.json",
    "agent_card": "https://camdentools.com/.well-known/agent-card.json",
    "skills_index": "https://camdentools.com/.well-known/agent-skills/index.json",
    "skill_md": "https://camdentools.com/.well-known/agent-skills/camden-tools-shopping/SKILL.md",
    "ai_catalog": "https://camdentools.com/.well-known/ai-catalog.json",
    "signatures_directory": "https://camdentools.com/.well-known/http-message-signatures-directory",
    "acp": "https://camdentools.com/.well-known/acp.json",
    "mcp_account": "https://camdentools.com/mcp/account",
    "oauth_protected_resource": "https://camdentools.com/.well-known/oauth-protected-resource/mcp/account",
    "llms": "https://camdentools.com/llms.txt",
    "llms_full": "https://camdentools.com/llms-full.txt"
  }
}