{"openapi":"3.1.0","info":{"title":"Insync MCP — Broker API","version":"1.0.0","description":"Integrator reference for the **broker-facing** Insync MCP server (the companion to the policyholder-facing `insync-mcp-customer` server). It exposes broker tools — clients, policies, quotes, claims, invoices, documents, notes, tasks, addresses, external lookups, e-mail and insurance-condition documents — over JSON-RPC.\n\nSome tools are **not yet coupled** to a back office (Novulo/ANVA): they are fully implemented but their endpoint does not exist yet, so each such operation is flagged with a warning in its description.\n\n**Transport.** Tools are served over the Streamable-HTTP transport at `POST /mcp` and the legacy SSE transport at `/sse`. The paths below (`/mcp/tools/{name}`) are documentation stand-ins for each tool's `arguments`; see each operation for the real `tools/call` envelope.\n\n**Auth.** Every `/mcp` and `/sse` request needs an `X-API-Key` header *and* the back-end configuration headers that select and authenticate the broker back-office:\n\n- **Novulo** (default): `X-Backend-Url`, `X-Backend-Username`, `X-Backend-Password`.\n- **ANVA**: `X-Backend-Type: anva`, `X-Anva-Client-Id`, `X-Anva-Client-Secret`, `X-Anva-Org-Code`.\n\nSide-effecting tools confirm via MCP **elicitation**; if the client can't elicit they proceed without a prompt, so the caller must confirm first.\n\n**Target conventions.** The snake_case naming, canonical enums and agent-enabling contract rules we are migrating toward are documented under the **Backend contract (Novulo)** section below and in full in `docs/TARGET-DESIGN.md`. The as-is code is unchanged; these describe the end-state."},"servers":[{"url":"https://insync-mcp.insync-software.workers.dev"}],"tags":[{"name":"Clients","description":"Relaties — search, read and manage client dossiers (incl. policies, claims, documents and invoices via `get-client`)."},{"name":"Policies","description":"Insurance policies (polissen) — list, read, create and mutate."},{"name":"Quotes","description":"Quotes (offertes) and indicative premium calculation."},{"name":"Claims","description":"Claims (schademeldingen)."},{"name":"Invoices","description":"Invoices (facturen)."},{"name":"Documents","description":"A client's own documents (documenten) in the back office — list and upload."},{"name":"Notes","description":"Notes (notities) on clients."},{"name":"Tasks","description":"Tasks (taken) on clients."},{"name":"Addresses","description":"Client addresses and Dutch postal-code address lookup."},{"name":"External lookups","description":"External lookups — vehicle (RDW) and company (KVK)."},{"name":"E-mail","description":"Send branded e-mails to clients."},{"name":"Insurance documents","description":"Generic insurance product conditions (voorwaarden) — not a client's own documents."},{"name":"Backend contract (Novulo)","description":"The real broker back-office (Novulo) HTTP endpoints behind the MCP tools — the contract the back office must implement. These are upstream endpoints (reached via the `X-Backend-Url` you configure), **not** served by this MCP server. Read responses reference the entity schemas; write bodies mirror what the tools POST today. Operations marked ⚠️ do not exist yet (proposed).\n\n## Target naming & contract conventions\n\nThe conventions every **new** tool/endpoint should follow, and the end-state the existing ones migrate toward (alias-compatible — the old key keeps working for one release). The full target design, including the new tools and the agent-enabling contract rules (structured returns on writes, `idempotency_key`, pagination, `dry_run`, a stable error shape), lives in `docs/TARGET-DESIGN.md`.\n\n**Applies to everything the agent sees** — tool input keys, output fields and enum values alike — so a value read from one tool feeds straight into the next.\n\n- **Language & case:** English, `snake_case`. No glued-together words (`premiumamount` → `premium_amount`), no Dutch abbreviations (`kvk` → `coc_number`), plural names for arrays (`object` → `objects`).\n- **Identifiers:** an entity's own id is `id` in output; a reference to it (every tool input, any foreign key) is `<entity>_id` (`client_id`, `policy_id`, `claim_id`, `quote_id`, `invoice_id`, `document_id`, `task_id`, `note_id`), replacing today's mix of `guid` / `customer_guid` / `clientGuid` / `contact`. The upstream Novulo body names (`contact`, `insurance`, …) stay an internal mapping detail.\n- **Types:** dates `_date` (ISO `YYYY-MM-DD`), timestamps `_at` (ISO 8601), money `_amount` (number, EUR), booleans `is_` / `has_`.\n- **Canonical enums** (one per concept, shared by list-filters and updates): `claim_status` = `new` / `in_progress` / `closed`; `policy_status` = `active` / `suspended` / `cancelled` / `expired`; `invoice_status` = `open` / `paid` / `overdue`; `quote_status` = `draft` / `issued` / `accepted` / `rejected` / `expired`.\n- **Write bodies** follow the same rules (`e_mail` → `email`, `firstname` → `first_name`).\n\nProperties flagged ⚠️ below carry a concrete proposed rename; everything else keeps its current name. These are target proposals — the as-is code and Zod SSOT are unchanged."}],"components":{"schemas":{"Client":{"type":"object","properties":{"customer_guid":{"type":"string"},"name":{"type":"string"},"street_and_number":{"type":"string"},"postalcode":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"⚠️ Proposed rename → `postal_code` (target naming)."},"city":{"anyOf":[{"type":"string"},{"type":"null"}]},"kvk":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"⚠️ Proposed rename → `coc_number` (target naming)."},"type":{"type":"string"},"website":{"anyOf":[{"type":"string"},{"type":"null"}]},"createdat":{"type":"string","description":"⚠️ Proposed rename → `created_at` (target naming)."},"email":{"anyOf":[{"type":"string"},{"type":"null"}]},"insurances":{"type":"array","items":{"$ref":"#/components/schemas/Insurance"}},"claims":{"type":"array","items":{"$ref":"#/components/schemas/Claim"}},"documents":{"type":"array","items":{"$ref":"#/components/schemas/Document"}},"invoices":{"type":"array","items":{"$ref":"#/components/schemas/CustomerInvoice"}}},"required":["customer_guid","name","street_and_number","postalcode","city","kvk","type","website","createdat","email","insurances","claims","documents","invoices"],"additionalProperties":false},"Insurance":{"type":"object","properties":{"guid":{"type":"string"},"reference":{"type":"string","description":"⚠️ Proposed rename → `policy_number` (target naming)."},"name":{"type":"string"},"premiumamount":{"type":"number","description":"⚠️ Proposed rename → `premium_amount` (target naming)."},"premiumfrequency":{"type":"string","description":"⚠️ Proposed rename → `premium_frequency` (target naming)."},"start_date":{"type":"string"},"contract_due_date":{"type":"string"},"premium_due_date":{"type":"string"},"part_of_package":{"type":"string"},"object":{"type":"array","items":{"$ref":"#/components/schemas/InsuranceObject"},"description":"⚠️ Proposed rename → `objects` (target naming)."},"coverages":{"type":"array","items":{"$ref":"#/components/schemas/Coverage"}},"documents":{"type":"array","items":{"$ref":"#/components/schemas/Document"}},"conditions_documents":{"type":"array","items":{"$ref":"#/components/schemas/ConditionsDocument"}}},"required":["guid","reference","name","premiumamount","premiumfrequency","start_date","contract_due_date","premium_due_date","part_of_package","object","coverages","documents","conditions_documents"],"additionalProperties":false},"Coverage":{"type":"object","properties":{"guid":{"type":"string"},"product":{"type":"string"},"coverages_conditions_documents":{"type":"array","items":{"$ref":"#/components/schemas/ConditionsDocument"},"description":"⚠️ Proposed rename → `conditions_documents` (target naming)."}},"required":["guid","product","coverages_conditions_documents"],"additionalProperties":false},"ConditionsDocument":{"type":"object","properties":{"document_id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"name":{"type":"string"},"created_at":{"type":"string"},"url":{"type":"string"},"guid":{"type":"string"}},"required":["document_id","name","created_at","url","guid"],"additionalProperties":false},"InsuranceObject":{"type":"object","properties":{"guid":{"type":"string"},"object_name":{"type":"string"},"object_details":{"type":"string"},"object_type":{"type":"string"}},"required":["guid","object_name","object_details","object_type"],"additionalProperties":false},"Document":{"type":"object","properties":{"document_id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"name":{"type":"string"},"url":{"type":"string"},"created_at":{"type":"string"},"is_invoice":{"type":"boolean"},"outstanding_amount":{"type":"number"},"total_after_tax":{"type":"number"},"invoicenumber":{"type":"string","description":"⚠️ Proposed rename → `invoice_number` (target naming)."}},"required":["document_id","name","url","created_at","is_invoice","outstanding_amount","total_after_tax","invoicenumber"],"additionalProperties":false},"Claim":{"type":"object","properties":{"guid":{"type":"string"},"insurance_guid":{"type":"string"},"claim_date":{"type":"string"},"damaged_object":{"type":"string"},"subject":{"type":"string"},"damaged_object_type":{"type":"string"},"status":{"type":"string","enum":["Nieuw","Lopend","Gesloten"],"description":"⚠️ Proposed target values: `Nieuw` → `new`, `Lopend` → `in_progress`, `Gesloten` → `closed`."}},"required":["guid","insurance_guid","claim_date","damaged_object","subject","damaged_object_type","status"],"additionalProperties":false},"CustomerInvoice":{"type":"object","properties":{"guid":{"type":"string"},"date":{"type":"string","description":"⚠️ Proposed rename → `invoice_date` (target naming)."},"number":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"⚠️ Proposed rename → `invoice_number` (target naming)."},"description":{"type":"string"},"price":{"type":"number"},"outstanding_amount":{"type":"number"},"document_id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["guid","date","number","description","price","outstanding_amount","document_id"],"additionalProperties":false},"InsurancesConnection":{"type":"object","properties":{"guid":{"type":"string"},"name":{"type":"string"},"type":{"type":"string"},"insurances":{"type":"array","items":{"$ref":"#/components/schemas/Insurance"}}},"required":["guid","name","type","insurances"],"additionalProperties":false},"ClaimsConnection":{"type":"object","properties":{"guid":{"type":"string"},"name":{"type":"string"},"type":{"type":"string"},"claims":{"type":"array","items":{"$ref":"#/components/schemas/Claim"}}},"required":["guid","name","type","claims"],"additionalProperties":false},"DocumentsConnection":{"type":"object","properties":{"guid":{"type":"string"},"name":{"type":"string"},"type":{"type":"string"},"documents":{"type":"array","items":{"$ref":"#/components/schemas/Document"}}},"required":["guid","name","type","documents"],"additionalProperties":false}},"securitySchemes":{"apiKey":{"type":"apiKey","in":"header","name":"X-API-Key","description":"Shared MCP API key (one of `MCP_API_KEYS`). Must be sent together with the back-end configuration headers — see the API description."}}},"security":[{"apiKey":[]}],"paths":{"/mcp/tools/list-clients":{"post":{"tags":["Clients"],"summary":"list-clients","operationId":"mcp_list-clients","description":"List all clients in the database. Returns only the name and id of each client (no contact details, policies, claims, etc.). Use get-client to retrieve the full dossier of a specific client.\n\n**Side effect:** no · **Source:** `GET /insyncmcp/customers`\n\nInvoked over JSON-RPC at `POST /mcp` (not a REST endpoint):\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"tools/call\",\n  \"params\": {\n    \"name\": \"list-clients\",\n    \"arguments\": {}\n  }\n}\n```","responses":{"200":{"description":"JSON-RPC response; the tool result is in `result.content`."}}}},"/mcp/tools/get-client":{"post":{"tags":["Clients"],"summary":"get-client","operationId":"mcp_get-client","description":"Get the full dossier of a single client/relation by client_id or name. Returns the client details together with ALL of the client's insurance policies (verzekeringen/polissen), claims (schademeldingen), documents and invoices (facturen), plus their address and contact details. Use this tool to answer any question about a specific client's policies, claims, documents or invoices — that data is included here and there is no separate list tool for it. Note: this returns the client's OWN policies, not the generic insurance product conditions (use list-insurance-options for those).\n\n**Side effect:** no · **Source:** `GET /insyncmcp/customer`\n\nInvoked over JSON-RPC at `POST /mcp` (not a REST endpoint):\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"tools/call\",\n  \"params\": {\n    \"name\": \"get-client\",\n    \"arguments\": { /* arguments below */ }\n  }\n}\n```","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"description":"The name of the client to search for. This parameter is ignored if client_id is provided.","type":"string"},"client_id":{"description":"The id of the client to look up. Use the id returned by list-clients or another tool. This parameter takes precedence over name.","type":"string","minLength":36,"maxLength":36},"guid":{"description":"Deprecated alias for `client_id` (the client to look up). Kept for backward compatibility — prefer `client_id`.","type":"string","minLength":36,"maxLength":36},"navigate":{"default":false,"description":"Only set this to true when the user specifically says it wants to navigate to the client details page.","type":"boolean"},"defaultTab":{"default":"overview","type":"string","enum":["overview","details","policies","claims","documents","notes"]}},"required":["navigate","defaultTab"],"additionalProperties":false}}}},"responses":{"200":{"description":"JSON-RPC response; the tool result is in `result.content`."}}}},"/mcp/tools/create-client":{"post":{"tags":["Clients"],"summary":"create-client","operationId":"mcp_create-client","description":"Create a new client in the database.\n\n**Side effect:** yes (confirms via elicitation — proceeds without a prompt if the client can't elicit, so confirm with the user first) · **Source:** `POST /insyncmcp/add_contact`\n\nInvoked over JSON-RPC at `POST /mcp` (not a REST endpoint):\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"tools/call\",\n  \"params\": {\n    \"name\": \"create-client\",\n    \"arguments\": { /* arguments below */ }\n  }\n}\n```","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"clientType":{"type":"string","enum":["Particulier","Zakelijk"]},"firstName":{"description":"Required if client_type is \"Particulier\"","type":"string"},"prefix":{"type":"string"},"lastName":{"description":"Required if client_type is \"Particulier\"","type":"string"},"organisationName":{"description":"Required if client_type is \"Zakelijk\"","type":"string"},"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"}},"required":["clientType","email"],"additionalProperties":false}}}},"responses":{"200":{"description":"JSON-RPC response; the tool result is in `result.content`."}}}},"/mcp/tools/update-client":{"post":{"tags":["Clients"],"summary":"update-client","operationId":"mcp_update-client","description":"> ⚠️ **Not yet connected to a back office.** This tool is fully implemented (schema, confirmation and request shape are final), but it is not yet usable against the back office (Novulo/ANVA) — the endpoint is not available yet. Calling it today will fail; it will start working once the back office exposes the endpoint, without any change to the tool.\n\nUpdate an existing client/relation. Only the provided fields are changed. Always confirms with the user before applying the changes.\n\n**Side effect:** yes (confirms via elicitation — proceeds without a prompt if the client can't elicit, so confirm with the user first) · **Source:** `POST /insyncmcp/update_contact`\n\nInvoked over JSON-RPC at `POST /mcp` (not a REST endpoint):\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"tools/call\",\n  \"params\": {\n    \"name\": \"update-client\",\n    \"arguments\": { /* arguments below */ }\n  }\n}\n```","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"client_id":{"description":"The id of the client to update. Use the id field from the client data (get-client / list-clients).","type":"string","minLength":36,"maxLength":36},"guid":{"description":"Deprecated alias for `client_id` (the client to update). Kept for backward compatibility — prefer `client_id`.","type":"string","minLength":36,"maxLength":36},"firstName":{"description":"New first name (for a Particulier).","type":"string"},"prefix":{"description":"New name prefix (tussenvoegsel), e.g. \"van der\".","type":"string"},"lastName":{"description":"New surname (for a Particulier).","type":"string"},"organisationName":{"description":"New organisation name (for a Zakelijk).","type":"string"},"email":{"description":"New email address.","type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"phone":{"description":"New phone number.","type":"string"},"website":{"description":"New website.","type":"string"}},"additionalProperties":false}}}},"responses":{"200":{"description":"JSON-RPC response; the tool result is in `result.content`."}}}},"/mcp/tools/list-policies":{"post":{"tags":["Policies"],"summary":"list-policies","operationId":"mcp_list-policies","description":"List insurance policies (polissen) across the portfolio, optionally filtered by client. Use this for portfolio-wide questions (e.g. all policies of a company). To see the policies of one specific client you can also use get-client, which already includes them. Returns each policy's product, policy number and id so you can fetch details (get-policy) or perform follow-up actions (update-policy, cancel-policy, …).\n\n**Side effect:** no · **Source:** `GET /insyncmcp/insurances`\n\nInvoked over JSON-RPC at `POST /mcp` (not a REST endpoint):\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"tools/call\",\n  \"params\": {\n    \"name\": \"list-policies\",\n    \"arguments\": { /* arguments below */ }\n  }\n}\n```","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"client_id":{"description":"Optional client id to only list policies for that specific client. Use the id returned by get-client or list-clients.","type":"string"},"clientGuid":{"description":"Deprecated alias for `client_id` (filter policies by client). Kept for backward compatibility — prefer `client_id`.","type":"string"}},"additionalProperties":false}}}},"responses":{"200":{"description":"JSON-RPC response; the tool result is in `result.content`."}}}},"/mcp/tools/get-policy":{"post":{"tags":["Policies"],"summary":"get-policy","operationId":"mcp_get-policy","description":"> ⚠️ **Not yet connected to a back office.** This tool is fully implemented (schema, confirmation and request shape are final), but it is not yet usable against the back office (Novulo/ANVA) — the endpoint is not available yet. Calling it today will fail; it will start working once the back office exposes the endpoint, without any change to the tool.\n\nGet the details of a single insurance policy (polis) by its id. The policy_id comes from the 'policies' field returned by get-client or from list-policies.\n\n**Side effect:** no · **Source:** `GET /insyncmcp/insurance`\n\nInvoked over JSON-RPC at `POST /mcp` (not a REST endpoint):\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"tools/call\",\n  \"params\": {\n    \"name\": \"get-policy\",\n    \"arguments\": { /* arguments below */ }\n  }\n}\n```","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"policy_id":{"description":"The id of the policy to retrieve. Use the id from list-policies, or a policy in get-client's dossier.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"guid":{"description":"Deprecated alias for `policy_id` (the policy to retrieve). Kept for backward compatibility — prefer `policy_id`.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"additionalProperties":false}}}},"responses":{"200":{"description":"JSON-RPC response; the tool result is in `result.content`."}}}},"/mcp/tools/create-policy":{"post":{"tags":["Policies"],"summary":"create-policy","operationId":"mcp_create-policy","description":"> ⚠️ **Not yet connected to a back office.** This tool is fully implemented (schema, confirmation and request shape are final), but it is not yet usable against the back office (Novulo/ANVA) — the endpoint is not available yet. Calling it today will fail; it will start working once the back office exposes the endpoint, without any change to the tool.\n\nCreate (sluiten) a new insurance policy for an existing client. Use this once a quote is agreed or a policy is taken out directly. The policy number is usually assigned by the insurer, so leave it empty unless it is already known. Always confirms with the user before creating.\n\n**Side effect:** yes (confirms via elicitation — proceeds without a prompt if the client can't elicit, so confirm with the user first) · **Source:** `POST /insyncmcp/add_insurance`\n\nInvoked over JSON-RPC at `POST /mcp` (not a REST endpoint):\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"tools/call\",\n  \"params\": {\n    \"name\": \"create-policy\",\n    \"arguments\": { /* arguments below */ }\n  }\n}\n```","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"client_id":{"description":"The id of the client the policy is for. Use the id returned by get-client or list-clients.","type":"string"},"clientGuid":{"description":"Deprecated alias for `client_id` (the client the policy is for). Kept for backward compatibility — prefer `client_id`.","type":"string"},"product":{"type":"string","description":"The insurance product, e.g. 'Autoverzekering', 'Inboedelverzekering', 'Aansprakelijkheidsverzekering'."},"company":{"description":"The insurer (maatschappij), e.g. 'ASR', 'Nationale-Nederlanden'.","type":"string"},"coverage":{"description":"The coverage (dekking), e.g. 'WA', 'WA + Casco (Allrisk)'.","type":"string"},"premium":{"description":"The premium amount in euros (EUR).","type":"number"},"object":{"description":"The insured object, e.g. a license plate (kenteken) for a car or an address for a home.","type":"string"},"startDate":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$","description":"The start date (ingangsdatum) in ISO format, e.g. 2025-12-31. The current date is 1970-01-01."},"endDate":{"description":"Optional end date (einddatum) in ISO format. Leave empty for an open-ended (doorlopende) policy.","type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"policyNumber":{"description":"Optional policy number (polisnummer) if already known. Usually assigned by the insurer afterwards.","type":"string"}},"required":["product","startDate"],"additionalProperties":false}}}},"responses":{"200":{"description":"JSON-RPC response; the tool result is in `result.content`."}}}},"/mcp/tools/update-policy":{"post":{"tags":["Policies"],"summary":"update-policy","operationId":"mcp_update-policy","description":"> ⚠️ **Not yet connected to a back office.** This tool is fully implemented (schema, confirmation and request shape are final), but it is not yet usable against the back office (Novulo/ANVA) — the endpoint is not available yet. Calling it today will fail; it will start working once the back office exposes the endpoint, without any change to the tool.\n\nUpdate (muteren) an existing insurance policy. Use this for changes to coverage, premium, dates or the insured object. Only the provided fields are changed. To suspend, reactivate or cancel a policy use suspend-policy, reactivate-policy or cancel-policy instead. Always confirms before applying the changes.\n\n**Side effect:** yes (confirms via elicitation — proceeds without a prompt if the client can't elicit, so confirm with the user first) · **Source:** `POST /insyncmcp/update_insurance`\n\nInvoked over JSON-RPC at `POST /mcp` (not a REST endpoint):\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"tools/call\",\n  \"params\": {\n    \"name\": \"update-policy\",\n    \"arguments\": { /* arguments below */ }\n  }\n}\n```","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"policy_id":{"description":"The id of the policy to update. Use the id from list-policies or a policy in get-client's dossier.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"guid":{"description":"Deprecated alias for `policy_id` (the policy to update). Kept for backward compatibility — prefer `policy_id`.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"product":{"description":"New product.","type":"string"},"company":{"description":"New insurer (maatschappij).","type":"string"},"coverage":{"description":"New coverage (dekking).","type":"string"},"premium":{"description":"New premium amount in euros (EUR).","type":"number"},"object":{"description":"New insured object (e.g. license plate or address).","type":"string"},"startDate":{"description":"New start date (ingangsdatum) in ISO format.","type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"endDate":{"description":"New end date (einddatum) in ISO format.","type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"}},"additionalProperties":false}}}},"responses":{"200":{"description":"JSON-RPC response; the tool result is in `result.content`."}}}},"/mcp/tools/cancel-policy":{"post":{"tags":["Policies"],"summary":"cancel-policy","operationId":"mcp_cancel-policy","description":"> ⚠️ **Not yet connected to a back office.** This tool is fully implemented (schema, confirmation and request shape are final), but it is not yet usable against the back office (Novulo/ANVA) — the endpoint is not available yet. Calling it today will fail; it will start working once the back office exposes the endpoint, without any change to the tool.\n\nCancel (royeren/opzeggen) an existing insurance policy as of a given date. This ends the policy — it is not the same as a temporary suspension (use suspend-policy for that). Always confirms before cancelling.\n\n**Side effect:** yes (confirms via elicitation — proceeds without a prompt if the client can't elicit, so confirm with the user first) · **Source:** `POST /insyncmcp/cancel_insurance`\n\nInvoked over JSON-RPC at `POST /mcp` (not a REST endpoint):\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"tools/call\",\n  \"params\": {\n    \"name\": \"cancel-policy\",\n    \"arguments\": { /* arguments below */ }\n  }\n}\n```","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"policy_id":{"description":"The id of the policy to cancel. Use the id from list-policies or a policy in get-client's dossier.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"guid":{"description":"Deprecated alias for `policy_id` (the policy to cancel). Kept for backward compatibility — prefer `policy_id`.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"cancellationDate":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$","description":"The cancellation/effective date (royementsdatum) in ISO format, e.g. 2025-12-31. The current date is 1970-01-01."},"reason":{"type":"string","description":"The reason for cancellation (reden van royement) in Dutch, e.g. 'Op verzoek van klant', 'Object verkocht', 'Wanbetaling'."}},"required":["cancellationDate","reason"],"additionalProperties":false}}}},"responses":{"200":{"description":"JSON-RPC response; the tool result is in `result.content`."}}}},"/mcp/tools/suspend-policy":{"post":{"tags":["Policies"],"summary":"suspend-policy","operationId":"mcp_suspend-policy","description":"> ⚠️ **Not yet connected to a back office.** This tool is fully implemented (schema, confirmation and request shape are final), but it is not yet usable against the back office (Novulo/ANVA) — the endpoint is not available yet. Calling it today will fail; it will start working once the back office exposes the endpoint, without any change to the tool.\n\nTemporarily suspend (schorsen) an existing policy as of a given date — for example schorsing of a car policy while the vehicle is not in use. The policy stays open and can be reactivated later with reactivate-policy. Always confirms before suspending.\n\n**Side effect:** yes (confirms via elicitation — proceeds without a prompt if the client can't elicit, so confirm with the user first) · **Source:** `POST /insyncmcp/suspend_insurance`\n\nInvoked over JSON-RPC at `POST /mcp` (not a REST endpoint):\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"tools/call\",\n  \"params\": {\n    \"name\": \"suspend-policy\",\n    \"arguments\": { /* arguments below */ }\n  }\n}\n```","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"policy_id":{"description":"The id of the policy to suspend. Use the id from list-policies or a policy in get-client's dossier.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"guid":{"description":"Deprecated alias for `policy_id` (the policy to suspend). Kept for backward compatibility — prefer `policy_id`.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"suspensionDate":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$","description":"The date the suspension takes effect (schorsingsdatum) in ISO format. The current date is 1970-01-01."},"reason":{"description":"Optional reason for the suspension (reden van schorsing) in Dutch.","type":"string"}},"required":["suspensionDate"],"additionalProperties":false}}}},"responses":{"200":{"description":"JSON-RPC response; the tool result is in `result.content`."}}}},"/mcp/tools/reactivate-policy":{"post":{"tags":["Policies"],"summary":"reactivate-policy","operationId":"mcp_reactivate-policy","description":"> ⚠️ **Not yet connected to a back office.** This tool is fully implemented (schema, confirmation and request shape are final), but it is not yet usable against the back office (Novulo/ANVA) — the endpoint is not available yet. Calling it today will fail; it will start working once the back office exposes the endpoint, without any change to the tool.\n\nReactivate (schorsing opheffen / herstellen) a previously suspended policy as of a given date, so cover resumes. Always confirms before reactivating.\n\n**Side effect:** yes (confirms via elicitation — proceeds without a prompt if the client can't elicit, so confirm with the user first) · **Source:** `POST /insyncmcp/reactivate_insurance`\n\nInvoked over JSON-RPC at `POST /mcp` (not a REST endpoint):\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"tools/call\",\n  \"params\": {\n    \"name\": \"reactivate-policy\",\n    \"arguments\": { /* arguments below */ }\n  }\n}\n```","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"policy_id":{"description":"The id of the suspended policy to reactivate. Use the id from list-policies or a policy in get-client's dossier.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"guid":{"description":"Deprecated alias for `policy_id` (the policy to reactivate). Kept for backward compatibility — prefer `policy_id`.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"reactivationDate":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$","description":"The date cover should resume (hersteldatum) in ISO format. The current date is 1970-01-01."}},"required":["reactivationDate"],"additionalProperties":false}}}},"responses":{"200":{"description":"JSON-RPC response; the tool result is in `result.content`."}}}},"/mcp/tools/list-quotes":{"post":{"tags":["Quotes"],"summary":"list-quotes","operationId":"mcp_list-quotes","description":"> ⚠️ **Not yet connected to a back office.** This tool is fully implemented (schema, confirmation and request shape are final), but it is not yet usable against the back office (Novulo/ANVA) — the endpoint is not available yet. Calling it today will fail; it will start working once the back office exposes the endpoint, without any change to the tool.\n\nList quotes (offertes) across the portfolio, optionally filtered by client and/or status. Returns each quote's number, product, status and id so you can fetch details (get-quote) or accept it (accept-quote).\n\n**Side effect:** no · **Source:** `GET /insyncmcp/quotes`\n\nInvoked over JSON-RPC at `POST /mcp` (not a REST endpoint):\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"tools/call\",\n  \"params\": {\n    \"name\": \"list-quotes\",\n    \"arguments\": { /* arguments below */ }\n  }\n}\n```","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"client_id":{"description":"Optional client id to only list quotes for that specific client. Use the id returned by get-client or list-clients.","type":"string"},"clientGuid":{"description":"Deprecated alias for `client_id` (filter quotes by client). Kept for backward compatibility — prefer `client_id`.","type":"string"},"status":{"default":"all","description":"Filter by quote status. Defaults to \"all\".","type":"string","enum":["concept","uitgebracht","geaccepteerd","afgewezen","verlopen","all"]}},"required":["status"],"additionalProperties":false}}}},"responses":{"200":{"description":"JSON-RPC response; the tool result is in `result.content`."}}}},"/mcp/tools/get-quote":{"post":{"tags":["Quotes"],"summary":"get-quote","operationId":"mcp_get-quote","description":"> ⚠️ **Not yet connected to a back office.** This tool is fully implemented (schema, confirmation and request shape are final), but it is not yet usable against the back office (Novulo/ANVA) — the endpoint is not available yet. Calling it today will fail; it will start working once the back office exposes the endpoint, without any change to the tool.\n\nGet the details of a single quote (offerte) by its id. The quote_id comes from list-quotes.\n\n**Side effect:** no · **Source:** `GET /insyncmcp/quote`\n\nInvoked over JSON-RPC at `POST /mcp` (not a REST endpoint):\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"tools/call\",\n  \"params\": {\n    \"name\": \"get-quote\",\n    \"arguments\": { /* arguments below */ }\n  }\n}\n```","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"quote_id":{"description":"The id of the quote to retrieve. Use the id from list-quotes.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"guid":{"description":"Deprecated alias for `quote_id` (the quote to retrieve). Kept for backward compatibility — prefer `quote_id`.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"additionalProperties":false}}}},"responses":{"200":{"description":"JSON-RPC response; the tool result is in `result.content`."}}}},"/mcp/tools/calculate-premium":{"post":{"tags":["Quotes"],"summary":"calculate-premium","operationId":"mcp_calculate-premium","description":"> ⚠️ **Not yet connected to a back office.** This tool is fully implemented (schema, confirmation and request shape are final), but it is not yet usable against the back office (Novulo/ANVA) — the endpoint is not available yet. Calling it today will fail; it will start working once the back office exposes the endpoint, without any change to the tool.\n\nCalculate an indicative premium (premie-indicatie) for an insurance product, based on the supplied rating factors. This is a calculation only — it does not create a quote or policy. Use create-quote to turn an agreed premium into an offer. Rating factors vary per product; pass the common fields and any extra factors via 'parameters'.\n\n**Side effect:** no · **Source:** `POST /insyncmcp/calculate_premium`\n\nInvoked over JSON-RPC at `POST /mcp` (not a REST endpoint):\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"tools/call\",\n  \"params\": {\n    \"name\": \"calculate-premium\",\n    \"arguments\": { /* arguments below */ }\n  }\n}\n```","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"product":{"type":"string","description":"The insurance product to rate, e.g. 'Autoverzekering', 'Inboedelverzekering'."},"company":{"description":"Optional insurer (maatschappij) to rate against.","type":"string"},"coverage":{"description":"Optional desired coverage (dekking), e.g. 'WA' or 'Allrisk'.","type":"string"},"insuredValue":{"description":"Optional insured value/sum (verzekerd bedrag) in euros, where relevant.","type":"number"},"parameters":{"description":"Additional rating factors as key/value pairs, e.g. { kenteken: 'AB123C', bouwjaar: 2020, postcode: '1234AB', leeftijd: 35 }.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["product"],"additionalProperties":false}}}},"responses":{"200":{"description":"JSON-RPC response; the tool result is in `result.content`."}}}},"/mcp/tools/create-quote":{"post":{"tags":["Quotes"],"summary":"create-quote","operationId":"mcp_create-quote","description":"> ⚠️ **Not yet connected to a back office.** This tool is fully implemented (schema, confirmation and request shape are final), but it is not yet usable against the back office (Novulo/ANVA) — the endpoint is not available yet. Calling it today will fail; it will start working once the back office exposes the endpoint, without any change to the tool.\n\nCreate (opstellen) a new quote (offerte) for a client. Use this to record a proposed premium and coverage so it can be sent to the client and later accepted (accept-quote). Always confirms before creating.\n\n**Side effect:** yes (confirms via elicitation — proceeds without a prompt if the client can't elicit, so confirm with the user first) · **Source:** `POST /insyncmcp/add_quote`\n\nInvoked over JSON-RPC at `POST /mcp` (not a REST endpoint):\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"tools/call\",\n  \"params\": {\n    \"name\": \"create-quote\",\n    \"arguments\": { /* arguments below */ }\n  }\n}\n```","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"client_id":{"description":"The id of the client the quote is for. Use the id returned by get-client or list-clients.","type":"string"},"clientGuid":{"description":"Deprecated alias for `client_id` (the client the quote is for). Kept for backward compatibility — prefer `client_id`.","type":"string"},"product":{"type":"string","description":"The insurance product, e.g. 'Autoverzekering', 'Inboedelverzekering'."},"company":{"description":"The insurer (maatschappij) the quote is with.","type":"string"},"coverage":{"description":"The proposed coverage (dekking), e.g. 'WA + Casco (Allrisk)'.","type":"string"},"premium":{"description":"The proposed premium amount in euros (EUR).","type":"number"},"object":{"description":"The object to be insured, e.g. a license plate (kenteken) or an address.","type":"string"},"startDate":{"description":"The intended start date (beoogde ingangsdatum) in ISO format. The current date is 1970-01-01.","type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"validUntil":{"description":"Optional date the quote is valid until (geldig tot) in ISO format.","type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"notes":{"description":"Optional notes/remarks for the quote in Dutch.","type":"string"}},"required":["product"],"additionalProperties":false}}}},"responses":{"200":{"description":"JSON-RPC response; the tool result is in `result.content`."}}}},"/mcp/tools/accept-quote":{"post":{"tags":["Quotes"],"summary":"accept-quote","operationId":"mcp_accept-quote","description":"> ⚠️ **Not yet connected to a back office.** This tool is fully implemented (schema, confirmation and request shape are final), but it is not yet usable against the back office (Novulo/ANVA) — the endpoint is not available yet. Calling it today will fail; it will start working once the back office exposes the endpoint, without any change to the tool.\n\nAccept (accepteren) an existing quote (offerte) on behalf of the client, converting it into an active policy. Always confirms before accepting.\n\n**Side effect:** yes (confirms via elicitation — proceeds without a prompt if the client can't elicit, so confirm with the user first) · **Source:** `POST /insyncmcp/accept_quote`\n\nInvoked over JSON-RPC at `POST /mcp` (not a REST endpoint):\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"tools/call\",\n  \"params\": {\n    \"name\": \"accept-quote\",\n    \"arguments\": { /* arguments below */ }\n  }\n}\n```","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"quote_id":{"description":"The id of the quote to accept. Use the id from list-quotes.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"guid":{"description":"Deprecated alias for `quote_id` (the quote to accept). Kept for backward compatibility — prefer `quote_id`.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"startDate":{"description":"The start date (ingangsdatum) of the resulting policy in ISO format. Defaults to the quote's intended start date if omitted. The current date is 1970-01-01.","type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"}},"additionalProperties":false}}}},"responses":{"200":{"description":"JSON-RPC response; the tool result is in `result.content`."}}}},"/mcp/tools/list-claims":{"post":{"tags":["Claims"],"summary":"list-claims","operationId":"mcp_list-claims","description":"List claims (schademeldingen) across the portfolio, optionally filtered by client, policy and/or status. Use this for portfolio-wide questions (e.g. all open claims). To see the claims of one specific client you can also use get-client, which already includes them. Returns each claim's subject, status and id so you can fetch details (get-claim) or perform follow-up actions (update-claim, add-claim-document).\n\n**Side effect:** no · **Source:** `GET /insyncmcp/claims`\n\nInvoked over JSON-RPC at `POST /mcp` (not a REST endpoint):\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"tools/call\",\n  \"params\": {\n    \"name\": \"list-claims\",\n    \"arguments\": { /* arguments below */ }\n  }\n}\n```","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"client_id":{"description":"Optional client id to only list claims for that specific client. Use the id returned by get-client or list-clients.","type":"string"},"clientGuid":{"description":"Deprecated alias for `client_id` (filter claims by client). Kept for backward compatibility — prefer `client_id`.","type":"string"},"policy_id":{"description":"Optional policy id to only list claims filed against that specific policy.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"policyGuid":{"description":"Deprecated alias for `policy_id` (filter claims by policy). Kept for backward compatibility — prefer `policy_id`.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"status":{"default":"all","description":"Filter by claim status. Defaults to \"all\".","type":"string","enum":["Nieuw","Lopend","Gesloten","all"]}},"required":["status"],"additionalProperties":false}}}},"responses":{"200":{"description":"JSON-RPC response; the tool result is in `result.content`."}}}},"/mcp/tools/get-claim":{"post":{"tags":["Claims"],"summary":"get-claim","operationId":"mcp_get-claim","description":"> ⚠️ **Not yet connected to a back office.** This tool is fully implemented (schema, confirmation and request shape are final), but it is not yet usable against the back office (Novulo/ANVA) — the endpoint is not available yet. Calling it today will fail; it will start working once the back office exposes the endpoint, without any change to the tool.\n\nGet the details of a single claim (schademelding) by its id. The claim_id comes from the 'claims' field returned by get-client or from list-claims.\n\n**Side effect:** no · **Source:** `GET /insyncmcp/claim`\n\nInvoked over JSON-RPC at `POST /mcp` (not a REST endpoint):\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"tools/call\",\n  \"params\": {\n    \"name\": \"get-claim\",\n    \"arguments\": { /* arguments below */ }\n  }\n}\n```","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"claim_id":{"description":"The id of the claim to retrieve. Use the id from list-claims, or a claim in get-client's dossier.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"guid":{"description":"Deprecated alias for `claim_id` (the claim to retrieve). Kept for backward compatibility — prefer `claim_id`.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"additionalProperties":false}}}},"responses":{"200":{"description":"JSON-RPC response; the tool result is in `result.content`."}}}},"/mcp/tools/create-claim":{"post":{"tags":["Claims"],"summary":"create-claim","operationId":"mcp_create-claim","description":"Create a new claim (schademelding) for an existing insurance policy. Requires the id of the policy the claim is filed against (see policy_id).\n\n**Side effect:** yes (confirms via elicitation — proceeds without a prompt if the client can't elicit, so confirm with the user first) · **Source:** `POST /insyncportal/addclaim`\n\nInvoked over JSON-RPC at `POST /mcp` (not a REST endpoint):\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"tools/call\",\n  \"params\": {\n    \"name\": \"create-claim\",\n    \"arguments\": { /* arguments below */ }\n  }\n}\n```","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"claim_date":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$","description":"Claim date in ISO format, e.g., 2025-12-31. The current date is 1970-01-01"},"claim_subject":{"type":"string","description":"A brief subject or title for the claim in Dutch."},"claim_description":{"type":"string","description":"A detailed description of the claim in Dutch."},"policy_id":{"description":"The id of the insurance policy the claim is filed against. Get this from list-policies or a policy in get-client's dossier.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"insurance_guid":{"description":"Deprecated alias for `policy_id` (the policy the claim is filed against). Kept for backward compatibility — prefer `policy_id`.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["claim_date","claim_subject","claim_description"],"additionalProperties":false}}}},"responses":{"200":{"description":"JSON-RPC response; the tool result is in `result.content`."}}}},"/mcp/tools/update-claim":{"post":{"tags":["Claims"],"summary":"update-claim","operationId":"mcp_update-claim","description":"> ⚠️ **Not yet connected to a back office.** This tool is fully implemented (schema, confirmation and request shape are final), but it is not yet usable against the back office (Novulo/ANVA) — the endpoint is not available yet. Calling it today will fail; it will start working once the back office exposes the endpoint, without any change to the tool.\n\nUpdate an existing claim (schademelding). Only the provided fields are changed. Always confirms with the user before applying the changes.\n\n**Side effect:** yes (confirms via elicitation — proceeds without a prompt if the client can't elicit, so confirm with the user first) · **Source:** `POST /insyncportal/updateclaim`\n\nInvoked over JSON-RPC at `POST /mcp` (not a REST endpoint):\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"tools/call\",\n  \"params\": {\n    \"name\": \"update-claim\",\n    \"arguments\": { /* arguments below */ }\n  }\n}\n```","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"claim_id":{"description":"The id of the claim to update. Use the id from list-claims or a claim in get-client's dossier.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"claim_guid":{"description":"Deprecated alias for `claim_id` (the claim to update). Kept for backward compatibility — prefer `claim_id`.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"claim_date":{"description":"New claim date in ISO format, e.g., 2025-12-31. The current date is 1970-01-01","type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"claim_subject":{"description":"New subject or title for the claim in Dutch.","type":"string"},"claim_description":{"description":"New detailed description of the claim in Dutch.","type":"string"},"status":{"description":"New status of the claim.","type":"string","enum":["open","in_behandeling","afgehandeld","afgewezen"]}},"additionalProperties":false}}}},"responses":{"200":{"description":"JSON-RPC response; the tool result is in `result.content`."}}}},"/mcp/tools/add-claim-document":{"post":{"tags":["Claims"],"summary":"add-claim-document","operationId":"mcp_add-claim-document","description":"> ⚠️ **Not yet connected to a back office.** This tool is fully implemented (schema, confirmation and request shape are final), but it is not yet usable against the back office (Novulo/ANVA) — the endpoint is not available yet. Calling it today will fail; it will start working once the back office exposes the endpoint, without any change to the tool.\n\nAttach a document (bijlage) to an existing claim (schademelding) — for example a photo of the damage, a repair quote (herstelofferte) or a police report. The file content must be supplied base64-encoded. Always confirms before uploading.\n\n**Side effect:** yes (confirms via elicitation — proceeds without a prompt if the client can't elicit, so confirm with the user first) · **Source:** `POST /insyncportal/addclaimdocument`\n\nInvoked over JSON-RPC at `POST /mcp` (not a REST endpoint):\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"tools/call\",\n  \"params\": {\n    \"name\": \"add-claim-document\",\n    \"arguments\": { /* arguments below */ }\n  }\n}\n```","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"claim_id":{"description":"The id of the claim to attach the document to. Use the id from list-claims or a claim in get-client's dossier.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"claimGuid":{"description":"Deprecated alias for `claim_id` (the claim to attach the document to). Kept for backward compatibility — prefer `claim_id`.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"fileName":{"type":"string","description":"The file name including extension, e.g. 'schadefoto.jpg'."},"contentBase64":{"type":"string","description":"The file content, base64-encoded (without a data-URL prefix)."},"mimeType":{"description":"Optional MIME type, e.g. 'application/pdf' or 'image/jpeg'.","type":"string"},"description":{"description":"Optional short description of the document in Dutch.","type":"string"}},"required":["fileName","contentBase64"],"additionalProperties":false}}}},"responses":{"200":{"description":"JSON-RPC response; the tool result is in `result.content`."}}}},"/mcp/tools/list-invoices":{"post":{"tags":["Invoices"],"summary":"list-invoices","operationId":"mcp_list-invoices","description":"List invoices (facturen) across the portfolio, optionally filtered by client and/or status. Use this for portfolio-wide questions (e.g. all outstanding invoices). To see the invoices of one specific client you can also use get-client, which already includes them. Returns each invoice's number, amount, status and id so you can fetch details with get-invoice.\n\n**Side effect:** no · **Source:** `GET /insyncmcp/documents` (invoices via `is_invoice`)\n\nInvoked over JSON-RPC at `POST /mcp` (not a REST endpoint):\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"tools/call\",\n  \"params\": {\n    \"name\": \"list-invoices\",\n    \"arguments\": { /* arguments below */ }\n  }\n}\n```","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"client_id":{"description":"Optional client id to only list invoices for that specific client. Use the id returned by get-client or list-clients.","type":"string"},"clientGuid":{"description":"Deprecated alias for `client_id` (filter invoices by client). Kept for backward compatibility — prefer `client_id`.","type":"string"},"status":{"default":"all","description":"Filter by invoice status. Defaults to \"all\". Use \"openstaand\" for unpaid (outstanding_amount > 0), \"betaald\" for paid.","type":"string","enum":["openstaand","betaald","all"]}},"required":["status"],"additionalProperties":false}}}},"responses":{"200":{"description":"JSON-RPC response; the tool result is in `result.content`."}}}},"/mcp/tools/get-invoice":{"post":{"tags":["Invoices"],"summary":"get-invoice","operationId":"mcp_get-invoice","description":"Get the details of a single invoice (factuur) by its id. The invoice id comes from list-invoices (shown in brackets) or the 'invoices' field returned by get-client.\n\n**Side effect:** no · **Source:** `GET /insyncmcp/documents` (matched by `document_id`)\n\nInvoked over JSON-RPC at `POST /mcp` (not a REST endpoint):\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"tools/call\",\n  \"params\": {\n    \"name\": \"get-invoice\",\n    \"arguments\": { /* arguments below */ }\n  }\n}\n```","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"documentId":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"The document_id (int) of the invoice to retrieve — shown in [brackets] by list-invoices, or in get-client's 'invoices' array."},"client_id":{"description":"Optional client id to narrow the /documents lookup to one relation.","type":"string"},"clientGuid":{"description":"Deprecated alias for `client_id` (narrow the lookup to one client). Kept for backward compatibility — prefer `client_id`.","type":"string"}},"required":["documentId"],"additionalProperties":false}}}},"responses":{"200":{"description":"JSON-RPC response; the tool result is in `result.content`."}}}},"/mcp/tools/create-invoice":{"post":{"tags":["Invoices"],"summary":"create-invoice","operationId":"mcp_create-invoice","description":"Create a new invoice for a client. To view a client's existing invoices, use list-invoices or get-invoice (or get-client's 'invoices' field).\n\n**Side effect:** yes (confirms via elicitation — proceeds without a prompt if the client can't elicit, so confirm with the user first) · **Source:** `POST /insyncmcp/add_invoice`\n\nInvoked over JSON-RPC at `POST /mcp` (not a REST endpoint):\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"tools/call\",\n  \"params\": {\n    \"name\": \"create-invoice\",\n    \"arguments\": { /* arguments below */ }\n  }\n}\n```","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"client_id":{"description":"The id of the client for whom the invoice is to be created. Use the id returned by get-client or list-clients.","type":"string"},"clientGuid":{"description":"Deprecated alias for `client_id` (the client to create the invoice for). Kept for backward compatibility — prefer `client_id`.","type":"string"},"amount":{"type":"number","description":"The invoice amount in euros (EUR)."},"description":{"type":"string","description":"Description of the invoice"}},"required":["amount","description"],"additionalProperties":false}}}},"responses":{"200":{"description":"JSON-RPC response; the tool result is in `result.content`."}}}},"/mcp/tools/list-documents":{"post":{"tags":["Documents"],"summary":"list-documents","operationId":"mcp_list-documents","description":"List documents (documenten) stored on a client, policy or claim — e.g. polisbladen, correspondence, ID copies or quotes. Optionally filter by client, policy and/or claim. Note: these are a client's OWN documents in the back office, not the generic insurance product conditions (use list-insurance-options for those). Returns each document's name, type and id.\n\n**Side effect:** no · **Source:** `GET /insyncmcp/documents`\n\nInvoked over JSON-RPC at `POST /mcp` (not a REST endpoint):\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"tools/call\",\n  \"params\": {\n    \"name\": \"list-documents\",\n    \"arguments\": { /* arguments below */ }\n  }\n}\n```","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"client_id":{"description":"Optional client id to only list documents for that specific client. Use the id returned by get-client or list-clients.","type":"string"},"clientGuid":{"description":"Deprecated alias for `client_id` (filter documents by client). Kept for backward compatibility — prefer `client_id`.","type":"string"},"policy_id":{"description":"Optional policy id to only list documents for that policy.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"policyGuid":{"description":"Deprecated alias for `policy_id` (filter documents by policy). Kept for backward compatibility — prefer `policy_id`.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"claim_id":{"description":"Optional claim id to only list documents for that claim.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"claimGuid":{"description":"Deprecated alias for `claim_id` (filter documents by claim). Kept for backward compatibility — prefer `claim_id`.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"additionalProperties":false}}}},"responses":{"200":{"description":"JSON-RPC response; the tool result is in `result.content`."}}}},"/mcp/tools/upload-document":{"post":{"tags":["Documents"],"summary":"upload-document","operationId":"mcp_upload-document","description":"> ⚠️ **Not yet connected to a back office.** This tool is fully implemented (schema, confirmation and request shape are final), but it is not yet usable against the back office (Novulo/ANVA) — the endpoint is not available yet. Calling it today will fail; it will start working once the back office exposes the endpoint, without any change to the tool.\n\nUpload (toevoegen) a document to a client, optionally linked to a specific policy or claim. The file content must be supplied base64-encoded. Always confirms before uploading.\n\n**Side effect:** yes (confirms via elicitation — proceeds without a prompt if the client can't elicit, so confirm with the user first) · **Source:** `POST /insyncmcp/add_document`\n\nInvoked over JSON-RPC at `POST /mcp` (not a REST endpoint):\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"tools/call\",\n  \"params\": {\n    \"name\": \"upload-document\",\n    \"arguments\": { /* arguments below */ }\n  }\n}\n```","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"client_id":{"description":"The id of the client the document belongs to. Use the id returned by get-client or list-clients.","type":"string"},"clientGuid":{"description":"Deprecated alias for `client_id` (the client the document belongs to). Kept for backward compatibility — prefer `client_id`.","type":"string"},"fileName":{"type":"string","description":"The file name including extension, e.g. 'polisblad.pdf'."},"contentBase64":{"type":"string","description":"The file content, base64-encoded (without a data-URL prefix)."},"mimeType":{"description":"Optional MIME type, e.g. 'application/pdf' or 'image/jpeg'.","type":"string"},"documentType":{"description":"Optional document type/category in Dutch, e.g. 'Polisblad', 'Correspondentie', 'Identiteitsbewijs'.","type":"string"},"description":{"description":"Optional short description of the document in Dutch.","type":"string"},"policy_id":{"description":"Optional policy id to link the document to a specific policy.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"policyGuid":{"description":"Deprecated alias for `policy_id` (link the document to a policy). Kept for backward compatibility — prefer `policy_id`.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"claim_id":{"description":"Optional claim id to link the document to a specific claim.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"claimGuid":{"description":"Deprecated alias for `claim_id` (link the document to a claim). Kept for backward compatibility — prefer `claim_id`.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["fileName","contentBase64"],"additionalProperties":false}}}},"responses":{"200":{"description":"JSON-RPC response; the tool result is in `result.content`."}}}},"/mcp/tools/list-notes":{"post":{"tags":["Notes"],"summary":"list-notes","operationId":"mcp_list-notes","description":"> ⚠️ **Not yet connected to a back office.** This tool is fully implemented (schema, confirmation and request shape are final), but it is not yet usable against the back office (Novulo/ANVA) — the endpoint is not available yet. Calling it today will fail; it will start working once the back office exposes the endpoint, without any change to the tool.\n\nList notes. Optionally filter by client. Use this to read back notes that were created.\n\n**Side effect:** no · **Source:** `GET /insyncmcp/notes`\n\nInvoked over JSON-RPC at `POST /mcp` (not a REST endpoint):\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"tools/call\",\n  \"params\": {\n    \"name\": \"list-notes\",\n    \"arguments\": { /* arguments below */ }\n  }\n}\n```","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"client_id":{"description":"Optional client id to only list notes for that specific client.","type":"string"},"clientGuid":{"description":"Deprecated alias for `client_id` (filter notes by client). Kept for backward compatibility — prefer `client_id`.","type":"string"}},"additionalProperties":false}}}},"responses":{"200":{"description":"JSON-RPC response; the tool result is in `result.content`."}}}},"/mcp/tools/create-note":{"post":{"tags":["Notes"],"summary":"create-note","operationId":"mcp_create-note","description":"Create a new note for a client.\n\n**Side effect:** yes (confirms via elicitation — proceeds without a prompt if the client can't elicit, so confirm with the user first) · **Source:** `POST /insyncmcp/add_note`\n\nInvoked over JSON-RPC at `POST /mcp` (not a REST endpoint):\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"tools/call\",\n  \"params\": {\n    \"name\": \"create-note\",\n    \"arguments\": { /* arguments below */ }\n  }\n}\n```","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"client_id":{"description":"The id of the client for whom the note is to be created. Use the id returned by get-client or list-clients.","type":"string"},"clientGuid":{"description":"Deprecated alias for `client_id` (the client to create the note for). Kept for backward compatibility — prefer `client_id`.","type":"string"},"subject":{"type":"string","maxLength":50,"description":"Short description of the note"},"content":{"type":"string","description":"The full content of the note"}},"required":["subject","content"],"additionalProperties":false}}}},"responses":{"200":{"description":"JSON-RPC response; the tool result is in `result.content`."}}}},"/mcp/tools/list-tasks":{"post":{"tags":["Tasks"],"summary":"list-tasks","operationId":"mcp_list-tasks","description":"> ⚠️ **Not yet connected to a back office.** This tool is fully implemented (schema, confirmation and request shape are final), but it is not yet usable against the back office (Novulo/ANVA) — the endpoint is not available yet. Calling it today will fail; it will start working once the back office exposes the endpoint, without any change to the tool.\n\nList tasks. Optionally filter by client and/or completion status. Use this to read back tasks that were created.\n\n**Side effect:** no · **Source:** `GET /insyncmcp/tasks`\n\nInvoked over JSON-RPC at `POST /mcp` (not a REST endpoint):\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"tools/call\",\n  \"params\": {\n    \"name\": \"list-tasks\",\n    \"arguments\": { /* arguments below */ }\n  }\n}\n```","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"client_id":{"description":"Optional client id to only list tasks for that specific client.","type":"string"},"clientGuid":{"description":"Deprecated alias for `client_id` (filter tasks by client). Kept for backward compatibility — prefer `client_id`.","type":"string"},"status":{"default":"open","description":"Which tasks to return. Defaults to \"open\".","type":"string","enum":["open","completed","all"]}},"required":["status"],"additionalProperties":false}}}},"responses":{"200":{"description":"JSON-RPC response; the tool result is in `result.content`."}}}},"/mcp/tools/create-task":{"post":{"tags":["Tasks"],"summary":"create-task","operationId":"mcp_create-task","description":"Create a new task for a client.\n\n**Side effect:** yes (confirms via elicitation — proceeds without a prompt if the client can't elicit, so confirm with the user first) · **Source:** `POST /insyncmcp/add_task`\n\nInvoked over JSON-RPC at `POST /mcp` (not a REST endpoint):\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"tools/call\",\n  \"params\": {\n    \"name\": \"create-task\",\n    \"arguments\": { /* arguments below */ }\n  }\n}\n```","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"client_id":{"description":"The id of the client for whom the task is to be created. Use the id returned by get-client or list-clients.","type":"string"},"clientGuid":{"description":"Deprecated alias for `client_id` (the client to create the task for). Kept for backward compatibility — prefer `client_id`.","type":"string"},"content":{"type":"string","description":"The full content of the task"}},"required":["content"],"additionalProperties":false}}}},"responses":{"200":{"description":"JSON-RPC response; the tool result is in `result.content`."}}}},"/mcp/tools/complete-task":{"post":{"tags":["Tasks"],"summary":"complete-task","operationId":"mcp_complete-task","description":"> ⚠️ **Not yet connected to a back office.** This tool is fully implemented (schema, confirmation and request shape are final), but it is not yet usable against the back office (Novulo/ANVA) — the endpoint is not available yet. Calling it today will fail; it will start working once the back office exposes the endpoint, without any change to the tool.\n\nMark a task as completed (afronden).\n\n**Side effect:** yes (confirms via elicitation — proceeds without a prompt if the client can't elicit, so confirm with the user first) · **Source:** `POST /insyncmcp/complete_task`\n\nInvoked over JSON-RPC at `POST /mcp` (not a REST endpoint):\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"tools/call\",\n  \"params\": {\n    \"name\": \"complete-task\",\n    \"arguments\": { /* arguments below */ }\n  }\n}\n```","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"task_id":{"description":"The id of the task to complete. Use the id from list-tasks.","type":"string"},"taskGuid":{"description":"Deprecated alias for `task_id` (the task to complete). Kept for backward compatibility — prefer `task_id`.","type":"string"}},"additionalProperties":false}}}},"responses":{"200":{"description":"JSON-RPC response; the tool result is in `result.content`."}}}},"/mcp/tools/update-task":{"post":{"tags":["Tasks"],"summary":"update-task","operationId":"mcp_update-task","description":"> ⚠️ **Not yet connected to a back office.** This tool is fully implemented (schema, confirmation and request shape are final), but it is not yet usable against the back office (Novulo/ANVA) — the endpoint is not available yet. Calling it today will fail; it will start working once the back office exposes the endpoint, without any change to the tool.\n\nUpdate the content of an existing task.\n\n**Side effect:** yes (confirms via elicitation — proceeds without a prompt if the client can't elicit, so confirm with the user first) · **Source:** `POST /insyncmcp/update_task`\n\nInvoked over JSON-RPC at `POST /mcp` (not a REST endpoint):\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"tools/call\",\n  \"params\": {\n    \"name\": \"update-task\",\n    \"arguments\": { /* arguments below */ }\n  }\n}\n```","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"task_id":{"description":"The id of the task to update. Use the id from list-tasks.","type":"string"},"taskGuid":{"description":"Deprecated alias for `task_id` (the task to update). Kept for backward compatibility — prefer `task_id`.","type":"string"},"content":{"type":"string","description":"The new content of the task."}},"required":["content"],"additionalProperties":false}}}},"responses":{"200":{"description":"JSON-RPC response; the tool result is in `result.content`."}}}},"/mcp/tools/add-address":{"post":{"tags":["Addresses"],"summary":"add-address","operationId":"mcp_add-address","description":"Add a new address to a client.\n\n**Side effect:** yes (confirms via elicitation — proceeds without a prompt if the client can't elicit, so confirm with the user first) · **Source:** `POST /insyncmcp/add_address`\n\nInvoked over JSON-RPC at `POST /mcp` (not a REST endpoint):\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"tools/call\",\n  \"params\": {\n    \"name\": \"add-address\",\n    \"arguments\": { /* arguments below */ }\n  }\n}\n```","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"client_id":{"description":"The id of the client for whom the address is to be added. Use the id returned by get-client or list-clients.","type":"string"},"clientGuid":{"description":"Deprecated alias for `client_id` (the client to add the address to). Kept for backward compatibility — prefer `client_id`.","type":"string"},"clientName":{"type":"string","description":"The name of the client for whom the address is to be added."},"city":{"type":"string","maxLength":50,"description":"City of the address"},"street":{"type":"string","maxLength":50,"description":"Street of the address"},"number":{"type":"string","maxLength":10,"description":"House number of the address"},"numberSuffix":{"description":"House number suffix of the address","type":"string","maxLength":10},"postalCode":{"type":"string","maxLength":10,"description":"Postal code of the address"}},"required":["clientName","city","street","number","postalCode"],"additionalProperties":false}}}},"responses":{"200":{"description":"JSON-RPC response; the tool result is in `result.content`."}}}},"/mcp/tools/lookup-address":{"post":{"tags":["Addresses"],"summary":"lookup-address","operationId":"mcp_lookup-address","description":"Look up a Dutch address by postal code and house number\n\n**Side effect:** no · **Source:** External — postcode.tech (`POSTCODE_API_KEY`)\n\nInvoked over JSON-RPC at `POST /mcp` (not a REST endpoint):\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"tools/call\",\n  \"params\": {\n    \"name\": \"lookup-address\",\n    \"arguments\": { /* arguments below */ }\n  }\n}\n```","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"postalCode":{"type":"string","pattern":"^[1-9][0-9]{3}\\s?[A-Z]{2}$","description":"Dutch postal code (e.g., 1111XX)"},"houseNumber":{"type":"number","description":"House number"}},"required":["postalCode","houseNumber"],"additionalProperties":false}}}},"responses":{"200":{"description":"JSON-RPC response; the tool result is in `result.content`."}}}},"/mcp/tools/lookup-vehicle":{"post":{"tags":["External lookups"],"summary":"lookup-vehicle","operationId":"mcp_lookup-vehicle","description":"Lookup vehicle information by Dutch license plate\n\n**Side effect:** no · **Source:** External — RDW open data (no key)\n\nInvoked over JSON-RPC at `POST /mcp` (not a REST endpoint):\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"tools/call\",\n  \"params\": {\n    \"name\": \"lookup-vehicle\",\n    \"arguments\": { /* arguments below */ }\n  }\n}\n```","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"licensePlate":{"type":"string","maxLength":6,"description":"Dutch license plate number (e.g., \"AB123C\")"}},"required":["licensePlate"],"additionalProperties":false}}}},"responses":{"200":{"description":"JSON-RPC response; the tool result is in `result.content`."}}}},"/mcp/tools/lookup-kvk":{"post":{"tags":["External lookups"],"summary":"lookup-kvk","operationId":"mcp_lookup-kvk","description":"> ⚠️ **Not yet connected to a back office.** This tool is fully implemented (schema, confirmation and request shape are final), but it is not yet usable against the back office (Novulo/ANVA) — the endpoint is not available yet. Calling it today will fail; it will start working once the back office exposes the endpoint, without any change to the tool.\n\nLook up Dutch company information via the KVK (Kamer van Koophandel) integration. Provide either a KVK number or a (partial) company name. Searching by name may return multiple matches.\n\n**Side effect:** no · **Source:** `GET /insyncmcp/kvk`\n\nInvoked over JSON-RPC at `POST /mcp` (not a REST endpoint):\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"tools/call\",\n  \"params\": {\n    \"name\": \"lookup-kvk\",\n    \"arguments\": { /* arguments below */ }\n  }\n}\n```","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"kvkNumber":{"description":"The 8-digit KVK number to look up. Takes precedence over name.","type":"string","pattern":"^\\d{8}$"},"name":{"description":"A (partial) company name to search for. Ignored if kvkNumber is provided.","type":"string"}},"additionalProperties":false}}}},"responses":{"200":{"description":"JSON-RPC response; the tool result is in `result.content`."}}}},"/mcp/tools/send-email":{"post":{"tags":["E-mail"],"summary":"send-email","operationId":"mcp_send-email","description":"Send an email with the provided sender details, recipient details, subject and content\n\n**Side effect:** yes (confirms via elicitation — proceeds without a prompt if the client can't elicit, so confirm with the user first) · **Source:** External — Resend (`RESEND_API_KEY`) + Supabase branding\n\nInvoked over JSON-RPC at `POST /mcp` (not a REST endpoint):\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"tools/call\",\n  \"params\": {\n    \"name\": \"send-email\",\n    \"arguments\": { /* arguments below */ }\n  }\n}\n```","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"recipient":{"type":"object","properties":{"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$","description":"The email address of the recipient."},"name":{"description":"The name of the recipient.","type":"string"}},"required":["email"],"additionalProperties":false,"description":"The recipient information. Can be fetched using the get-client tool when sending to a client."},"subject":{"type":"string","description":"The subject line of the email."},"content":{"type":"string","description":"The main body content of the email. Only use plain text without links or other elements and exclude an greeting or closing."},"cc":{"description":"Optional list of CC email addresses.","type":"array","items":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"}},"bcc":{"description":"Optional list of BCC email addresses.","type":"array","items":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"}},"replyTo":{"description":"Optional reply-to email address.","type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"}},"required":["recipient","subject","content"],"additionalProperties":false}}}},"responses":{"200":{"description":"JSON-RPC response; the tool result is in `result.content`."}}}},"/mcp/tools/list-insurance-options":{"post":{"tags":["Insurance documents"],"summary":"list-insurance-options","operationId":"mcp_list-insurance-options","description":"Lists all available GENERIC insurance products, companies and condition documents (voorwaarden) — NOT the policies of a specific client (use get-client for a client's own policies). Use this tool FIRST to understand what insurance documents are available before fetching specific conditions with get-conditions. Returns companies with their labels, products with availability info, and all files with their metadata (id, company, product, type, coverage).\n\n**Side effect:** no · **Source:** Supabase — `insurance_companies` / `insurance_products` / `insurance_files`\n\nInvoked over JSON-RPC at `POST /mcp` (not a REST endpoint):\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"tools/call\",\n  \"params\": {\n    \"name\": \"list-insurance-options\",\n    \"arguments\": {}\n  }\n}\n```","responses":{"200":{"description":"JSON-RPC response; the tool result is in `result.content`."}}}},"/mcp/tools/get-conditions":{"post":{"tags":["Insurance documents"],"summary":"get-conditions","operationId":"mcp_get-conditions","description":"Fetches and parses GENERIC insurance condition documents (voorwaarden) by their IDs — NOT documents belonging to a specific client (use get-client for those). Use 'list-insurance-options' first to discover available files and their IDs. This tool downloads the PDFs and extracts the text content for analysis.\n\n**Side effect:** no · **Source:** Supabase (`insurance_files`) + PDF parse (`unpdf`)\n\nInvoked over JSON-RPC at `POST /mcp` (not a REST endpoint):\n\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"tools/call\",\n  \"params\": {\n    \"name\": \"get-conditions\",\n    \"arguments\": { /* arguments below */ }\n  }\n}\n```","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"fileIds":{"minItems":1,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"description":"Array of file IDs (UUIDs) to fetch. Get these IDs from 'list-insurance-options'."}},"required":["fileIds"],"additionalProperties":false}}}},"responses":{"200":{"description":"JSON-RPC response; the tool result is in `result.content`."}}}},"/insyncmcp/customers":{"get":{"tags":["Backend contract (Novulo)"],"summary":"List all relations (relaties)","operationId":"backend_GET__insyncmcp_customers","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Client"}}}}}}}},"/insyncmcp/customer":{"get":{"tags":["Backend contract (Novulo)"],"summary":"Get one relation with its full dossier","operationId":"backend_GET__insyncmcp_customer","parameters":[{"name":"guid","in":"query","required":false,"schema":{"type":"string"},"description":"Relation guid"},{"name":"name","in":"query","required":false,"schema":{"type":"string"},"description":"Relation name (alternative to guid)"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Client"}}}}}}},"/insyncmcp/search_customers":{"get":{"tags":["Backend contract (Novulo)"],"summary":"⚠️ Search relations by name, policy number, kenteken or email","operationId":"backend_GET__insyncmcp_search_customers","description":"> ⚠️ **Proposed — this endpoint does not exist in the back office yet.** It is documented here as the target contract for the back-end team.\n\n","parameters":[{"name":"query","in":"query","required":true,"schema":{"type":"string"},"description":"Search term"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Client"}}}}}}}},"/insyncmcp/insurances":{"get":{"tags":["Backend contract (Novulo)"],"summary":"List policies, grouped by relation (Connection layer)","operationId":"backend_GET__insyncmcp_insurances","parameters":[{"name":"contact","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by relation guid"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/InsurancesConnection"}}}}}}}},"/insyncmcp/insurance":{"get":{"tags":["Backend contract (Novulo)"],"summary":"⚠️ Get one policy","operationId":"backend_GET__insyncmcp_insurance","description":"> ⚠️ **Proposed — this endpoint does not exist in the back office yet.** It is documented here as the target contract for the back-end team.\n\n","parameters":[{"name":"guid","in":"query","required":true,"schema":{"type":"string"},"description":"Policy guid"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Insurance"}}}}}}},"/insyncmcp/documents":{"get":{"tags":["Backend contract (Novulo)"],"summary":"List documents AND invoices, grouped by relation (told apart by `is_invoice`)","operationId":"backend_GET__insyncmcp_documents","parameters":[{"name":"contact","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by relation guid"},{"name":"policy","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by policy guid"},{"name":"claim","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by claim guid"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DocumentsConnection"}}}}}}}},"/insyncmcp/claims":{"get":{"tags":["Backend contract (Novulo)"],"summary":"List claims, grouped by relation (Connection layer)","operationId":"backend_GET__insyncmcp_claims","parameters":[{"name":"contact","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by relation guid"},{"name":"policy","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by policy guid"},{"name":"status","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by status (Nieuw / Lopend / Gesloten)"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ClaimsConnection"}}}}}}}},"/insyncmcp/claim":{"get":{"tags":["Backend contract (Novulo)"],"summary":"⚠️ Get one claim","operationId":"backend_GET__insyncmcp_claim","description":"> ⚠️ **Proposed — this endpoint does not exist in the back office yet.** It is documented here as the target contract for the back-end team.\n\n","parameters":[{"name":"guid","in":"query","required":true,"schema":{"type":"string"},"description":"Claim guid"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Claim"}}}}}}},"/insyncmcp/add_contact":{"post":{"tags":["Backend contract (Novulo)"],"summary":"Create a relation","operationId":"backend_POST__insyncmcp_add_contact","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"firstname":{"type":"string"},"prefix":{"type":"string"},"surname":{"type":"string"},"organization_name":{"type":"string"},"e_mail":{"type":"string"}},"required":["type","e_mail"]}}}},"responses":{"200":{"description":"Success"}}}},"/insyncmcp/update_contact":{"post":{"tags":["Backend contract (Novulo)"],"summary":"⚠️ Update a relation","operationId":"backend_POST__insyncmcp_update_contact","description":"> ⚠️ **Proposed — this endpoint does not exist in the back office yet.** It is documented here as the target contract for the back-end team.\n\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"contact":{"type":"string"},"firstname":{"type":"string"},"prefix":{"type":"string"},"surname":{"type":"string"},"organization_name":{"type":"string"},"e_mail":{"type":"string"},"phone":{"type":"string"},"website":{"type":"string"}},"required":["contact"]}}}},"responses":{"200":{"description":"Success"}}}},"/insyncmcp/add_insurance":{"post":{"tags":["Backend contract (Novulo)"],"summary":"⚠️ Create (sluiten) a policy","operationId":"backend_POST__insyncmcp_add_insurance","description":"> ⚠️ **Proposed — this endpoint does not exist in the back office yet.** It is documented here as the target contract for the back-end team.\n\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"contact":{"type":"string"},"product":{"type":"string"},"company":{"type":"string"},"coverage":{"type":"string"},"premium":{"type":"number"},"object":{"type":"string"},"start_date":{"type":"string"},"end_date":{"type":"string"},"policy_number":{"type":"string"}},"required":["contact","product","start_date"]}}}},"responses":{"200":{"description":"Success"}}}},"/insyncmcp/update_insurance":{"post":{"tags":["Backend contract (Novulo)"],"summary":"⚠️ Update (muteren) a policy","operationId":"backend_POST__insyncmcp_update_insurance","description":"> ⚠️ **Proposed — this endpoint does not exist in the back office yet.** It is documented here as the target contract for the back-end team.\n\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"insurance":{"type":"string"},"product":{"type":"string"},"company":{"type":"string"},"coverage":{"type":"string"},"premium":{"type":"number"},"object":{"type":"string"},"start_date":{"type":"string"},"end_date":{"type":"string"}},"required":["insurance"]}}}},"responses":{"200":{"description":"Success"}}}},"/insyncmcp/cancel_insurance":{"post":{"tags":["Backend contract (Novulo)"],"summary":"⚠️ Cancel (royeren) a policy","operationId":"backend_POST__insyncmcp_cancel_insurance","description":"> ⚠️ **Proposed — this endpoint does not exist in the back office yet.** It is documented here as the target contract for the back-end team.\n\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"insurance":{"type":"string"},"cancellation_date":{"type":"string"},"reason":{"type":"string"}},"required":["insurance","cancellation_date","reason"]}}}},"responses":{"200":{"description":"Success"}}}},"/insyncmcp/suspend_insurance":{"post":{"tags":["Backend contract (Novulo)"],"summary":"⚠️ Suspend (schorsen) a policy","operationId":"backend_POST__insyncmcp_suspend_insurance","description":"> ⚠️ **Proposed — this endpoint does not exist in the back office yet.** It is documented here as the target contract for the back-end team.\n\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"insurance":{"type":"string"},"suspension_date":{"type":"string"},"reason":{"type":"string"}},"required":["insurance","suspension_date"]}}}},"responses":{"200":{"description":"Success"}}}},"/insyncmcp/reactivate_insurance":{"post":{"tags":["Backend contract (Novulo)"],"summary":"⚠️ Reactivate (schorsing opheffen) a policy","operationId":"backend_POST__insyncmcp_reactivate_insurance","description":"> ⚠️ **Proposed — this endpoint does not exist in the back office yet.** It is documented here as the target contract for the back-end team.\n\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"insurance":{"type":"string"},"reactivation_date":{"type":"string"}},"required":["insurance","reactivation_date"]}}}},"responses":{"200":{"description":"Success"}}}},"/insyncportal/addclaim":{"post":{"tags":["Backend contract (Novulo)"],"summary":"Create a claim","operationId":"backend_POST__insyncportal_addclaim","description":"The tool currently sends placeholder magic GUIDs (`claim_cause`, `claim_type`, `claimed_by`, a fixed `answers` guid) — the real body contract still needs to be confirmed.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"claim_date":{"type":"string"},"claim_subject":{"type":"string"},"claimed_by":{"type":"string"},"claim_cause":{"type":"string"},"policy_guid":{"type":"string"},"claim_type":{"type":"string"},"answers":{"type":"array"}},"required":["claim_date","claim_subject","policy_guid"]}}}},"responses":{"200":{"description":"Success"}}}},"/insyncportal/updateclaim":{"post":{"tags":["Backend contract (Novulo)"],"summary":"⚠️ Update a claim","operationId":"backend_POST__insyncportal_updateclaim","description":"> ⚠️ **Proposed — this endpoint does not exist in the back office yet.** It is documented here as the target contract for the back-end team.\n\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"claim_guid":{"type":"string"},"claim_date":{"type":"string"},"claim_subject":{"type":"string"},"claim_description":{"type":"string"},"status":{"type":"string"}},"required":["claim_guid"]}}}},"responses":{"200":{"description":"Success"}}}},"/insyncportal/addclaimdocument":{"post":{"tags":["Backend contract (Novulo)"],"summary":"⚠️ Attach a document to a claim","operationId":"backend_POST__insyncportal_addclaimdocument","description":"> ⚠️ **Proposed — this endpoint does not exist in the back office yet.** It is documented here as the target contract for the back-end team.\n\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"claim_guid":{"type":"string"},"file_name":{"type":"string"},"content_base64":{"type":"string"},"mime_type":{"type":"string"},"description":{"type":"string"}},"required":["claim_guid","file_name","content_base64"]}}}},"responses":{"200":{"description":"Success"}}}},"/insyncmcp/add_invoice":{"post":{"tags":["Backend contract (Novulo)"],"summary":"Create an invoice","operationId":"backend_POST__insyncmcp_add_invoice","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"contact":{"type":"string"},"amount":{"type":"number"},"description":{"type":"string"}},"required":["contact","amount","description"]}}}},"responses":{"200":{"description":"Success"}}}},"/insyncmcp/add_document":{"post":{"tags":["Backend contract (Novulo)"],"summary":"⚠️ Upload a document","operationId":"backend_POST__insyncmcp_add_document","description":"> ⚠️ **Proposed — this endpoint does not exist in the back office yet.** It is documented here as the target contract for the back-end team.\n\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"contact":{"type":"string"},"file_name":{"type":"string"},"content_base64":{"type":"string"},"mime_type":{"type":"string"},"document_type":{"type":"string"},"description":{"type":"string"},"policy":{"type":"string"},"claim":{"type":"string"}},"required":["contact","file_name","content_base64"]}}}},"responses":{"200":{"description":"Success"}}}},"/insyncmcp/add_note":{"post":{"tags":["Backend contract (Novulo)"],"summary":"Create a note","operationId":"backend_POST__insyncmcp_add_note","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"contact":{"type":"string"},"note":{"type":"string"},"description":{"type":"string"}},"required":["contact","note"]}}}},"responses":{"200":{"description":"Success"}}}},"/insyncmcp/add_task":{"post":{"tags":["Backend contract (Novulo)"],"summary":"Create a task","operationId":"backend_POST__insyncmcp_add_task","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"contact":{"type":"string"},"description":{"type":"string"}},"required":["contact","description"]}}}},"responses":{"200":{"description":"Success"}}}},"/insyncmcp/complete_task":{"post":{"tags":["Backend contract (Novulo)"],"summary":"⚠️ Complete a task","operationId":"backend_POST__insyncmcp_complete_task","description":"> ⚠️ **Proposed — this endpoint does not exist in the back office yet.** It is documented here as the target contract for the back-end team.\n\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"task":{"type":"string"}},"required":["task"]}}}},"responses":{"200":{"description":"Success"}}}},"/insyncmcp/update_task":{"post":{"tags":["Backend contract (Novulo)"],"summary":"⚠️ Update a task","operationId":"backend_POST__insyncmcp_update_task","description":"> ⚠️ **Proposed — this endpoint does not exist in the back office yet.** It is documented here as the target contract for the back-end team.\n\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"task":{"type":"string"},"description":{"type":"string"}},"required":["task"]}}}},"responses":{"200":{"description":"Success"}}}},"/insyncmcp/add_address":{"post":{"tags":["Backend contract (Novulo)"],"summary":"Couple an address to a relation","operationId":"backend_POST__insyncmcp_add_address","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"contact":{"type":"string"},"city":{"type":"string"},"street":{"type":"string"},"number":{"type":"number"},"numberappendix":{"type":"string"},"postalcode":{"type":"string"}},"required":["contact","postalcode","number"]}}}},"responses":{"200":{"description":"Success"}}}}}}