Every company has a Gary.
Ours never leaves.
The one person who knows why the refund window is 14 days, who to ask about the ledger, and which docs quietly went stale. Gary reads your Slack, Jira, Notion, meetings and GitHub into one FalkorDB graph and answers by walking it, with every source shown.
Can a customer get a full refund after 20 days?
Your docs are lying. Your chatbot believes them.
A Notion page from March says 30 days. A Slack reply from August changed it to 14. Search finds the page with the right words; it has no idea one replaced the other. Most teams have watched an AI tool confidently quote an outdated doc.
Yes. Monthly plans have a 30-day full-refund window, so day 20 qualifies.
Superseded on Aug 12. Support would refund the wrong customers, and nobody would know why.
No: 14 days since Aug 12, decided by Maya because of BILL-212. 3 docs still say 30 days. Fix them?
Five sources. One graph. One Gary.
Gary doesn't search your documents. It reads them once, turns them into a graph of who decided what, why, and what replaced it, and then answers by walking that graph.
Every record becomes a node. Authors, reviewers, assignees and attendees become edges. Threads stay threads.
People, systems, projects and topics are matched using a vocabulary read from the graph itself, so the graph teaches the parser.
An LLM extracts decisions while seeing what the graph already believes, writing SUPERSEDES, BECAUSE_OF and ASSERTS edges.
The agent picks from 12 fixed Cypher tools, never writes Cypher, and every citation and name is verified against the graph.
A colleague who remembers why.
Every capability below is a graph traversal, not a prompt. Try any of them live.
{
"mcpServers": {
"gary": {
"command": "pnpm",
"args": ["-s", "mcp"],
"env": {
"FALKORDB_URL": "falkor://…"
}
}
}
}The same 12 graph tools as an MCP server, for Claude Desktop, Claude Code, or any agent.
live from the Kitestring graph on FalkorDB Cloud
Watch Gary work.
Recorded by driving the real, deployed app: stale answers, decision lineage, a live policy change, memory going stale, the time machine, and an honest “I don't know”.
The graph does the thinking.
The model never writes Cypher. It picks from fixed, parameterised tools like these, and every query it runs is shown with rows and milliseconds.
MATCH (cur:Decision {status:'active'})-[:ABOUT]->(s)
OPTIONAL MATCH chain = (cur)-[:SUPERSEDES*1..6]->(:Decision)
RETURN cur, [n IN nodes(chain) | n.statement]MATCH (cur)-[:SUPERSEDES*1..6]->(old:Decision)
MATCH (doc:Doc {living:true})-[:ASSERTS]->(old)
WHERE NOT (doc)-[:ASSERTS]->(cur)
RETURN doc.title, old.statementCALL algo.betweenness({
nodeLabels: ['Person'],
relationshipTypes: ['COLLABORATES']
}) YIELD node, scoreCALL algo.SPpaths({sourceNode: a, targetNode: b,
relTypes: $rels, relDirection: 'both',
maxLen: 8, pathCount: 1}) YIELD pathAsk Gary anything
about Kitestring.
Kitestring is a fictional 21-person startup. Every record is synthetic.