survivemem
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@survivememcheckpoint this session before we compact"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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.
/compactand 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.tomlname and its root commit, not by its directory, so memories are shared across clones and forks, while each clone's branch and.configstay 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
bm25with a tokenizer that keeps identifiers such asCONFIG_ARM64_PTR_AUTH,linux-6.6.yor0xFF200000whole, trigram fallback for substrings, Reciprocal Rank Fusion, optional vector rerank (sqlite-vecand 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;--stalelists 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.
gitonPATHfor project identity (without it, only a.survivemem.tomlnames 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
vecextra (sqlite-vec) and Ollama on127.0.0.1with thebge-m3model.
Install
Straight from GitHub:
uv tool install git+https://github.com/FPGArtktic/survivememFrom 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 doctorQuick 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 whyid 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 serveCheck 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 |
|
| 5 s | |
|
|
| 5 s |
|
|
| 5 s |
|
|
| 5 s |
|
| 5 s | |
|
| 30 s (room for the optional local summary) | |
|
|
| 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 candidatedocs/architecture.md: components and deployment
docs/identity.md: project resolution, URL normalisation, clones, scopes
docs/hooks.md: each hook, its output and failure behaviour
docs/compaction.md: the checkpoint round trip and merge rules
docs/investigations.md: debug sessions, the loop guard, log extraction
docs/mcp.md: MCP registration and tools
docs/data-model.md: the SQLite schema
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 survivememWhen 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 memoryThe 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 |
| store a memory (default kind |
| relevance-ranked search; |
| newest first; candidates only with |
| full record, including deleted ones, refs as commands |
| change a memory |
| soft delete and undo |
| walk candidates interactively and promote, edit or discard them |
| list projects with their primary identity and counts |
| resolution chain for |
| inspect and fix projects |
| attach or detach |
| workspace links, by hand or from |
| the clones (checkouts) of a project |
| DB path and size, counts, FTS/vector/Ollama state, hook and MCP registration |
| one JSON document for an AI client to orient itself |
| JSON Schema of memory, project, checkout, checkpoint and ref objects |
|
|
| open an investigation (one open per project) |
| append a hypothesis, experiment, observation, ruled_out or note |
| the investigation block or timeline; list investigations |
| evidence; good/bad boundary; repeated identical failures |
| lifecycle and Markdown postmortem |
| extract errors from a log into evidence or a candidate |
| the compaction-proof session checkpoint |
| backup, migration, Markdown notes |
| rebuild the FTS indexes; (re)build vectors when available |
| health checks, exit code 3 when one fails; |
| MCP server over stdio |
| 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 |
| one JSON document / one object per line |
| explicit format; |
| IDs only, one per line, for |
| do not truncate the content column |
| plain ASCII ( |
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 |
2 | not found |
3 | database error (including a failed |
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 = falseA repository can pin its project name with a .survivemem.toml at its root:
project = "de10-nano-bsp"Environment variables
Variable | Effect |
| database path (default |
| configuration file path |
| force the project (label or id) for hooks, CLI and MCP server; created if unknown |
| Ollama base URL, default |
| base directories; relative values are ignored |
| 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 searchand the MCPsearch_memoriesembed 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-vecis missing, Ollama is down or slow, or the model is not pulled, everything silently falls back to FTS5.reindexsays why vectors stay disabled.Run
survivemem reindexagain 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_PROXYare ignored for it, so memory text never goes through a proxy.ssh -Greads your SSH configuration without connecting. The$schemaURI insurvivemem schemais 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 |
| the database, plus its |
| copy taken before a schema migration |
| configuration |
| log of the hooks and the MCP server; appended, never rotated |
| 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 doctorOK 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 directlySymptom | What to check |
Nothing is injected | Run |
Wrong or new project |
|
A hook seems to do nothing | Look at |
|
|
| install a newer survivemem, or restore |
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 |
The loop guard asks about a command you meant to repeat | Log why the outcome should differ ( |
| 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 pytestEvery test gets its own
HOME, XDG directories and database, and pointsSURVIVEMEM_OLLAMA_URLat a closed port, so a running Ollama or your real memory database is never touched.The development group installs
sqlite-vecso 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 pytestand review the diff.Run the CLI from the checkout with
uv run survivemem …. UseSURVIVEMEM_DBandXDG_STATE_HOMEto 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 toolscheckpointA
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.
| Name | Required | Description | Default |
|---|---|---|---|
| done | Yes | ||
| goal | Yes | ||
| next | Yes | ||
| files | Yes | ||
| blockers | No | ||
| decisions | Yes | ||
| in_progress | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| fix | Yes | ||
| status | No | solved | |
| root_cause | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | ||
| refs | No | ||
| text | Yes | ||
| anchor | No | ||
| result | No | ||
| command | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| env | No | ||
| title | Yes | ||
| symptom | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | ||
| project | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | ||
| refs | No | ||
| tags | No | ||
| scope | No | ||
| anchor | No | ||
| content | Yes | ||
| project | No | ||
| global_memory | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
12 tool updates
v0.1.0- First observed
checkpoint - First observed
forget_memory - First observed
investigation_close - First observed
investigation_log - First observed
investigation_open - First observed
investigation_status - First observed
list_projects - First observed
list_recent - First observed
memory_status - First observed
search_memories - First observed
session_state - First observed
store_memory
TDQS
Scored across 12 tools
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.
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.
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.
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
Related MCP Connectors
Persistent cross-session memory shared by Codex, Claude Code, ChatGPT, and other AI agents.
- SeturosOAuthcom.seturos
Shared work memory for Claude Code, Codex, Cursor and chat, scoped to each repository.
Persistent, governed institutional memory for Claude Code — specs, decisions, learnings.
Persistent memory for Claude Code and Cursor. Stop re-explaining your project every session.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceProvides 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
- AlicenseNot gradedqualityAmaintenanceEnables 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 npmMIT
- AlicenseNot gradedqualityAmaintenanceEnables 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 npmMIT
- AlicenseNot gradedqualityAmaintenanceEnables 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 npmMIT