Skip to main content
Glama

@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.


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.txt covering 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 FSRS

  • hebbian-two-factor — Two-Factor synaptic consolidation

  • sleep-simulation-selection — RL-based replay selection

  • spectral-health — Fiedler-value KG health monitor

  • ib-budget — Information-Bottleneck retention budget

  • dopamine-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 (@zensation/core)

The library (@zensation/algorithms)

Layers

Seven layer classes. recall() searches episodic, semantic, procedural and core memory, working memory on request; the cross-context layer is not part of recall.

—

Routing

store() picks the layer: step-by-step content becomes a procedure, an emotional weight above 0.5 an episode, a confidence above 0.9 a pinned core block, anything else a fact.

—

Emotional tagging

At store() with automatic routing — not with an explicit type, and not when steps or procedural wording already made it a procedure. The weight decides episode or fact, and which episodes consolidation promotes; a weight you pass for a fact stretches its starting FSRS stability by 1 + weight.

tagEmotion, computeEmotionalWeight

Spaced repetition (FSRS)

Every fact gets an FSRS schedule. getReviewQueue() lists the due facts; a review your application reports with recordReview() updates the schedule. Recall does not rank by retrievability.

FSRS, prediction-error-coupled FSRS

Forgetting

Nothing in long-term memory decays or is deleted on its own. forget(id, layer) deletes a memory on request together with what consolidation linked to it (episode ⇄ fact) and its working-memory copies; { cascade: false } deletes only the one memory. Working memory decays exponentially with the minutes since its last decay.

Ebbinghaus retention, personal decay profiles

Consolidation

consolidate() turns each emotionally weighted episode among the 100 most recent into a fact, once.

Sleep replay (selectForReplay, simulateReplay, pruneWeakConnections), simulation-selection loop

Hebbian learning

Not used: core keeps no knowledge graph.

Classic and two-factor Hebbian

Bayesian confidence

Not used.

propagateForRelation and the rest of the module

Context-dependent retrieval

Not used. The includeContext option never had an effect and was withdrawn in 0.5.0.

captureEncodingContext, calculateContextSimilarity

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/algorithms
import {
  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 confidence

Want 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

basic-chatbot.ts

Working Memory + Short-Term Memory for conversation context — no SDK needed

with-claude.ts

An Anthropic Claude assistant that remembers across conversations

with-langchain.ts

ZenBrain as the memory backend of a LangChain agent

with-crewai.ts

Multiple agents sharing Working Memory, with Hebbian strengthening

with-vercel-ai.ts

A memory-aware system prompt for the Vercel AI SDK streamText pattern

with-llamaindex.ts

ZenBrain as long-term memory for a LlamaIndex.TS agent — LlamaIndex keeps the short-term window, ZenBrain decides what outlives it

with-mastra.ts

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.ts

The 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

@zensation/algorithms · source

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

@zensation/core · source

Memory layers, coordinator, adapter interfaces

:white_check_mark: Published

@zensation/adapter-postgres · source

PostgreSQL + pgvector storage adapter

:white_check_mark: Published

@zensation/adapter-sqlite · source

SQLite storage adapter (zero-config)

:white_check_mark: Published

@zensation/mcp · source

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

@zensation/ai-sdk · source

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/algorithms and @zensation/core (core depends only on algorithms) — pure TypeScript, dual ESM + CJS, tree-shakeable subpath exports

  • Reproducible — building from this source produces the same 153-file @zensation/algorithms@0.6.0 tarball published on npm

  • 7-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 build

Research

ZenBrain's architecture and algorithms are documented in an open-access technical disclosure:

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 MemoryCoordinator interface 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/algorithms as 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

License

Apache 2.0 — use it in production, modify it, distribute it. Just keep the attribution.


Available Tools

5 tools
zenbrain_consolidateConsolidate memoryA
Destructive

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.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
prunedYesAlways 0: consolidation deletes nothing from long-term memory.
decayedYesWorking-memory slots removed by decay (relevance at or below 0.01).
promotedYesEpisodes promoted to semantic facts in this pass.

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 memoryA
DestructiveIdempotent

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.

NameRequiredDescriptionDefault
idYesThe id of one result from zenbrain_recall.
layerYesThe layer of that same result, exactly as zenbrain_recall reported it.

Output Schema

NameRequiredDescription
idYes
layerYes
forgottenYesTrue if the memory was deleted, false if the layer held none with that id.
alsoForgottenYesMemories deleted with it: what consolidation linked to it (derived from it, or it from), and working-memory copies.

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 stateA
Read-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.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
coreYesCore memory blocks.
workingYesWorking-memory slots in use and the slot limit.
episodicYesEpisodes stored.
semanticYesFacts stored, and how many are due for spaced-repetition review.
shortTermYesInteractions held in short-term memory.
proceduralYesProcedures stored.

TDQS

A4.7/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 memoriesA
Read-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.

NameRequiredDescriptionDefault
limitNoHow many results to return at most, after ranking (default 10).
queryYesWhat to look for, in plain language.
layersNoRestrict 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).
minScoreNoLeave 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.
minConfidenceNoLeave 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

NameRequiredDescription
countYesHow many memories were returned.
resultsYesMemories sorted by score (0 to 1), highest first; 0 means nothing in that layer matched.
skippedYesRows 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

A4.5/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
typeNoRouting hint. 'auto' (default) decides from the content.
stepsNoOrdered steps of a procedure. Optional: without them the steps are taken from the content (numbered or bulleted lines, otherwise every line).
toolsNoTools a procedure uses.
sourceNoWhere this came from, e.g. 'user', 'ai', 'import'. Kept with facts and episodes.
contentYesThe memory to store, in plain language.
contextNoContext domain, e.g. 'work', 'personal', 'learning'. Kept with episodes only.
outcomeNoWhat the procedure achieves.
confidenceNoHow certain this is (0–1), kept with facts. Above 0.9 routes to core memory unless an earlier routing rule matched.
emotionalWeightNoEmotional 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

NameRequiredDescription
idYesIdentifier of the stored memory.

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

  1. 3 tool updatesv0.6.0
    • Changedzenbrain_forget2 fields changed
      • addedOutput schema / properties / alsoForgotten
        Added 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"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "forgotten",
        -  "id",
        -  "layer"
        -]New value: +[
        +  "forgotten",
        +  "id",
        +  "layer",
        +  "alsoForgotten"
        +]
    • Changedzenbrain_recall4 fields changed
      • changedInput schema / properties / layers / description
        Previous 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)."
      • addedInput schema / properties / minScore
        Added 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"
        +}
      • changedOutput schema / properties / results / description
        Previous 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."
      • addedOutput schema / properties / results / items / properties / duplicates
        Added 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"
        +}
    • Changedzenbrain_store1 field changed
      • changedInput schema / properties / emotionalWeight / description
        Previous 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))."
  2. 3 tool updatesv0.5.2
    • Changedzenbrain_consolidate1 field changed
      • changedOutput schema / properties / decayed / description
        Previous value: -"Working-memory slots decayed."New value: +"Working-memory slots removed by decay (relevance at or below 0.01)."
    • Changedzenbrain_recall3 fields changed
      • changedInput schema / properties / layers / description
        Previous 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)."
      • changedOutput schema / properties / results / description
        Previous value: -"Matching memories, most relevant first."New value: +"Memories sorted by score, highest first; scores are per layer (see the tool description)."
      • changedOutput schema / properties / skipped / description
        Previous 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."
    • Changedzenbrain_store4 fields changed
      • changedInput schema / properties / confidence / description
        Previous 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."
      • changedInput schema / properties / context / description
        Previous value: -"Context domain, e.g. 'work', 'personal', 'learning'."New value: +"Context domain, e.g. 'work', 'personal', 'learning'. Kept with episodes only."
      • changedInput schema / properties / emotionalWeight / description
        Previous 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."
      • changedInput schema / properties / source / description
        Previous 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."
  3. 2 tool updatesv0.5.1
    • Addedzenbrain_forget
    • Changedzenbrain_recall2 fields changed
      • addedOutput schema / properties / results / items / properties / id
        Added value: +{
        +  "description": "Pass it with `layer` to zenbrain_forget to delete this memory.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / results / items / required
        Previous value: -[
        -  "content",
        -  "layer",
        -  "score"
        -]New value: +[
        +  "id",
        +  "content",
        +  "layer",
        +  "score"
        +]
  4. 1 tool updatev0.4.10
    • Changedzenbrain_recall1 field changed
      • changedInput schema / properties / minConfidence / description
        Previous 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."
  5. 2 tool updatesv0.4.9
    • Changedzenbrain_recall4 fields changed
      • removedInput schema / properties / includeContext
        Removed value: -{
        -  "description": "Boost results whose stored context (time of day, weekday, task type) matches the current one.",
        -  "type": "boolean"
        -}
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum results (default 10)."New value: +"How many results to return at most, after ranking (default 10)."
      • changedInput schema / properties / minConfidence / description
        Previous 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."
      • removedInput schema / properties / taskType
        Removed value: -{
        -  "description": "Current task, e.g. 'coding', 'writing'. Only has an effect together with `includeContext: true`.",
        -  "type": "string"
        -}
    • Changedzenbrain_store1 field changed
      • changedInput schema / properties / steps / description
        Previous 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)."
  6. 4 tool updatesv0.1.7
    • Changedzenbrain_consolidate2 fields changed
      • changedOutput schema / properties / promoted / description
        Previous value: -"Episodes promoted to semantic facts."New value: +"Episodes promoted to semantic facts in this pass."
      • changedOutput schema / properties / pruned / description
        Previous value: -"Items pruned below the retention threshold."New value: +"Always 0: consolidation deletes nothing from long-term memory."
    • Changedzenbrain_health1 field changed
      • changedOutput 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"
        +}
    • Changedzenbrain_recall3 fields changed
      • changedInput schema / properties / includeContext / description
        Previous value: -"Boost results matching the current context."New value: +"Boost results whose stored context (time of day, weekday, task type) matches the current one."
      • changedInput schema / properties / layers / description
        Previous 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."
      • changedInput schema / properties / taskType / description
        Previous 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`."
    • Changedzenbrain_store1 field changed
      • changedInput schema / properties / emotionalWeight / description
        Previous 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."
  7. 4 tool updatesv0.1.5
    • First observedzenbrain_consolidate
    • First observedzenbrain_health
    • First observedzenbrain_recall
    • First observedzenbrain_store

TDQS

A4.7/5.0

Scored across 5 tools

Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityActive
ResponsivenessSlow

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    A 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.
    18
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Enables 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.
    6
    1
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Persistent 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
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables 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 npm
    MIT