Grounded runs as an MCP server. Claude, Claude Code, a Slack bot, or anything that speaks the Model Context Protocol can ask it a question and get back the same answer a person gets in the browser: the text, the citations, each citation’s verification status, and a link to the audited thread. Whatever figure the agent relays, the proof travels with it.
Three things to know before the config:
- The key is a login. Each API key maps to one Grounded user, and every call runs as that user, inside that user’s organisation. An agent sees what that person would see and nothing from any other organisation.
- The answer is the real answer. ask_grounded drives the normal chat pipeline: retrieval, citation registration, the numeral guard, persistence. The thread it creates sits in the Grounded UI afterwards, so anyone can check the agent’s work.
- It is switched on per instance. Your Grounded administrator enables the server and issues keys. Until they do, there is no server to call.
The three tools
ask_grounded(question, deep_mode=false, thread_id="")
Ask the knowledge base a question. Returns the answer with inline [S1] [S2] markers, a citations list (source document, page or sheet and cell range, the exact quote, the verification status), the thread id, and the thread URL. Pass the thread id back to ask a follow-up in the same conversation. deep_mode is for multi-document synthesis and is slower.
search_corpus(query, top_k=8)
Retrieval only. Hybrid vector and keyword search over the corpus, returning the top passages with their source document and score. Use it to locate evidence, and ask_grounded when you want Grounded’s own cited answer. Notes in the notebook come back marked as notes.
list_documents(limit=50)
What is in the estate this key can see: filename, type, status, chunk count, ingestion date.
What comes back
The real exchange, run through an MCP client against the demo estate on 12 October 2026, trimmed to two citations:
{
"answer": "May 2026 total revenue was **£21.063m** versus a budget of **£20.753m**, so it was **£0.310m favourable to budget**. The Monthly Report is stated in **£’000**, and the “Total revenue” row shows MTD Actual **21,063**, MTD Budget **20,753**, and MTD Var **310** [S8][S9].",
"citations": [
{
"ref": "S8",
"source": "Monthly Report - May-26.pdf",
"page": 1,
"quote": "## Caldergate Distribution Group Ltd\n\nMonthly Report - May-26\n\n(£'000 unless stated)\n\n## Consolidated P&L\n\n| Line | MTD Actual | MTD Budget | MTD Var | YTD Actual | YTD Budget | YTD Var |\n|--------------------------------------|--------------|--------------|-----------|--------------|--------------|-----------|\n| Facilities & Safety Supplies",
"status": "not_verified",
"document_id": "2601d871-dd9b-4e36-a89d-b0361fed1da2"
},
{
"ref": "S9",
"source": "Monthly Report - May-26.pdf",
"page": 1,
"quote": "| 8,343 | 8,216 | 127 | 45,069 | 44,884 | 185 |\n| Industrial Consumables & Packaging | 8,464 | 8,361 | 103 | 43,974 | 44,207 | (233) |\n| Office & Print Solutions | 4,256 | 4,176 | 80 | 22,388 | 22,513 | (125) |\n| Total revenue | 21,063 | 20,753 | 310 | 111,431 | 111,604 | (173) |",
"status": "not_verified",
"document_id": "2601d871-dd9b-4e36-a89d-b0361fed1da2"
}
],
"thread_id": "2abc085c-e192-4f60-ba70-d938c5d21159",
"thread_url": "http://localhost:5173/chat/2abc085c-e192-4f60-ba70-d938c5d21159"
}
The status field is the citation check, which runs on demand on the thread; the browser’s “N figures verified” chip is the numeral guard, a separate check. the same four citations the browser shows, returned as data. A relaying agent
keeps the [S#] markers and appends a numbered Sources list.
Set it up
Endpoint: https://<your-grounded-host>/mcp
Auth: X-API-Key: <key> (Authorization: Bearer <key> also works)
Claude Code:
claude mcp add --transport http grounded https://<your-grounded-host>/mcp --header "X-API-Key: <key>"
Claude Desktop / claude.ai: add a custom connector with the endpoint URL and the key as a bearer token. (Confirm the exact dialog wording at build time.)
Slack: the @grounded bot is this server with a Slack front. Ask it in a channel and the answer arrives with its Sources list and a link to the thread.
Your own scripts: any MCP client library. The server is stateless streamable HTTP, so you have nothing to keep alive between calls.
Three prompts to try
- “Does the cash in the May pack tie to the bank?” (ask_grounded)
- “Find every document that mentions the Ridgway Freight accrual.” (search_corpus)
- “What is in this estate, and when was the May pack ingested?” (list_documents)
What it is not
Not a connector into your ledger. Grounded reads documents. If you want live figures from Xero, NetSuite or Anaplan with lineage, that is on my backlog, and when it lands it will follow the same rule as everything else here: a figure arrives with its source or it does not arrive. Grounded also works the other way round and consumes other MCP servers (the connections strip in the app), with a confirm-before-ingest step, so a connected folder can feed the estate.
Related
Use case: Ask it from Slack or Claude · Technical: API · Security and data.
Posts: What is an API, actually? · An AI agent is a loop. Here is the loop. Engineering record: the MCP server commit, dated.