Koskamo

Custom Blinds Shop MCP

An AI-transactable window covering catalogue that lets agents search products, get live ZAR pricing, configure blinds, build carts, and complete checkout via Yoco or Ozow without authentication.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

Custom Blinds Shop MCP logo, by Custom Blinds Shutters & AwningsCommunity listingStreamable HTTPNo sign-inEndpoint checked 2026-11-06Published by Custom Blinds Shutters & Awnings
MCP endpoint (Streamable HTTP)
https://shop.customblinds.co.za/mcp
Vendor documentation

What its tools do

26 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

26 of 26 have a description · 26 of 26 declare behavior hints · 11 of 26 with parameters document them all

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Search the blind catalogue and get live pricing
  • Configure made-to-measure blinds with specific dimensions
  • Build a shopping cart and create a checkout session
  • Complete payment using Yoco or Ozow links

Source and maintenance

Community listingRegistry 1.0.0
Maintenance checked

Protocol and capabilities

Server
custom-blinds-shop 2.0.0
MCP protocol negotiated in check
2025-06-18
Tools
26 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {}
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

Custom Blinds Shutters & Awnings shop: made-to-measure blinds in South Africa. All prices are ZAR, VAT included. Flow: search_catalog or lookup_catalog, get_product, get_price, configure_product (validates an exact colour; use check_colour_stock for a named colour), create_cart, create_checkout, complete_checkout. Browsing, pricing, cart and checkout are open; submit_enquiry and create_order need a partner Bearer key. create_checkout creates a real unpaid order: confirm product, size, colour, total and the customer's real name, email, mobile and delivery address before calling it. Test or placeholder details are refused. complete_checkout then creates the payment link; a link is not a payment. If the status is held_for_verification or payment_link_review, tell the customer the team will follow up on WhatsApp and do not create another checkout. Duo Roller is two independent fabric rolls with stronger room darkening. Zebra (Double Roller) is one fabric with alternating stripes that lets more light through when closed. Never treat them as the same product. Do not promise delivery dates; get_delivery_estimate returns production and transit ranges only. To see a blind in the customer's own window, use get_ar_visualizer_url (the Custom Blinds Visualiser: See it before you buy it; a preview, not a measuring tool). Off-cuts are not posted. On orders over R8,000 sample swatches go on request, in the colours the customer likes, for the product they are ordering. Never quote a sample price or courier cost. Online shop contact is WhatsApp +27 76 022 8410 only, never a phone call. Garden Route customers (Knysna, Plett, George and surrounds) and all awnings, shutters, shadeports and Ziptrak go to Duncan Kane on WhatsApp +27 79 523 5407 for a free consultation; get_whatsapp_handoff builds the link.

Tools

26 advertised

search_products
Advertised by the server during the last successful anonymous check.
Advertised read-only

Legacy discovery, retained for backward compatibility. Prefer search_catalog / lookup_catalog, then get_product. Filters by blind type, colour or maximum dimensions. Returns products with id (not product_id), name, description, features and in-stock colour count. Pass that id as product_id to get_price or configure_product.

search_products input schema
{
  "type": "object",
  "properties": {
    "type": {
      "type": "string",
      "description": "Blind category to filter by: roller, venetian, honeycomb, vertical, outdoor"
    },
    "colour": {
      "type": "string",
      "description": "Colour name to search for (partial match)"
    },
    "province": {
      "type": "string",
      "description": "Optional. Customer's South African province or city. Garden Route locations get Duncan's direct contact; other locations get the online shop contact."
    },
    "max_width_mm": {
      "type": "number",
      "description": "Maximum width in millimetres the product supports"
    },
    "max_height_mm": {
      "type": "number",
      "description": "Maximum height/drop in millimetres the product supports"
    }
  }
}
search_products output schema
{
  "type": "object",
  "required": [
    "products",
    "total"
  ],
  "properties": {
    "total": {
      "type": "number"
    },
    "contact": {
      "type": "object",
      "required": [],
      "properties": {
        "name": {
          "type": "string"
        },
        "note": {
          "type": "string"
        },
        "email": {
          "type": "string"
        },
        "whatsapp": {
          "type": "string"
        }
      },
      "additionalProperties": true
    },
    "currency": {
      "type": "string",
      "const": "ZAR"
    },
    "products": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "product_id",
          "name",
          "category",
          "product_url"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "category": {
            "type": "string"
          },
          "features": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "product_id": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "product_url": {
            "type": "string"
          },
          "starting_price_zar": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ]
          },
          "colour_count_in_stock": {
            "type": "number"
          }
        },
        "additionalProperties": true
      }
    }
  },
  "additionalProperties": true
}
search_products annotations
{
  "readOnlyHint": true
}
get_price
Advertised by the server during the last successful anonymous check.
Advertised read-only

Get an exact ZAR price using product_id from search_catalog or lookup_catalog, width_mm and height_mm. Prices include VAT and delivery. Colour selects the bamboo price tier where applicable. A price is not a stock reservation: validate the exact colour and mount with configure_product before creating a cart. Failure can return success:false or a JSON-RPC validation error.

get_price input schema
{
  "type": "object",
  "required": [
    "product_id",
    "width_mm",
    "height_mm"
  ],
  "properties": {
    "colour": {
      "type": "string",
      "description": "Optional bamboo colour for colour-specific tier pricing"
    },
    "finish": {
      "type": "string",
      "description": "Optional finish for aluminium products: Plain, Brushed, Woodgrain"
    },
    "no_drill": {
      "type": "boolean",
      "description": "Optional. true for the no-drill option (tension brackets, inside the frame, max 2000mm wide; 1500mm on 25mm venetians). Adds the R65 no-drill kit per blind. Offered on indoor roller blinds, including value rollers, and 25mm aluminium or aluwood venetians. Dedicated no-drill products already include the kit."
    },
    "province": {
      "type": "string",
      "description": "Optional. Customer's South African province or city. Garden Route locations get Duncan's direct contact; other locations get the online shop contact."
    },
    "quantity": {
      "type": "number",
      "description": "Number of blinds (default 1)"
    },
    "width_mm": {
      "type": "number",
      "description": "Width in millimetres (e.g. 1200)"
    },
    "height_mm": {
      "type": "number",
      "description": "Height/drop in millimetres (e.g. 1500)"
    },
    "product_id": {
      "type": "string",
      "description": "product_id from search_catalog or lookup_catalog (e.g. roller-blockout)"
    }
  }
}
get_price output schema
{
  "type": "object",
  "required": [
    "product_id",
    "width_mm",
    "height_mm",
    "quantity",
    "unit_price_zar",
    "total_price_zar",
    "currency",
    "vat_included"
  ],
  "properties": {
    "finish": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "limits": {
      "type": "object",
      "required": [],
      "properties": {},
      "additionalProperties": true
    },
    "contact": {
      "type": "object",
      "required": [],
      "properties": {
        "name": {
          "type": "string"
        },
        "note": {
          "type": "string"
        },
        "email": {
          "type": "string"
        },
        "whatsapp": {
          "type": "string"
        }
      },
      "additionalProperties": true
    },
    "currency": {
      "type": "string",
      "const": "ZAR"
    },
    "delivery": {
      "type": "string"
    },
    "quantity": {
      "type": "number"
    },
    "width_mm": {
      "type": "number"
    },
    "height_mm": {
      "type": "number"
    },
    "lead_time": {
      "type": "string"
    },
    "next_step": {
      "type": "string"
    },
    "product_id": {
      "type": "string"
    },
    "product_name": {
      "type": "string"
    },
    "vat_included": {
      "type": "boolean"
    },
    "unit_price_zar": {
      "type": "number"
    },
    "total_price_zar": {
      "type": "number"
    },
    "effective_width_mm": {
      "type": "number"
    },
    "effective_height_mm": {
      "type": "number"
    },
    "minimum_charge_applied": {
      "type": "boolean"
    }
  },
  "additionalProperties": true
}
get_price annotations
{
  "readOnlyHint": true
}
configure_product
Advertised by the server during the last successful anonymous check.
Advertised read-only

Lock in a full blind specification: product, dimensions, colour, and mount type (inside recess or outside face-fix). Validates that the colour exists and is in stock, then prices the blind. Returns a configuration summary to pass directly into create_cart. Call check_colour_stock first if availability is uncertain.

configure_product input schema
{
  "type": "object",
  "required": [
    "product_id",
    "width_mm",
    "height_mm",
    "colour",
    "mount_type"
  ],
  "properties": {
    "colour": {
      "type": "string",
      "description": "Colour name (must match available colours)"
    },
    "finish": {
      "type": "string",
      "description": "Optional finish for aluminium venetians"
    },
    "no_drill": {
      "type": "boolean",
      "description": "Optional. true for the no-drill option (tension brackets, inside the frame, max 2000mm wide; 1500mm on 25mm venetians). Adds the R65 no-drill kit per blind. Offered on indoor roller blinds, including value rollers, and 25mm aluminium or aluwood venetians. Dedicated no-drill products already include the kit."
    },
    "province": {
      "type": "string",
      "description": "Optional. Customer's South African province or city. Garden Route locations get Duncan's direct contact; other locations get the online shop contact."
    },
    "quantity": {
      "type": "number",
      "description": "Number of blinds (default 1)"
    },
    "width_mm": {
      "type": "number",
      "description": "Width in millimetres"
    },
    "height_mm": {
      "type": "number",
      "description": "Height/drop in millimetres"
    },
    "mount_type": {
      "type": "string",
      "minLength": 1,
      "description": "Use inside (recess) or outside (face-fix); handler requires a nonempty value"
    },
    "product_id": {
      "type": "string",
      "description": "product_id from search_catalog or lookup_catalog"
    }
  }
}
configure_product output schema
{
  "type": "object",
  "required": [
    "product_id",
    "width_mm",
    "height_mm",
    "colour",
    "mount_type",
    "quantity",
    "unit_price_zar",
    "total_price_zar",
    "currency"
  ],
  "properties": {
    "colour": {
      "type": "string"
    },
    "finish": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "limits": {
      "type": "object",
      "required": [],
      "properties": {},
      "additionalProperties": true
    },
    "contact": {
      "type": "object",
      "required": [],
      "properties": {
        "name": {
          "type": "string"
        },
        "note": {
          "type": "string"
        },
        "email": {
          "type": "string"
        },
        "whatsapp": {
          "type": "string"
        }
      },
      "additionalProperties": true
    },
    "summary": {
      "type": "string"
    },
    "currency": {
      "type": "string",
      "const": "ZAR"
    },
    "delivery": {
      "type": "string"
    },
    "in_stock": {
      "type": "boolean"
    },
    "quantity": {
      "type": "number"
    },
    "width_mm": {
      "type": "number"
    },
    "height_mm": {
      "type": "number"
    },
    "lead_time": {
      "type": "string"
    },
    "next_step": {
      "type": "string"
    },
    "price_zar": {
      "type": "number"
    },
    "mount_type": {
      "type": "string"
    },
    "product_id": {
      "type": "string"
    },
    "product_name": {
      "type": "string"
    },
    "vat_included": {
      "type": "boolean"
    },
    "unit_price_zar": {
      "type": "number"
    },
    "total_price_zar": {
      "type": "number"
    },
    "effective_width_mm": {
      "type": "number"
    },
    "effective_height_mm": {
      "type": "number"
    },
    "minimum_charge_applied": {
      "type": "boolean"
    }
  },
  "additionalProperties": true
}
configure_product annotations
{
  "readOnlyHint": true
}
submit_enquiry
Advertised by the server during the last successful anonymous check.

Legacy auth-required tool, prefer the open UCP flow (create_cart → create_checkout → complete_checkout) for credentialless checkout. Use submit_enquiry only when the customer wants a sales team follow-up by email rather than paying online. Requires Bearer token. Pass a configure_product output plus customer name, email, and phone. Team responds within 24 hours.

submit_enquiry input schema
{
  "type": "object",
  "required": [
    "product_config",
    "customer_name",
    "customer_email",
    "customer_phone",
    "message"
  ],
  "properties": {
    "message": {
      "type": "string",
      "minLength": 10,
      "description": "Required enquiry message; at least 10 characters after trimming"
    },
    "customer_name": {
      "type": "string",
      "description": "Customer full name"
    },
    "customer_email": {
      "type": "string",
      "description": "Customer email address"
    },
    "customer_phone": {
      "type": "string",
      "description": "Customer phone number"
    },
    "product_config": {
      "type": "object",
      "properties": {
        "colour": {
          "type": "string"
        },
        "width_mm": {
          "type": "number"
        },
        "height_mm": {
          "type": "number"
        },
        "price_zar": {
          "type": "number"
        },
        "mount_type": {
          "type": "string"
        },
        "product_id": {
          "type": "string"
        },
        "product_name": {
          "type": "string"
        }
      },
      "description": "Product configuration from configure_product"
    }
  }
}
submit_enquiry output schema
{
  "type": "object",
  "required": [
    "success",
    "message",
    "contact"
  ],
  "properties": {
    "contact": {
      "type": "object",
      "required": [],
      "properties": {
        "name": {
          "type": "string"
        },
        "note": {
          "type": "string"
        },
        "email": {
          "type": "string"
        },
        "whatsapp": {
          "type": "string"
        }
      },
      "additionalProperties": true
    },
    "message": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  },
  "additionalProperties": true
}
submit_enquiry annotations
{
  "readOnlyHint": false,
  "destructiveHint": false
}
create_order
Advertised by the server during the last successful anonymous check.
Advertised destructive

Legacy auth-required tool, prefer the open UCP flow (create_cart → create_checkout → complete_checkout) which needs no credentials. Use create_order only if you hold a Bearer token and want a single-call path to a payment link. All item prices are re-verified server-side against the live pricing engine, agent-supplied prices are ignored. Returns a Yoco or Ozow payment_url.

create_order input schema
{
  "type": "object",
  "required": [
    "items",
    "customer_name",
    "customer_email",
    "customer_phone"
  ],
  "properties": {
    "items": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "product_id",
          "width_mm",
          "height_mm",
          "colour",
          "mount_type"
        ],
        "properties": {
          "colour": {
            "type": "string"
          },
          "finish": {
            "type": "string"
          },
          "no_drill": {
            "type": "boolean",
            "description": "Optional. true for the no-drill option (tension brackets, inside the frame, max 2000mm wide; 1500mm on 25mm venetians). Adds the R65 no-drill kit per blind. Offered on indoor roller blinds, including value rollers, and 25mm aluminium or aluwood venetians. Dedicated no-drill products already include the kit."
          },
          "quantity": {
            "type": "number"
          },
          "width_mm": {
            "type": "number"
          },
          "height_mm": {
            "type": "number"
          },
          "mount_type": {
            "type": "string"
          },
          "product_id": {
            "type": "string"
          },
          "product_name": {
            "type": "string"
          },
          "unit_price_zar": {
            "type": "number"
          },
          "total_price_zar": {
            "type": "number"
          }
        }
      },
      "minItems": 1,
      "description": "Array of configured blind items"
    },
    "customer_city": {
      "type": "string",
      "description": "Delivery city"
    },
    "customer_name": {
      "type": "string",
      "description": "Customer full name"
    },
    "customer_email": {
      "type": "string",
      "description": "Customer email address"
    },
    "customer_phone": {
      "type": "string",
      "description": "Customer phone number"
    },
    "payment_method": {
      "enum": [
        "yoco",
        "ozow"
      ],
      "type": "string",
      "default": "yoco",
      "description": "Yoco card or Ozow instant EFT"
    },
    "customer_address": {
      "type": "string",
      "description": "Delivery address"
    }
  }
}
create_order output schema
{
  "type": "object",
  "required": [
    "order_reference",
    "checkout_id",
    "status",
    "payment_url",
    "message"
  ],
  "properties": {
    "ap2": {
      "type": "object",
      "required": [
        "merchant_authorization"
      ],
      "properties": {
        "merchant_authorization": {
          "type": "string"
        }
      },
      "additionalProperties": true
    },
    "items": {
      "anyOf": [
        {
          "type": "array",
          "items": {
            "type": "object",
            "required": [],
            "properties": {
              "colour": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "drop_mm": {
                "type": "number"
              },
              "quantity": {
                "type": "number"
              },
              "width_mm": {
                "type": "number"
              },
              "mount_type": {
                "type": "string"
              },
              "unit_price": {
                "type": "number"
              },
              "total_price": {
                "type": "number"
              },
              "product_name": {
                "type": "string"
              },
              "product_slug": {
                "type": "string"
              }
            },
            "additionalProperties": true
          }
        },
        {
          "type": "null"
        }
      ]
    },
    "status": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "message": {
      "type": "string"
    },
    "currency": {
      "type": "string",
      "const": "ZAR"
    },
    "customer": {
      "type": "object",
      "required": [],
      "properties": {
        "city": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ]
        },
        "name": {
          "type": "string"
        },
        "email": {
          "type": "string"
        },
        "phone": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ]
        },
        "address": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "additionalProperties": true
    },
    "next_step": {
      "type": "string"
    },
    "total_zar": {
      "type": "number"
    },
    "item_count": {
      "type": "number"
    },
    "checkout_id": {
      "type": "string"
    },
    "payment_url": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "payment_method": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "order_reference": {
      "type": "string"
    },
    "provider_reference": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    }
  },
  "additionalProperties": true
}
create_order annotations
{
  "readOnlyHint": false,
  "destructiveHint": true
}
search_catalog
Advertised by the server during the last successful anonymous check.
Advertised read-only

Preferred free-text discovery. Returns results containing product_id, name, category, description, product_url and colour_count_in_stock, plus total and currency. For structured filters use lookup_catalog. Pass product_id to get_product or get_price.

search_catalog input schema
{
  "type": "object",
  "properties": {
    "query": {
      "type": "string",
      "description": "Free-text query, e.g. 'blockout' or 'venetian'"
    }
  }
}
search_catalog output schema
{
  "type": "object",
  "required": [
    "results",
    "total",
    "currency"
  ],
  "properties": {
    "total": {
      "type": "number"
    },
    "results": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "product_id",
          "name",
          "category",
          "description",
          "product_url",
          "colour_count_in_stock"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "category": {
            "type": "string"
          },
          "product_id": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "product_url": {
            "type": "string"
          },
          "colour_count_in_stock": {
            "type": "number"
          }
        },
        "additionalProperties": true
      }
    },
    "currency": {
      "type": "string",
      "const": "ZAR"
    }
  },
  "additionalProperties": true
}
search_catalog annotations
{
  "readOnlyHint": true
}
lookup_catalog
Advertised by the server during the last successful anonymous check.
Advertised read-only

Preferred structured discovery. Filter by category, partial colour name or required supported width/drop in mm. Returns results containing product_id, name, category and product_url, plus total. Width/drop filters check separate maximums, not every combination; confirm the exact pair with get_price.

lookup_catalog input schema
{
  "type": "object",
  "properties": {
    "colour": {
      "type": "string"
    },
    "category": {
      "type": "string",
      "description": "roller | venetian | honeycomb | vertical | outdoor"
    },
    "max_width_mm": {
      "type": "number"
    },
    "max_height_mm": {
      "type": "number"
    }
  }
}
lookup_catalog output schema
{
  "type": "object",
  "required": [
    "results",
    "total"
  ],
  "properties": {
    "total": {
      "type": "number"
    },
    "results": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "product_id",
          "name",
          "category",
          "product_url"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "category": {
            "type": "string"
          },
          "product_id": {
            "type": "string"
          },
          "product_url": {
            "type": "string"
          }
        },
        "additionalProperties": true
      }
    }
  },
  "additionalProperties": true
}
lookup_catalog annotations
{
  "readOnlyHint": true
}
get_product
Advertised by the server during the last successful anonymous check.
Advertised read-only

Fetch complete details for one product by id (e.g. roller-blockout, venetian-25mm-aluwood). Returns all available colours with in-stock status, materials, features, and maximum supported dimensions. Use before configure_product to confirm a colour exists and is in stock before committing.

get_product input schema
{
  "type": "object",
  "required": [
    "product_id"
  ],
  "properties": {
    "product_id": {
      "type": "string"
    }
  }
}
get_product output schema
{
  "type": "object",
  "required": [
    "product_id",
    "name",
    "category",
    "colours",
    "product_url"
  ],
  "properties": {
    "name": {
      "type": "string"
    },
    "colours": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "name",
          "in_stock"
        ],
        "properties": {
          "hex": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "name": {
            "type": "string"
          },
          "finish": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "in_stock": {
            "type": "boolean"
          },
          "material": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "expected_restock": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": true
      }
    },
    "category": {
      "type": "string"
    },
    "features": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "materials": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "product_id": {
      "type": "string"
    },
    "schema_url": {
      "type": "string"
    },
    "description": {
      "type": "string"
    },
    "product_url": {
      "type": "string"
    },
    "size_limits": {
      "anyOf": [
        {
          "type": "object",
          "required": [
            "product_id",
            "unit",
            "max_width_mm",
            "max_height_mm",
            "minimum_charge_width_mm",
            "minimum_charge_height_mm",
            "combination_dependent",
            "availability_rule",
            "width_drop_frontier",
            "measurement_note",
            "validation_note"
          ],
          "properties": {
            "unit": {
              "type": "string",
              "const": "mm"
            },
            "product_id": {
              "type": "string"
            },
            "max_width_mm": {
              "type": "number"
            },
            "max_height_mm": {
              "type": "number"
            },
            "validation_note": {
              "type": "string"
            },
            "measurement_note": {
              "type": "string"
            },
            "availability_rule": {
              "type": "string"
            },
            "width_drop_frontier": {
              "type": "array",
              "items": {
                "type": "object",
                "required": [
                  "width_band_max_mm",
                  "max_drop_mm"
                ],
                "properties": {
                  "max_drop_mm": {
                    "type": "number"
                  },
                  "width_band_max_mm": {
                    "type": "number"
                  }
                },
                "additionalProperties": true
              }
            },
            "combination_dependent": {
              "type": "boolean"
            },
            "minimum_order_width_mm": {
              "type": "number"
            },
            "minimum_charge_width_mm": {
              "type": "number"
            },
            "minimum_order_height_mm": {
              "type": "number"
            },
            "minimum_charge_height_mm": {
              "type": "number"
            }
          },
          "additionalProperties": true
        },
        {
          "type": "null"
        }
      ]
    },
    "max_width_mm": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ]
    },
    "suitable_for": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "max_height_mm": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ]
    },
    "installation_type": {
      "type": "string"
    },
    "starting_price_zar": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ]
    },
    "colour_count_in_stock": {
      "type": "number"
    }
  },
  "additionalProperties": true
}
get_product annotations
{
  "readOnlyHint": true
}
create_cart
Advertised by the server during the last successful anonymous check.

Start the open UCP purchase flow, no auth needed. Creates a cart session and returns a cart_id (24-hour TTL). Optionally seed with pre-configured blind items and customer details. Next step: update_cart to add items, then create_checkout → complete_checkout to mint the payment link.

create_cart input schema
{
  "type": "object",
  "properties": {
    "items": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "product_id",
          "width_mm",
          "height_mm",
          "colour",
          "mount_type"
        ],
        "properties": {
          "colour": {
            "type": "string",
            "minLength": 1,
            "description": "Exact available colour; validate with configure_product before adding"
          },
          "finish": {
            "type": "string",
            "description": "Optional pricing finish for aluminium Venetians"
          },
          "no_drill": {
            "type": "boolean",
            "description": "Optional. true for the no-drill option (tension brackets, inside the frame, max 2000mm wide; 1500mm on 25mm venetians). Adds the R65 no-drill kit per blind. Offered on indoor roller blinds, including value rollers, and 25mm aluminium or aluwood venetians. Dedicated no-drill products already include the kit."
          },
          "quantity": {
            "type": "number",
            "description": "Number of blinds; defaults to 1"
          },
          "width_mm": {
            "type": "number",
            "description": "Actual ordered width in millimetres",
            "exclusiveMinimum": 0
          },
          "height_mm": {
            "type": "number",
            "description": "Actual ordered drop in millimetres",
            "exclusiveMinimum": 0
          },
          "mount_type": {
            "type": "string",
            "minLength": 1,
            "description": "Use inside for recess fit or outside for face fix"
          },
          "product_id": {
            "type": "string",
            "description": "product_id returned by search_catalog or lookup_catalog"
          },
          "product_name": {
            "type": "string",
            "description": "Optional; server resolves the catalogue name"
          },
          "unit_price_zar": {
            "type": "number",
            "description": "Optional, ignored: server recalculates all prices"
          },
          "total_price_zar": {
            "type": "number",
            "description": "Optional, ignored: server recalculates all totals"
          }
        }
      },
      "description": "Optional configured items; all submitted prices are ignored"
    },
    "customer": {
      "type": "object",
      "properties": {
        "city": {
          "type": "string"
        },
        "name": {
          "type": "string",
          "description": "Real customer name, checked before checkout creation"
        },
        "email": {
          "type": "string",
          "description": "Real customer email, checked before checkout creation"
        },
        "phone": {
          "type": "string",
          "description": "South African phone number, checked before checkout creation"
        },
        "address": {
          "type": "string"
        }
      }
    }
  }
}
create_cart output schema
{
  "type": "object",
  "required": [
    "cart_id",
    "items",
    "item_count",
    "total_zar",
    "currency",
    "customer",
    "created_at",
    "updated_at",
    "expires_at"
  ],
  "properties": {
    "items": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "product_id",
          "width_mm",
          "height_mm",
          "quantity",
          "unit_price_zar",
          "total_price_zar"
        ],
        "properties": {
          "colour": {
            "type": "string"
          },
          "finish": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "quantity": {
            "type": "number"
          },
          "width_mm": {
            "type": "number"
          },
          "height_mm": {
            "type": "number"
          },
          "mount_type": {
            "type": "string"
          },
          "product_id": {
            "type": "string"
          },
          "product_name": {
            "type": "string"
          },
          "unit_price_zar": {
            "type": "number"
          },
          "total_price_zar": {
            "type": "number"
          }
        },
        "additionalProperties": true
      }
    },
    "cart_id": {
      "type": "string"
    },
    "currency": {
      "type": "string",
      "const": "ZAR"
    },
    "customer": {
      "anyOf": [
        {
          "type": "object",
          "required": [],
          "properties": {
            "city": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ]
            },
            "name": {
              "type": "string"
            },
            "email": {
              "type": "string"
            },
            "phone": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ]
            },
            "address": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ]
            }
          },
          "additionalProperties": true
        },
        {
          "type": "null"
        }
      ]
    },
    "total_zar": {
      "type": "number"
    },
    "created_at": {
      "type": "string"
    },
    "expires_at": {
      "type": "string"
    },
    "item_count": {
      "type": "number"
    },
    "updated_at": {
      "type": "string"
    }
  },
  "additionalProperties": true
}
create_cart annotations
{
  "readOnlyHint": false,
  "destructiveHint": false
}
get_cart
Advertised by the server during the last successful anonymous check.
Advertised read-only

Retrieve live cart state by cart_id: full item list, calculated totals in ZAR, and any customer details stored so far. Call after update_cart to confirm changes are correct before proceeding to create_checkout. Cart expires after 24 hours of inactivity.

get_cart input schema
{
  "type": "object",
  "required": [
    "cart_id"
  ],
  "properties": {
    "cart_id": {
      "type": "string"
    }
  }
}
get_cart output schema
{
  "type": "object",
  "required": [
    "cart_id",
    "items",
    "item_count",
    "total_zar",
    "currency",
    "customer",
    "created_at",
    "updated_at",
    "expires_at"
  ],
  "properties": {
    "items": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "product_id",
          "width_mm",
          "height_mm",
          "quantity",
          "unit_price_zar",
          "total_price_zar"
        ],
        "properties": {
          "colour": {
            "type": "string"
          },
          "finish": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "quantity": {
            "type": "number"
          },
          "width_mm": {
            "type": "number"
          },
          "height_mm": {
            "type": "number"
          },
          "mount_type": {
            "type": "string"
          },
          "product_id": {
            "type": "string"
          },
          "product_name": {
            "type": "string"
          },
          "unit_price_zar": {
            "type": "number"
          },
          "total_price_zar": {
            "type": "number"
          }
        },
        "additionalProperties": true
      }
    },
    "cart_id": {
      "type": "string"
    },
    "currency": {
      "type": "string",
      "const": "ZAR"
    },
    "customer": {
      "anyOf": [
        {
          "type": "object",
          "required": [],
          "properties": {
            "city": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ]
            },
            "name": {
              "type": "string"
            },
            "email": {
              "type": "string"
            },
            "phone": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ]
            },
            "address": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ]
            }
          },
          "additionalProperties": true
        },
        {
          "type": "null"
        }
      ]
    },
    "total_zar": {
      "type": "number"
    },
    "created_at": {
      "type": "string"
    },
    "expires_at": {
      "type": "string"
    },
    "item_count": {
      "type": "number"
    },
    "updated_at": {
      "type": "string"
    }
  },
  "additionalProperties": true
}
get_cart annotations
{
  "readOnlyHint": true
}
update_cart
Advertised by the server during the last successful anonymous check.
Advertised destructive

Modify an open cart before checkout. op: 'add' appends items, 'remove' drops items by 0-based index, 'set' replaces the full item list, 'clear' empties the cart. Merges customer details (name, email, phone) via the customer field. Call get_cart afterwards to confirm. Cannot modify a cart that already has a checkout in progress.

update_cart input schema
{
  "type": "object",
  "required": [
    "cart_id"
  ],
  "properties": {
    "op": {
      "enum": [
        "add",
        "remove",
        "set",
        "clear"
      ],
      "type": "string",
      "default": "set"
    },
    "items": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "product_id",
          "width_mm",
          "height_mm",
          "colour",
          "mount_type"
        ],
        "properties": {
          "colour": {
            "type": "string",
            "minLength": 1,
            "description": "Exact available colour; validate with configure_product before adding"
          },
          "finish": {
            "type": "string",
            "description": "Optional pricing finish for aluminium Venetians"
          },
          "no_drill": {
            "type": "boolean",
            "description": "Optional. true for the no-drill option (tension brackets, inside the frame, max 2000mm wide; 1500mm on 25mm venetians). Adds the R65 no-drill kit per blind. Offered on indoor roller blinds, including value rollers, and 25mm aluminium or aluwood venetians. Dedicated no-drill products already include the kit."
          },
          "quantity": {
            "type": "number",
            "description": "Number of blinds; defaults to 1"
          },
          "width_mm": {
            "type": "number",
            "description": "Actual ordered width in millimetres",
            "exclusiveMinimum": 0
          },
          "height_mm": {
            "type": "number",
            "description": "Actual ordered drop in millimetres",
            "exclusiveMinimum": 0
          },
          "mount_type": {
            "type": "string",
            "minLength": 1,
            "description": "Use inside for recess fit or outside for face fix"
          },
          "product_id": {
            "type": "string",
            "description": "product_id returned by search_catalog or lookup_catalog"
          },
          "product_name": {
            "type": "string",
            "description": "Optional; server resolves the catalogue name"
          },
          "unit_price_zar": {
            "type": "number",
            "description": "Optional, ignored: server recalculates all prices"
          },
          "total_price_zar": {
            "type": "number",
            "description": "Optional, ignored: server recalculates all totals"
          }
        }
      }
    },
    "cart_id": {
      "type": "string"
    },
    "indices": {
      "type": "array",
      "items": {
        "type": "number"
      },
      "description": "Item indices to remove (0-based) when op='remove'"
    },
    "customer": {
      "type": "object",
      "properties": {
        "city": {
          "type": "string"
        },
        "name": {
          "type": "string",
          "description": "Real customer name, checked before checkout creation"
        },
        "email": {
          "type": "string",
          "description": "Real customer email, checked before checkout creation"
        },
        "phone": {
          "type": "string",
          "description": "South African phone number, checked before checkout creation"
        },
        "address": {
          "type": "string"
        }
      }
    }
  }
}
update_cart output schema
{
  "type": "object",
  "required": [
    "cart_id",
    "items",
    "item_count",
    "total_zar",
    "currency",
    "customer",
    "created_at",
    "updated_at",
    "expires_at"
  ],
  "properties": {
    "items": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "product_id",
          "width_mm",
          "height_mm",
          "quantity",
          "unit_price_zar",
          "total_price_zar"
        ],
        "properties": {
          "colour": {
            "type": "string"
          },
          "finish": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "quantity": {
            "type": "number"
          },
          "width_mm": {
            "type": "number"
          },
          "height_mm": {
            "type": "number"
          },
          "mount_type": {
            "type": "string"
          },
          "product_id": {
            "type": "string"
          },
          "product_name": {
            "type": "string"
          },
          "unit_price_zar": {
            "type": "number"
          },
          "total_price_zar": {
            "type": "number"
          }
        },
        "additionalProperties": true
      }
    },
    "cart_id": {
      "type": "string"
    },
    "currency": {
      "type": "string",
      "const": "ZAR"
    },
    "customer": {
      "anyOf": [
        {
          "type": "object",
          "required": [],
          "properties": {
            "city": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ]
            },
            "name": {
              "type": "string"
            },
            "email": {
              "type": "string"
            },
            "phone": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ]
            },
            "address": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ]
            }
          },
          "additionalProperties": true
        },
        {
          "type": "null"
        }
      ]
    },
    "total_zar": {
      "type": "number"
    },
    "created_at": {
      "type": "string"
    },
    "expires_at": {
      "type": "string"
    },
    "item_count": {
      "type": "number"
    },
    "updated_at": {
      "type": "string"
    }
  },
  "additionalProperties": true
}
update_cart annotations
{
  "readOnlyHint": false,
  "destructiveHint": true
}
cancel_cart
Advertised by the server during the last successful anonymous check.
Advertised destructive

Permanently delete a cart by cart_id. Use when the customer abandons the session or wants to start over. Has no effect on any checkout or paid order already created from this cart. Irreversible, create a new cart to restart.

cancel_cart input schema
{
  "type": "object",
  "required": [
    "cart_id"
  ],
  "properties": {
    "cart_id": {
      "type": "string"
    }
  }
}
cancel_cart output schema
{
  "type": "object",
  "required": [
    "cancelled",
    "cart_id"
  ],
  "properties": {
    "cart_id": {
      "type": "string"
    },
    "cancelled": {
      "type": "boolean"
    }
  },
  "additionalProperties": true
}
cancel_cart annotations
{
  "readOnlyHint": false,
  "destructiveHint": true
}
create_checkout
Advertised by the server during the last successful anonymous check.
Advertised destructive

Phase 1 of 2 in the purchase flow. Convert a cart (or inline items + customer) into a checkout. Customer name, email, and phone are required. Returns checkout_id. No payment link is minted yet, call complete_checkout for that. Use update_checkout to correct customer details before finalising.

create_checkout input schema
{
  "type": "object",
  "anyOf": [
    {
      "required": [
        "cart_id"
      ]
    },
    {
      "required": [
        "items",
        "customer"
      ],
      "properties": {
        "customer": {
          "required": [
            "name",
            "email",
            "phone"
          ]
        }
      }
    }
  ],
  "properties": {
    "items": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "product_id",
          "width_mm",
          "height_mm",
          "colour",
          "mount_type"
        ],
        "properties": {
          "colour": {
            "type": "string",
            "minLength": 1,
            "description": "Exact available colour; validate with configure_product before adding"
          },
          "finish": {
            "type": "string",
            "description": "Optional pricing finish for aluminium Venetians"
          },
          "no_drill": {
            "type": "boolean",
            "description": "Optional. true for the no-drill option (tension brackets, inside the frame, max 2000mm wide; 1500mm on 25mm venetians). Adds the R65 no-drill kit per blind. Offered on indoor roller blinds, including value rollers, and 25mm aluminium or aluwood venetians. Dedicated no-drill products already include the kit."
          },
          "quantity": {
            "type": "number",
            "description": "Number of blinds; defaults to 1"
          },
          "width_mm": {
            "type": "number",
            "description": "Actual ordered width in millimetres",
            "exclusiveMinimum": 0
          },
          "height_mm": {
            "type": "number",
            "description": "Actual ordered drop in millimetres",
            "exclusiveMinimum": 0
          },
          "mount_type": {
            "type": "string",
            "minLength": 1,
            "description": "Use inside for recess fit or outside for face fix"
          },
          "product_id": {
            "type": "string",
            "description": "product_id returned by search_catalog or lookup_catalog"
          },
          "product_name": {
            "type": "string",
            "description": "Optional; server resolves the catalogue name"
          },
          "unit_price_zar": {
            "type": "number",
            "description": "Optional, ignored: server recalculates all prices"
          },
          "total_price_zar": {
            "type": "number",
            "description": "Optional, ignored: server recalculates all totals"
          }
        }
      },
      "minItems": 1
    },
    "cart_id": {
      "type": "string",
      "description": "Either cart_id or items required"
    },
    "customer": {
      "type": "object",
      "properties": {
        "city": {
          "type": "string"
        },
        "name": {
          "type": "string",
          "description": "Real customer name, checked before checkout creation"
        },
        "email": {
          "type": "string",
          "description": "Real customer email, checked before checkout creation"
        },
        "phone": {
          "type": "string",
          "description": "South African phone number, checked before checkout creation"
        },
        "address": {
          "type": "string"
        }
      }
    },
    "payment_method": {
      "enum": [
        "yoco",
        "ozow"
      ],
      "type": "string",
      "description": "Default 'yoco'"
    }
  }
}
create_checkout output schema
{
  "type": "object",
  "required": [
    "checkout_id",
    "status",
    "total_zar",
    "currency"
  ],
  "properties": {
    "ap2": {
      "type": "object",
      "required": [
        "merchant_authorization"
      ],
      "properties": {
        "merchant_authorization": {
          "type": "string"
        }
      },
      "additionalProperties": true
    },
    "items": {
      "anyOf": [
        {
          "type": "array",
          "items": {
            "type": "object",
            "required": [],
            "properties": {
              "colour": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "drop_mm": {
                "type": "number"
              },
              "quantity": {
                "type": "number"
              },
              "width_mm": {
                "type": "number"
              },
              "mount_type": {
                "type": "string"
              },
              "unit_price": {
                "type": "number"
              },
              "total_price": {
                "type": "number"
              },
              "product_name": {
                "type": "string"
              },
              "product_slug": {
                "type": "string"
              }
            },
            "additionalProperties": true
          }
        },
        {
          "type": "null"
        }
      ]
    },
    "status": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "message": {
      "type": "string"
    },
    "currency": {
      "type": "string",
      "const": "ZAR"
    },
    "customer": {
      "type": "object",
      "required": [],
      "properties": {
        "city": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ]
        },
        "name": {
          "type": "string"
        },
        "email": {
          "type": "string"
        },
        "phone": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ]
        },
        "address": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "additionalProperties": true
    },
    "next_step": {
      "type": "string"
    },
    "total_zar": {
      "type": "number"
    },
    "item_count": {
      "type": "number"
    },
    "checkout_id": {
      "type": "string"
    },
    "payment_url": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "payment_method": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "provider_reference": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    }
  },
  "additionalProperties": true
}
create_checkout annotations
{
  "readOnlyHint": false,
  "destructiveHint": true
}
get_checkout
Advertised by the server during the last successful anonymous check.
Advertised read-only

Read checkout by checkout_id. Returns persisted order status, payment_status, payment_method, items, customer, total_zar and currency. Initial order status is started, not pending. This tool does not return a previously generated payment_url: retain the complete_checkout response in caller context.

get_checkout input schema
{
  "type": "object",
  "required": [
    "checkout_id"
  ],
  "properties": {
    "checkout_id": {
      "type": "string"
    }
  }
}
get_checkout output schema
{
  "type": "object",
  "required": [
    "checkout_id",
    "status",
    "total_zar",
    "currency"
  ],
  "properties": {
    "ap2": {
      "type": "object",
      "required": [
        "merchant_authorization"
      ],
      "properties": {
        "merchant_authorization": {
          "type": "string"
        }
      },
      "additionalProperties": true
    },
    "items": {
      "anyOf": [
        {
          "type": "array",
          "items": {
            "type": "object",
            "required": [],
            "properties": {
              "colour": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "drop_mm": {
                "type": "number"
              },
              "quantity": {
                "type": "number"
              },
              "width_mm": {
                "type": "number"
              },
              "mount_type": {
                "type": "string"
              },
              "unit_price": {
                "type": "number"
              },
              "total_price": {
                "type": "number"
              },
              "product_name": {
                "type": "string"
              },
              "product_slug": {
                "type": "string"
              }
            },
            "additionalProperties": true
          }
        },
        {
          "type": "null"
        }
      ]
    },
    "status": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "message": {
      "type": "string"
    },
    "currency": {
      "type": "string",
      "const": "ZAR"
    },
    "customer": {
      "type": "object",
      "required": [],
      "properties": {
        "city": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ]
        },
        "name": {
          "type": "string"
        },
        "email": {
          "type": "string"
        },
        "phone": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ]
        },
        "address": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "additionalProperties": true
    },
    "next_step": {
      "type": "string"
    },
    "total_zar": {
      "type": "number"
    },
    "item_count": {
      "type": "number"
    },
    "checkout_id": {
      "type": "string"
    },
    "payment_url": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "payment_method": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "provider_reference": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    }
  },
  "additionalProperties": true
}
get_checkout annotations
{
  "readOnlyHint": true
}
update_checkout
Advertised by the server during the last successful anonymous check.
Advertised destructive

Update customer details or payment_method only before payment-link generation. Paid, cancelled and payment-in-progress checkouts are rejected. Concurrent state changes are detected; retrieve the latest status before retrying.

update_checkout input schema
{
  "type": "object",
  "required": [
    "checkout_id"
  ],
  "properties": {
    "customer": {
      "type": "object",
      "properties": {
        "city": {
          "type": "string"
        },
        "name": {
          "type": "string",
          "description": "Real customer name, checked before checkout creation"
        },
        "email": {
          "type": "string",
          "description": "Real customer email, checked before checkout creation"
        },
        "phone": {
          "type": "string",
          "description": "South African phone number, checked before checkout creation"
        },
        "address": {
          "type": "string"
        }
      }
    },
    "checkout_id": {
      "type": "string"
    },
    "payment_method": {
      "enum": [
        "yoco",
        "ozow"
      ],
      "type": "string"
    }
  }
}
update_checkout output schema
{
  "type": "object",
  "required": [
    "checkout_id",
    "status",
    "total_zar",
    "currency"
  ],
  "properties": {
    "ap2": {
      "type": "object",
      "required": [
        "merchant_authorization"
      ],
      "properties": {
        "merchant_authorization": {
          "type": "string"
        }
      },
      "additionalProperties": true
    },
    "items": {
      "anyOf": [
        {
          "type": "array",
          "items": {
            "type": "object",
            "required": [],
            "properties": {
              "colour": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "drop_mm": {
                "type": "number"
              },
              "quantity": {
                "type": "number"
              },
              "width_mm": {
                "type": "number"
              },
              "mount_type": {
                "type": "string"
              },
              "unit_price": {
                "type": "number"
              },
              "total_price": {
                "type": "number"
              },
              "product_name": {
                "type": "string"
              },
              "product_slug": {
                "type": "string"
              }
            },
            "additionalProperties": true
          }
        },
        {
          "type": "null"
        }
      ]
    },
    "status": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "message": {
      "type": "string"
    },
    "currency": {
      "type": "string",
      "const": "ZAR"
    },
    "customer": {
      "type": "object",
      "required": [],
      "properties": {
        "city": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ]
        },
        "name": {
          "type": "string"
        },
        "email": {
          "type": "string"
        },
        "phone": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ]
        },
        "address": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "additionalProperties": true
    },
    "next_step": {
      "type": "string"
    },
    "total_zar": {
      "type": "number"
    },
    "item_count": {
      "type": "number"
    },
    "checkout_id": {
      "type": "string"
    },
    "payment_url": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "payment_method": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "provider_reference": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    }
  },
  "additionalProperties": true
}
update_checkout annotations
{
  "readOnlyHint": false,
  "destructiveHint": true
}
complete_checkout
Advertised by the server during the last successful anonymous check.
Advertised destructive

Generate a Yoco card or Ozow instant-EFT payment link; this does NOT complete payment. Rejects cancelled checkouts and rechecks stock and totals first. An atomic claim prevents competing gateway calls. Returns payment_url or null plus status and message; cloud callers may be held. Retain a successful URL: repeat calls return payment_pending with no URL. Gateway failures raise an error, send no payment-link email and require team review rather than an automatic retry. Poll get_order with customer_email for payment status.

complete_checkout input schema
{
  "type": "object",
  "required": [
    "checkout_id"
  ],
  "properties": {
    "checkout_id": {
      "type": "string"
    },
    "payment_method": {
      "enum": [
        "yoco",
        "ozow"
      ],
      "type": "string",
      "description": "Overrides any value set in create_checkout/update_checkout"
    }
  }
}
complete_checkout output schema
{
  "type": "object",
  "allOf": [
    {
      "if": {
        "required": [
          "payment_url"
        ],
        "properties": {
          "payment_url": {
            "type": "string"
          }
        }
      },
      "then": {
        "required": [
          "total_zar",
          "currency",
          "payment_method"
        ]
      }
    }
  ],
  "required": [
    "checkout_id",
    "status",
    "payment_url",
    "message"
  ],
  "properties": {
    "ap2": {
      "type": "object",
      "required": [
        "merchant_authorization"
      ],
      "properties": {
        "merchant_authorization": {
          "type": "string"
        }
      },
      "additionalProperties": true
    },
    "items": {
      "anyOf": [
        {
          "type": "array",
          "items": {
            "type": "object",
            "required": [],
            "properties": {
              "colour": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "drop_mm": {
                "type": "number"
              },
              "quantity": {
                "type": "number"
              },
              "width_mm": {
                "type": "number"
              },
              "mount_type": {
                "type": "string"
              },
              "unit_price": {
                "type": "number"
              },
              "total_price": {
                "type": "number"
              },
              "product_name": {
                "type": "string"
              },
              "product_slug": {
                "type": "string"
              }
            },
            "additionalProperties": true
          }
        },
        {
          "type": "null"
        }
      ]
    },
    "status": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "message": {
      "type": "string"
    },
    "currency": {
      "type": "string",
      "const": "ZAR"
    },
    "customer": {
      "type": "object",
      "required": [],
      "properties": {
        "city": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ]
        },
        "name": {
          "type": "string"
        },
        "email": {
          "type": "string"
        },
        "phone": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ]
        },
        "address": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "additionalProperties": true
    },
    "next_step": {
      "type": "string"
    },
    "total_zar": {
      "type": "number"
    },
    "item_count": {
      "type": "number"
    },
    "checkout_id": {
      "type": "string"
    },
    "payment_url": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "payment_method": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "provider_reference": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    }
  },
  "additionalProperties": true
}
complete_checkout annotations
{
  "readOnlyHint": false,
  "destructiveHint": true
}
cancel_checkout
Advertised by the server during the last successful anonymous check.
Advertised destructive

Abort an unpaid checkout and release its checkout_id. Use if the customer changes their mind after create_checkout but before completing payment. Has no effect on orders already confirmed by webhook. To restart, create a new cart and checkout from scratch.

cancel_checkout input schema
{
  "type": "object",
  "required": [
    "checkout_id"
  ],
  "properties": {
    "checkout_id": {
      "type": "string"
    }
  }
}
cancel_checkout output schema
{
  "type": "object",
  "required": [
    "checkout_id",
    "status"
  ],
  "properties": {
    "status": {
      "type": "string"
    },
    "checkout_id": {
      "type": "string"
    }
  },
  "additionalProperties": true
}
cancel_checkout annotations
{
  "readOnlyHint": false,
  "destructiveHint": true
}
get_order
Advertised by the server during the last successful anonymous check.
Advertised read-only

Retrieve a confirmed order's status, items, and payment details by order_id. customer_email is required as soft-auth and must exactly match the order record, prevents arbitrary order lookups. Returns payment status (paid | pending | failed), production status, and dispatch date once available.

get_order input schema
{
  "type": "object",
  "required": [
    "order_id",
    "customer_email"
  ],
  "properties": {
    "order_id": {
      "type": "string"
    },
    "customer_email": {
      "type": "string"
    }
  }
}
get_order output schema
{
  "type": "object",
  "required": [
    "order_id",
    "payment_status",
    "total_zar",
    "currency"
  ],
  "properties": {
    "items": {
      "anyOf": [
        {
          "type": "array",
          "items": {
            "type": "object",
            "required": [],
            "properties": {
              "colour": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "drop_mm": {
                "type": "number"
              },
              "quantity": {
                "type": "number"
              },
              "width_mm": {
                "type": "number"
              },
              "mount_type": {
                "type": "string"
              },
              "unit_price": {
                "type": "number"
              },
              "total_price": {
                "type": "number"
              },
              "product_name": {
                "type": "string"
              },
              "product_slug": {
                "type": "string"
              }
            },
            "additionalProperties": true
          }
        },
        {
          "type": "null"
        }
      ]
    },
    "paid_at": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "currency": {
      "type": "string",
      "const": "ZAR"
    },
    "order_id": {
      "type": "string"
    },
    "lead_time": {
      "type": "string"
    },
    "total_zar": {
      "type": "number"
    },
    "order_status": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "payment_status": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "order_reference": {
      "type": "string"
    }
  },
  "additionalProperties": true
}
get_order annotations
{
  "readOnlyHint": true
}
check_colour_stock
Advertised by the server during the last successful anonymous check.
Advertised read-only

Verify whether a specific colour is available before configure_product. Returns in_stock boolean, expected_restock_date if out of stock, and up to 5 alternative in-stock colours ordered by similarity. Call this when a customer requests a named colour or when you want to prevent a configure_product failure due to an out-of-stock selection.

check_colour_stock input schema
{
  "type": "object",
  "required": [
    "product_id",
    "colour_name"
  ],
  "properties": {
    "product_id": {
      "type": "string"
    },
    "colour_name": {
      "type": "string"
    }
  }
}
check_colour_stock output schema
{
  "type": "object",
  "required": [
    "in_stock"
  ],
  "properties": {
    "found": {
      "type": "boolean"
    },
    "colour": {
      "type": "string"
    },
    "message": {
      "type": "string"
    },
    "in_stock": {
      "type": "boolean"
    },
    "product_id": {
      "type": "string"
    },
    "expected_restock": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "matching_colours": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "name",
          "in_stock"
        ],
        "properties": {
          "hex": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "name": {
            "type": "string"
          },
          "finish": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "in_stock": {
            "type": "boolean"
          },
          "material": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "expected_restock": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": true
      }
    },
    "available_colours": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "exact_colour_match": {
      "type": "boolean"
    },
    "requires_exact_colour_selection": {
      "type": "boolean"
    }
  },
  "additionalProperties": true
}
check_colour_stock annotations
{
  "readOnlyHint": true
}
request_swatch
Advertised by the server during the last successful anonymous check.

Log up to 5 colour codes against an EXISTING order for the team (order_ref required; without it the tool returns status order_required and logs nothing). Sample swatches, not off-cuts: on orders over R8,000 the customer can ask on WhatsApp for swatches in the colours they like, for the product they are ordering; if nothing suits, full refund with no fees. Never quote a sample price or courier cost.

request_swatch input schema
{
  "type": "object",
  "required": [
    "customer_name",
    "customer_email",
    "customer_phone",
    "product_interest",
    "order_ref"
  ],
  "properties": {
    "suburb": {
      "type": "string",
      "description": "Optional delivery suburb"
    },
    "order_ref": {
      "type": "string",
      "description": "The order reference the swatches ship with. Required."
    },
    "swatch_codes": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Optional specific colour codes (max 5)"
    },
    "customer_name": {
      "type": "string",
      "description": "Customer's full name."
    },
    "customer_email": {
      "type": "string",
      "description": "Customer's email address."
    },
    "customer_phone": {
      "type": "string",
      "description": "Used as WhatsApp number"
    },
    "product_interest": {
      "type": "string",
      "description": "e.g. 'Roller Blockout' or 'Honeycomb'"
    }
  }
}
request_swatch output schema
{
  "type": "object",
  "required": [
    "status",
    "message"
  ],
  "properties": {
    "policy": {
      "type": "string"
    },
    "status": {
      "type": "string"
    },
    "message": {
      "type": "string"
    },
    "next_step": {
      "type": "string"
    },
    "order_ref": {
      "type": "string"
    },
    "request_id": {
      "type": "number"
    },
    "swatch_count": {
      "type": "number"
    },
    "estimated_delivery_days": {
      "type": "object",
      "required": [
        "min",
        "max"
      ],
      "properties": {
        "max": {
          "type": "number"
        },
        "min": {
          "type": "number"
        }
      },
      "additionalProperties": true
    }
  },
  "additionalProperties": true
}
request_swatch annotations
{
  "readOnlyHint": false,
  "destructiveHint": false
}
get_payment_methods
Advertised by the server during the last successful anonymous check.
Advertised read-only

List available payment processors and their capabilities. Returns Yoco (card, immediate) and Ozow (instant EFT via South African bank account). Call when the customer asks 'how can I pay?' or before presenting options. The result informs the payment_method field in create_checkout and complete_checkout.

get_payment_methods input schema
{
  "type": "object",
  "properties": {
    "order_total_zar": {
      "type": "number",
      "description": "Optional. For future per-handler limit filtering."
    }
  }
}
get_payment_methods output schema
{
  "type": "object",
  "required": [
    "default_currency",
    "handlers",
    "note"
  ],
  "properties": {
    "note": {
      "type": "string"
    },
    "handlers": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "id",
          "name",
          "supports"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "note": {
            "type": "string"
          },
          "supports": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "additionalProperties": true
      }
    },
    "default_currency": {
      "type": "string",
      "const": "ZAR"
    }
  },
  "additionalProperties": true
}
get_payment_methods annotations
{
  "readOnlyHint": true
}
get_whatsapp_handoff
Advertised by the server during the last successful anonymous check.
Advertised read-only

Generate a pre-filled WhatsApp deep link to hand the customer off to the right contact. Garden Route locations (Knysna, Plett, George, Sedgefield, etc.) route to Duncan Kane on WhatsApp (+27795235407) for a free in-home consultation; all other South African locations route to the shop WhatsApp (+27760228410), WhatsApp only, no voice calls. Use when the customer prefers human assistance or when self-serve checkout isn't appropriate.

get_whatsapp_handoff input schema
{
  "type": "object",
  "properties": {
    "message": {
      "type": "string",
      "description": "Optional additional message to prefill"
    },
    "location": {
      "type": "string",
      "description": "City/suburb. Drives Duncan vs shop routing."
    },
    "customer_name": {
      "type": "string"
    },
    "product_context": {
      "type": "string",
      "description": "e.g. 'roller blockout for bedroom'"
    }
  }
}
get_whatsapp_handoff output schema
{
  "type": "object",
  "required": [
    "whatsapp_url",
    "recipient",
    "recipient_phone",
    "reason"
  ],
  "properties": {
    "reason": {
      "type": "string"
    },
    "recipient": {
      "type": "string"
    },
    "whatsapp_url": {
      "type": "string"
    },
    "recipient_phone": {
      "type": "string"
    }
  },
  "additionalProperties": true
}
get_whatsapp_handoff annotations
{
  "readOnlyHint": true
}
get_product_recommendation
Advertised by the server during the last successful anonymous check.
Advertised read-only

Translate a customer's primary concern into a product recommendation. primary_concern must be one of: blockout, heat, glare, moisture, privacy, security, automation. Optionally narrow by room (bedroom, lounge, etc.), location, budget, and aesthetic. Returns a recommended product_id with rationale, pass it to get_price or configure_product next. Security concern routes to brochure MCP (Garden Route customers only).

get_product_recommendation input schema
{
  "type": "object",
  "required": [
    "primary_concern"
  ],
  "properties": {
    "room": {
      "type": "string"
    },
    "location": {
      "type": "string"
    },
    "aesthetic": {
      "type": "string"
    },
    "max_budget_zar": {
      "type": "number"
    },
    "primary_concern": {
      "enum": [
        "blockout",
        "heat",
        "glare",
        "moisture",
        "privacy",
        "security",
        "automation"
      ],
      "type": "string"
    }
  }
}
get_product_recommendation output schema
{
  "type": "object",
  "required": [
    "recommendations"
  ],
  "properties": {
    "notes": {
      "type": "string"
    },
    "handoff": {
      "type": "object",
      "required": [
        "url",
        "product_family",
        "reason"
      ],
      "properties": {
        "url": {
          "type": "string"
        },
        "reason": {
          "type": "string"
        },
        "product_family": {
          "type": "string"
        }
      },
      "additionalProperties": true
    },
    "recommendations": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "product_id",
          "product_name",
          "reason",
          "starting_price_zar_for_1m_x_1m",
          "currency",
          "shop_url"
        ],
        "properties": {
          "reason": {
            "type": "string"
          },
          "currency": {
            "type": "string",
            "const": "ZAR"
          },
          "shop_url": {
            "type": "string"
          },
          "product_id": {
            "type": "string"
          },
          "product_name": {
            "type": "string"
          },
          "starting_price_zar_for_1m_x_1m": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": true
      }
    }
  },
  "additionalProperties": true
}
get_product_recommendation annotations
{
  "readOnlyHint": true
}
get_ar_visualizer_url
Advertised by the server during the last successful anonymous check.
Advertised read-only

Returns the link to the Custom Blinds Visualiser (See it before you buy it), pre-selected to the product when it is supported. The customer adds a photo of their window (any angle), picks a blind and colour, and previews it on their own window. A preview of colour and style, not a measuring tool. No measuring or marking. A name and WhatsApp number are needed; 2 free previews per customer. Also returns the measuring guide (mode 'measure' makes it the main url) and the list of supported products. A customer still unsure of sizes can order with best guess sizes, receive a free tape measure and confirm before production starts. Use when a customer wants to see how a blind or colour will look before ordering, or is unsure how to measure.

get_ar_visualizer_url input schema
{
  "type": "object",
  "properties": {
    "mode": {
      "enum": [
        "measure",
        "visualize",
        "both"
      ],
      "type": "string",
      "description": "Which link goes in url: visualize (own-window visualiser), measure (measuring guide) or both (visualiser, the default). Both links are always returned."
    },
    "product_id": {
      "type": "string",
      "description": "Optional. Pre-select a product in the visualiser (e.g. roller-blockout, double-roller-zebra, outdoor-blinds)."
    }
  }
}
get_ar_visualizer_url output schema
{
  "type": "object",
  "required": [
    "url",
    "visualiser_url",
    "measure_url",
    "note"
  ],
  "properties": {
    "url": {
      "type": "string"
    },
    "note": {
      "type": "string"
    },
    "product_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "measure_url": {
      "type": "string"
    },
    "visualiser_url": {
      "type": "string"
    },
    "supported_products": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "product_id",
          "label"
        ],
        "properties": {
          "label": {
            "type": "string"
          },
          "product_id": {
            "type": "string"
          }
        },
        "additionalProperties": true
      }
    }
  },
  "additionalProperties": true
}
get_ar_visualizer_url annotations
{
  "readOnlyHint": true
}
get_delivery_estimate
Advertised by the server during the last successful anonymous check.
Advertised read-only

Explain the lead time for a new order. Production takes 5 to 7 working days once payment clears, outside peak seasons, then courier transit of about 2 to 5 working days. Returns the ranges and a plain-language summary safe to share. Never quote a dispatch or delivery date: weather and production set them. Call this when a customer asks 'when will it arrive?'.

get_delivery_estimate input schema
{
  "type": "object",
  "properties": {
    "order_date": {
      "type": "string",
      "description": "ISO date string of the order placement date (e.g. '2026-05-18'). Defaults to today."
    }
  }
}
get_delivery_estimate output schema
{
  "type": "object",
  "required": [
    "production_working_days_min",
    "production_working_days_max",
    "transit_working_days_min",
    "transit_working_days_max",
    "delivery_after_dispatch",
    "summary",
    "important"
  ],
  "properties": {
    "summary": {
      "type": "string"
    },
    "important": {
      "type": "string"
    },
    "order_date": {
      "type": "string"
    },
    "production_starts": {
      "type": "string"
    },
    "expedited_available": {
      "type": "boolean"
    },
    "delivery_after_dispatch": {
      "type": "string"
    },
    "transit_working_days_max": {
      "type": "number"
    },
    "transit_working_days_min": {
      "type": "number"
    },
    "production_working_days_max": {
      "type": "number"
    },
    "production_working_days_min": {
      "type": "number"
    }
  },
  "additionalProperties": true
}
get_delivery_estimate annotations
{
  "readOnlyHint": true
}
request_price_match
Advertised by the server during the last successful anonymous check.
Advertised read-only

Submit a price match claim when the customer has found the same blind at a lower price elsewhere. Custom Blinds matches verified South African retailer prices for identical product, dimensions, and specs. Returns a pre-filled WhatsApp link to the claims team. Not applicable to: Blinds Direct (same supplier), clearance or flash-sale prices, or out-of-stock items. Requires product_id and competitor_price_zar at minimum.

request_price_match input schema
{
  "type": "object",
  "required": [
    "product_id",
    "competitor_price_zar"
  ],
  "properties": {
    "width_mm": {
      "type": "number",
      "description": "Window width in mm"
    },
    "height_mm": {
      "type": "number",
      "description": "Window height/drop in mm"
    },
    "product_id": {
      "type": "string",
      "description": "Product the customer wants to match (e.g. roller-blockout)"
    },
    "customer_name": {
      "type": "string",
      "description": "Customer name"
    },
    "competitor_url": {
      "type": "string",
      "description": "URL to competitor product page or quote"
    },
    "competitor_name": {
      "type": "string",
      "description": "Name of the competitor (e.g. 'Blind Empire')"
    },
    "customer_whatsapp": {
      "type": "string",
      "description": "Customer WhatsApp number for follow-up"
    },
    "competitor_price_zar": {
      "type": "number",
      "description": "Competitor's price in ZAR (incl. VAT)"
    }
  }
}
request_price_match output schema
{
  "type": "object",
  "required": [
    "success",
    "claim_summary",
    "whatsapp_url",
    "message",
    "exclusions",
    "note"
  ],
  "properties": {
    "note": {
      "type": "string"
    },
    "message": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    },
    "exclusions": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "whatsapp_url": {
      "type": "string"
    },
    "claim_summary": {
      "type": "object",
      "required": [
        "product_id",
        "dimensions",
        "competitor",
        "competitor_price_zar"
      ],
      "properties": {
        "competitor": {
          "type": "string"
        },
        "dimensions": {
          "type": "string"
        },
        "product_id": {
          "type": "string"
        },
        "competitor_price_zar": {
          "type": "string"
        }
      },
      "additionalProperties": true
    }
  },
  "additionalProperties": true
}
request_price_match annotations
{
  "readOnlyHint": true
}

Prompts

Not advertised

No prompt definitions available.

Resources

Not advertised

No resource definitions available.

90-day uptime

A lightweight connection check about every six hours, sampled on hosts with many listings. It shows the server answered, not that its tools work.

Too few checks for a percentage yet (1 of 1 answered).

  1. 2026-11-07: 1 of 1 checks answered

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
715 ms
95th percentile latency
715 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 715 ms · metadata changed · 26 tool(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http custom-blinds-shop-mcp https://shop.customblinds.co.za/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add custom-blinds-shop-mcp --url https://shop.customblinds.co.za/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable custom-blinds-shop-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "custom-blinds-shop-mcp": {
      "url": "https://shop.customblinds.co.za/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "custom-blinds-shop-mcp": {
      "type": "streamableHttp",
      "url": "https://shop.customblinds.co.za/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start custom-blinds-shop-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "custom-blinds-shop-mcp": {
      "type": "http",
      "url": "https://shop.customblinds.co.za/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http custom-blinds-shop-mcp https://shop.customblinds.co.za/mcp

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://shop.customblinds.co.za/mcp

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "custom-blinds-shop-mcp": {
      "serverUrl": "https://shop.customblinds.co.za/mcp"
    }
  }
}

Let your agent find its tools

Find servers like Custom Blinds Shop MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.