An insurance market agents can actually read.
OpenInsurance turns the public documents of the Belgian insurance market into an open, source-cited knowledge base, served to any AI agent over MCP. This page explains the architecture: what MCP is, why not a RAG chatbot, and why it matters now.
Insurance products live in PDFs nobody can query.
What a Belgian insurance product really covers is written in its general conditions: dense PDFs scattered across the websites of more than fifty insurers, each with its own structure, editions and vocabulary. There is no neutral, machine-readable map of what actually exists on the market.
OpenInsurance builds that map, in the open: every product page is extracted from the official PDF and cites it, page by page. The whole pipeline is committed, so anyone can reproduce the extraction with their own model. The question then becomes: how do you serve this to an AI agent without losing that rigour?
MCP is the standard socket between an agent and its data.
The Model Context Protocol (MCP) is an open standard that lets any AI assistant call tools exposed by a server: Claude, a broker's chatbot, a monitoring agent or a Python script all plug into the same socket, with three lines of config instead of a custom integration each.
The OpenInsurance server is keyless, read-only and runs on your machine: the dataset is the git repo itself. Ten deterministic tools (search, get_product, compare_products, find_overlap, verify_claim...) answer in 0.01 to 3 ms, and every product response carries its source URL and page numbers. No account, no hosting, no LLM inside.
Ask the model, search an index, or read the document?
Same insurance question, three architectures. A plain LLM answers from memory. RAG retrieves fuzzy chunks from a vector index. OpenInsurance serves the reviewed document itself, cited. Only the last one can show you its source.
Plain LLM, from memory
ungroundedYou ask. The model pattern-matches against whatever insurance text sat in its training data.
It reconstructs plausible exclusions, franchises and limits: fluent, specific-sounding, undated.
One pass, no document opened, nothing checked against a real set of general conditions.
Ask again next month, or on the next model version, and the answer quietly drifts.
RAG chatbot
black boxPDFs chopped into chunks, embedded into vectors
a vector index: opaque, not diffable
approximate retrieval at question time
one interface: the chatbot
Agent + OpenInsurance
groundedThe agent queries the MCP: deterministic matching over 162 reviewed, committed products.
It gets the real clause back, verbatim, with the CG edition, the page and the source URL.
It drafts, then can call verify_claim to fact-check its own draft against the PDF.
Same question, same cited documents, every run. Diffable like code.
The model was never the scarce thing. A cited data layer you can diff and trust is.
Four stages, one explicit trust boundary.
The first three stages are frozen in git: reproducible, reviewable, auditable. Hallucination can only happen at the fourth, and that is the part the server's responses are built to discipline.
Public sources
sources/be/*.ymlCommitted YAML says where each insurer's official PDFs live. Nothing hidden: the inputs are part of the repo.
Frozen extraction
data/be/extracted/*.jsonEach PDF is turned once into structured JSON and cited Markdown, by a prompt that is itself committed. Nothing is generated at query time, and a grounding pass checks every quote verbatim against the PDF.
Deterministic MCP server
mcp/Ten read-only tools over those files: search, comparison, duplicate-cover detection, verbatim evidence. No LLM inside, no network, no state. Same input, same output.
The reasoning client
Claude · chatbot · scriptYour agent does the semantic work, quoting what the tools returned. Every response front-loads the real citation (document, edition, reference, source URL) so the model copies instead of reconstructing.
On one side of the line, everything is git: diffable, reviewable, reproducible. On the other, one job remains: keeping the model quoting the document. That is what the grounding contract, the citation line and verify_claim are for.
Soon, an agent will be doing the research.
When a client asks 'am I covered for this?', the answer increasingly comes from an assistant that reads the documents, not from someone scrolling a PDF. Brokers, bancassurers and insurers are wiring assistants to their product data, and the EU pushes the same direction with standardized product documents (IPID) and the open insurance agenda (EIOPA, FIDA).
In that world, the scarce thing is not the model. It is a data layer an agent can trust: public, machine-readable, citable down to the official document, and the same for everyone.
That is exactly what OpenInsurance is: the open, source-cited documents layer of that stack. Live today for the Belgian market, and built as a recipe any country can reproduce.
Plug your agent in, in two minutes.
> Which covers am I paying for twice if I combine a home policy and a family policy?
find_overlap("be", ["Police habitation pour le locataire", "La Police familiale"])
→ Civil liability · present in both contracts
→ Legal protection · present in both contracts
→ each candidate cited to its source PDF
The dataset ships in the repo, already built: clone it, register the server, ask. The session opposite is real and replayable at home, keyless.
Two lines and any MCP client is connected. Keyless, read-only, runs on your machine:
git clone https://github.com/sluyasu/OpenInsurance.git claude mcp add insurance-wiki --env INSURANCE_WIKI_REPO=$PWD/OpenInsurance -- uvx openinsurance-wiki-mcp
Information only, never advice.