Skip to main content
Glama

jevmem

Long-term memory for AI agents that costs fractions of a cent, never calls an LLM, and cleans up after itself.

CI PyPI License: MIT Python 3.12+ Status: beta

Your agent forgets everything when the session ends. Most memory add-ons fix that by asking a big LLM to summarise, tag, deduplicate and re-rank on every write and read: slow, expensive, and one more thing that can hallucinate. jevmem takes the approach of the Jev-Mem paper (Jev-Mem: System-One-Controlled Agentic Memory for Efficient AI Agents): split the work.

  • System One (fast, cheap): Jev answers typed questions with probabilities. Is this note safe? what kind is it? does it contradict an older one? which notes matter for this question? is that enough yet?

  • System Two (slow, smart): your agent (Claude) writes the notes, synthesises patterns and answers.

jevmem is the memory layer built on that idea: an MCP server, Claude Code and Cursor configs, hooks and skill, a CLI and a Python library on top of one SQLite file. Install it from PyPI: pypi.org/project/jevmem.

architecture

Why you would want it

Your agent stops repeating itself. "We never use pip here", "the month-end job moved to 22:00 because the warehouse was downsized", "that flaky test is a timezone bug": decisions, gotchas and preferences survive across sessions and are injected when they matter, not dumped into every prompt.

It is cheap and fast enough to run on every prompt. A recall is about one Jev call (~0.25 s) in the common case, roughly $0.0002 in the heavy case, and zero generative tokens. A hook can decide per prompt whether memory is needed at all, and inject nothing when it is not.

It sends less, and the right thing. Plain vector search returns five notes and hopes. jevmem judges relevance, follows links between notes to find the why behind a fact, and returns one to three:

recall results

It knows when it does not know. Recall reports sufficient: false instead of returning five plausible notes for a question memory cannot answer (abstains on 94-98% of unanswerable questions), so the agent looks in the code instead of guessing.

Memory that stays clean. Newer facts supersede older ones, duplicates collapse, repeated episodes become proposals for a general rule that the agent writes. Nothing is deleted behind your back: stale notes just rank lower.

Safe by construction. Every write is screened: credentials are rejected, prompt-injection text aimed at the agent is rejected, near-duplicates are rejected, and "next step is X" status notes (which rot silently) are rejected too. Recalled notes are always presented to the agent as data, never as instructions.

Git-aware. Notes remember the branch and commit they were written on. All worktrees of a repository share one memory; notes from an abandoned branch rank lower.

It never gets in the way. Everything fails open: if Jev is down, hooks inject nothing and recall degrades to hybrid search. Your agent never blocks on its memory.

It scales down and up. Zero setup on a laptop (one SQLite file, in-RAM exact search). When you outgrow it, point JEVMEM_INDEX at Qdrant, LanceDB or Postgres/pgvector (sqlite-vec takes over automatically past 100k notes): SQLite stays the source of truth and the index is a rebuildable copy.

What it adds to an agentic workflow

Without jevmem

With jevmem

Re-explain conventions every session, or paste them into CLAUDE.md forever

Decisions and gotchas are recalled by relevance, and old ones retire themselves

Vector top-k: five notes, some stale, some contradicting each other

One to three notes, superseded facts filtered, the causal "why" attached

An LLM in the memory loop: slow, costly, nondeterministic writes

Typed probabilities from a small model; thresholds in code, tuned on data

Memory poisoning goes unnoticed

Injection, secrets, duplicates and status rot are screened at write time

"I don't remember" is indistinguishable from "here are five loosely related notes"

An explicit sufficient / missing signal

Multi-agent setups share nothing, or everything

Shared project: scope plus private agent: scopes

It also ships a small Judge API (route a task to the right agent, prune tool output, screen untrusted text, decide when to stop) for using the same cheap typed decisions outside memory. See Python library.

Related MCP server: rekal

How it works in 60 seconds

  1. Write: your agent calls memory_write("On 2026-05-15 we moved the month-end job to 22:00 because the warehouse was downsized to Medium"). Code rejects secrets and duplicates; one batched Jev call types the note and screens it for injection and status rot; a second call links it to related notes. (write path)

  2. Recall: a later question, "why does the month-end job run at night?", is answered by lite mode (one call), escalating to full mode (route, graph expansion, stop check) only when it looks multi-hop or temporal. The graph edge from the job note to the warehouse note finds the cause even though they share no words. (recall path)

  3. Hooks inject pinned notes and the strongest conventions at session start, and relevant notes per prompt, with no effort from the agent. (hooks)

  4. Consolidate: every 20 writes, Jev compares new notes with their neighbours and flags what is superseded, duplicated or repeated. (consolidation)

write pipeline recall pipeline session flow

Quickstart

You need Python 3.12+, uv, an MCP host (Claude Code or Cursor), and a decision model: either a TypeSafe API key for hosted Jev (currently waitlisted, what the results were measured with) or a local or third-party model, which needs no key.

Create your settings file once; it holds the key (and, if you want, the database path) for every project and editor, and the CLI, MCP server and hooks read it automatically. It lives in ~/.jevmem/config.jsonc (Windows: %USERPROFILE%\.jevmem\config.jsonc), outside every repository:

uvx jevmem config init --api-key "..."     # omit --api-key to be prompted (hidden), or to skip it for a local model

Claude Code

claude mcp add --scope user jevmem -- uvx --from jevmem jevmem-mcp

No clone needed: uvx fetches jevmem from PyPI. Notes go to a per-project scope (project:<repository name>, found from the folder the agent works in) unless the agent says global (for personal preferences that apply everywhere) or you set -e JEVMEM_SCOPE=.... Recall searches the project plus global.

Cursor

Add a user-wide server in %USERPROFILE%\.cursor\mcp.json (Windows) or ~/.cursor/mcp.json (macOS/Linux), or a project file at .cursor/mcp.json.:

{
  "mcpServers": {
    "jevmem": {
      "type": "stdio",
      "command": "uvx",
      "args": ["--from", "jevmem", "jevmem-mcp"]
    }
  }
}

This repo already ships .cursor/mcp.json for working on jevmem itself. Reload MCP in Cursor after saving (Customize → MCP), then confirm memory_write / memory_recall appear under Available Tools.

The default install is the one the results were measured with: it includes a small local embedding model (fastembed, ONNX, no API) and the sqlite-vec index. The model (about 70 MB) downloads on first use, so run uvx --from jevmem jevmem warmup once while online. Optional vector backends (jevmem[qdrant], [lancedb], [pgvector], [all]) and the lighter JEVMEM_EMBEDDER=hash opt-out are in the installation guide.

Then ask the agent to remember something ("remember that we deploy through ops/deploy.sh, never by hand") and, in a new session, ask how to deploy. For the full experience:

  • copy the jev-memory skill to ~/.claude/skills/ (Claude Code) or use this repo's .cursor/skills/jev-memory/ (Cursor);

  • add the two Claude Code hooks for automatic injection (snippet);

  • seed it from what you already have: uvx jevmem import-claude-memory or uvx jevmem import-markdown AGENTS.md.

Windows notes (paths, PowerShell, Cursor, no-bash MCP launch): see installation § Windows and Cursor.

Using a local or third-party model

jevmem only needs a server that speaks Jev's /v1/systemone API, so any compatible model works in place of hosted Jev, and the api_key in your settings file is not needed then. Example with jevk5:4b, run locally through ollaya (a runner for decision models; install it from there):

ollaya pull jevk5:4b      # one-time download, 4.5 GB
ollaya serve              # leave running; listens on http://localhost:11435
ollaya ps                 # after the first call: check the model is on cuda, not cpu (about 5.5 GB of VRAM)
ollaya stop               # when you are done: unloads the models and stops the server

Then point jevmem at the server and name the model:

claude mcp add --scope user jevmem \
  -e JEVMEM_BASE_URL=http://localhost:11435 -e JEVMEM_MODEL=jevk5:4b \
  -- uvx --from jevmem jevmem-mcp

Env var

Purpose

JEVMEM_BASE_URL

the server's address; setting it switches jevmem off hosted Jev

JEVMEM_MODEL

model name to ask for (the server's default if unset)

JEVMEM_API_KEY

only if that server wants a key. TYPESAFE_API_KEY is never sent to a custom address

JEVMEM_TIMEOUT

seconds per call (default 60); raise it for a slow model on CPU

Put them in ~/.jevmem/config.jsonc (base_url, model, api_key, timeout) instead of -e flags if you prefer. Run the model on its own: with a GPU shared with another model it can silently fall back to CPU, which is much slower. Things to know before relying on one:

  • Thresholds are calibrated for hosted Jev. A model that scores differently needs its own cutoffs (Config); rerun jevmem eval and jevmem eval-injection against it before trusting the screens.

  • Recall makes batched calls (up to ~30 questions per request). A model with a short context rejects them and recall quietly falls back to plain vector search.

  • Measured so far: jevk5:4b on a local GPU is usable for recall but trims much less context than Jev and is a weaker injection and conflict screen; laya is not suitable. Numbers in docs/evaluation.md.

To work on the code, git clone this repo and uv sync. Full setup, every environment variable, the CLI and the hooks: docs/installation.md.

Use it with a memory bank

jevmem is a supplement to a markdown memory bank, not a replacement. Keep current state (focus, blockers, next steps) in a few git-tracked files the agent reads whole each session, so it follows the branch and shows in PR diffs; keep the dated facts that stay true (decisions with reasons, bug causes, gotchas, preferences) in jevmem, where they are recalled by relevance. Rules stay in AGENTS.md / CLAUDE.md. Never put "next step is X" in jevmem: it goes stale silently, and memory_write rejects it.

If you do not have a memory bank yet, memory-bank is a ready-made one: an Agent Skill plus templates for Claude Code and Cursor, written to work alongside jevmem.

npx skills add illescasDaniel/memory-bank

Results

Measured live against Jev on small datasets we built ourselves, with real embeddings (bge-small). They are indications, not benchmarks; methodology, datasets and caveats are in docs/evaluation.md.

vector top-5

jevmem

Recall, held-out notes (41 questions)

0.86

0.99

Recall, LoCoMo slice, 9 conversations (272 questions, never used for tuning)

0.70

0.89 (lite: 0.84 for ~1/5 of the Jev tokens)

Recall, 57 real commit-history notes

0.90

1.00

Multi-hop questions, LoCoMo slice (conv-26)

0.20

0.70

Notes sent to the agent per question

5

1.4 to 2.3

Unanswerable questions correctly flagged

never

94-98%

auto mode vs full mode, pooled over 466 questions

same recall (0.911 vs 0.910) for ~40% fewer Jev tokens

Consolidation, labelled stale/duplicate pairs, held out

44/44 right (22/44 before the rework), no false flags

Write-time screens

0 false captures on 123 real prompts; 0 of 10 injections missed (regression set, tuned on itself)

Documentation

Installation and configuration

setup, Windows/Cursor, env vars, tools, CLI, hooks, skill, indexes

Architecture

write, recall, hooks, consolidation, scopes, Python API, code layout

Concepts

Jev, System One/Two, embeddings, vector search and databases, explained from scratch

Evaluation

methodology, datasets, every number above, caveats, 1M-note benchmark

Known limitations

what is weak, honestly, and what we would try next

Changelog

what changed

Status

Beta (v0.4.0). Core library, MCP server and CLI, Claude Code / Cursor configs, skill and hooks, consolidation, an evaluation harness and pluggable vector indexes are in and tested (uv run pytest; CI runs Linux, macOS and Windows on Python 3.12 and 3.13). Expect rough edges: the tuning data is small and mostly from one project, and Jev itself is a waitlisted hosted service. Issues and experience reports are very welcome, especially from projects that are not ours.

Credits and license

Based on Jev-Mem: System-One-Controlled Agentic Memory for Efficient AI Agents (Jiang, Li and Li, arXiv:2609.23986). Typed decisions by Jev from TypeSafe. This project is not affiliated with the paper's authors or TypeSafe.

MIT, see LICENSE.

Available Tools

11 tools
memory_consolidateA

Run a consolidation pass now (also runs automatically every 20 writes). all_notes=True re-judges every stored note from scratch (slow: one Jev call per note); use it once after upgrading jevmem.

ParametersJSON Schema
NameRequiredDescriptionDefault
all_notesNo

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It usefully discloses automatic cadence and the cost/latency of all_notes=True (one Jev call per note). It does not say what consolidation actually does to stored notes, whether it merges/rewrites/drops anything, or whether it is reversible.

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?

Two dense sentences, front-loaded with the action, followed by cadence and parameter guidance. Slightly jargon-heavy ('Jev call', 'jevmem') but nothing wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers trigger, cadence, cost, and the single parameter, which is enough to invoke it. However, with no annotations and no output schema, the description omits the effect of consolidation on stored memory and any indication of what the pass returns, leaving a mutation-adjacent tool under-described.

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 description coverage is 0%, so the description must compensate, and it does: it explains that all_notes=True re-judges every stored note from scratch, that it is slow, and when to use it. Only the default (false) behavior is left implicit.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource: 'Run a consolidation pass now.' The parenthetical about automatic runs clarifies scope. It does not differentiate itself from siblings like memory_flush_pending or memory_pending_synthesis, which an agent might reasonably confuse with 'consolidation'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a clear condition for the non-default path ('use it once after upgrading jevmem') and the cadence context (auto-runs every 20 writes) implies manual invocation is optional/on-demand. No explicit when-not-to-use and no named alternatives among the many memory_* siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

memory_dismissC

Reject a merge/promote proposal.

ParametersJSON Schema
NameRequiredDescriptionDefault
synthesis_idYes

TDQS

C2.6/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden, yet it says nothing about whether rejection is permanent, whether it discards the proposal or merely defers it, what permissions are needed, or what happens to the underlying memory. Only the bare mutation intent is communicated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler, which is structurally clean. However, at one short clause it is arguably undersized for a destructive state-changing tool, so the brevity is as much under-specification as conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with one undocumented parameter, no annotations, and no output schema, the description is too thin: an agent cannot determine side effects, reversibility, or where the synthesis_id comes from. The missing pieces are exactly the ones the description would have to supply.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the sole parameter, synthesis_id, is undocumented in both schema and description. The phrase 'merge/promote proposal' loosely implies the id targets a proposal, but the description never explicitly maps the parameter to it or states its format/source.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb ('Reject') and a clear object ('a merge/promote proposal'), so the agent knows this is a state-changing rejection of a pending proposal. It does not, however, use the term 'synthesis' that appears in the parameter and sibling names, so the link to memory_pending_synthesis/memory_resolve is left implicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to reject versus when to use memory_resolve, memory_consolidate, or memory_pending_synthesis, and no prerequisites or preconditions are stated. The agent must infer usage purely from the one-line purpose.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

memory_flush_pendingB

Retry writes queued while Jev was unreachable.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It indicates a retry of queued mutations but says nothing about idempotency, what happens to the queue on failure, whether it blocks, or what errors surface — significant gaps for a write-side recovery tool.

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?

A single short sentence front-loaded with the action verb; nothing is wasted. It is arguably too terse for a mutation tool, which caps it below 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

A zero-param tool with no output schema is simple enough to describe briefly, but with no annotations and no return-value detail, an agent lacks information about outcomes, failure modes, or post-condition state.

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 there is nothing for the description to disambiguate. Baseline 4 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (retry) and resource (writes queued during an outage), so an agent can tell it is about flushing a backlog rather than writing new data. It does not explicitly contrast itself with memory_write or memory_pending_synthesis, but the purpose is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'while Jev was unreachable' implies the triggering condition, giving implicit usage context. However, it never names an alternative (e.g., memory_write) or states when not to call it, so the routing decision is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

memory_forgetC

Delete a memory and its edges.

ParametersJSON Schema
NameRequiredDescriptionDefault
node_idYes

TDQS

C2.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It does disclose one useful trait – that deletion cascades to 'its edges' – but says nothing about irreversibility, required permissions, whether the node must exist, or what is returned on success/failure.

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?

A single tight sentence with the destructive action front-loaded and no filler. It is efficient, though arguably under-specified rather than genuinely concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive, non-read-only operation with no annotations, no output schema, and an undocumented sole parameter, the description is too thin. It omits the information an agent most needs before calling it: that the delete is permanent, and what identifier form node_id expects.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the description never mentions node_id. It also introduces a terminology mismatch, calling the target 'a memory' while the schema parameter is 'Node Id' (integer), leaving an agent unsure whether it passes a memory identifier or a graph node identifier.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Delete') and resource ('a memory') and adds a scope detail ('and its edges') that distinguishes it from a mere unlink. However, it never names a sibling such as memory_dismiss or memory_consolidate, so an agent must infer which of the many memory-mutating siblings this is for.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No when-to-use guidance at all. With siblings like memory_dismiss, memory_resolve, and memory_consolidate all plausibly removing or altering memories, the description gives no condition for choosing memory_forget over them, nor any prerequisite.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

memory_listB

List stored memories (newest first) with their top memory types.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
scopeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It does disclose ordering (newest first) and the shape of returned content ('top memory types'), which is useful behavioral context, but it says nothing about pagination, how limit interacts with the ordering, what 'scope' filters, or whether this is a pure read operation.

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?

A single sentence with zero filler, and the most decision-relevant detail (newest first) is front-loaded. Nothing to trim.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/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 need no explanation, but two parameters are completely undocumented and there are no annotations. For a list tool with a nullable 'scope' argument and a defaulted 'limit', the definition leaves the agent guessing at invocation semantics.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description explains neither parameter. 'limit' (default 30) and 'scope' (nullable string) are undocumented in both places, so the agent cannot tell what scope accepts or how limit bounds the result set. The ordering hint is output-related, not parameter-related.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb ('List') and resource ('stored memories') plus the ordering (newest first) and the returned content (top memory types). It is clear on its own, but it never differentiates itself from siblings like memory_recall or memory_stats, so an agent must infer which listing tool to pick.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use guidance and no named alternative among the ten sibling tools. The phrase 'list stored memories' implies a browse/inventory use case, but nothing tells the agent when to prefer this over memory_recall.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

memory_pending_synthesisA

Merge/promote proposals from consolidation. YOU are the writer: for each item follow instruction, then call memory_resolve(synthesis_id, text), or memory_dismiss if the proposal is wrong.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must carry the full behavioral burden. It usefully discloses that the agent is the writer and that output items carry an `instruction` field to follow, but it never states whether calling this tool mutates state, whether items persist across calls, or whether the operation is idempotent.

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?

Two tight sentences with the core action front-loaded and the workflow instruction immediately after. The backtick-quoted `instruction` and the dense slash in 'Merge/promote' cost a little clarity, but nothing is wasted.

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?

An output schema exists, so return values need not be explained, and the description covers the workflow an agent must execute. The remaining gap is that it never states where synthesis_id or the pending items come from, forcing the agent to infer the entry point.

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 baseline is 4. The description does add context by naming the arguments the downstream calls require (synthesis_id, text), which helps the agent understand the data flow even though there is nothing to document on this tool itself.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: merge/promote proposals produced by consolidation. It distinguishes itself from memory_consolidate by describing the post-consolidation promotion step, though the phrasing 'merge/promote' is slightly ambiguous about whether the tool returns items or performs the merge itself.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes the agent: for each item follow `instruction`, then call memory_resolve(synthesis_id, text), or memory_dismiss if the proposal is wrong. It names the alternative tool and the condition that selects it. It does not say when to prefer this over memory_flush_pending or memory_consolidate, so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

memory_pinA

Pin (or unpin) a note the user wants in every session; SessionStart injects pinned notes first.

ParametersJSON Schema
NameRequiredDescriptionDefault
pinnedNo
node_idYes

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations present, the description carries the full burden, and it delivers a key downstream behavior: SessionStart injects pinned notes first. That tells the agent the real effect of pinning and the injection ordering. It still omits persistence/permission semantics, but the core behavioral payoff is disclosed.

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?

A single tight sentence with the action front-loaded and the downstream effect attached. Every clause earns its place with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter tool with no output schema, the description covers purpose and effect reasonably. The gap is the unexplained required node_id and no mention of what happens for an invalid id or whether pinning is idempotent, which a 0%-coverage schema leaves the description responsible for.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It does clarify the 'pinned' boolean by framing the tool as pin-or-unpin, but the required node_id parameter is never mentioned or explained, leaving the most important argument undocumented in both schema and description.

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 (pin/unpin) on a specific resource (a note), and the parenthetical 'or unpin' immediately clarifies the bidirectional nature. The pinning operation is distinct from siblings like memory_write and memory_recall, so an agent can select it without ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'the user wants in every session' implies the selection criterion for pinning, which is useful context. However, it names no alternatives (e.g., memory_write for one-off notes) and gives no explicit when-not guidance, so routing is left partly to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

memory_recallA

Adaptive recall. Check sufficient/missing: if sufficient is false, the memory may lack the answer, so verify in code/docs rather than assuming. Searches scope plus global. mode: "auto" (default: lite first, escalates to full when lite finds nothing or the question looks multi-hop/time-related; stop_reason says which ran), "full" (always multi-hop graph expansion: use it when you know the answer joins several facts) or "lite" (vector top-20 + one Jev call that filters them and judges sufficiency: ~4x cheaper than full, no multi-hop).

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNo
queryYes
scopeNo
max_itemsNo

TDQS

A3.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden and does so richly: it explains the adaptive escalation logic for `auto`, the cost/multi-hop trade-offs of `full` vs `lite`, the ~4x cheaper lite path, and the `sufficient`/`missing` and `stop_reason` return signals. This is unusually thorough disclosure for a memory tool.

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?

The description is compact and front-loads the core idea ('Adaptive recall'), then layers conditionals and mode semantics without excessive padding. The dense parenthetical for `auto` is information-rich, though the overall flow could be slightly better structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with no annotations, no output schema, and four parameters at 0% schema coverage, the description is only partially complete. It covers behavior and mode selection well but omits any explanation of `max_items`, the full return shape beyond `sufficient`/`missing`/`stop_reason`, and does not explicitly route the agent away from sibling list/stats tools.

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 0%, so the description must compensate. It thoroughly explains `mode` and mentions `scope` (searches scope plus global), but leaves `max_items` (default 8) entirely unexplained and does not clarify `query` formatting. Partial compensation across four undocumented parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening 'Adaptive recall' names the operation and resource, and the following sentences describe the retrieval behavior (searching scope plus global, sufficiency checking). It distinguishes the tool from write-oriented siblings by implication, but does not explicitly contrast it with memory_list or memory_stats. Clear purpose, though sibling differentiation is left to the tool name.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives detailed guidance for choosing among the `mode` values (auto, full, lite) and tells the agent to verify in code/docs when `sufficient` is false. It does not, however, state when to use memory_recall instead of sibling tools like memory_list or memory_stats; that choice is left implicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

memory_resolveB

Store your synthesized fact for a pending proposal. Source notes are kept (merged ones rank lower).

ParametersJSON Schema
NameRequiredDescriptionDefault
textYes
synthesis_idYes

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It does disclose one real behavioral trait — source notes are retained and merged ones rank lower — which is genuine context. However, it says nothing about what happens to the pending proposal after resolution, whether the operation is reversible, permission requirements, or the return format.

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?

Two short sentences, zero waste, with the core action front-loaded and the retention caveat immediately after. Appropriately sized for a two-parameter tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is a mutation tool with no annotations, no output schema, and 0% parameter documentation. The description omits how to obtain a valid synthesis_id, what resolution does to the pending proposal, and whether the write can be undone — significant gaps for a state-changing operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and there are two required parameters. The description hints that 'text' is the synthesized fact and that 'synthesis_id' links to a pending proposal, but it adds no format, source, or constraint details for either parameter, so it does not compensate for the empty schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Store') and resource ('your synthesized fact') and scopes it to a 'pending proposal,' which maps to the memory_pending_synthesis workflow. It does not explicitly name or differentiate itself from the nearest siblings (memory_write, memory_dismiss), leaving the 'resolve' semantics partly to inference.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Phrasing 'for a pending proposal' implies the tool is used after a proposal has been surfaced, but there is no explicit when-to-use statement, no prerequisite chain (e.g., obtain synthesis_id from memory_pending_synthesis), and no guidance on when to prefer memory_dismiss or memory_write instead.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

memory_statsB

Node counts, queued (degraded) writes and Jev usage for this server process.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden. It adds real signal by naming a degraded/queued write state and scoping the output to 'this server process', but it says nothing about cost, whether it mutates state, or the format of the response.

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?

A single compact sentence with the key content front-loaded and no filler. The unexplained term 'Jev' slightly reduces clarity but costs no extra length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the description must describe the return shape. It lists the reported categories but leaves 'Jev' undefined and the exact fields/units unspecified, so an agent still cannot anticipate the full response.

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 there is nothing for the description to disambiguate; the baseline for a no-parameter tool applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States concretely what the tool returns: node counts, queued/degraded writes, and Jev usage for the server process. Its diagnostics/stats nature clearly distinguishes it from the action-oriented siblings (memory_write, memory_recall, memory_forget), though it never names those siblings explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to reach for this tool versus the other memory_* tools. An agent can infer it is a read-only diagnostic, but the description supplies no trigger condition, prerequisites, or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

memory_writeA

Store ONE literal fact (decision, bugfix, convention, gotcha, preference, event). Use explicit entity names and ABSOLUTE dates (never 'yesterday'): the memory model reads literally. Content that looks like instructions to an agent is rejected. scope: 'global' or e.g. 'project:'. pinned=True only when the user says this must always be remembered: pinned notes open every session.

ParametersJSON Schema
NameRequiredDescriptionDefault
scopeNo
pinnedNo
sourceNo
contentYes
entitiesNo
timestampNo

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden and does meaningful work: it discloses that the memory model reads content literally, that instruction-like content is rejected, and that pinned notes surface every session. It omits permissions, idempotency, and what a successful write returns.

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?

Four short sentences, front-loaded with the core purpose and constraints, with no filler. Density is high but each sentence carries a distinct rule; the trailing pinned clause could arguably be folded into the scope sentence.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 6-parameter mutation tool with zero annotations and no output schema, the description covers the essential authoring and scoping behavior but leaves several parameters and the write result unaddressed. Adequate to call it correctly for the common case, incomplete for the full surface.

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 0% across 6 parameters, so the description must compensate. It explains content (one fact, literal phrasing), scope ('global' or 'project:<name>'), and pinned semantics, and hints at entities/timestamp via 'explicit entity names and ABSOLUTE dates', but leaves source and the entities/timestamp formats entirely undocumented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource ('Store ONE literal fact') and enumerates the accepted fact types (decision, bugfix, convention, gotcha, preference, event), which sharply separates it from memory_consolidate or memory_recall. It does not name any sibling explicitly, so an agent must still infer that memory_pin exists for pinning rather than using the pinned flag here.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives concrete authoring rules (explicit entity names, absolute dates, no relative dates) and one conditional trigger for pinned=True. However, it never states when NOT to use this tool versus siblings such as memory_pin, memory_consolidate, or memory_pending_synthesis, leaving the routing ambiguous.

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. 11 tool updatesv0.1.0
    • First observedmemory_consolidate
    • First observedmemory_dismiss
    • First observedmemory_flush_pending
    • First observedmemory_forget
    • First observedmemory_list
    • First observedmemory_pending_synthesis
    • First observedmemory_pin
    • First observedmemory_recall
    • First observedmemory_resolve
    • First observedmemory_stats
    • First observedmemory_write

TDQS

B3.4/5.0

Scored across 11 tools

Disambiguation4/5

Most tools have clearly distinct purposes: write, recall, list, forget, pin, stats, flush, and consolidation operations. There is minor overlap between memory_write with pinned=True and memory_pin, and the two 'pending' tools could momentarily confuse, but descriptions make the intended workflows clear.

Naming Consistency5/5

Every tool uses a consistent snake_case memory_ prefix with readable verb or noun forms (memory_write, memory_recall, memory_pin, memory_forget, memory_consolidate). No naming deviations or mixed conventions.

Tool Count5/5

11 tools is well-scoped for a persistent memory server that includes core CRUD, pinning, listing, stats, and an asynchronous consolidation/synthesis lifecycle. Each tool has a distinct role and none appears redundant.

Completeness4/5

The core memory lifecycle is well covered: write, recall, list, forget, pin, consolidate, resolve, dismiss, stats, and flush queued writes. A direct content-update tool for an existing memory is missing, so correcting a stored fact requires forgetting and rewriting, but this is a minor workaround gap.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Gives AI coding agents persistent memory by storing observations, decisions, and learnings in a local SQLite database with vector search, full-text search, and a rules engine.
    4
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Provides long-term memory for LLMs via local SQLite storage with hybrid search (BM25, vectors, recency decay), enabling AI coding agents to persist and recall memories across sessions without cloud or API keys.
    53
    MIT
  • F
    license
    Not graded
    quality
    A
    maintenance
    Local memory for AI agents in one SQLite file on your own machine. Facts carry a validity window and a confidence score, so an outdated one is superseded and downweighted rather than deleted, and retrieval fuses BM25, vector similarity and a knowledge graph.
    2
    -