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

MCP primary

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.

REST fallback

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