AgentRecall
Summary: AgentRecall's MCP server gives an agent a persistent, local memory loop — load context at session start, capture facts/decisions mid-session, retrieve past knowledge on demand, verify plans against stored corrections, and save/compound learnings at session end.
session_start— Entry point to call first; loads project memory and cross-project insights.mode: 'lite'returns a ≤500-token briefing,'full'the rich payload;verbosereturns raw JSON.session_end— Explicit save/checkpoint (nothing auto-saves). Takes a requiredsummary(multi-phase aware), plus optionalinsights,trajectory, andopen_phase/close_phaseto update the project's pipeline narrative spine.remember— Mid-session write of a single fact, decision, or insight, optionally routed to a specific room (architecture, blockers, goals, awareness, Q&A log) viacontext.recall— Free-form mid-session search over past memory (keyword + RRF merged results) withlimit,sincefiltering, and afeedbackarray to boost/penalize results for future ranking.check— Validate understanding or gate a risky action before doing it. Passingaction_description(publish/deploy/delete/credential/external send) returns matching corrections with averdictofblockedwhen an authoritative rule overrides the plan; also supports Bayesian decision trails (prior/posterior/evidence).Cross-cutting: everything is scoped per
project(defaultauto), so the agent can load, write, search, and check memory across sessions, projects, and restarts.
Allows importing project context, commit history, and architecture from local Git repositories to bootstrap memory for AI agents.
Supports semantic recall using pgvector on PostgreSQL, enabling efficient similarity search over memory embeddings with RRF scoring.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@AgentRecallsave this discussion about the new feature"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
English · 中文
1. Install the MCP server (Claude Code):
claude mcp add --scope user agent-recall -- npx -y agent-recall-mcpGeneric MCP JSON for other clients:
{ "mcpServers": { "agent-recall": { "command": "npx", "args": ["-y", "agent-recall-mcp"] } } }2. First message of every new session, run the loop:
At the start of a session, call session_start to load context.
When the human corrects you, call remember with type "correction".
At the end of a session, call session_end to compound what you learned.What it does
AgentRecall is two things:
A governed corrections ledger — every time you correct your agent ("no, not that version", "put this section first", "ask me before you assume"), that correction is stored as a structured record with severity, evidence, and outcome tracking. It persists across sessions, projects, and agent restarts.
A measurement instrument — the only open-source system that tracks whether a correction actually changed what the agent does in a later session. Every correction accumulates
retrieved_count, and every time the agent encounters the same situation, the outcome is recorded (heededorrecurred).
No other agent memory tool measures that second step. Every benchmark in the field tests retrieval; none tests behavioral change across sessions. We built the measurement harness first — and we publish what we found, including the unflattering numbers.
Related MCP server: knowledgeplane
Measured, not promised
Most agent memory tools claim "never repeats the same mistake." None of them publish a number for it.
Here is what our own instrument found on our own live corpus (2026-07-03):
Metric | Value | Artifact |
Correction capture recall (dual-blind audit, n=59) | 35.3% [17.3–58.7 CI] |
|
Heed rate, pre-2026-07-03 (instrument-biased upper bound — do not cite) | 92.5% [Wilson 60.1–100] |
|
Heed rate, evidence-grounded (post-reset) | 0/3 events |
|
Correction transfer recall (offline bench, achievable) | 0/4 [Wilson 0–49%] |
|
Median session_start injection | 1,489 tokens (was 2,010; Mem0 anchor ~7K) |
|
p95 session_start latency (warm) | 363 ms (was 1,132) |
|
The heed instrument defaulted to "heeded" absent evidence before 2026-07-03; the reset default is "unknown" — the honest 0/3 is the correct starting point, not a regression. Transfer recall cannot support a point-estimate claim below 39 classes (claim-gate ledger, benchmark spec §2.6).
Verify it yourself: every number above regenerates from the committed artifacts — see docs/eval/REPRODUCE.md.
What this means: we captured 35% of real corrections in our own live use. The heed instrument was biased and we reset it. The offline transfer benchmark scores 0 on our own corpus — which is a density problem (32 active corrections across 19 projects is too sparse to front-run mistakes), not a retrieval architecture problem (confirmed 5× by internal experiments).
The learning loop framing is correct — the system is designed to track whether corrections change behavior — but the data we have so far is insufficient to quantify the uplift. We are publishing the measurement harness and running the experiment.
Why this is different from every other memory tool
In mid-2026, the agent-memory field is crowded (Mem0 ~60K stars, Graphiti/Zep ~28K, Supermemory ~28K, Letta ~24K). Most published benchmark numbers in this space are self-reported on the same 2–3 retrieval benchmarks and are hard to reproduce independently.
The confirmed gap (from our research report docs/research/agent-memory-landscape-2026-07.md §2): no public benchmark measures whether a captured correction changes what a fresh agent does in a new session. LongMemEval, LoCoMo, MemoryAgentBench, Letta Leaderboard — all test retrieval or within-session updates.
AgentRecall owns two pieces of the unclaimed ground:
The corrections ledger — a governed data model (
corrections-export/v1, scrubbed egress, retraction, severity, proof-confidence) that any engine can integrate against.The measurement harness —
predict-loo(leave-one-out, anti-self-confirming, dual denominators) and the correction-transfer benchmark spec (HeedBench v1— provisional name), which implements the missing pipeline: capture → persist → fresh session → measure recurrence.
Benchmark numbers in agent memory are typically self-reported and hard to reproduce. Ours regenerate from a fixed, hash-locked corpus with one command (npm run bench) — including the scores that make us look bad.
Quick Start
Visual setup guide — all 13 clients, copy-paste prompts: open
warroom/install.htmlfrom the repo (or after unzipping the War Room release) in any browser. No server needed.
MCP Server — for AI agents
# Claude Code
claude mcp add --scope user agent-recall -- npx -y agent-recall-mcp
# Cursor — .cursor/mcp.json
{ "mcpServers": { "agent-recall": { "command": "npx", "args": ["-y", "agent-recall-mcp"] } } }
# VS Code — .vscode/mcp.json
{ "servers": { "agent-recall": { "command": "npx", "args": ["-y", "agent-recall-mcp"] } } }
# Windsurf — ~/.codeium/windsurf/mcp_config.json
{ "mcpServers": { "agent-recall": { "command": "npx", "args": ["-y", "agent-recall-mcp"] } } }
# Codex
codex mcp add agent-recall -- npx -y agent-recall-mcpSkill (Claude Code only):
mkdir -p ~/.claude/skills/agent-recall
curl -o ~/.claude/skills/agent-recall/SKILL.md \
https://raw.githubusercontent.com/Goldentrii/AgentRecall-X/main/SKILL.mdSDK & CLI
npm install agent-recall-sdk # JS/TS apps
npx agent-recall-cli recall "topic" # terminal & CIimport { AgentRecall } from "agent-recall-sdk";
const memory = new AgentRecall({ project: "my-app" });
await memory.capture("What stack?", "Next.js + Postgres");
const ctx = await memory.recall("rate limiting");5 Memory Layers
The canonical cognitive-psychology taxonomy mapped to your agent's filesystem:
Layer | Type | What it holds | Path |
1 | Episodic | What happened in each session, chronologically. Auto-written during work. |
|
2 | Semantic | Topic-clustered facts with |
|
3 | Procedural | IF-THEN production rules — reusable how-tos. |
|
4 | Narrative | Project phases: Goal → What was hard → How solved → Synthesis. |
|
5 | Correction | Behavioral calibration: rules the agent must follow, with severity and outcome tracking. |
|
+ | Awareness | Cross-project insights promoted from N-confirmed corrections — the compounding layer. |
|
All layers share one canonical naming grammar so any agent can compose retrieval paths from intent. Existing files keep working via a legacy_path view — no migration needed.
The Session Loop
flowchart LR
A([session start]) --> B["/arstart — open<br/>board → pick → load context"]
B --> C{work}
C -->|need past knowledge| D["/arrecall — search"]
D --> C
C --> E["/arsave — save<br/>journal + compound"]
E --> F([session end])
F -. every K sessions .-> G["/arreflect — consolidate"]
G -.-> ACommand | When | What it does |
| First — every session | OPEN. No args = status board across ALL projects (pending work, blockers) → pick by number → load that project's deep context (palace rooms, corrections, task recall). |
| Last — every session | SAVE. Write journal + palace consolidation + awareness compounding. |
| Mid-session, on demand | SEARCH. Surface past knowledge for the current task — documented fixes, prior decisions, patterns. |
| Every K sessions | CONSOLIDATE. Periodic triage: confirm recurrence/phantom matches, cluster new error classes, propose rule re-abstractions (rule edits stay owner-gated). |
Without
/arstart, a fresh agent has zero orientation. Without/arsave, nothing compounds. Those two are the spine;/arrecalland/arreflectcompound it.
The Automaticity Principle
Memory only compounds if it fires automatically, not on demand. Every pull-channel tool (recall, memory_query) saw zero organic calls across 44 projects over weeks of real use — including from the agent that built them. That is why only 5 tools ship by default; the two-verb model (session_start / session_end) carries all the compounding value, and everything else is opt-in via --full.
Dreaming — Nightly Consolidation (optional)
An autonomous overnight agent that runs while you sleep and compounds everything your sessions wrote during the day.
What it does | Result |
Mine patterns across all projects | Repeated corrections promote to |
Ebbinghaus salience decay | Low-signal rooms fade; your palace stays sharp |
Journal rollups | Entries >30 days compress into summary rooms |
Awareness graduation | Corrections confirmed N× times go cross-project |
Telegram report | Nightly summary: learned · decayed · crystallized |
Requires a live Claude Code login. If the session expires, dream skips with a Telegram alert.
# Fix expired login (run this when dreaming stops)
claude loginDream reports are saved locally to ~/.agent-recall/dreams/YYYY-MM-DD.md.
Semantic Recall — opt-in, 100% local embeddings
Keyword recall cannot reach a memory phrased differently from your question ("semver increment" never matches a rule written as "one version bump per release"). The optional semantic leg closes that gap with a local ONNX embedding model — zero cloud, zero telemetry, and the recall path never touches the network.
ar embeddings setup # one-time: installs the local runtime (~380MB) + downloads the model (~145MB, cached forever)
ar embeddings rebuild # builds the vector index from your store (incremental — only new/changed content embeds)
export AGENT_RECALL_EMBEDDINGS=1 # or add "embeddings_enabled": true to ~/.agent-recall/config.json
ar embeddings status # flag / model / index diagnosticsProperty | Guarantee |
Default | OFF — flag off is byte-identical to keyword-only recall |
Inference | Local ONNX (transformers.js), CPU, ~5-10ms per query warm |
Network | Only |
Packaging | Neither runtime nor model ships in the npm package — installed self-contained under |
Degradation | Missing/corrupt index or model → keyword results, unchanged, with the reason in |
Security | Semantic candidates pass the same trust/scope/fence stages as keyword ones; the index stores content-hash→vector only (no text), so a stale or tampered index cannot inject content |
Measured | Golden retrieval eval 2026-09-12: 75% → 90% top-5 hit-rate, zero regressions (default |
Chinese/English cross-lingual queries work (the model is multilingual — a zh question finds an en rule and vice versa). Re-run ar embeddings rebuild occasionally (or after writing a lot); content-hash keying makes it cheap, and un-indexed new content simply stays keyword-searchable until then.
Experimental: Recurrence & Reflection Harness Kit
The question this answers: does a correction actually change behavior, or does the same mistake come back? A logged correction whose error class recurs after the rule was encoded is a phantom gradient step — the write cost was paid, the behavior never changed.
The kit in experimental/harness-kit/ is a Claude Code harness layer that closes this loop on top of AgentRecall:
Piece | What it does |
| Health digest every session: correction flow, insight promotion rate, loop health, phantom counts, reflection cadence |
| Error-class taxonomy over your corrections; mechanical phantom detection (violation dated after its rule) |
| The four memory verbs (open · save · search · consolidate) as slash commands |
| Periodic triage: confirm provisional matches, cluster new error classes, propose rule re-abstractions — rule edits stay owner-gated |
| Surfaces overdue reflection mid-session — memory pushed to the moment of action, not left to be remembered |
| Warn-only guard for an explicit-model dispatch policy — an example of mechanizing a rule that text alone failed to enforce |
North-star metric: post-re-abstraction phantom rate → 0 for treated classes. First validation run (2026-07-14, one power-user harness): 8 error classes and 18 confirmed phantom gradient steps found in 109 corrections; 6 rules re-abstracted the same day.
Status: experimental. Validated on one harness; Python 3 stdlib only; install steps and caveats in the kit's README. Since v3.4.37 the same phenomenon is also measured natively: failure_class + the cross-project recurrence join.
War Room Dashboard — Download & Deploy
A local-first visual dashboard for your memory: an activity calendar, per-project status, corrections, and insights — all rendered from your local ~/.agent-recall/ data. Fully offline (vendored assets), no Node and no build step.
Download
ar-warroom-v3.4.32.zipfrom the latest GitHub Release.Unzip it, then serve it locally:
cd warroom
python3 -m http.server 8080This is the recommended onboarding for Hermes / OpenClaw / OpenCode users too — one offline page to see everything your agent has learned.
Architecture
TypeScript monorepo, 4 published packages: core (storage + tool logic), mcp-server (thin MCP wrappers), sdk (programmatic API), cli (the ar command). All memory is local markdown under ~/.agent-recall/projects/<slug>/ — journal/, corrections/, and palace/ (rooms, skills, pipeline, awareness). An optional Supabase mirror adds pgvector semantic recall; all-local stays the default.
Retrieval: keyword + RRF (Cormack 2009). FSRS-lite decay (Ebbinghaus → SuperMemo → FSRS-6). A Modern Hopfield re-rank primitive (Ramsauer 2020) is in the codebase but not wired into the default path — what runs today is local keyword/substring matching (stemming + synonym expansion + lightweight IDF, per-source ranking) merged via RRF, plus optional vector search when OPENAI_API_KEY is set. No inverted index or BM25 k1/b tuning — a real BM25 index is a possible future upgrade, not what's running now.
Platform Compatibility
Platform | Mechanism | Status |
Claude Code | MCP server + skill + hooks | Primary |
Cursor · Windsurf · VS Code (Copilot) · Codex | MCP server | Supported |
Any JS/TS app | SDK ( | Supported |
Terminal / CI | CLI ( | Supported |
Links
Full reference → README.full.md
Docs → docs/ — command reference, architecture deep-dives
Changelog → UPDATE-LOG.md — phase-by-phase evolution + design reasoning
Benchmark spec → docs/proposals/2026-07-02-correction-transfer-benchmark-spec.md
Landscape research → docs/research/agent-memory-landscape-2026-07.md
Skill → SKILL.md — Claude Code skill definition
Community → Telegram · GitHub Issues
Contributing
PRs welcome. Open an issue first for anything substantive — the design is opinionated and grounded in published research; we want changes grounded the same way.
License
MIT — see LICENSE.
Available Tools
5 toolscheckCheck UnderstandingA
[MID-SESSION — safe any time; for alignment, before risky decisions] Use when the user asks to validate understanding, verify alignment, or check if their interpretation matches the human's intent. Also call BEFORE a high-risk action — publish, deploy, delete, credential exposure, external send/message, or any other irreversible write — passing action_description (one sentence, what you're about to do). Returns matching corrections/rules/insights plus a verdict: blocked means an authoritative correction OVERRIDES the plan — read it before proceeding. To RECORD a durable human correction, pass human_correction as the STRUCTURED object {rule, why, applies_when} — a plain string is only STAGED for later review, never activated.
| Name | Required | Description | Default |
|---|---|---|---|
| goal | No | The goal or decision question you're checking alignment on. Required for alignment checks; optional when recording a pure decision trail (prior/posterior/evidence). | |
| delta | No | The gap between your understanding and reality (or 'none'). | |
| prior | No | Initial probability estimate (0-1). Start of Bayesian decision trail. | |
| outcome | No | Final decision result: 'confirmed', 'rejected', 'partial', or free text. Triggers decision trail persistence. | |
| project | No | auto | |
| evidence | No | Evidence collected since prior. Each entry shifts probability. | |
| posterior | No | Updated probability after considering evidence (0-1). | |
| confidence | No | How confident you are. Defaults to medium. | medium |
| assumptions | No | Key assumptions you're making. | |
| decision_id | No | Link multiple check calls to the same decision. Auto-generated if not provided. | |
| understanding | No | Alias for goal — use when saying 'check my understanding: X'. Provide either goal or understanding. | |
| human_correction | No | After human responds: what they actually wanted. Pass the OBJECT form {rule, why, applies_when} to activate a durable correction; a plain string is only staged for review. | |
| action_description | No | What you're about to DO, one sentence — pass this before publish/deploy/delete/credential/external-send/irreversible-write actions. Returns matching corrections/rules/insights on the result's `action_check` field, with `verdict: "blocked"` when an authoritative correction overrides the plan. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden and does so well: it explains that `verdict: blocked` means an authoritative correction overrides the plan, and that a plain-string human_correction is only staged while the object form activates a durable rule. These are non-obvious operational consequences that an agent cannot infer from the schema alone. It omits any statement of side effects of the decision-trail mode or error behavior.
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 a bracketed timing tag ('MID-SESSION — safe any time') before the prose, so the agent gets the when first. It is dense and longer than most, and the action_description guidance partly repeats the schema text, but nearly every sentence carries actionable routing or semantics.
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 13-parameter tool with no annotations and no output schema, the description covers the alignment and pre-action modes thoroughly and describes the return payload (corrections/rules/insights plus verdict). However, the Bayesian decision-trail feature (prior/posterior/evidence/decision_id/confidence/assumptions/outcome) is essentially undocumented in the description, leaving a large chunk of the tool's surface explained only by 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 92%, so the schema already documents most parameters (baseline 3), but the description adds real value beyond it: it specifies that action_description should be one sentence of what you're about to DO, and draws the critical distinction between the string form (staged) and the structured {rule, why, applies_when} form (activated). That meaning is not fully conveyed by the schema's own descriptions.
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 states a specific verb ('check') against a concrete resource (alignment/understanding with human intent) and enumerates the situations that trigger it. It clearly distinguishes its role from the sibling memory tools by framing itself as a validation gate. The only blur is that it also silently carries correction-recording and decision-trail modes, which muddies the single-purpose framing.
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?
It gives explicit trigger conditions: user asks to validate/verify understanding, and pre-action checks before publish/deploy/delete/credential/external-send. It even points at session_start's pending_corrections for resolving staged items. It stops short of stating when NOT to use this versus remember/recall, so it is clear-but-not-exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recallRecallA
[RETRIEVE — use freely, any time] Use when the user asks to recall, search, find, or look up previous memory, context, or decisions.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results after RRF merge. | |
| query | Yes | What to search for. | |
| since | No | ISO date ("2026-05-01") or relative duration ("7d"). Filters journal results. | |
| project | No | auto | |
| feedback | No | Rate previous recall results to improve future ranking. Pass {id, useful:true} for each result you actually used; {id, useful:false} for noise. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It only states the tool's purpose and that it can be used freely. It does not mention side effects, authentication needs, rate limits, or any constraints beyond being a retrieval operation. This is insufficient for a tool with multiple parameters.
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?
The description is extremely concise—a single line with a tag and purpose statement. It is front-loaded with the retrieval tag and immediately useful information. No wasted words.
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?
Despite having 5 parameters (1 required) and no output schema, the description provides no context about the feedback mechanism, the 'since' parameter, or the limit parameter. It does not explain the return format or behavior for complex queries. The description is too sparse for the tool's complexity.
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 schema coverage is 80%, meaning most parameters have descriptions. The tool description adds no additional meaning beyond the schema; it only describes the overall purpose. Baseline for high coverage is 3, so no extra credit for parameter insights.
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 clearly states the tool's purpose: to recall, search, find, or look up previous memory, context, or decisions. It uses specific verbs and identifies it as a retrieval operation, distinguishing it from siblings like 'remember' (likely for storage). The tag '[RETRIEVE — use freely, any time]' reinforces its role.
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?
The description provides explicit when-to-use guidance: 'Use when the user asks to recall, search, find, or look up previous memory, context, or decisions.' It also includes the tag 'use freely, any time,' implying no restrictions. However, it does not mention when not to use or explicitly name alternatives, though sibling tools suggest boundaries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rememberRememberA
[MID-SESSION WRITE — single fact/decision; saying it is not saving it] Use when the user asks to remember, store, note, or save a specific decision, fact, or insight.
| Name | Required | Description | Default |
|---|---|---|---|
| content | Yes | What to remember. | |
| context | No | Routing hint. Values: 'architecture' or 'decision' → palace/architecture room. 'blocker' or 'blocked' → palace/blockers room. 'goal' → palace/goals room. 'lesson' or 'insight' → awareness. 'qa' or 'capture' → Q&A log. Omit for auto-classification. Note: bug/fix/error content previously routed to standalone knowledge/ dir now routes to journal (purity-census-2026-07-05: knowledge/ is write-only, not surfaced by recall or session_start). | |
| project | No | auto |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must disclose behavior itself. It does note it is a write and that 'saying it is not saving it,' which is a valuable behavioral insight. However, it omits details about side effects, persistence scope, or potential errors, relying on schema routing hints for additional context.
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?
The description is a single front-loaded sentence with a parenthetical qualifier. It is concise, informative, and avoids redundancy, earning its place without unnecessary 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 simple write tool with no output schema, the description and schema collectively cover the core invocation steps, including trigger phrases and routing. However, the undocumented project parameter and lack of confirmation/return behavior leave minor gaps.
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 schema provides descriptions for content and context (67% coverage), with the context parameter richly documented through routing hints. The project parameter has no description and the tool description does not explain it, leaving a noticeable gap in parameter understanding.
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 explicitly identifies this as a MID-SESSION WRITE for a single fact or decision, and lists specific trigger phrases ('remember, store, note, save'). It distinguishes itself from likely read or session siblings by focusing on persistence of a specific item.
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?
The description gives clear usage guidance with concrete triggers ('Use when the user asks to remember, store, note, or save a specific decision, fact, or insight.'). It does not provide when-not-to-use exclusions or alternatives, but the context is unambiguous for a write operation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
session_endEnd SessionA
[ON SAVE/EXIT — YOU must call this; nothing auto-saves] Use when the user asks to save, checkpoint, summarize, end, retain, or persist the current session. Optionally pass close_phase / open_phase to update the project pipeline narrative spine in the same call.
| Name | Required | Description | Default |
|---|---|---|---|
| project | No | auto | |
| summary | Yes | What happened this session. Simple session: 2-3 sentences. Multi-phase session: one paragraph per completed phase (e.g. 'Phase 1 — Name: what happened. Phase 2 — Name: what happened. Decisions: X. Blockers: Y.'). Never compress a multi-phase session to 2 sentences — it makes the journal useless. | |
| insights | No | Insights learned this session. | |
| open_phase | No | Open a new pipeline phase as part of this save (e.g. when a watershed session pivots into the next strategic direction). | |
| trajectory | No | Where is the work heading next. | |
| close_phase | No | Close the currently active pipeline phase as part of this save. Provide all three reflection fields explicitly — never auto-generated. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It discloses the critical behavioral trait 'nothing auto-saves; you must call this', which is vital for correct invocation. It also reveals the optional pipeline update capability. However, it does not describe idempotency or error conditions.
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?
Two sentences with no waste. The first sentence is an imperative warning that front-loads the most critical behavioral instruction. The second sentence concisely describes optional parameters. Every word earns its place.
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?
No output schema, so description should cover return values or side effects. It mentions that the tool persists session state and optionally updates the pipeline narrative, but does not state what the tool returns (e.g., confirmation) or whether it fails silently. The description is adequate for a simple end-point but lacks full closure.
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 83%, so baseline is 3. The description adds minimal meaning beyond existing schema descriptions—it mentions that close_phase/open_phase update the 'project pipeline narrative spine', but the schema already explains their purpose. The extra context is helpful but not substantial enough to raise the score.
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 clearly states the tool ends a session and must be called on save/exit. It lists specific triggers like 'save, checkpoint, summarize, end, retain, or persist' which distinguishes it from sibling tools like session_start (opposite) and check/recall/remember (retrieval-focused). The verb 'End' and resource 'Session' are precise.
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?
The description explicitly states when to use the tool (when user asks to save/end/etc.) and mentions an optional feature (close_phase/open_phase) available in the same call. It does not include explicit when-not-to-use statements, but the context of session ending is clear given sibling names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
session_startStart SessionA
[ENTRY — call FIRST, before acting] Use when the user asks to start, load, continue, resume, or open memory for a project. Set mode='lite' for a ≤500-token briefing (good for fresh conversations where the agent will pull memory on demand via recall()).
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | 'lite' = ≤500-token sketch; agent must pull on demand. 'full' = current rich payload. | full |
| context | No | Optional context for matching cross-project insights | |
| project | No | auto | |
| verbose | No | Set true to get full JSON context instead of terse summary |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of behavioral disclosure. It reveals that the tool is an entry point and explains lite mode's ≤500-token briefing behavior, but it does not state what 'full' actually returns beyond schema hints, nor any side effects like session state resets. Some context is added, but gaps remain.
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?
The description is a single, dense paragraph with the critical instruction front-loaded in brackets. Every clause earns its place: entry order, trigger phrases, and lite mode trade-off. No fluff or repetition of schema fields.
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 session-start tool with no output schema, the description covers the essential context: when to call, what it does, and mode behavior. It lacks explicit mention of return value or project auto-selection, but the schema covers those parameters, and the lite/full distinction implies the output payload. Good enough for a tool with four optional params and no nested objects.
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?
Despite 75% schema description coverage, the description adds significant semantic value by explaining when to choose mode='lite' and tying it to recall(). The context and verbose parameters are left to the schema, but the mode guidance elevates the description above the baseline schema detail.
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 opens with '[ENTRY — call FIRST, before acting]', clearly identifying the tool as the session initialization entry point. It specifies exact user intents ('start, load, continue, resume, or open memory') and distinguishes it from siblings like recall and remember.
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 instructs to call FIRST before acting, defines when to use it (user asks to start/load/continue/resume/open memory), and provides a concrete use case for mode='lite' in fresh conversations, even referencing recall() as an alternative for on-demand memory retrieval.
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 tool update
v3.4.50- Changed
check3 fields changed- added
Input schema / properties / human_correction / anyOfAdded value: +[ + { + "description": "LEGACY string form — STAGED to the pending-review store, NOT activated. Prefer the object form.", + "type": "string" + }, + { + "description": "STRUCTURED correction — the ONLY form that reaches the active corrections ledger. Incomplete input is rejected with an agent_instruction explaining the fix.", + "properties": { + "applies_when": { + "description": "1-5 REAL context keywords (topics/domains, e.g. [\"git\",\"deploy\"]) — sentence fragments are rejected.", + "items": { + "type": "string" + }, + "type": "array" + }, + "pending_id": { + "description": "Id of a staged pending correction (from session_start's pending_corrections or a prior check result) — resolves it: promoted with a valid {rule,why,applies_when}, or discarded with resolution:'reject'.", + "type": "string" + }, + "resolution": { + "description": "With pending_id: 'promote' (default; requires valid rule/why/applies_when) or 'reject' (discards the staged item; `why` doubles as the reject reason).", + "enum": [ + "promote", + "reject" + ], + "type": "string" + }, + "rule": { + "description": "ONE imperative, self-contained sentence stating the durable behavior (e.g. \"Never publish without explicit owner approval\"). Questions/status statements are rejected.", + "type": "string" + }, + "why": { + "description": "Concrete evidence behind the rule — what happened or what the human said. Required for activation.", + "type": "string" + } + }, + "type": "object" + } +] - changed
Input schema / properties / human_correction / descriptionPrevious value: -"After human responds: what they actually wanted (or 'confirmed')."New value: +"After human responds: what they actually wanted. Pass the OBJECT form {rule, why, applies_when} to activate a durable correction; a plain string is only staged for review." - removed
Input schema / properties / human_correction / typeRemoved value: -"string"
3 tool updates
v3.4.40- Added
check - Added
remember - Added
session_start
3 tool updates
v3.4.38- Removed
check - Removed
remember - Removed
session_start
5 tool updates
v0.1.0- First observed
check - First observed
recall - First observed
remember - First observed
session_end - First observed
session_start
TDQS
Scored across 5 tools
Tools map to distinct memory lifecycle phases, and descriptions provide explicit trigger conditions. However, `check` overlaps with both `recall` (retrieval) and `remember` (recording), which could cause occasional misselection despite detailed guidance.
Names are all lowercase snake_case, but the pattern is mixed: `check`, `recall`, and `remember` are bare verbs, while `session_start` and `session_end` use a noun_verb structure. Still readable, but not a uniform convention.
5 tools is well-scoped for a memory system, covering entry, retrieval, validation, recording, and exit without redundancy or bloat.
The lifecycle covers start, recall, remember, check, and end, but lacks an explicit delete/forget operation or a way to update existing memories (beyond corrections via `check`). Minor gap agents can work around.
Maintenance
Related MCP Connectors
An MCP memory server. One memory your agents share — across models, devices and apps.
Persistent personal memory for AI assistants — save, search, and recall across every MCP client.
- EngramOAuthapp.getengram
Persistent, verbatim, searchable memory for AI assistants — one memory across every MCP client.
- memnodeOAuthdev.memnode
Persistent, inspectable memory for AI agents with lineage, correction, and a hosted MCP endpoint.
Related MCP Servers
- AlicenseAqualityCmaintenanceMCP server for long-term agent memory, providing persistent memory, searchable knowledge, and evolving identity for AI agents.53Apache 2.0
- FlicenseNot gradedqualityCmaintenanceMCP server that gives AI agents and teams persistent, shared memory using a knowledge graph with vector embeddings, automatic consolidation of related facts, and hybrid search.3-
- AlicenseNot gradedqualityCmaintenanceMCP server that provides AI agents with persistent memory, cross-agent sharing, and context management, enabling them to remember conversations, track complex tasks, and evolve skills across tools.2MIT
- AlicenseAqualityDmaintenanceMCP server for persistent, semantic memory across AI sessions; store context, decisions, and learnings and recall them with natural language search.227 npmMIT