{
  "mcp_version": "2024-11-05",
  "server_name": "creafor-arrangements",
  "description": "MCP server voor Creafor's arrangement-based drukwerkcatalogus. Exposes interne /connector/html/* endpoints als agent-callable tools, UCP-genormaliseerd.",
  "transport": "http",
  "endpoint":  "https://creafor-mcp.andreas-8c4.workers.dev/mcp",
  "endpoint_local": "/mcp",
  "sse_endpoint": "https://creafor-mcp.andreas-8c4.workers.dev/mcp/sse",
  "auth": {
    "type": "agent_token",
    "header": "X-Agent-Token",
    "param": "token",
    "guest_mode": "automatic — public reads work without auth, login tool returns token for write ops"
  },
  "rate_limits": {
    "guest_per_min": 60,
    "authenticated_per_min": 200
  },
  "documentation_url": "https://www.printvis.be/module/pages/mcp-docs.html",
  "llms_txt_url": "https://www.printvis.be/module/llms.txt",
  "tools": [
    {
      "name": "list_root_categories",
      "description": "Lijst van top-level productcategorieën (BANNERS, BEACHVLAGGEN, BORDEN, VISITEKAARTJES, ...).",
      "inputSchema": { "type": "object", "properties": {} },
      "backend": "GET /connector/html/handleArrangements"
    },
    {
      "name": "browse",
      "description": "Drill-down: haal de volgende laag in de hiërarchie op. Elke laag kan een subcategorie-grid zijn of een concreet product-detail.",
      "inputSchema": {
        "type": "object",
        "required": ["id", "level"],
        "properties": {
          "id":    { "type": "integer", "description": "ID van geklikte node in vorige laag" },
          "level": { "type": "integer", "description": "Huidige diepte (1=subcategorieën, 2=sub-sub, 3=product-detail)" }
        }
      },
      "backend": "GET /connector/html/handleArrangements?id={id}&level={level}"
    },
    {
      "name": "calculate_price",
      "description": "Realtime prijsberekening voor een arrangement. `unit` van het arrangement bepaalt welke parameters relevant zijn: per_piece → alleen run; per_m2 → parameter_1 (breedte mm) + parameter_2 (hoogte mm); per_meter → parameter_2 (lengte mm); per_weight → parameter_1 (gewicht g).",
      "inputSchema": {
        "type": "object",
        "required": ["id", "run"],
        "properties": {
          "id":          { "type": "integer", "description": "Arrangement-ID (link_03)" },
          "run":         { "type": "integer", "description": "Oplage (aantal stuks)", "minimum": 1 },
          "versions":    { "type": "integer", "description": "Aantal versies", "default": 1, "minimum": 1 },
          "parameter_1": { "type": "integer", "description": "Breedte/gewicht in mm/g", "default": 0 },
          "parameter_2": { "type": "integer", "description": "Hoogte/lengte in mm", "default": 0 }
        }
      },
      "backend": "GET /connector/html/calculateProductPrice?id={id}&bufferType=arrangement&run={run}&versions={versions}&parameter_1={parameter_1}&parameter_2={parameter_2}",
      "returns": { "price": "number (excl. btw)" }
    },
    {
      "name": "add_to_cart",
      "description": "Voeg een geconfigureerd arrangement toe aan de winkelmand (bufferLine). Vereist authenticatie.",
      "inputSchema": {
        "type": "object",
        "required": ["id", "run"],
        "properties": {
          "id":          { "type": "integer" },
          "run":         { "type": "integer" },
          "versions":    { "type": "integer", "default": 1 },
          "parameter_1": { "type": "integer", "default": 0 },
          "parameter_2": { "type": "integer", "default": 0 },
          "reference":   { "type": "string", "description": "Klant-referentie voor deze regel" },
          "remark":      { "type": "string", "description": "Opmerking voor productie" }
        }
      },
      "backend": "PUT /connector/html/handleBufferLine"
    },
    {
      "name": "my_cart",
      "description": "Huidige inhoud van winkelmandje + totaal. Vereist login.",
      "inputSchema": { "type": "object", "properties": {} },
      "backend": "GET /connector/html/calculateBufferLines + POST /connector/html/listTables"
    },
    {
      "name": "remove_from_cart",
      "description": "Verwijder een regel uit het winkelmandje.",
      "inputSchema": {
        "type": "object",
        "required": ["id"],
        "properties": { "id": { "type": "integer" } }
      },
      "backend": "DELETE /connector/html/handleBufferLine"
    },
    {
      "name": "checkout",
      "description": "Plaats een order met de geselecteerde buffer-regels. Vereist leveradres, betaalwijze, leverdatum.",
      "inputSchema": {
        "type": "object",
        "required": ["lineIds", "delivery_date", "delivery", "payment_type"],
        "properties": {
          "lineIds":       { "type": "array", "items": { "type": "integer" } },
          "delivery_date": { "type": "string", "description": "DD-MM-YYYY" },
          "delivery":      { "type": "object" },
          "payment_type":  { "type": "string", "enum": ["Rekening", "Machtiging", "Online,sisow", "Rembours"] }
        }
      },
      "backend": "POST /connector/html/submitBufferLines"
    },
    {
      "name": "estimate_delivery_date",
      "description": "MP-suggestie voor leverdatum op basis van planning.",
      "inputSchema": { "type": "object", "properties": {} },
      "backend": "GET /connector/html/calculateDeliveryDate"
    },
    {
      "name": "login",
      "description": "Authenticate as a Creafor customer. Sets a write-enabled session.",
      "inputSchema": {
        "type": "object",
        "required": ["username", "password"],
        "properties": {
          "username": { "type": "string" },
          "password": { "type": "string" }
        }
      },
      "backend": "POST /connector/html/createUserSession"
    },
    {
      "name": "get_country_info",
      "description": "Landinformatie inclusief dynamische `extra_address`-labels (Eircode, County, enz.).",
      "inputSchema": {
        "type": "object",
        "required": ["code"],
        "properties": { "code": { "type": "string", "description": "ISO country code (BE, NL, FR, ...)" } }
      },
      "backend": "GET /connector/html/getCountryInfo?code={code}"
    },
    {
      "name": "lookup_city",
      "description": "Zoek stad bij gegeven postcode + land.",
      "inputSchema": {
        "type": "object",
        "required": ["country_code", "zipcode"],
        "properties": {
          "country_code": { "type": "string" },
          "zipcode":      { "type": "string" }
        }
      },
      "backend": "GET /connector/html/getCity"
    },
    {
      "name": "user_preferences",
      "description": "Klantgegevens + bewaarde adressen + ACL-rechten. Alleen beschikbaar voor ingelogde users.",
      "inputSchema": { "type": "object", "properties": {} },
      "backend": "GET /connector/html/getUserPreferences"
    },
    {
      "name": "request_custom_quote",
      "description": "Vraag een offerte op maat aan voor drukwerk dat niet in de standaardcatalogus zit (afwijkend formaat, bijzondere afwerking, exotisch materiaal, niche-product). Werkt zowel voor ingelogde klanten als voor guest-agents — bij guest-modus moet `contact` meegegeven worden zodat MP een tijdelijk klantenaccount kan aanmaken. Antwoord komt binnen 24u (werkdagen) per e-mail; de offerte verschijnt automatisch in het account zodra goedgekeurd door de calculator.",
      "inputSchema": {
        "type": "object",
        "required": ["specs"],
        "properties": {
          "contact": {
            "type": "object",
            "description": "Contactgegevens (verplicht in guest-mode, genegeerd voor ingelogde users).",
            "properties": {
              "company":        { "type": "string" },
              "contact_name":   { "type": "string" },
              "email":          { "type": "string", "format": "email" },
              "phone":          { "type": "string" },
              "address":        { "type": "string" },
              "address_number": { "type": "string" },
              "zipcode":        { "type": "string" },
              "city":           { "type": "string" },
              "country_code":   { "type": "string", "description": "ISO-2 bv. BE/NL/LU/FR/DE", "default": "BE" }
            }
          },
          "specs": {
            "type": "object",
            "required": ["remark", "runs"],
            "properties": {
              "checklist":    { "type": "string", "description": "Categorie-id uit MP, of een vrije tag (stickers/borden/banners/displays/drukwerk/verpakking/andere)." },
              "remark":       { "type": "string", "description": "Hoofdomschrijving van wat er gedrukt moet worden — incl. use-case." },
              "reference":    { "type": "string", "description": "Klant-referentie / PO-nummer (optioneel)." },
              "artwork_date": { "type": "string", "description": "DD-MM-YYYY — wanneer de bestanden aangeleverd worden (optioneel)." },
              "runs":         { "type": "array", "items": { "type": "integer", "minimum": 1 }, "minItems": 1, "maxItems": 3,
                                "description": "Tot 3 oplages voor staffel-prijs (bv. [100, 250, 500])." },
              "specs":        { "type": "object",
                                "description": "Vrije tekstvelden text_01..text_12 met productdetails (formaat, materiaal, bedrukking, afwerking, ...). Sleutels mogen 1..12 zijn of 'text_01'..'text_12'." }
            }
          }
        }
      },
      "backend": "PUT /connector/html/handleBufferLine (bufferType=quotationManual, standard_quotation=0) + POST /connector/html/submitBufferLines",
      "guest_flow": "POST /createUserSession (PRINTING/VISIBILITY) + PUT /createUserSession met contact → throwaway-session → bovenstaande flow",
      "returns": { "ok": "boolean", "lineId": "integer", "message": "string", "expected_response_hours": 24 }
    }
  ],
  "unitTypes": {
    "0": "per_piece",
    "1": "per_m2 (parameter_1 = width mm, parameter_2 = height mm)",
    "2": "per_meter (parameter_2 = length mm)",
    "3": "per_weight (parameter_1 = weight g)"
  },
  "paymentMethods": ["Rekening", "Machtiging", "Online,sisow", "Rembours"],
  "bufferTypes":    ["article", "product", "arrangement", "standard", "autofill", "imagestore", "jobManual", "jobPDF", "quotationManual", "quotationPDF", "web2print", "link", "webdesign"]
}
