Sandra
A self-hosted memory for AI agents: a graph your assistants read from and write to, so what they learn in one session is still there in the next — on another machine, or for someone else on your team.
Four ideas, and the rest follows
- A concept is a word
- “likes”, “is_a”, “alice”. Concepts are the shared vocabulary, and they are meant to be reused — one concept named “likes” can carry thousands of facts.
- A triplet is a fact
- Three concepts joined:
alice → likes → chocolate. The specificity lives in the triplet, never in the concept. - An entity is a thing
- A concept plus two identity edges saying what it is and where it belongs — the difference between the word “book” and a particular book.
- A type is the pair those edges point at
- Not a table and not a schema. A type exists because entities point at it, which is why it cannot be empty.
Two ways in
Sandra is an MCP server first. Tools for creating, reading, linking, searching and traversing memory, plus semantic search where an embedding endpoint is configured. Point an agent at it:
claude mcp add sandra --transport http https://sandra.onae.mobilethinking.ch/mcp \
--header "Authorization: Bearer <your token>"
Tokens are minted on the server with php artisan sandra:token create.
A hosted client that has never met this server can connect over OAuth instead.
The same graph over plain HTTP, for anything that does not speak MCP. It is the second-class surface on purpose — it exists so a script can reach the data, not so an agent can.
curl -H "Authorization: Bearer <your token>" \
https://sandra.onae.mobilethinking.ch/api/book/library
Where to go next
- The user guide — what Sandra is, how it works, how to connect, and what a good memory looks like. Written for people who will never read the code.
- Why naming matters — the one habit that decides whether a shared memory stays usable.