Skip to main content
Glama

survivemem

Local, single-user persistent memory for Claude Code and Claude Desktop. One SQLite file, no server, no API keys, no telemetry.

Linux only. Licensed under GPL-3.0-or-later.

What it is and why

survivemem keeps the useful part of hosted "AI memory" on your own machine: durable facts, preferences and project decisions, injected into Claude's context when they are relevant, and the working state of a session, put back after the context is compacted.

It is built around three problems that show up in long engineering sessions:

  • Compaction drops the plot. /compact and auto-compaction replace the conversation with a summary that regularly loses the goal, the decisions already taken and the open items. survivemem stores a checkpoint of that state in SQLite (written by the model through MCP, with a deterministic fallback extracted from the transcript) and re-injects it right after every compaction. See docs/compaction.md.

  • One repository, many clones. Kernels, U-Boot, Yocto layers and BSPs get cloned several times: one per board, one per branch under review, a bisect scratch copy, your own fork. survivemem recognises a project by its remotes, its .survivemem.toml name and its root commit, not by its directory, so memories are shared across clones and forks, while each clone's branch and .config stay visible. See docs/identity.md.

  • Relevant, bounded injection. Every prompt gets the few memories that match it (FTS5 with an identifier-friendly tokenizer, at most 8 hits and 6 000 characters), not a dump of everything stored.

Related MCP server: MCP Memory Keeper

Features

  • Memories with a kind (fact, preference, project, decision, environment, pitfall), tags, an optional source pointer (refs) and anchor, stored per project or globally.

  • Scopes: a memory can hold for the whole project, one branch (branch:<name>) or one clone (checkout:<id>).

  • Search: FTS5 bm25 with a tokenizer that keeps identifiers such as CONFIG_ARM64_PTR_AUTH, linux-6.6.y or 0xFF200000 whole, trigram fallback for substrings, Reciprocal Rank Fusion, optional vector rerank (sqlite-vec and a local Ollama). In the prompt hook, pitfalls rank first when the prompt looks like an error.

  • Claude Code hooks: inject memories on every prompt, capture candidates when a turn ends, save the session before compaction, restore it after, stop repeated failed experiments before they run, capture failing debug commands.

  • Investigations: debug sessions that span days and compactions, with hypotheses, experiments, ruled-out causes and evidence, re-injected after every compaction and guarded against loops.

  • Candidates are captured automatically but never searched or injected until you promote them with survivemem review.

  • MCP server (stdio) with twelve tools to search, store, forget, list, checkpoint and run investigations.

  • Workspaces: link the repositories of a Yocto build, a kas file or a repo manifest so their memories are visible from each other (projects autodetect).

  • A scriptable CLI: human tables on a terminal, JSON everywhere else, stable exit codes, a JSON Schema of every object (survivemem schema).

  • Export to JSONL (with project identities, so a mirror on another machine is recognised) or Markdown; idempotent import.

  • survivemem doctor: integrity, FTS, filesystem, configuration and integration checks; --stale lists memories whose anchor no longer matches the clone.

  • Deterministic log extraction for BitBake, kernel make, dmesg, Quartus and OpenOCD (survivemem ingest-log).

Not available yet

  • Shared memories committed in a repository ([share] in the configuration is parsed but not used).

Requirements

  • Linux (glibc, x86_64 or aarch64). Other platforms exit with survivemem: Linux only.

  • Python 3.12 or newer, with an SQLite that has FTS5 (the usual case; without FTS5 the database cannot be created).

  • uv to install and run.

  • git on PATH for project identity (without it, only a .survivemem.toml names a project and everything else falls back to global memories); the OpenSSH client is used, if present, to resolve SSH host aliases.

  • Claude Code and/or Claude Desktop.

  • Optional, for vector search: the vec extra (sqlite-vec) and Ollama on 127.0.0.1 with the bge-m3 model.

Install

Straight from GitHub:

uv tool install git+https://github.com/FPGArtktic/survivemem

From a checkout:

git clone https://github.com/FPGArtktic/survivemem
cd survivemem
uv tool install .

With the optional vector search extra:

uv tool install 'survivemem[vec] @ git+https://github.com/FPGArtktic/survivemem'
# or, from a checkout
uv tool install '.[vec]'

uv tool install puts survivemem in uv's tool bin directory (usually ~/.local/bin); run uv tool update-shell if that is not on your PATH. The hooks call survivemem by name, so it must be on the PATH Claude Code sees. To update, re-run the install command with --reinstall.

Check the installation:

survivemem --version
survivemem doctor

Quick start

cd ~/w/linux-de10
survivemem add "Kernel pinned to 6.6 LTS; vendor BSP breaks on 6.12." --kind decision --tag kernel
survivemem add "Prefer ruff over black" --kind preference --global
survivemem search "kernel 6.6"
survivemem list --since 7d
survivemem projects here        # which project this directory is, and why
id        kind        project     updated  tags    content
01M68KH5  preference  global      now              Prefer ruff over black
01M68KH5  decision    linux-de10  now      kernel  Kernel pinned to 6.6 LTS; vendor BSP breaks on 6.12.

The project is derived from the current directory; nothing needs to be registered. --global stores a memory that is visible from everywhere. IDs are ULIDs and every command accepts any unique prefix (survivemem show 01M68KH5J1).

Claude Code setup

MCP server

claude mcp add --transport stdio --scope user survivemem -- survivemem serve

Check with claude mcp list. Claude Code starts the server in the directory you launched it from, which is how the server knows the project. See docs/mcp.md for the tool list and for running from a source checkout.

Hooks

Merge docs/settings.json into ~/.claude/settings.json (all projects) or .claude/settings.json (one project). If the file already has a hooks object, add these entries to it rather than replacing it:

Event

Matcher

Command

Timeout

UserPromptSubmit

survivemem hook prompt

5 s

PreToolUse

Bash

survivemem hook pretool

5 s

PostToolUse

Bash|mcp__.*

survivemem hook posttool

5 s

PostToolUseFailure

Bash

survivemem hook posttool

5 s

Stop

survivemem hook stop

5 s

PreCompact

survivemem hook precompact

30 s (room for the optional local summary)

SessionStart

compact|resume

survivemem hook session-start

5 s

PreToolUse costs one SQLite query per Bash call when no investigation is open (about 45 ms for the whole process). PostToolUse opens the database only for Bash commands matching [capture] debug_commands and for the configured MCP tools. PostToolUseFailure is needed because a failed Bash call does not fire PostToolUse.

Hooks never fail: errors go to ~/.local/state/survivemem/hooks.log and the exit code is always 0. survivemem status and survivemem doctor show which hook events are registered. Details and an activity diagram per hook: docs/hooks.md.

The model is told through the MCP server's instructions and tool descriptions when to search, when it may store (only when you ask or confirm), and to call checkpoint after each completed subtask. A line in your CLAUDE.md such as "call the survivemem checkpoint tool after every completed subtask" makes the habit more reliable.

Claude Desktop

Claude Desktop for Linux is in beta. Add the server to claude_desktop_config.json under mcpServers (open the file from the app's developer settings; its location on Linux is not documented at the time of writing):

{
  "mcpServers": {
    "survivemem": {
      "command": "/home/you/.local/bin/survivemem",
      "args": ["serve"],
      "env": { "SURVIVEMEM_PROJECT": "linux-de10" }
    }
  }
}

Use the absolute path printed by command -v survivemem: a desktop application does not necessarily see the PATH of your shell. Desktop runs no hooks, so nothing is injected automatically and there is no loop guard: the model searches and reads investigations through the MCP tools. It also does not start the server in a project directory; without SURVIVEMEM_PROJECT (a project label or id) or a project argument to the tools, memories land in the global scope. checkpoint and session_state work, using a stable per-project session id.

How it works

prompt ──► hook prompt ──► resolve project ──► FTS5 search ──► <survivemem> block in context
model  ──► MCP checkpoint ──► session_state
/compact ──► hook precompact (merge transcript heuristic) ──► compaction ──► hook session-start
          ──► clone line + <survivemem-state> + <survivemem> back in context
turn ends ──► hook stop ──► candidate ──► survivemem review ──► memory
Bash call ──► hook pretool ──► loop guard (only with an open investigation)
          ──► hook posttool ──► evidence + experiment entry, or candidate

Daemon in a container (optional)

By default hooks, CLI and MCP server open the database directly. Profile B runs one long-lived daemon instead (MCP over Streamable HTTP on 127.0.0.1:8765, hooks as thin clients with --remote, a bearer token next to the DB), packaged as a rootless Podman Quadlet unit:

podman build -t localhost/survivemem:latest .
cp deploy/survivemem.container ~/.config/containers/systemd/
systemctl --user daemon-reload && systemctl --user start survivemem

When the daemon is down, --remote hooks fall back to the database. Setup, diagrams, security model and limitations: docs/deployment.md.

Investigations

For debugging that spans days and compactions (board bring-up, kernel regressions, timing failures), open an investigation. It records the symptom, the setup under test, hypotheses, experiments with their command, result and anchor, what was ruled out, and evidence excerpts:

survivemem inv open "altera_uart probe fails" --symptom "no console on ttyS1 after boot"
survivemem inv log hypothesis "uart clock not enabled before probe"
survivemem inv log experiment "rebuild the dtb with a clocks property" --command "make -j8 dtbs"
survivemem inv log ruled_out "pinmux is fine: scope shows TX toggling"
survivemem inv show
survivemem inv close --root-cause "…" --fix "…"     # solved: writes a pitfall memory

The model does the same through the four investigation_* MCP tools. The hooks then:

  • re-inject the investigation block after every compaction, and on the first and every 20th prompt of a session;

  • record each failing debug command (make, bitbake, dmesg, Quartus, OpenOCD, …) as an experiment with an output excerpt;

  • ask you before Claude re-runs a command that already failed at the same commit and .config, unless a new hypothesis was logged;

  • flag the third identical failure as a loop, shown on every prompt until a new hypothesis answers it.

Details, diagrams and the log extraction rules: docs/investigations.md.

CLI overview

survivemem --help prints a summary; survivemem help <command> the options of one command.

Command

Purpose

add "<text>" [--kind K] [--tag T]… [--scope project|branch|checkout] [--ref JSON]… [--anchor REV]

store a memory (default kind fact) in the current project, --project X or --global

search "<query>" [--limit 8] [--explain]

relevance-ranked search; --explain adds bm25, vector distance and match source

list [--kind K] [--tag T] [--since 30m|12h|7d|2w] [--limit N]

newest first; candidates only with --kind candidate

show <id>

full record, including deleted ones, refs as commands

edit <id> [--content …] [--kind …] [--add-tag …] [--rm-tag …] [--project X|--global] [--scope …] [--ref JSON]… [--anchor …]

change a memory

forget <id>… [--yes], restore <id>

soft delete and undo

review

walk candidates interactively and promote, edit or discard them

projects

list projects with their primary identity and counts

projects here

resolution chain for $PWD: identities, matched step, remotes, clone

projects show|rename|merge|identities …

inspect and fix projects

projects alias add <project> <identity> [--yes], projects alias rm <identity>

attach or detach remote:, root:, path:, name: identities

projects link|unlink <parent> <child>, projects autodetect [--project X] [--yes]

workspace links, by hand or from bblayers.conf, kas*.yml, .repo/manifest.xml

clones [--all], clones label <id> "<text>", clones prune [--purge] [--yes], clones diff <a> <b>

the clones (checkouts) of a project

status

DB path and size, counts, FTS/vector/Ollama state, hook and MCP registration

brief

one JSON document for an AI client to orient itself

schema

JSON Schema of memory, project, checkout, checkpoint and ref objects

env

environment memories as a KEY / value table

inv open "<title>" --symptom "<text>" [--env TEXT]

open an investigation (one open per project)

inv log <kind> "<text>" [--command C] [--result good|bad|inconclusive] [--anchor A] [--ref JSON]… [--evidence FILE]

append a hypothesis, experiment, observation, ruled_out or note

inv show [<id>] [--full], inv list [--status S] [--grep TEXT] [--all]

the investigation block or timeline; list investigations

inv attach <file> [--tool T] [--no-copy], inv bisect, inv loops

evidence; good/bad boundary; repeated identical failures

inv pause, inv resume [<id>], inv close --root-cause … --fix … [--status solved|abandoned], inv export [<id>]

lifecycle and Markdown postmortem

ingest-log <file> --tool bitbake|make|dmesg|quartus|openocd|gdb|system-console|other

extract errors from a log into evidence or a candidate

state [show] [--session ID], state set …, state purge [--all] --yes

the compaction-proof session checkpoint

export [--format jsonl|md] [--kind K], import < file.jsonl

backup, migration, Markdown notes

reindex

rebuild the FTS indexes; (re)build vectors when available

doctor [--stale]

health checks, exit code 3 when one fails; --stale lists memories whose anchor no longer matches the current clone

serve

MCP server over stdio

hook prompt|pretool|posttool|stop|precompact|session-start

Claude Code hook handlers (JSON on stdin)

Filters on add, list, search, review, brief, env, export, clones and inv: --project <label|id>, --global (only project-less memories, or store one), --all (no project filter). export covers all projects unless filtered.

review keys: f fact, p preference, d decision, t pitfall, v environment, j project, e edit the text first, x discard, s or Enter skip, q quit.

Output modes and exit codes

Option

Effect

(default)

a table or plain text on a terminal; JSON when stdout is not a terminal

--json / --jsonl

one JSON document / one object per line

--format table|md|json|jsonl

explicit format; md gives Markdown for list, search and projects

--quiet, -q

IDs only, one per line, for xargs

--wide

do not truncate the content column

--no-color, NO_COLOR

plain ASCII (... instead of …); no ANSI colour is ever emitted

Long output on a terminal goes through $PAGER (default less -R). JSON objects use the database column names plus an *_iso string for every timestamp (docs/data-model.md). Commands never prompt when stdin is not a terminal: destructive ones (forget, projects merge, clones prune --purge, state purge) refuse without --yes, and review refuses to run.

Exit code

Meaning

0

success

1

usage error, invalid input or configuration, refused without --yes

2

not found

3

database error (including a failed doctor check)

4

ambiguous ID prefix

Errors go to stderr; in machine mode as {"error": {"code": …, "message": …}}.

Configuration

$XDG_CONFIG_HOME/survivemem/config.toml (default ~/.config/survivemem/config.toml, override with SURVIVEMEM_CONFIG). Every key is optional; a missing file means the defaults below. An invalid value makes the CLI exit with code 1; hooks log the error and use the defaults.

[identity]
# Remote whose identity is checked first and named in hints; then "upstream", then the
# rest alphabetically.
remote = "origin"
# Forks whose root commit is NOT in families.toml: "adopt" (same project) or "propose"
# (new project plus a one-line hint with the merge command).
root_match = "adopt"

[identity.hosts]
# Rewrite "host:port" or "host" before remote URLs are compared. Empty by default.
# "gitlab.lan:12345" = "gitlab.lan"
# "192.168.1.10" = "gitlab.lan"

# Forks of a families.toml upstream (linux, u-boot, buildroot, openembedded-core,
# trusted-firmware-a, busybox) default to "propose"; override per family label.
# [identity.family.u-boot]
# root_match = "adopt"

[compaction]
# Ask a local Ollama model for a 10-line session summary in the PreCompact hook.
summarize = false
model = "llama3.2"

[embed]
# Ollama embedding model for vector search; must return 1024-dimensional vectors.
model = "bge-m3"
# How long Ollama keeps the model loaded after each request. Loading it cold takes longer
# than the 500 ms search budget, and search then quietly falls back to FTS5 only.
keep_alive = "30m"

[loop_guard]
# What the PreToolUse hook does with a command identical to a failed experiment at the
# same anchor: "ask" (Claude Code asks you), "deny" (refused), "warn" (context only).
mode = "ask"

[capture]
# Regular expression matched in FULL against the program name of each segment of a Bash
# command line (after sudo/env/VAR=…): "make" matches make and /usr/bin/make, not cmake,
# makepkg or `grep make`.
debug_commands = "bitbake|devtool|make|dmesg|journalctl|openocd|gdb|gdb-multiarch|[\\w.-]+-gdb|quartus_\\w+|jtagconfig|system-console|nios2-[\\w-]+|niosv[\\w-]*|bmaptool|dd"
# Shell-style patterns for MCP tools whose results are captured as candidates.
tools = ["mcp__jcodemunch__*", "mcp__rag__*", "mcp__jdocmunch__*"]

[share]
# Parsed and validated, but not used: shared repository memories are not implemented.
enabled = false

A repository can pin its project name with a .survivemem.toml at its root:

project = "de10-nano-bsp"

Environment variables

Variable

Effect

SURVIVEMEM_DB

database path (default $XDG_DATA_HOME/survivemem/memory.db)

SURVIVEMEM_CONFIG

configuration file path

SURVIVEMEM_PROJECT

force the project (label or id) for hooks, CLI and MCP server; created if unknown

SURVIVEMEM_OLLAMA_URL

Ollama base URL, default http://127.0.0.1:11434; only http on 127.0.0.1, localhost or ::1 is accepted

XDG_DATA_HOME, XDG_CONFIG_HOME, XDG_STATE_HOME

base directories; relative values are ignored

NO_COLOR, PAGER

output, see above

Vector search (optional)

FTS5 alone works well for technical text. Vector search adds semantic matches through a local embedding model:

uv tool install --reinstall 'survivemem[vec] @ git+https://github.com/FPGArtktic/survivemem'
ollama pull bge-m3
survivemem reindex       # creates memory_vec and embeds every live memory
survivemem status        # vec: enabled (sqlite-vec loaded, N embedded)
  • survivemem search and the MCP search_memories embed the query (500 ms timeout) and fuse the cosine top 50 with the lexical ranking by Reciprocal Rank Fusion.

  • The prompt hook never embeds; it stays FTS5 only to keep each prompt fast.

  • The Stop hook embeds up to 16 new or changed memories per turn (2 s timeout).

  • If sqlite-vec is missing, Ollama is down or slow, or the model is not pulled, everything silently falls back to FTS5. reindex says why vectors stay disabled.

  • Run survivemem reindex again after changing [embed] model.

Privacy

  • No network, except an optional Ollama on loopback. Any other Ollama URL is refused and logged, and HTTP_PROXY/ALL_PROXY are ignored for it, so memory text never goes through a proxy. ssh -G reads your SSH configuration without connecting. The $schema URI in survivemem schema is an identifier and is never fetched. No telemetry.

  • Secrets are rejected. Memories and captured candidates that match obvious token or key patterns (GitHub, GitLab, OpenAI/Anthropic, AWS, Google and Slack keys, private-key headers, password= / api_key=-style assignments) are refused by every write path (CLI, MCP, hooks, import).

  • What hooks keep. The Stop and PreCompact hooks store the last prompt (300 characters) and the final answer (600 characters) of a turn as a candidate. The session state additionally holds the last 3 prompts, the last answer, the last 10 Bash command lines and the paths of files Claude read or edited, with secrets redacted; it is never exported or searched and is purged after 14 days without activity. The PostToolUse hook keeps, for matching debug commands, an excerpt of at most 1 000 characters of the output (redacted), and for matching MCP tools a digest of at most 300 characters plus pointers; never the full output, never file contents.

  • Everything is in one file you own: copy it, back it up, or delete it.

Files and paths

Path

Content

~/.local/share/survivemem/memory.db ($XDG_DATA_HOME, SURVIVEMEM_DB)

the database, plus its -wal and -shm files while in use

memory.db.bak-<version> next to it

copy taken before a schema migration

~/.config/survivemem/config.toml ($XDG_CONFIG_HOME, SURVIVEMEM_CONFIG)

configuration

~/.local/state/survivemem/hooks.log ($XDG_STATE_HOME)

log of the hooks and the MCP server; appended, never rotated

<repo>/.survivemem.toml

optional project name for a repository

Keep the database on a local filesystem: WAL locking is unreliable on NFS, CIFS, sshfs and 9p, and survivemem doctor fails there.

Troubleshooting

Start with:

survivemem doctor
OK   integrity   ok
OK   schema      v3, code expects v3
OK   fts         memories_fts and memories_tri consistent
OK   filesystem  ext4
OK   config      defaults (no config.toml)
OK   vec         disabled (no memory_vec (run reindex)); search uses FTS5 only
OK   ollama      http://127.0.0.1:11434 unreachable; vectors and summaries off
OK   hooks       all hook events registered
OK   mcp         survivemem MCP server registered
OK   names       no .survivemem.toml name collisions
OK   clones      3 clones recorded
OK   profile     A (native): hooks, CLI and MCP server open the DB directly

Symptom

What to check

Nothing is injected

Run survivemem search "<words from the prompt>" in the same directory. Candidates are never injected; promote them with survivemem review. A prompt made only of common words matches nothing. Branch- and clone-scoped memories are only visible from that branch or clone.

Wrong or new project

survivemem projects here shows the identities, the matched step and any root-commit hint; fix with projects merge or projects alias add (docs/identity.md).

A hook seems to do nothing

Look at ~/.local/state/survivemem/hooks.log; every failure is logged there with a traceback. Replay a payload: edit cwd in docs/samples/user-prompt-submit.json, then survivemem hook prompt < docs/samples/user-prompt-submit.json.

fts ... out of sync

survivemem reindex

database schema vN is newer than this survivemem

install a newer survivemem, or restore memory.db.bak-<version>

Read-only database

Hooks, CLI and MCP server fall back to a lookup that writes nothing: memories are still injected and read commands work, writes fail with attempt to write a readonly database (exit code 3). Fix the file permissions.

The loop guard asks about a command you meant to repeat

Log why the outcome should differ (survivemem inv log hypothesis "…"), or check what it matches with survivemem inv loops (docs/investigations.md).

survivemem: Linux only

survivemem does not run on other platforms.

Development

git clone https://github.com/FPGArtktic/survivemem
cd survivemem
uv sync
uv run ruff check . && uv run ruff format --check . && uv run mypy && uv run pytest
  • Every test gets its own HOME, XDG directories and database, and points SURVIVEMEM_OLLAMA_URL at a closed port, so a running Ollama or your real memory database is never touched.

  • The development group installs sqlite-vec so the vector path is tested; Ollama is replaced by a fake embedder.

  • Table and Markdown renderings are pinned by golden files; regenerate them with UPDATE_GOLDEN=1 uv run pytest and review the diff.

  • Run the CLI from the checkout with uv run survivemem …. Use SURVIVEMEM_DB and XDG_STATE_HOME to point experiments at a scratch database.

Author

Mateusz Okulanis, GitHub FPGArtktic, e-mail FPGArtktic@outlook.com.

Bug reports, questions and pull requests: https://github.com/FPGArtktic/survivemem/issues.

License

GPL-3.0-or-later. See LICENSE.

Available Tools

12 tools
checkpointA

WRITE. Save the working state of this session so it survives context compaction: goal, done, in_progress, next, decisions (each with a one-line reason), files, optional blockers. Overwrites what it states, merges files. Call after every completed subtask and before any long operation; reference the open investigation id in in_progress.

NameRequiredDescriptionDefault
doneYes
goalYes
nextYes
filesYes
blockersNo
decisionsYes
in_progressYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and delivers the two most important write semantics: "Overwrites what it states, merges files," which tells the agent exactly what is replaced versus appended. It does not cover error behavior, size/rate limits, or whether the checkpoint requires an open investigation, so a few behavioral 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.

Conciseness5/5

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

Front-loaded with the write-mode and purpose, then the field enumeration, then the call-timing directive. Every clause adds usable information given zero schema coverage, and there is no filler.

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-value explanation is rightly omitted, and the description covers purpose, timing, and field intent for a seven-parameter write tool. Missing pieces are secondary: precondition (does an investigation need to be open?) and failure/overwrite-conflict behavior.

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 largely does: it explains that decisions are "each with a one-line reason," that blockers are optional, and that in_progress should carry the investigation id. It still leaves the expected format of files entries and done granularity implicit across seven parameters.

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

Purpose5/5

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

The description opens with an explicit mode marker ("WRITE") and a specific verb+resource: saving the session's working state so it survives context compaction. Enumerating the captured state (goal, done, in_progress, next, decisions, files, blockers) makes it clearly distinguishable from read-oriented siblings like session_state and memory_status.

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?

It gives concrete triggers: "Call after every completed subtask and before any long operation," plus a field-level convention to reference the open investigation id in in_progress. It stops short of naming alternatives explicitly (e.g., "read with session_state") or stating when not to checkpoint, so it is strong but not complete routing guidance.

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

forget_memoryA

WRITE. Soft-delete a memory by id or unique id prefix (restorable with the CLI). Precondition: the user asked to forget it.

NameRequiredDescriptionDefault
idYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does well: the "WRITE" tag flags mutation, "soft-delete" clarifies data is not destroyed, and "restorable with the CLI" gives the recovery route along with a user-consent precondition. It omits edge behavior such as what happens when a prefix matches more than one memory, so it is not fully complete.

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

Conciseness5/5

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

Three short clauses with the mutation flag front-loaded, then the action, then the precondition. Nothing repeats and every clause earns its place.

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 no explanation, and the description covers action, scope, recoverability, and consent. The only material gap for a destructive-by-intent tool is prefix-collision behavior, which is left to be discovered at call time.

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

Parameters4/5

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

Schema coverage is 0% and the single `id` parameter has no description at all, so the description must compensate; "by id or unique id prefix" does add real meaning over a bare string type. It leaves the ambiguity handling for non-unique prefixes unaddressed, which is the one semantic gap an agent would want.

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 the specific verb and resource ("Soft-delete a memory") plus the accepted identifier forms, so it is immediately distinguishable from read-side siblings like search_memories or memory_status. It stops short of naming a sibling alternative explicitly (e.g., when to use store_memory vs this), which keeps it from a 5.

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?

"Precondition: the user asked to forget it" gives one explicit gating condition for invocation, which is more than most tools offer. It implies the recovery path ("restorable with the CLI") but never states the negative case, such as not using it for a memory the user merely wants hidden, so it is not a full when/when-not pair.

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

investigation_closeA

WRITE. Close the open investigation with root_cause and fix; status solved (default) writes one pitfall memory pointing at it, abandoned writes none.

NameRequiredDescriptionDefault
fixYes
statusNosolved
root_causeYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does well: it flags the tool as a WRITE and discloses the concrete side effect that status=solved creates one pitfall memory pointing at the closed investigation while abandoned creates none. It omits what happens if no investigation is open, whether closing is reversible, and whether any other status values are accepted.

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?

One dense sentence, front-loaded with the 'WRITE.' classification and the core action. Every clause carries information, though wording like 'pointing at it' is slightly compressed and costs a moment of parsing.

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 critical mutation side effect. It falls short on edge cases: behavior when no investigation is open, irreversibility of the close, and the full valid value set for status.

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 valuably explains the status parameter's semantics and reveals two valid values ('solved', 'abandoned') plus the default, but says nothing about the required root_cause and fix beyond naming them – no expected format, length, or content guidance.

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

Purpose5/5

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

States a specific verb+resource (close the open investigation) and names the required inputs (root_cause, fix). It is clearly distinguishable from the siblings investigation_open, investigation_log, and investigation_status, and the leading 'WRITE.' marker immediately separates it from the read-style memory/session tools.

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 open investigation' implies the prerequisite that an investigation must be open, which is useful context. However, it never names an alternative or states when an agent should close with 'solved' vs 'abandoned' – the choice is left entirely to inference.

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

investigation_logA

WRITE. Append to the open investigation. kind: hypothesis, experiment, observation, ruled_out (with a one-line reason), note. An experiment needs command (logged BEFORE running it) and gets result good/bad/inconclusive after; anchor defaults to the current HEAD(+.config). One entry per experiment, never a summary of several.

NameRequiredDescriptionDefault
kindYes
refsNo
textYes
anchorNo
resultNo
commandNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/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 substantial work: it declares write semantics, the ordering discipline (command logged BEFORE execution, result afterward), the default anchor, and the one-entry-per-experiment invariant. It omits what happens if no investigation is open and whether entries can be amended or removed.

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

Conciseness4/5

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

Front-loaded with the operation type and tightly written; nearly every clause carries a distinct rule. The telegraphic shorthand 'HEAD(+.config)' and the compressed kind list border on cryptic, which costs it a point on clarity despite the efficiency.

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?

Output schema exists, so return values need no explanation, and the description covers the mutation workflow, entry taxonomy, and sequencing rules well for a 6-parameter write tool with no annotations. The unaddressed `refs` parameter and undefined failure behavior (no open investigation) are the remaining gaps.

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 coverage is 0%, so the description must compensate. It defines `kind`'s valid values, explains `command` and `result` including their enumeration (good/bad/inconclusive), and gives `anchor`'s default. However, `refs` — an opaque anyOf array of free-form objects — is never mentioned, and `text` is left implicit.

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?

Opens with 'WRITE. Append to the open investigation.' — a specific verb, resource, and scope (the *open* investigation) that separates it from read-oriented siblings like investigation_status and from the lifecycle siblings investigation_open/close. An agent can tell immediately this creates log entries rather than reading or closing an investigation.

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 strong conditional guidance: which `kind` values exist, that `ruled_out` requires a one-line reason, and that an experiment needs `command` logged before running with `result` recorded after. It also forbids batching ('one entry per experiment, never a summary of several'). It does not name sibling alternatives (checkpoint, store_memory, investigation_status), 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.

investigation_openA

WRITE. Open a debug investigation for the current project (one open at a time). Use before the first experiment when a task is debugging: a symptom with an unknown cause. Snapshots the project's environment memories; env adds free-form setup text.

NameRequiredDescriptionDefault
envNo
titleYes
symptomYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior5/5

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

Since no annotations were provided, the description carries the full burden of behavioral context. It successfully discloses that the system operates on a single instance ('one open at a time') and details the core behavior: 'Snapshots the project's environment memories.' This is crucial behavioral data.

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 definition is highly front-loaded, starting with a clear instruction ('WRITE') followed by the resource action. The subsequent sentences clearly expand on the use-case and side effects without unnecessary fluff.

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

Completeness5/5

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

Given the absence of annotations and the lack of structured parameter documentation, this description is exceptionally complete. It defines the constraint (one open at a time), the required inputs (title/symptom), and the nature of the secondary input (env).

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

Parameters5/5

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

With 0% schema description coverage, the description must define everything. It gives specific meaning to each parameter, explaining that 'env' 'adds free-form setup text,' thereby clarifying the role of the three parameters beyond their technical types.

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 purpose is clearly stated: 'Open a debug investigation for the current project.' It identifies the resource and the action. While it doesn't explicitly list all siblings, framing it as an investigation distinguishes it from generic memory storage or list operations.

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?

It provides strong 'when to use' guidelines, stating it should be used 'before the first experiment when a task is debugging.' This clearly scopes the intended workflow and helps the AI distinguish it from other routine data logging calls.

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

investigation_statusA

READ. Compact state of the open investigation (or id): symptom, setup, ruled out, open hypotheses, last experiments, blocker, commands not to re-run. Call at the start of any debugging task and after every compaction.

NameRequiredDescriptionDefault
idNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

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

With no annotations, the leading "READ." is valuable — it explicitly declares the operation is non-mutating. It also discloses the compact/paged nature of the payload and that it should be re-read after compaction (implying possible staleness). However it says nothing about behavior when no investigation is open or when an unknown `id` is supplied (error vs. empty payload), which is the main undisclosed trait.

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?

Front-loads the operation type, then the returned contents, then the call triggers. Dense and waste-free, with no restatement of the tool name or schema.

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 no explanation, and one optional parameter keeps the surface small. What's missing for a state-reset tool is the failure/empty case and any note that the snapshot is a summary rather than the full log.

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 coverage is 0% — `id` is a bare nullable string with no description. The description's "(or `id`)" does add real meaning: default resolves to the currently open investigation, and `id` overrides that to fetch some other one. That is useful but doesn't say whether closed/archived investigations are addressable or what format the id takes.

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 read of the open investigation's state and enumerates exactly what it returns (symptom, setup, ruled out, hypotheses, experiments, blocker, commands not to re-run). That enumeration separates it from investigation_log and checkpoint, though it never names a sibling explicitly.

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 two concrete trigger conditions: at the start of any debugging task and after every compaction. There is no statement of when not to use it and no named alternative (e.g. investigation_log or session_state), so it stops short of full routing guidance.

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

list_projectsA

READ. All projects with memory counts, identities and checkouts (path, branch, head, label); marks the current project and clone. No preconditions.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior4/5

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

With no annotations, the description carries the burden and does so: it declares read-only semantics ('READ'), states there are no preconditions, and discloses notable side-behaviors of the output (marking the current project and clone). It doesn't mention cost, limits, or ordering, which keeps it short of a 5.

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

Conciseness4/5

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

Front-loaded with the READ qualifier, then a compact inventory of returned fields; every clause carries information. The parenthetical field list is dense but earns its place by describing the response shape.

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 needn't be fully specified, and the description still summarizes them plus safety and precondition state. A zero-param read tool is adequately covered; only the absence of any comparison to sibling listing tools is a gap.

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 to disambiguate and the baseline of 4 applies. The description correctly implies a full unfiltered listing with no inputs.

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 ('All projects') and enumerates the payload (memory counts, identities, checkouts with path/branch/head/label, current project and clone marks). An agent can tell this is the project-enumeration tool versus memory-oriented siblings like search_memories or list_recent, though it doesn't name them explicitly.

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?

'READ' plus 'No preconditions' signals it is always safe to call and requires no setup. However, it never says when to prefer this over alternatives such as list_recent or investigation_status, so the routing decision is only implied.

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

list_recentB

READ. Newest memories first (current project, linked projects and global; all projects outside a project). Excludes candidates.

NameRequiredDescriptionDefault
limitNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior3/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 usefully discloses that this is a read operation, that results are newest-first, the retrieval scope, and that candidates are excluded. It does not explain limit behavior, pagination, or permissions, leaving meaningful behavioral gaps.

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 short and front-loads the key operation with "READ." It is dense but mostly earned, though the parenthetical scope phrasing is telegraphic and slightly hard to parse.

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 one-parameter read tool with an output schema, the description covers ordering, scope, and candidate exclusion. It still omits limit semantics and any sibling routing guidance, leaving clear but not severe gaps.

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?

There is one parameter, limit, with 0% schema description coverage, and the description never mentions it or explains its meaning. The parameter name is somewhat self-explanatory, but the description adds no semantics beyond the bare schema property.

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 read operation and identifies the resource as memories, with ordering "Newest memories first." It also clarifies scope: current project, linked projects, global, and all projects outside a project. It does not explicitly name or differentiate itself from siblings such as search_memories, so it stops short of 5.

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?

Usage is only implied by "READ" and "Newest memories first"; there is no explicit when-to-use or when-not-to-use guidance. The description does not point to search_memories or list_projects as alternatives, though the scope and candidate exclusion give some context.

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

memory_statusA

READ. DB path, schema version, counts per kind, FTS health, vector search state (sqlite-vec, embeddings), Ollama reachability and the current project.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

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

With no annotations, the description carries the burden itself, and it does disclose the read-only nature ('READ.') and the full set of things inspected. It does not disclose that the Ollama reachability and vector-search checks may involve network/embedding work and therefore carry latency, nor whether any of these checks can fail or degrade the call — a meaningful omission for a probe tool that touches an external service.

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 compact sentence front-loads the mode ('READ.') then lists the returned dimensions in order of specificity. Every clause names a distinct piece of information; nothing is redundant or padded.

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 and the parameter set is empty, so return-value detail is already covered and the description needn't repeat it. Given that low complexity, the field enumeration plus read-only marker is close to sufficient; the only real gap is the absent cue on when this beats the neighbouring status/session tools.

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 and the baseline of 4 applies. The description correctly implies a no-argument, whole-system snapshot rather than a targeted query.

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 enumerates exactly what the tool surfaces — DB path, schema version, per-kind counts, FTS health, vector state, Ollama reachability, current project — which unambiguously reads as a system diagnostics/status report. The leading 'READ.' verb-plus-field-list makes the resource clear, though it never explicitly names itself relative to siblings like session_state or investigation_status.

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 statement of when to call this versus alternatives, no prerequisites, and no exclusions. An agent must infer from the field list that this is the health/diagnostics probe, with no guidance on whether to reach for it before or instead of session_state or investigation_status.

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

search_memoriesA

READ. Relevance-ranked search over long-term memories of the current project (or project, a label or id), its linked projects and global memories. Returns at most limit hits, never a full dump. Candidates are never returned.

NameRequiredDescriptionDefault
limitNo
queryYes
projectNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

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

With no annotations, the description still discloses key traits: it is a read operation ('READ'), results are capped and never a full dump, and 'Candidates are never returned' clarifies result semantics. Missing are ranking behavior details, whether results span across projects in a defined order, or any auth/permission notes.

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?

Three tight sentences with the operation type front-loaded ('READ'), then scope, then result bounds. The parenthetical 'or `project`, a label or id' is slightly awkward but earns its place by defining the parameter.

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-value explanation is unnecessary, and the description covers scope, bounded results, and exclusion of candidates. What remains thin is guidance on choosing this tool over list_recent and details on cross-project result ordering, but nothing required to invoke it correctly is missing.

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

Parameters4/5

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

Schema coverage is 0%, so the description must compensate, and it does reasonably: `query` is implied as the search input, `limit` caps the hit count, and `project` is clarified as 'a label or id' including global/linked scope. It does not state the default limit (8) or the query syntax, keeping it short of a 5.

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

Purpose5/5

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

States a specific verb (relevance-ranked search) and resource (long-term memories), plus the scope: current project, linked projects, and global memories, with optional override by `project`. It is clearly distinguishable from siblings like list_recent, store_memory, and forget_memory without opening any schema.

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 framing 'Returns at most `limit` hits, never a full dump' implies this is the targeted-search path rather than enumeration, which is useful context. However, no sibling is named and there is no explicit when-to-use/when-not guidance versus tools like list_recent or memory_status, so the agent must infer the choice.

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

session_stateA

READ. The current session's checkpoint (state and its rendering), or {} when none.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior4/5

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

With no annotations, the description carries the burden and does disclose key traits: this is a read-only operation and it returns an empty object rather than erroring when no checkpoint exists. It does not cover auth or scope, but for a zero-arg read that is minor.

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?

One short sentence with the operation type front-loaded and the empty-result behavior appended. The telegraphic 'READ.' style is slightly clipped but wastes no words.

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 shape need not be explained, and there are no parameters to document. For a simple zero-arg read the description is nearly complete; only the relationship to the 'checkpoint' sibling is left implicit.

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

Parameters4/5

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

The tool takes no parameters, so the baseline is 4; there is nothing for the description to disambiguate.

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: reads the current session's checkpoint, including state and its rendering. The leading 'READ.' distinguishes it in spirit from the mutating sibling 'checkpoint', but no sibling is named outright.

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 'READ' framing and the 'or {} when none' clause imply when the tool applies (non-mutating inspection, safe when no checkpoint exists), but there is no explicit guidance on when to prefer 'checkpoint' or other session siblings.

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

store_memoryA

WRITE. Store one memory. Precondition: the user explicitly asked to remember it or confirmed a fact you proposed; never store silently. kind: fact, preference, project, decision, environment, pitfall. scope: project (default), branch (true only on this branch) or checkout (true only for this clone). global_memory=true for facts that hold everywhere. refs: pointers (§15) to the source; store the conclusion, not raw output.

NameRequiredDescriptionDefault
kindYes
refsNo
tagsNo
scopeNo
anchorNo
contentYes
projectNo
global_memoryNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.6/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 behavioral burden. It usefully discloses that this is a WRITE operation and adds the explicit-consent precondition, but it does not describe overwrite/duplicate behavior, persistence guarantees, failure modes, or other side effects an agent might need for a mutation 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 front-loaded with the operation and precondition, then uses compact semicolon-separated parameter notes. It is dense but efficient, with no obvious filler; the opaque "§15" reference is the main minor structure issue.

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 an 8-parameter mutation tool with no annotations and 0% schema description coverage, the description covers the core intent, consent precondition, and several important parameters. However, it leaves multiple parameters undocumented and does not explain duplicate handling or lifecycle behavior, so it is only partially complete.

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 explain parameters. It adds useful meaning for kind, scope, global_memory, and refs, but leaves tags, anchor, project, and content without semantic detail beyond the schema field names.

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 and resource: "WRITE. Store one memory." This clearly distinguishes the tool from read-oriented siblings such as search_memories and list_recent, though it does not explicitly name an alternative tool.

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?

It gives a strong precondition: only store when the user explicitly asked or confirmed a proposed fact, and never store silently. That provides clear when-to-use and when-not-to-use guidance, but it does not route the agent to sibling alternatives for adjacent tasks.

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. 12 tool updatesv0.1.0
    • First observedcheckpoint
    • First observedforget_memory
    • First observedinvestigation_close
    • First observedinvestigation_log
    • First observedinvestigation_open
    • First observedinvestigation_status
    • First observedlist_projects
    • First observedlist_recent
    • First observedmemory_status
    • First observedsearch_memories
    • First observedsession_state
    • First observedstore_memory

TDQS

A3.7/5.0

Scored across 12 tools

Disambiguation4/5

The set splits cleanly into three functional clusters (long-term memories, debug investigations, session checkpoints), and within each cluster the read/write lifecycle tools are distinguishable. The only real friction is between search_memories and list_recent (both return memories, differing only by ranking) and between checkpoint/store_memory, which both 'save' information but for different lifetimes and which rely on the description text to separate.

Naming Consistency3/5

Two competing conventions coexist: verb_noun (list_projects, store_memory, search_memories, forget_memory, list_recent) and resource-prefixed noun forms (investigation_open, investigation_log, investigation_status, investigation_close, memory_status). Worse, the same memory domain is split across both patterns (store_memory vs memory_status), and two tools are bare nouns with no prefix at all (checkpoint, session_state). Still readable, but not predictable.

Tool Count5/5

Twelve tools for a memory-plus-debugging server is well within the sweet spot, and each one maps to a distinct lifecycle step (open/log/status/close for investigations; store/search/list/forget for memories; save/read for checkpoints). Nothing appears padded or redundant.

Completeness3/5

Investigations have full lifecycle coverage and probing/checkpointing are covered in both directions, but the memory surface has gaps: there is no update/edit operation, and restore after forget_memory is explicitly a CLI-only escape hatch, which is a dead end for an agent. The 'candidate' memories referenced throughout are never exposed by any tool, and there is no way to list historical/closed investigations.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Provides local-first, cross-session memory for Claude Code, enabling semantic search across past sessions to retrieve procedures, decisions, or answers without exposing secrets.
    Apache 2.0
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables AI coding assistants to persist, search, checkpoint, and restore context across sessions, including decisions, progress, file changes, and git-correlated history. It prevents context loss during compaction and supports shared memory across multiple sessions.
    250 npm
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables persistent cross-session memory for Claude and other AI agents by storing and automatically retrieving decisions, patterns, and knowledge across conversations and workspace contexts, surviving restarts and context compaction.
    4 npm
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables Claude coding assistants to persist and restore context across sessions and compactions, saving decisions, progress, and file contents in channels and checkpoints for later retrieval. Supports search, change tracking, and sharing memory between parallel sessions.
    250 npm
    MIT