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.

ToolCalls a modelWritesExposable
memory_recallnonoyes
memory_retainyes — extractionyesno
memory_reflectyes — repeatedlynono
memory_compressyes — summarisationyesno
memory_bridgenoyesno

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 →