MCP tools
Five tools. Two of them write, one of them is a reasoning loop, and exactly one is safe to put on an endpoint without a key.
| Tool | Calls a model | Writes | Exposable |
|---|---|---|---|
memory_recall | no | no | yes |
memory_retain | yes — extraction | yes | no |
memory_reflect | yes — repeatedly | no | no |
memory_compress | yes — summarisation | yes | no |
memory_bridge | no | yes | no |
memory_recall
Search memory for relevant facts, with optional room, hall, layer, tag, author and time scoping. Four retrievals fused and reranked locally; no completion call, no mutation, no access counter. The whole cost is CPU. This is the only tool that can sit behind an unauthenticated endpoint without handing someone your budget.
Two arguments that behave differently from how they read. limit is the
number of results you get back — we had to enforce that, because the engine treats it as a
retrieval hint, and a request for 2 came back with 113 facts and 43,000 characters of somebody
else's context. And author / mine exclude unattributed facts by default:
everything written before attribution existed carries no author, so the permissive reading would
answer "what did sysadmin write" with the whole corpus.
memory_retain
Save text to long-term memory. An extraction pass splits it into atomic facts, types them into halls, dates them, resolves entities and records what supersedes what. This is where the model cost lives — one extraction per document, not per read.
Every fact it writes is attributed to the caller the server resolved. An
author passed in the call is consulted only when there is no server-side identity, and
is recorded as self-declared when it is used; an author: tag written by hand
among the caller's own tags is dropped outright. Where nothing resolves, the fact is stored
unattributed with a warning rather than under a stand-in name.
memory_reflect
Deep reasoning over stored memory: synthesises across facts, finds patterns, answers a complex question with citations. Worth being precise about, because it looks like a read: it does not write to the store, so a naive "read-only server" built from descriptions rather than code would include it. It is an agent loop with repeated model calls. Unauthenticated, it is a free LLM agent running on your key. It stays behind auth.
memory_compress
Builds compressed summaries — "closets" — by grouping facts on room and hall and summarising each group. Model cost plus a write. This is how L2 observation volume stops growing without bound.
memory_bridge
Creates a typed link between two related facts that live in different banks — a tunnel. No model, but it mutates the graph.
Scoping in practice
memory_retain({
bank_id: "your-fleet",
room: "shared", // the whole fleet reads this
layer: "L0", // surfaces at session start
content: "Deploys to staging go through `make dev`; never rsync by hand."
})
memory_recall({
bank_id: "your-fleet",
query: "how do we deploy to staging",
room: ["deployment", "shared"], // two topic rooms; rooms are topics, not per-agent scopes
mine: true // and only what I wrote — identity is its own axis
})
Room and author are separate arguments on purpose. A room says what a fact is about
and an author says who put it there; collapsing them into one string answers neither question. Note
also what is not in that call: there is no way to ask which rooms a bank contains. Tags have
a listing endpoint with wildcard search — ?q=author:* returns the roster of everyone who
has written — and rooms do not. That gap is item 8 →
A note on defaults for anyone packaging this
If you fork RCLL or repackage it, resist renaming the default bank. Changing the variable that names it is fine; changing the value silently moves every existing user who never set it into an empty bank, which reads from the outside exactly like "the upgrade deleted my memory". Rename the variable, keep the old default, deprecate on a timer. We caught this in our own rebrand one commit before publishing.
There is no tool that exports your memory
Stated on the API page because this is where somebody would go looking for it. The HTTP surface
has export and import endpoints; both are tagged bank templates
and both move configuration, mental models and directives. Neither moves a fact.
The listing endpoint that does return facts returns 11 of the 26 stored columns, dropping
room, hall, layer, embeddings, metadata and every link
between facts. So a caller can assemble a partial copy of their memory page by page, and what they
assemble will have lost the scoping this product is built around.
We are flagging it rather than waiting to ship the fix, because the failure is quiet: a command
named export returns a valid file, and you find out what is missing on the day you try
to restore it. A full dump — every column, every link, provenance intact, targeting the published
portable-agent-memory interchange format — is the first item on our list.
The rest of the list →