ZenBrain
OfficialUse this server to manage persistent memory for an AI agent: store, search, delete, consolidate, and inspect memories across five layers.
Store a memory (
zenbrain_store) with automatic routing to procedure, episode, core, or fact, optionally setting type, steps, confidence, emotional weight, etc.Recall memories (
zenbrain_recall) by query, optionally filtering by layers, minimum score, or minimum confidence.Forget a memory (
zenbrain_forget) permanently by id and layer, including linked consolidated memories and working-memory copies.Consolidate memory (
zenbrain_consolidate) to promote emotionally weighted episodes into semantic facts and decay working-memory slots.Inspect memory state (
zenbrain_health) for counts of working, short-term, episodic, semantic, procedural, and core memories, including due reviews.
arXiv preprint (cs.AI): arxiv.org/abs/2604.23878
Open-access archive (Zenodo / CERN): doi.org/10.5281/zenodo.19353663
ORCID: 0009-0001-1793-012X
License: CC BY 4.0 (paper) · Apache-2.0 (code)
@misc{bering2026zenbrain,
title = {ZenBrain: A Neuroscience-Inspired 7-Layer Memory Architecture for Autonomous AI Systems},
author = {Bering, Alexander},
year = {2026},
eprint = {2604.23878},
archivePrefix = {arXiv},
primaryClass = {cs.AI},
doi = {10.5281/zenodo.19353663},
url = {https://arxiv.org/abs/2604.23878}
}Feedback, replications, and counter-results are explicitly welcome — please open an issue or reach out via research@zensation.ai.
Your AI forgets everything after every conversation. ZenBrain gives it a memory that lasts across sessions, split into layers the way human memory is, and ships the mechanisms memory research describes (spaced repetition, emotional tagging, Hebbian strengthening, forgetting curves, sleep replay) as tested functions. Which of them run on their own and which you call yourself is in one table.
Architecture vs. this package. ZenBrain's architecture is 15 neuroscience-inspired mechanisms — 9 foundational algorithms + 6 Predictive Memory Architecture (PMA) components (paper). The six PMA components are proprietary: they ran in the ZenAI production system and are not in these packages, which contain the hooks they plug into. This open-source package ships the algorithm library: 10 core algorithms + 10 advanced research modules (20 modules), zero-dependency.
Benchmark: LongMemEval-500
On LongMemEval-500, three of nine head-to-head comparisons hold against Letta, Mem0 and A-Mem — all three against A-Mem, the remaining six are ties, none lost. Three competitors x three LLM judges, Bonferroni-corrected (alpha = 0.05/18) and version-matched. The measured ZenBrain arm (per the correction notice a Python port of a test-harness class, not the seven-layer system) reaches 91.3% of the binary-judge accuracy of a full-context comparison arm (whose answer model reads the whole history) with 1/109.6 of its input tokens in the answer step (47.7% vs. 52.2%); building the memory is not counted.
Works out of the box without an embedding provider — lexical ranking, nothing extra
to install. nomic-embed-text can be added as the embedding provider; it was the embedder of the
measured run. The figures above were not measured with this package: per the correction notice,
the measured arm is a Python port of a test-harness class, not an import of the packages.
The paper prints where ZenBrain loses as well: on LoCoMo, substring-based aggregate F1 favours lexical retrieval (BM25) by metric design, and we do not contest that. The advantage is most pronounced in the judge-graded comparisons and on cross-session reasoning.
The mechanism comparison further down re-runs from this repository in under a minute —
bash scripts/compare-mechanisms.sh, no API keys; it needs git, Node and network access to clone the three
compared repositories at the pinned commits. It prints a positive
and a negative control before the result, so the instrument can be checked before its output
is trusted. The mechanism ablation behind paper Tables 7–9 also runs from here: cd backend && npm run experiments, and CI compares every point estimate with the published ones. The method and the effect
sizes behind the LongMemEval numbers above are in the paper; this repository ships no runner for those.
The archived packages below run the significance tests and effect sizes in full, and the mechanism ablation
behind paper Tables 7–9.
Method, effect sizes and ablations: arXiv:2604.23878
Open-access archive: 10.5281/zenodo.19353663
Related MCP server: chronomem
Reproduction packages
The raw material behind the numbers above is deposited on Zenodo, open access and citable. Both links are concept DOIs and resolve to the latest version, the same convention this README uses for the paper archive; each description was measured against the version named after it.
Mechanism ablation, paper Tables 7–9 — 10.5281/zenodo.22162063 (described here: v1.0.0). Four experiment suites (95 tests), the reference JSON the paper's tables were generated from, and
verify-against-reference.mjs, which diffs a fresh run against that reference and exits non-zero on drift.npm install && npm run experiments; the run itself needs no API keys and no network, and finishes in under a minute on a laptop. Two of the paper's other ablation tables need data this package does not carry: Table 11 the LoCoMo corpus, Table 13 a different pipeline. The package says so itself.Measurement package, LongMemEval-500 and the real-pipeline flag ablation — 10.5281/zenodo.22161977 (described here: v1). Per-(system, judge, seed) judged outputs, the flag manifests as recorded at run time, a
SHA256SUMS.txtcovering every file in the package, and the analysis scripts. Three of those scripts are stdlib-only and self-checking — the full-context comparison behind the 91.3% figure, the judge-agreement figures, and the real-pipeline flag-ablation table: each prints every re-derived value next to the reference it has to match, and exits non-zero on mismatch. The significance tests behind the nine head-to-head comparisons against Letta, Mem0 and A-Mem sit in a separate script that needs numpy and scipy; it recomputes all eighteen pairwise tests and rewrites the deposited significance JSON byte-identically, so what catches a mismatch there is the checksum, not an exit code.
Both packages name what they do not cover. Replications and counter-results are welcome: research@zensation.ai.
How ZenBrain differs from Mem0, Letta and Zep
ZenBrain's architecture combines fifteen mechanisms taken from human memory research: nine foundational algorithms, which are in this library, and six Predictive Memory Architecture components, which are not public. Among the systems the paper surveys, none integrates more than two of the features it compares. The table below records which of five of these mechanisms appear in the public source of three widely used memory systems, at pinned versions, on a fixed date.
Mechanism | ZenBrain | Mem0 | Letta | Zep |
FSRS spaced repetition | yes | — | — | — |
Hebbian learning | yes | — | — | — |
Ebbinghaus forgetting curves | yes | — | — | — |
Sleep consolidation | yes | — | — | — |
Emotional tagging | yes | — | — | — |
Zero runtime dependencies | yes | — | — | n/a |
How this was measured, 27 August 2026. Full-text search over the public source of mem0ai/mem0 at tag ts-v3.1.7 (npm mem0ai 3.1.7, PyPI mem0ai 2.0.19), letta-ai/letta-code at tag v0.31.2 (npm @letta-ai/letta-code 0.31.2) and getzep/zep at commit 7de18df, its last before that date, lockfiles excluded. getzep/zep holds examples and integrations for the hosted Zep Cloud, whose own source is not public: a dash in the Zep column covers that repository only, and there is no library to count dependencies of. A dash means the term does not occur in that snapshot — not that the system cannot do something comparable under another name. One case we know of: Letta Code revises memory in the background and calls it "dreaming" (sleep-time compute), which the term search for sleep consolidation does not match. In ZenBrain the mechanisms in this table are library functions; which of them the coordinator runs is in this table. Dependency counts are declared direct dependencies: @zensation/core resolves to two packages, both our own; mem0ai declares four, @letta-ai/letta-code eighteen. Re-run the whole check — the five mechanism rows and the dependency counts, at these pins — with scripts/compare-mechanisms.sh (--latest runs it against today's default branches instead); it prints its own positive and negative controls so you can see the instrument works before you trust the result.
Human memory does not work like a key-value store. The brain keeps specialised systems for different kinds of memory, forgets actively, modulates by emotion and retrieves by context. ZenBrain brings those mechanisms to AI agents, as a memory system with seven layers and as a library of the algorithms behind them.
Advanced algorithms (since v0.3.0, May 2026)
On top of the 10 core algorithms above, @zensation/algorithms ships 10 advanced algorithms grounded in recent neuroscience and ML research. Each is exposed as its own sub-path (@zensation/algorithms/<name>) and remains zero-dependency:
fsrs-vmPFC— Prediction-Error coupled FSRShebbian-two-factor— Two-Factor synaptic consolidationsleep-simulation-selection— RL-based replay selectionspectral-health— Fiedler-value KG health monitorib-budget— Information-Bottleneck retention budgetdopamine-routing·hopfield-stm·personalized-pagerank·surprise-gradient-memory·temporal-multi-route
See CHANGELOG.md for details.
What runs on its own, and what you call yourself
@zensation/core is a memory system: the MemoryCoordinator stores, recalls, consolidates and
forgets. @zensation/algorithms is a library of twenty modules of tested functions, and the
coordinator calls only a few of them. Several mechanisms named in this README live in the library
alone; you wire them into your own system where you want them.
Mechanism | The coordinator ( | The library ( |
Layers | Seven layer classes. | — |
Routing |
| — |
Emotional tagging | At |
|
Spaced repetition (FSRS) | Every fact gets an FSRS schedule. | FSRS, prediction-error-coupled FSRS |
Forgetting | Nothing in long-term memory decays or is deleted on its own. | Ebbinghaus retention, personal decay profiles |
Consolidation |
| Sleep replay ( |
Hebbian learning | Not used: core keeps no knowledge graph. | Classic and two-factor Hebbian |
Bayesian confidence | Not used. |
|
Context-dependent retrieval | Not used. The |
|
The six Predictive Memory Architecture components of the paper are not in the packages; the packages contain the hooks they plug into (see Architecture vs. this package above).
Quick Start
Requires Node.js 22 or newer (since
0.4.0). On Node 20 or older, npm silently installs the last compatible release (@zensation/algorithms@0.3.4,@zensation/core@0.2.2) instead of the current one — which looks like a broken package but is a platform mismatch. See CHANGELOG.
npm install @zensation/algorithmsimport {
initFromDecayClass,
getRetrievability,
updateAfterRecall,
tagEmotion,
computeEmotionalWeight,
computeHebbianStrengthening,
propagateForRelation,
} from '@zensation/algorithms';
// 1. Schedule a memory with FSRS
const memory = initFromDecayClass('normal_decay');
// 2. A week later, check recall probability (Ebbinghaus curve)
const aWeekLater = new Date(Date.now() + 7 * 24 * 60 * 60 * 1000);
const retention = getRetrievability(memory, aWeekLater);
console.log(`Recall probability: ${(retention * 100).toFixed(1)}%`);
// ~36.8% — retrievability has decayed over the week
// 3. User recalled it anyway — update scheduling
const updated = updateAfterRecall(memory, 4, retention, aWeekLater);
// stability 7 -> 8.19: recalling at low retrievability gives a bigger boost
// 4. Tag emotional significance
const emotion = tagEmotion('I am absolutely thrilled — I got the promotion!');
const weight = computeEmotionalWeight(emotion);
console.log(`Decay multiplier: ${weight.decayMultiplier}x`);
// 2.7x — emotional memories decay nearly 3x slower
// 5. Strengthen knowledge connections (Hebbian)
const stronger = computeHebbianStrengthening(1.0);
// 1.09 — "neurons that fire together wire together"
// 6. Propagate confidence through your knowledge graph
const confidence = propagateForRelation(0.5, 0.8, 1.0, 'supports');
// 0.9 — supporting evidence increases confidenceWant the advanced algorithms?
import {
computeKGPredictionError,
computeAdaptiveFSRSInterval,
} from '@zensation/algorithms/fsrs-vmPFC';
// Couple FSRS scheduling with the prediction-error signal from your
// knowledge graph: when the embedding has shifted a lot since the last
// review (high cosine distance), shrink the next interval; otherwise push
// it out. Both arrays must have the same length.
const lastEmbedding = [0.1, 0.2, 0.3, 0.4];
const currentEmbedding = [0.5, 0.4, 0.1, 0.2];
const pe = computeKGPredictionError(lastEmbedding, currentEmbedding);
const nextInterval = computeAdaptiveFSRSInterval(14, pe);Each advanced algorithm has its own sub-path (@zensation/algorithms/spectral-health, @zensation/algorithms/ib-budget, …). All zero dependencies.
Runnable examples
Seven examples live in examples/; five run on the workspace packages alone, two need a
third-party SDK installed (the examples README says which):
Example | Shows |
Working Memory + Short-Term Memory for conversation context — no SDK needed | |
An Anthropic Claude assistant that remembers across conversations | |
ZenBrain as the memory backend of a LangChain agent | |
Multiple agents sharing Working Memory, with Hebbian strengthening | |
A memory-aware system prompt for the Vercel AI SDK | |
ZenBrain as long-term memory for a LlamaIndex.TS agent — LlamaIndex keeps the short-term window, ZenBrain decides what outlives it | |
ZenBrain behind a Mastra agent: a Processor records each turn, and the instructions are rebuilt from what is currently recallable |
npx tsx examples/basic-chatbot.tsThe integration examples additionally need their respective SDK installed; examples/README.md lists which. Open good first issues are the best way in if you want to contribute.
The Science Behind It
7-Layer Memory Architecture
Layer 7: Cross-Context Memory ← Entity links across domains (experimental)
Layer 6: Core Memory ← Pinned facts (Letta-style)
Layer 5: Procedural Memory ← "How to do X" (skills & workflows)
Layer 4: Long-Term Semantic ← Facts with FSRS scheduling
Layer 3: Episodic Memory ← Concrete experiences & events
Layer 2: Short-Term / Session ← Current conversation context
Layer 1: Working Memory ← Active task focus (7±2 items)Each layer holds a different kind of memory and is stored and searched in its own way.
FSRS Spaced Repetition
FSRS (Free Spaced Repetition Scheduler) is the open scheduler Anki offers as an alternative to its legacy SM-2 algorithm; its authors report that, in simulations, users need 20–30% fewer reviews than with SM-2 for the same retention (ABC of FSRS). It uses the desirable difficulty principle: reviewing when retention is low gives a bigger stability boost. In @zensation/core every fact gets an FSRS schedule; your application reports each review with recordReview(), and FSRS sets the next one.
Emotional Memory
The amygdala modulates memory consolidation — emotional events are remembered more vividly (flashbulb memory). ZenBrain's emotional tagger assigns arousal, valence, and significance scores using about 170 weighted keywords in four lists (English & German). In the library, emotional weight stretches decay half-lives up to 3x (computeEmotionalWeight); the coordinator uses the weight to route emotional content to episodic memory and to choose what consolidation promotes.
Hebbian Learning
"Neurons that fire together wire together" (Hebb, 1949). Knowledge graph edges that are frequently co-activated grow stronger. Unused edges decay and eventually get pruned. The result: a self-organizing knowledge structure that reflects actual usage patterns, with homeostatic normalization to prevent runaway growth. These are library functions; @zensation/core keeps no knowledge graph, so you apply them to a graph of your own.
Ebbinghaus Forgetting Curves
Ebbinghaus (1885) showed that memory decays exponentially: R = e^(-t/S). The library implements personalized decay profiles that adapt to individual learning patterns, with SM-2-compatible call signatures for existing spaced repetition code (the stability update itself is FSRS's). In the coordinator, only working memory decays.
Context-Dependent Retrieval
Tulving's Encoding Specificity Principle (1973): memories are recalled better when the retrieval context matches the encoding context. The library captures temporal context (time of day, day of week) and task type, and calculateContextSimilarity turns a match between a stored and the current context into a boost factor of up to 1.3 — a design constant, not a measured effect. The coordinator stores no encoding context; its includeContext option never had an effect and was withdrawn in 0.5.0.
Bayesian Confidence Propagation
Knowledge isn't isolated — facts support or contradict each other. The library propagates confidence through a knowledge graph you keep, one edge per call, with Bayesian-style (noisy-OR) updates: supporting evidence increases confidence, contradictions decrease it, with damping for numerical stability.
Sleep Consolidation
During sleep, the hippocampus replays recent experiences, strengthening important memories and pruning weak connections (Stickgold & Walker, 2013). ZenBrain simulates this process: selectForReplay() prioritizes emotional and recently-accessed memories, simulateReplay() boosts their stability by 50%, and pruneWeakConnections() removes weak Hebbian edges — a threshold rule inspired by the Synaptic Homeostasis Hypothesis (Tononi & Cirelli, 2006). The coordinator's consolidate() does not run this replay; it turns emotionally weighted episodes among the 100 most recent into facts, once each.
import { selectForReplay, simulateReplay } from '@zensation/algorithms/sleep-consolidation';
// Select memories for overnight consolidation
const toReplay = selectForReplay(allMemories);
// Simulate sleep replay — stability ↑, weak edges pruned
const result = simulateReplay(toReplay);
console.log(`Replayed ${result.summary.totalReplayed} memories, avg stability +${result.summary.avgStabilityIncrease.toFixed(1)} days`);Memory Coordinator
The MemoryCoordinator puts the layers behind one API — inspired by Global Workspace Theory (Baars, 1988):
import { MemoryCoordinator } from '@zensation/core';
const memory = new MemoryCoordinator({ storage: adapter, embedding: embedder });
// Auto-routes to the right layer (semantic, episodic, procedural, or core)
await memory.store('User prefers TypeScript', { type: 'auto' });
// Cross-layer search with ranked, deduplicated results
const results = await memory.recall('programming preferences');
// Forget a memory by the id and layer of a recall result (a fact consolidated from it goes too)
await memory.forget(results[0].id, results[0].layer);
// Consolidate: emotionally weighted episodes among the 100 most recent become facts, once each;
// working memory decays
await memory.consolidate();
// Facts whose FSRS review is due; report each review with recordReview()
const dueItems = await memory.getReviewQueue();Packages
Package | Description | Status |
20 algorithm modules — 10 core (FSRS, Hebbian, Ebbinghaus, emotional, Bayesian, sleep consolidation, intervals, visualization) + 10 advanced (vmPFC-FSRS, two-factor Hebbian, IB budget, Hopfield STM, …) | :white_check_mark: Published | |
Memory layers, coordinator, adapter interfaces | :white_check_mark: Published | |
PostgreSQL + pgvector storage adapter | :white_check_mark: Published | |
SQLite storage adapter (zero-config) | :white_check_mark: Published | |
MCP server — gives any MCP client (Claude Desktop, Claude Code, Cursor) five tools over five of the seven layers. Carries the protocol SDK, so the core stays dependency-free | :white_check_mark: Published | |
Vercel AI SDK middleware — recall before the model call, store after it. Works with any provider, zero runtime dependencies | :white_check_mark: Published |
Tree-Shakeable Imports
Every algorithm is available as a subpath export:
// Import everything
import { tagEmotion, updateAfterRecall } from '@zensation/algorithms';Or just what you need (better tree-shaking):
import { updateAfterRecall } from '@zensation/algorithms/fsrs';
import { tagEmotion } from '@zensation/algorithms/emotional';
import { computeHebbianStrengthening } from '@zensation/algorithms/hebbian';
import { propagateForRelation } from '@zensation/algorithms/bayesian';
import { selectForReplay } from '@zensation/algorithms/sleep-consolidation';
import { getRetrievabilityWithCI } from '@zensation/algorithms/intervals';
import { generateRetentionCurve } from '@zensation/algorithms/visualization';Use Cases
AI Chatbots with Long-Term Memory
import { initFromDecayClass, getRetrievability, type FSRSState } from '@zensation/algorithms/fsrs';
import { tagEmotion, computeEmotionalWeight } from '@zensation/algorithms/emotional';
// When your AI learns a fact about the user:
function rememberFact(fact: string): FSRSState {
const weight = computeEmotionalWeight(tagEmotion(fact));
// Emotional facts start with more stability: the multiplier runs from 1 to 3,
// and initFromDecayClass applies up to 2x of it to the base stability.
return initFromDecayClass('normal_decay', weight.decayMultiplier);
}
// Before each conversation, check what needs reinforcement:
function getFactsDueForReview(facts: FSRSState[]) {
return facts.filter(f => getRetrievability(f) < 0.7);
}Knowledge Graph with Self-Organizing Edges
import { computeHebbianStrengthening, computeHebbianDecay } from '@zensation/algorithms/hebbian';
import { propagateForRelation } from '@zensation/algorithms/bayesian';
// When two concepts are mentioned together:
function coActivate(edge: { weight: number }) {
edge.weight = computeHebbianStrengthening(edge.weight);
}
// Periodic maintenance — decay unused edges:
function decayEdges(edges: { weight: number; lastUsed: Date }[]) {
for (const edge of edges) {
edge.weight = computeHebbianDecay(edge.weight);
// 0 means the edge fell below MIN_WEIGHT (0.1): prune it
}
}RAG with Confidence Scoring
import { propagateForRelation, isSignificantChange } from '@zensation/algorithms/bayesian';
type Fact = { confidence: number };
type Relation = { source: Fact; target: Fact; weight: number; type: string };
// After retrieval, propagate confidence through related facts:
function updateConfidenceGraph(relations: Relation[]) {
for (const rel of relations) {
const newConf = propagateForRelation(
rel.target.confidence,
rel.source.confidence,
rel.weight,
rel.type // a key of PROPAGATION_FACTORS: 'supports', 'contradicts', 'causes', 'requires', 'part_of', …
);
if (isSignificantChange(newConf, rel.target.confidence)) {
rel.target.confidence = newConf;
}
}
}Extracted From Production
These aren't toy implementations — ZenBrain's algorithms are extracted from ZenAI, the AI platform they ran in production. Everything claimed here is verifiable in this repository:
945 tests (539 algorithms · 164 core · 88 adapter-sqlite · 65 adapter-postgres, 12 of them against a real PostgreSQL · 61 mcp · 28 ai-sdk), all passing
Zero runtime dependencies in
@zensation/algorithmsand@zensation/core(core depends only on algorithms) — pure TypeScript, dual ESM + CJS, tree-shakeable subpath exportsReproducible — building from this source produces the same 153-file
@zensation/algorithms@0.6.0tarball published on npm7-layer memory architecture grounded in published neuroscience
Contributing
We welcome contributions! See CONTRIBUTING.md for guidelines. Issues and pull requests are answered; replications and counter-results are especially welcome.
Resources: API Reference | Recipes | Architecture | Benchmarks | FAQ | Roadmap
# Clone the repo
git clone https://github.com/zensation-ai/zenbrain.git
cd zenbrain
# Install dependencies
npm install
# Run tests
npm test
# Build all packages
npm run buildResearch
ZenBrain's architecture and algorithms are documented in an open-access technical disclosure:
arXiv preprint (cs.AI): arxiv.org/abs/2604.23878
Open-access archive: ZenBrain: A Neuroscience-Inspired 7-Layer Memory Architecture for Autonomous AI Systems (Zenodo, DOI: 10.5281/zenodo.19353663 — resolves to the latest version)
TDCommons: Technical Disclosure (CC BY 4.0)
HuggingFace: Model Card & Benchmarks
If you use ZenBrain in academic work, please cite:
@misc{bering2026zenbrain,
title = {ZenBrain: A Neuroscience-Inspired 7-Layer Memory Architecture for Autonomous AI Systems},
author = {Bering, Alexander},
year = {2026},
eprint = {2604.23878},
archivePrefix = {arXiv},
primaryClass = {cs.AI},
doi = {10.5281/zenodo.19353663},
url = {https://arxiv.org/abs/2604.23878}
}Cited by
Five works cite ZenBrain (as of 28 September 2026): a survey by the Sico team at Microsoft Research, MindMemOS by Huawei's Noah's Ark Lab, the EVD preprint, the HindsightTag manuscript and the Lamperouge manifesto.
Agentic Evolution: From Self-Improving Agents to Co-Evolving Human-AI Systems, a survey by the Sico team at Microsoft Research (2026), calls forgetting "critically understudied": very few of the roughly 100 Memory & Sense papers it surveys implement explicit forgetting. It lists ZenBrain as one of four works in its forgetting/lifecycle group and as its only source for sleep-based consolidation.
MindMemOS (Huawei's Noah's Ark Lab, arXiv:2608.12428, August 2026) relies on exactly three references for the foundational claim of its introduction: two field surveys and a single system paper — ZenBrain.
HindsightTag (Vivek Govindbhai Dudhat, manuscript, July 2026, revised 30 September 2026) discusses ZenBrain as its closest prior system and uses its
MemoryCoordinatorinterface as the integration example.EVD: An Emotional Valence Dimension for Persistent Agent Memory (R. J. Vandelinder and I. Vandelinder, Exile Research, Zenodo, June 2026) places ZenBrain in its related work.
The field measures the wrong thing (Lamperouge, manifesto, Zenodo, August 2026) selects ZenBrain among six works on persistent internal state and notes that its "days" are simulation steps.
Each work with the sentence that cites ZenBrain: zensation.ai/en/publikationen.
Projects that build the library into their code:
ACMS reads and writes the ZenBrain SQLite database directly.
neurograph-runtime uses the FSRS implementation of
@zensation/algorithmsas the ranking and feedback layer of a knowledge base on radiotherapy literature.
Citing ZenBrain or building on it? Open an issue and we will add you here.
Community
GitHub Discussions: Ask a question, show what you built — help, show-and-tell, feature requests
GitHub Issues: Bug reports & feature requests
Email: open-source@zensation.ai
License
Apache 2.0 — use it in production, modify it, distribute it. Just keep the attribution.
Available Tools
5 toolszenbrain_consolidateConsolidate memoryADestructive
Run one consolidation pass: among the 100 most recent episodes, each one with an emotional weight above 0.5 becomes a semantic fact — once, however often the pass runs. Working-memory slots lose relevance with age, and slots whose relevance has dropped to 0.01 or below are removed; that is the only deletion, and nothing in long-term memory is deleted. Run it between sessions or after a batch of zenbrain_store calls, not on every turn; compare zenbrain_health before and after to see the effect.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| pruned | Yes | Always 0: consolidation deletes nothing from long-term memory. |
| decayed | Yes | Working-memory slots removed by decay (relevance at or below 0.01). |
| promoted | Yes | Episodes promoted to semantic facts in this pass. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true, and the description goes well beyond that by naming exactly what is deleted (working-memory slots with relevance <= 0.01) and what is safe (nothing in long-term memory is deleted). It also discloses idempotency-like behavior that annotations cannot express: each qualifying episode becomes a fact 'once, however often the pass runs.'
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then scope of deletion, then invocation cadence. Every sentence carries information, though the middle sentence about slot relevance is dense and slightly harder to parse than the rest.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters, an output schema present, and annotations covering the safety profile, the description supplies everything an agent needs: effect, deletion scope, frequency guidance, and a verification path via zenbrain_health.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the schema baseline is 4. The description correctly implies no configuration is needed to invoke it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific action (one consolidation pass) and states the exact transformation it performs on episodes and working-memory slots. It is clearly distinct from sibling tools like zenbrain_store and zenbrain_health, which it references by name.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use guidance: 'Run it between sessions or after a batch of zenbrain_store calls, not on every turn.' It also gives a concrete verification step (compare zenbrain_health before and after), leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zenbrain_forgetForget a memoryADestructiveIdempotent
Permanently delete a memory, addressed by the id and layer that zenbrain_recall returned for it, together with what consolidation linked to it; this cannot be undone. Forgetting an episode also deletes the fact zenbrain_consolidate made from it; forgetting such a fact also deletes every episode consolidated into it; both also delete the working-memory copies of that content. Forgetting a working-memory result deletes only that copy. alsoForgotten lists everything deleted besides the memory itself. A memory stored on its own and never consolidated keeps its long-term entry. Use it when the user asks to forget something or a stored memory is wrong; to correct a memory, forget it and store the corrected version with zenbrain_store. An id the layer does not hold is reported as not forgotten, not as an error.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The id of one result from zenbrain_recall. | |
| layer | Yes | The layer of that same result, exactly as zenbrain_recall reported it. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| layer | Yes | |
| forgotten | Yes | True if the memory was deleted, false if the layer held none with that id. |
| alsoForgotten | Yes | Memories deleted with it: what consolidation linked to it (derived from it, or it from), and working-memory copies. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true and idempotentHint=true, but the description goes well beyond them: it describes the cascade in both directions (episode→fact, fact→consolidated episodes, working-memory copies), the survival rule for unconsolidated memories, the alsoForgotten field, and the non-error handling of a layer/id mismatch. That is exactly the behavior an agent needs before invoking an irreversible delete.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the destructive action, and the cascade, exception-handling, and usage sentences each add distinct information. It is dense and somewhat run-on (semicolon-chained cascade rules), but no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists so return values need no explanation, yet the description still flags the alsoForgotten field, covers irreversible cascade semantics, distinguishes the working-memory-only case, and routes users to the store-corrected-version workflow. Nothing an agent needs to call this safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters are already documented as coming from a zenbrain_recall result, so the schema carries the load. The description reinforces the coupling ('the id and layer that zenbrain_recall returned for it') but adds no format, syntax, or edge-case detail beyond what is already structured.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource ('Permanently delete a memory') with scope stated up front, and it names the sibling that supplies its inputs (zenbrain_recall). An agent can distinguish this from zenbrain_store and zenbrain_consolidate without opening another schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use ('when the user asks to forget something or a stored memory is wrong') plus the correction workflow ('forget it and store the corrected version with zenbrain_store'). It also names the counter-case: an id the layer does not hold is reported as not forgotten rather than an error.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zenbrain_healthInspect memory stateARead-only
Report how full the memory layers are: working-memory slots in use, interactions held, episodes, facts and how many are due for review, procedures, core blocks. Read-only and cheap, safe to call at any time. It returns counts only; to read the memories themselves, use zenbrain_recall.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| core | Yes | Core memory blocks. |
| working | Yes | Working-memory slots in use and the slot limit. |
| episodic | Yes | Episodes stored. |
| semantic | Yes | Facts stored, and how many are due for spaced-repetition review. |
| shortTerm | Yes | Interactions held in short-term memory. |
| procedural | Yes | Procedures stored. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is partly covered; the description adds cost/performance context ('cheap, safe to call at any time') and states the output shape ('counts only'). It does not add detail on latency budgets or pagination, but none is relevant for a zero-parameter count report.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences: the first front-loads what is measured, the second the cost/safety profile, the third the alternative. Every sentence earns its place with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values needn't be described; the description nonetheless sets expectations ('counts only'). For a zero-parameter diagnostic tool with full annotation coverage, nothing an agent needs is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes no parameters, so the baseline is 4. There is nothing for the description to disambiguate, and it correctly spends no words on parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Name and description pair a specific verb ('report how full') with the exact resources measured: working-memory slots, interactions, episodes, due-for-review facts, procedures, core blocks. It also distinguishes itself from the sibling zenbrain_recall by stating it returns counts, not contents.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly frames the tool as a cheap, read-only, always-safe call and names the alternative (zenbrain_recall) for the adjacent need of reading actual memories. Both the when-to-use and the when-to-use-something-else conditions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zenbrain_recallRecall memoriesARead-only
Search long-term memory for anything relevant to a query. By default it searches the episodic, semantic, procedural and core layers; working memory (the most recent stores, held only while the server runs, up to five results) is searched only when named in layers. Returns results sorted by score, each with its id and the layer it came from; zenbrain_forget takes both. The score runs from 0 to 1 and says how well a result matches the query; a layer in which nothing matches returns recent memories (or its most successful procedures) at 0, behind every hit, and minScore above 0 leaves them out. Every core block scores 0.5 or 0.8, so a block can rank above a weak hit. Use this before answering when the user refers to something from an earlier session. To see how much is stored rather than what, use zenbrain_health; to save something, use zenbrain_store.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many results to return at most, after ranking (default 10). | |
| query | Yes | What to look for, in plain language. | |
| layers | No | Restrict the search to these layers. Defaults to episodic, semantic, procedural and core; add 'working' to include the most recent stores held in memory (up to five, ranked by the query). | |
| minScore | No | Leave out results scoring below this value (default 0 keeps all). Any value above 0 drops the score-0 fallbacks that a layer returns when nothing in it matches. | |
| minConfidence | No | Leave out results whose confidence is below this value. Applied before the final ranking, so fewer than `limit` results may come back. Facts use their stored confidence, procedures their success rate; core blocks, episodes and working-memory items count as 1 and are kept. |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | How many memories were returned. |
| results | Yes | Memories sorted by score (0 to 1), highest first; 0 means nothing in that layer matched. |
| skipped | Yes | Rows without readable content that this server left out of `results`. When recall finds more than one row, the coordinator drops such rows while deduplicating, before they reach this count. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds real behavioral detail not in annotations: default layer set, working-memory volatility and five-result cap, sort order, score range 0–1, per-layer fallback behavior at score 0, and core-block fixed scores of 0.5/0.8.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then defaults, then return semantics, then alternatives. Several sentences are dense but each earns its place; the core-block scoring sentence is the only one bordering on niche detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only ranked search with an output schema present, the definition covers defaults, ranking, score semantics, fallback behavior, and cross-tool routing. Return values needn't be explained given the output schema. Coverage of `limit`/`minConfidence` behavior is left to the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the bar is a baseline 3; the description nonetheless adds semantics for `layers` (working is opt-in and held only while the server runs) and `minScore` (values above 0 drop score-0 fallbacks) that reinforce and contextualize the schema text. It does not explain `limit` or `minConfidence`, keeping it from a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('search long-term memory') and immediately scopes the default layers, so the agent knows exactly what it retrieves. It also explicitly names sibling alternatives (zenbrain_health, zenbrain_store) for adjacent needs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-to-use trigger ('before answering when the user refers to something from an earlier session') and routes non-matching needs to siblings ('to see how much is stored… use zenbrain_health; to save something, use zenbrain_store').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zenbrain_storeStore a memoryA
Write something into long-term memory so it survives this conversation. Routing is automatic by default, first match wins: steps, or wording such as "How to", "Steps:" or "workflow:", make a procedure; an emotional weight above 0.5 (detected, or set via emotionalWeight) an episode; a confidence above 0.9 a pinned core memory; anything else a semantic fact. Set type only when you want to override that. Every call adds a new memory, except that storing the same core memory again updates it; the content is also kept in working memory (the most recent seven) while the server runs, so once seven are held each store replaces the oldest copy there. Long-term memory is never changed by a store. Returns the id of the stored memory. If it may already be stored, check with zenbrain_recall first: storing it again adds a duplicate.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Routing hint. 'auto' (default) decides from the content. | |
| steps | No | Ordered steps of a procedure. Optional: without them the steps are taken from the content (numbered or bulleted lines, otherwise every line). | |
| tools | No | Tools a procedure uses. | |
| source | No | Where this came from, e.g. 'user', 'ai', 'import'. Kept with facts and episodes. | |
| content | Yes | The memory to store, in plain language. | |
| context | No | Context domain, e.g. 'work', 'personal', 'learning'. Kept with episodes only. | |
| outcome | No | What the procedure achieves. | |
| confidence | No | How certain this is (0–1), kept with facts. Above 0.9 routes to core memory unless an earlier routing rule matched. | |
| emotionalWeight | No | Emotional significance (0–1). Detected from the content when omitted. Above 0.5 routes to episodic memory unless steps or procedural wording matched first. With type 'fact' it is not stored, but lengthens the fact's first review interval (×(1 + weight)). |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Identifier of the stored memory. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnly=false, idempotent=false), the description discloses the routing precedence ('first match wins'), that every call adds a new memory except repeated core memories which update, the working-memory seven-item replacement behavior, that long-term memory is never otherwise mutated, and that the new id is returned. These are exactly the mutation/idempotency nuances the annotations only hint at.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense and front-loaded, leading with the purpose before the routing detail. It is long relative to most descriptions, but nearly every clause carries distinct behavioral information; only the repetition of the routing rules against the schema keeps it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter mutation tool with an output schema present, the description covers what the annotations cannot: routing outcomes, duplicate risk, working-memory eviction, and return value. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline would be 3, but the description adds real value: the ordered routing precedence among `steps`/procedural wording, `emotionalWeight` > 0.5, `confidence` > 0.9, and the interaction where an explicit `type` overrides auto. That precedence is not fully evident from per-parameter schema text alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('write something into long-term memory') plus the scope of persistence ('survives this conversation'), and it is trivially separable from siblings recall/forget/consolidate. An agent knows exactly what this does without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: 'If it may already be stored, check with zenbrain_recall first: storing it again adds a duplicate,' and states when to set `type` versus let auto-routing decide. Names the alternative sibling and the condition that selects it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
3 tool updates
v0.6.0- Changed
zenbrain_forget2 fields changed- added
Output schema / properties / alsoForgottenAdded value: +{ + "description": "Memories deleted with it: what consolidation linked to it (derived from it, or it from), and working-memory copies.", + "items": { + "additionalProperties": false, + "properties": { + "id": { + "type": "string" + }, + "layer": { + "type": "string" + } + }, + "required": [ + "id", + "layer" + ], + "type": "object" + }, + "type": "array" +} - changed
Output schema / requiredPrevious value: -[ - "forgotten", - "id", - "layer" -]New value: +[ + "forgotten", + "id", + "layer", + "alsoForgotten" +]
- Changed
zenbrain_recall4 fields changed- changed
Input schema / properties / layers / descriptionPrevious value: -"Restrict the search to these layers. Defaults to episodic, semantic, procedural and core; add 'working' to include the most recent stores held in memory (returned whatever the query)."New value: +"Restrict the search to these layers. Defaults to episodic, semantic, procedural and core; add 'working' to include the most recent stores held in memory (up to five, ranked by the query)." - added
Input schema / properties / minScoreAdded value: +{ + "description": "Leave out results scoring below this value (default 0 keeps all). Any value above 0 drops the score-0 fallbacks that a layer returns when nothing in it matches.", + "maximum": 1, + "minimum": 0, + "type": "number" +} - changed
Output schema / properties / results / descriptionPrevious value: -"Memories sorted by score, highest first; scores are per layer (see the tool description)."New value: +"Memories sorted by score (0 to 1), highest first; 0 means nothing in that layer matched." - added
Output schema / properties / results / items / properties / duplicatesAdded value: +{ + "description": "Memories with (nearly) the same content that recall left out in favour of this one, e.g. the fact consolidated from this episode. Present only when there are any.", + "items": { + "additionalProperties": false, + "properties": { + "id": { + "type": "string" + }, + "layer": { + "type": "string" + } + }, + "required": [ + "id", + "layer" + ], + "type": "object" + }, + "type": "array" +}
- Changed
zenbrain_store1 field changed- changed
Input schema / properties / emotionalWeight / descriptionPrevious value: -"Emotional significance (0–1). Detected from the content when omitted. Above 0.5 routes to episodic memory unless steps or procedural wording matched first."New value: +"Emotional significance (0–1). Detected from the content when omitted. Above 0.5 routes to episodic memory unless steps or procedural wording matched first. With type 'fact' it is not stored, but lengthens the fact's first review interval (×(1 + weight))."
3 tool updates
v0.5.2- Changed
zenbrain_consolidate1 field changed- changed
Output schema / properties / decayed / descriptionPrevious value: -"Working-memory slots decayed."New value: +"Working-memory slots removed by decay (relevance at or below 0.01)."
- Changed
zenbrain_recall3 fields changed- changed
Input schema / properties / layers / descriptionPrevious value: -"Restrict the search to these layers. Defaults to episodic, semantic, procedural and core; add 'working' to include recently stored items held in memory."New value: +"Restrict the search to these layers. Defaults to episodic, semantic, procedural and core; add 'working' to include the most recent stores held in memory (returned whatever the query)." - changed
Output schema / properties / results / descriptionPrevious value: -"Matching memories, most relevant first."New value: +"Memories sorted by score, highest first; scores are per layer (see the tool description)." - changed
Output schema / properties / skipped / descriptionPrevious value: -"Rows that carried no readable content and were left out of `results`."New value: +"Rows without readable content that this server left out of `results`. When recall finds more than one row, the coordinator drops such rows while deduplicating, before they reach this count."
- Changed
zenbrain_store4 fields changed- changed
Input schema / properties / confidence / descriptionPrevious value: -"How certain this is (0–1). Above 0.9 routes to core memory."New value: +"How certain this is (0–1), kept with facts. Above 0.9 routes to core memory unless an earlier routing rule matched." - changed
Input schema / properties / context / descriptionPrevious value: -"Context domain, e.g. 'work', 'personal', 'learning'."New value: +"Context domain, e.g. 'work', 'personal', 'learning'. Kept with episodes only." - changed
Input schema / properties / emotionalWeight / descriptionPrevious value: -"Emotional significance (0–1). Detected from the content when omitted. Above 0.5 routes to episodic memory."New value: +"Emotional significance (0–1). Detected from the content when omitted. Above 0.5 routes to episodic memory unless steps or procedural wording matched first." - changed
Input schema / properties / source / descriptionPrevious value: -"Where this came from, e.g. 'user', 'ai', 'import'."New value: +"Where this came from, e.g. 'user', 'ai', 'import'. Kept with facts and episodes."
2 tool updates
v0.5.1- Added
zenbrain_forget - Changed
zenbrain_recall2 fields changed- added
Output schema / properties / results / items / properties / idAdded value: +{ + "description": "Pass it with `layer` to zenbrain_forget to delete this memory.", + "type": "string" +} - changed
Output schema / properties / results / items / requiredPrevious value: -[ - "content", - "layer", - "score" -]New value: +[ + "id", + "content", + "layer", + "score" +]
1 tool update
v0.4.10- Changed
zenbrain_recall1 field changed- changed
Input schema / properties / minConfidence / descriptionPrevious value: -"Leave out results whose stored confidence is below this value; results stored without a confidence count as 1 and are kept."New value: +"Leave out results whose confidence is below this value. Applied before the final ranking, so fewer than `limit` results may come back. Facts use their stored confidence, procedures their success rate; core blocks, episodes and working-memory items count as 1 and are kept."
2 tool updates
v0.4.9- Changed
zenbrain_recall4 fields changed- removed
Input schema / properties / includeContextRemoved value: -{ - "description": "Boost results whose stored context (time of day, weekday, task type) matches the current one.", - "type": "boolean" -} - changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum results (default 10)."New value: +"How many results to return at most, after ranking (default 10)." - changed
Input schema / properties / minConfidence / descriptionPrevious value: -"Drop results below this confidence."New value: +"Leave out results whose stored confidence is below this value; results stored without a confidence count as 1 and are kept." - removed
Input schema / properties / taskTypeRemoved value: -{ - "description": "Current task, e.g. 'coding', 'writing'. Only has an effect together with `includeContext: true`.", - "type": "string" -}
- Changed
zenbrain_store1 field changed- changed
Input schema / properties / steps / descriptionPrevious value: -"Ordered steps. Required when type is 'procedure'."New value: +"Ordered steps of a procedure. Optional: without them the steps are taken from the content (numbered or bulleted lines, otherwise every line)."
4 tool updates
v0.1.7- Changed
zenbrain_consolidate2 fields changed- changed
Output schema / properties / promoted / descriptionPrevious value: -"Episodes promoted to semantic facts."New value: +"Episodes promoted to semantic facts in this pass." - changed
Output schema / properties / pruned / descriptionPrevious value: -"Items pruned below the retention threshold."New value: +"Always 0: consolidation deletes nothing from long-term memory."
- Changed
zenbrain_health1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "core": { + "additionalProperties": false, + "description": "Core memory blocks.", + "properties": { + "blocks": { + "type": "number" + } + }, + "required": [ + "blocks" + ], + "type": "object" + }, + "episodic": { + "additionalProperties": false, + "description": "Episodes stored.", + "properties": { + "count": { + "type": "number" + } + }, + "required": [ + "count" + ], + "type": "object" + }, + "procedural": { + "additionalProperties": false, + "description": "Procedures stored.", + "properties": { + "count": { + "type": "number" + } + }, + "required": [ + "count" + ], + "type": "object" + }, + "semantic": { + "additionalProperties": false, + "description": "Facts stored, and how many are due for spaced-repetition review.", + "properties": { + "count": { + "type": "number" + }, + "dueForReview": { + "type": "number" + } + }, + "required": [ + "count", + "dueForReview" + ], + "type": "object" + }, + "shortTerm": { + "additionalProperties": false, + "description": "Interactions held in short-term memory.", + "properties": { + "interactions": { + "type": "number" + } + }, + "required": [ + "interactions" + ], + "type": "object" + }, + "working": { + "additionalProperties": false, + "description": "Working-memory slots in use and the slot limit.", + "properties": { + "max": { + "type": "number" + }, + "used": { + "type": "number" + } + }, + "required": [ + "used", + "max" + ], + "type": "object" + } + }, + "required": [ + "working", + "shortTerm", + "episodic", + "semantic", + "procedural", + "core" + ], + "type": "object" +}
- Changed
zenbrain_recall3 fields changed- changed
Input schema / properties / includeContext / descriptionPrevious value: -"Boost results matching the current context."New value: +"Boost results whose stored context (time of day, weekday, task type) matches the current one." - changed
Input schema / properties / layers / descriptionPrevious value: -"Restrict the search to these layers. Defaults to all but working."New value: +"Restrict the search to these layers. Defaults to episodic, semantic, procedural and core; add 'working' to include recently stored items held in memory." - changed
Input schema / properties / taskType / descriptionPrevious value: -"Current task, e.g. 'coding', 'writing' — used for context matching."New value: +"Current task, e.g. 'coding', 'writing'. Only has an effect together with `includeContext: true`."
- Changed
zenbrain_store1 field changed- changed
Input schema / properties / emotionalWeight / descriptionPrevious value: -"Emotional significance (0–1). Detected from the content when omitted."New value: +"Emotional significance (0–1). Detected from the content when omitted. Above 0.5 routes to episodic memory."
4 tool updates
v0.1.5- First observed
zenbrain_consolidate - First observed
zenbrain_health - First observed
zenbrain_recall - First observed
zenbrain_store
TDQS
Scored across 5 tools
Each tool owns a clearly distinct verb-resource: store (write), recall (read), forget (delete), consolidate (maintenance pass), and health (read-only stats). The descriptions actively disambiguate by cross-referencing each other (e.g. 'to save, use zenbrain_store; to see how much is stored, use zenbrain_health'). No two tools could reasonably be confused.
All five tools follow a uniform zenbrain_<operation> snake_case pattern with single, predictable operation tokens. The convention holds throughout, with no mixing of styles or verb forms.
Five tools is well-scoped for a memory server, with each tool earning its place across a full lifecycle (write, read, delete, consolidate, monitor). Nothing is redundant or missing a corresponding slot.
The surface covers the full memory lifecycle: create (store), read (recall), delete (forget), maintenance (consolidate), and observability (health). Direct update/edit is absent, though it is explicitly documented as a forget-then-store workaround, so it's a minor gap rather than a dead end.
Maintenance
Related MCP Connectors
InfoLang semantic memory MCP — investigate, memorize, and recall compressed agent context.
- sepiaceOAuthio.sepiace
Long-term memory for AI agents. Pass one sentence, and it remembers, recalls, or forgets.
- memnodeOAuthdev.memnode
Persistent, inspectable memory for AI agents with lineage, correction, and a hosted MCP endpoint.
- KogniteOAuthdev.kognite
Hosted agent memory: store, search, and recall facts across sessions from any MCP client.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceA local memory engine for AI agents. Stores conversation episodes, consolidates knowledge through a neuroscience-inspired lifecycle, and builds a personal knowledge graph — all in a local SQLite database.18MIT
- AlicenseAqualityCmaintenanceEnables AI agents and MCP clients to store, retrieve, and manage bi-temporal, graph-aware facts in an embedded SQLite memory engine with token-budgeted recall and contradiction tracking.61MIT
- AlicenseNot gradedqualityBmaintenancePersistent long-term memory for MCP clients. Store and recall semantic facts, episodic events, and task state with vector-based relevance search. Write what matters, retrieve what's needed — memory that persists across sessions and agents, backed by a local SQLite store with optional embeddings for meaning-based lookup. Simple file-based storage, no external services required.MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to store and recall durable facts, decisions, and lessons over MCP using hybrid semantic and keyword search, typed memories, graph relations, sessions, and time-travel queries. Runs locally with no server process or API key, persisting everything to files that both agents and a CLI can share.14 npmMIT