Why did the system decide that?
Every belief carries its lineage. Ask any decision “how did you get here?” and the chain of derivations, evidence, and prior beliefs comes back with hashes attached.
InvariantDB records every decision, everything the system knew at the time, and the complete chain of evidence — so months later you can explain each one with confidence, instead of guessing.
“What did our system know at that time?” Drag the sliders. Watch the same query return different answers at different points in time — the audit chain doesn't move.
This is what “what did the system know?” looks like as a query. belief-99 was revised on 2026-06-01. Ask what it knew before the revision → HIGH_RISK 0.70. Ask what it knew after → LOW_RISK 0.95. Both are true. Both are provable.
The advantage: every decision your AI makes comes with its own proof. Every fact it saw at the time, every step in the chain of evidence — queryable in one Cypher call. Months later, during an incident, or under audit.
Every belief carries its lineage. Ask any decision “how did you get here?” and the chain of derivations, evidence, and prior beliefs comes back with hashes attached.
Two clocks on every value — valid time (when it was true) and recorded time (when you learned it). AT VALID and AT RECORDED are Cypher keywords, not conventions.
Prove it without leaking the subject. Per-subject encryption keys mean GDPR Article 17 erasure = destroy the key: the ciphertext becomes noise, but the audit chain survives to verify every prior decision.
InvariantDB ships a Model Context Protocol server with 14 tools: Cypher query, fulltext + vector search, agent-memory primitives (record episodes, revise beliefs, replay), per-property provenance, audit replay. Wire it once; every Claude, Cursor, or Continue session sees the graph.
https://invariantdb.com/mcp
JSON-RPC 2.0 over HTTPS. Auth via Authorization: Bearer gq_.... Stdio mode also supported (npx gq-mcp).
// claude_desktop_config.json { "mcpServers": { "invariantdb": { "command": "npx", "args": [ "-y", "gq-mcp", "--remote", "https://invariantdb.com/mcp" ], "env": { "GQ_API_KEY": "gq_..." } } } }
Defense-in-depth: the MCP server refuses mutations by default (a misbehaving agent can read, search, and audit; never CREATE / DELETE / SET unless you flip the explicit allow-mutate flag). Every tool call lands in the audit chain.
Every record, every approver, every counterparty — connected. And every edge is stamped with when we knew it. The three amber nodes? Those were filed after the policy lapse, backdated to before. Click-and-drag a node. This is live Cytoscape, the same renderer you get in the InvariantDB console.
Every primitive maps to a specific control. Auditors see the receipts. Regulators see the chain. Your customers see the confidence.
Each demo is a full interactive investigation — dollar-for-dollar, hop-for-hop. Open one and replay a real case through time.
"Compliance-friendly" usually means "slow." Not here. 536,000 nodes. 810,000 edges. A $30/month ARM instance. Here's what a single query costs.
Every prompt, tool call, and belief revision lands as a first-class node with two clocks. When an agent misfires in prod, you replay the exact context it saw — not a summarized log — and prove whether the model reasoned correctly on stale data or drifted on its own.
Cypher reference · procedures index →// A tool call misfired at 09:15 — replay the exact state. CALL db.recordEpisode("conv-42", "tool_call", "ran cypher_query against Account graph", '{"args":{"q":"MATCH (a:Account {id:99})-[:TRANSACTED]->(t) RETURN t LIMIT 50"}}') YIELD eventId, ts RETURN eventId, ts; // Replay what the agent saw as of yesterday morning. MATCH (s:Session {id: "conv-42"}) AT RECORDED '2026-07-05T09:15:00Z' CALL db.replayEpisodes("conv-42", 100) YIELD eventId, kind, ts, text RETURN kind, text, ts ORDER BY ts; // Vector-seeded graph expansion — find similar prior sessions and // walk the 2-hop neighborhood. No round-trip to Pinecone. CALL gds.semanticMatchExpand("Document", "embedding", [0.12, 0.44, 0.71, /* … 1536-dim … */], 2, 5) YIELD nodeId, hops, score RETURN nodeId, hops, score ORDER BY hops, score DESC LIMIT 50;