Skip to main content
Glama

memshelf-mcp

Put your agent's memory on a shelf, hand it the index.

PyPI Python Glama ci security License: MIT Docs Sibling: docshelf

                              _          _  __
 _ __ ___   ___ _ __ ___  ___| |__   ___| |/ _|
| '_ ` _ \ / _ \ '_ ` _ \/ __| '_ \ / _ \ | |_
| | | | | |  __/ | | | | \__ \ | | |  __/ |  _|
|_| |_| |_|\___|_| |_| |_|___/_| |_|\___|_|_|
  ____________________________________________
 | INDEX >> | E-01 | E-02 | E-03 | E-04 | ... |
 |__________|______|______|______|______|_____|
        memory shelves for AI agents

What this is

Long-running agent sessions burn tokens re-sending history and lose detail to lossy auto-compaction. memshelf applies the docshelf pattern — tiny index in context, bodies fetched on demand — to the agent's own working memory:

  1. Closed conversation topics, research dumps, and bulky tool output are offloaded to a local shelf as Markdown episodes.

  2. Each episode carries an LLM-written, contract-validated digest that preserves decisions, rejected alternatives, artifacts, and open threads.

  3. The agent keeps only INDEX.md (kilobytes) + digests in context and recalls exact sections via INDEX → episode → section slice over MCP.

Positioning in one sentence: claude-mem's loop, git's substrate, docshelf's navigation — episodic memory you can grep, diff, review, and carry between hosts. Private and local by default: the standard storage mode is a local git repo with no remote configured. The tool is public; the memory never is.

Related MCP server: hmem

Measured, not promised

One week of dogfooding on the live shelf — full numbers and methodology in docs/demo.md:

Measure

Result

Episodes on the shelf

34

Standing cost in every session (INDEX + digests)

~8.6K tokens

Shelved mass those episodes replace

~1.9M tokens — ≈220 : 1

One question answered from memory

~1.8K tokens (INDEX + one episode)

Recall test: fresh agent, INDEX path only

5 / 5 — zero misses, zero over-fetch

Tokens are counted as chars/4 everywhere, so the ratios are estimator-independent; absolute counts move with the tokenizer.

Quick start

As an MCP server:

# Claude Code
claude mcp add memshelf -- uvx memshelf-mcp
// Claude Desktop (claude_desktop_config.json)
{
  "mcpServers": {
    "memshelf": { "command": "uvx", "args": ["memshelf-mcp"] }
  }
}

As a Claude Desktop extensionadapters/claude-desktop/: an .mcpb bundle installed from Settings → Extensions, with a Default shelf setting so calls need not repeat the path. Nothing has to be installed alongside it — not even Python.

As a Claude Code pluginadapters/claude-code/: a /shelve skill plus SessionStart / SessionEnd / PreCompact hooks.

Or from the shell (pip install memshelf-mcp, Python ≥ 3.10) — the same loop, no MCP:

memshelf init   --shelf ~/my-shelf --name "My working memory"
memshelf shelve --shelf ~/my-shelf --slug 2026-07-23-topic --kind topic \
  --digest "What was decided, what was rejected and why, what stays open." \
  --section "Decisions=What was decided, and what was rejected instead — one line each."
memshelf recall --shelf ~/my-shelf --id 2026-07-23-topic --section Decisions --log
memshelf rebuild --shelf ~/my-shelf  # render ledger/INDEX from the episode (a bot's job on shelves that have one)
memshelf stats  --shelf ~/my-shelf   # claimed + realized savings
memshelf doctor --shelf ~/my-shelf   # exit 1 on integrity errors

pip install 'memshelf-mcp[semantic]' adds an embedding sidecar so search also finds paraphrases and the other language (memshelf semantic build --shelf ~/my-shelf once; MEMSHELF_SEMANTIC=off turns it off). Optional: the base install stays grep-only and as light as it is.

Tool surface

One verb per job; the same names over MCP (memshelf_*) and in the CLI (long-form descriptions: docs/tools.md):

Tool

What it does

init

Create (or top up) a memory shelf: docshelf layout, fixed categories

shelve

Offload one closed topic as a durable, indexed episode; --amend rewrites in place

lint_digest

Validate a digest against the contract without touching the shelf

import

Retro-shelve a whole exported dialog without pulling it through context

index

Return the shelf INDEX — the small recall entry point

recall

Fetch an episode by id, or a single ## Section of it

search

Grep the shelf; returns matching episodes

stats

The shelf's token economy: standing cost vs shelved mass, claimed vs realized

advise

What your context is made of and what you could put down — proposals only

rebuild

Regenerate every derived file from the episodes

rollup

Archive a period behind one digest-of-digests

purge

Drop episodes past retain_until, then reindex — dry run by default

resolve

Settle multi-writer conflicts: regenerate derived, union the recall log

doctor

Diagnose: episode schema, digest contract at rest, secret shapes, index bloat

prune-splits

CLI only — remove H2 split directories git never got (migration for #109)

tags

CLI only — episodes grouped by frontmatter tag (#18)

graph

CLI only — who mentions whom: cross-episode id references as JSON or Mermaid (#18)

retro

CLI only — one quarter of the shelf as a Markdown retrospective (#18)

fork

CLI only — bootstrap a fresh session from INDEX + selected episodes or sections (#18)

mirror

CLI only — INDEX (± episodes) as one self-contained HTML page for phone-side reading (#18)

semantic

CLI only — build / status / drop the embedding sidecar that turns search hybrid; lives outside the shelf, needs pip install 'memshelf-mcp[semantic]' (#17)

search-bench

CLI only — hit@1 / hit@k / MRR of grep vs hybrid on a query<TAB>expected-id file (#17)

The rules the tools enforce

The digest is a contract, not a convention. It is the only thing read at recall before fetching a body, so a weak one devalues the whole episode. lint_digest runs the same validator as shelve with no side effects (--strict turns warnings into failures); errors block a shelve, warnings do not — a pure reference digest legitimately carries no decision marker. A rejected digest is a feature: the tool prints exactly what to fix and writes nothing.

--amend re-runs the whole pipeline — redaction, the digest contract, composition — so an amended episode is exactly as guarded as a fresh one, which a hand-edit of the file never is. Amending a slug that is not on the shelf is an error, not a create.

The episode is the source; everything else is output. ledger.tsv, INDEX.md, stats.svg and each category's .meta.json are derived: shelve writes and commits the episode alone, rebuild renders the rest — delete all four and rebuild restores them byte-identically. That is what makes two sessions shelving in parallel a non-event: the merge is clean by construction. On a shared shelf, let a bot own the derived files on main — ready-to-copy workflows in adapters/shelf-repo/; rebuild --adopt migrates an older shelf once, rebuild --check is the CI guard.

Two consequences worth stating plainly, because getting them wrong costs a merge conflict:

  • doctor reports no-ledger-row and stale-index immediately after a correct shelve — on every branch, main included. Nothing is broken: the episode is written, the derived files are not rendered yet. They clear on the next rebuild — the bot's run, on a shelf that has one.

  • Do not rebuild and commit the derived files by hand to silence them. That is exactly the conflict class the split removes: a hand-regenerated ledger.tsv/INDEX.md/stats.svg meets the bot's, and the merge stops being clean by construction. Wait for the renderer; on a shelf without a bot, run memshelf rebuild --shelf . as its own step.

If those warnings persist for a day while episodes keep arriving, that is a different state — the renderer is not lagging, it is stopped — and doctor says so separately, as derived-stale at error severity. The day is counted from when the renderer could first see the work, not from the ledger's last commit: an episode pushed minutes ago onto a shelf whose ledger has not moved since yesterday says nothing about the renderer, and saying otherwise sent readers to a manual rebuild, which is the conflict this whole split exists to avoid.

That arrival is read from this clone's reflog for the tracked upstream — the one local record of when the ref moved here. A commit date is not a substitute: it says when the episode was written, and «shelve now, push when confirmed» is a documented way to work, so the two can be a working day apart. Where the reflog cannot say — a fresh clone starts an empty one, which is what CI and ephemeral agent sessions run in — doctor reports renderer-wait-unknown at the unknown level instead of picking a verdict: from there, «stopped» and «handed the work a minute ago» look the same, and the renderer has to be judged where it can be observed, on its own job's run. On a shelf with no upstream there is no renderer to be fair to, and the ledger's own age stays the clock.

There was a third way to hold stale-index forever, and it is fixed rather than documented: docshelf split any episode past 50 KiB into section files beside it, shelve committed the episode alone, and from then on this working copy rendered an INDEX no other checkout could produce — no rebuild could clear it, and search answered with addresses that existed on one machine (#109). shelve no longer splits. A shelf that already carries such directories keeps reporting them as local-split-dir until memshelf prune-splits --shelf . --apply removes them; the episode file holds every section, so nothing is lost. It is a dry run without --apply, and a split directory that is committed is reported and left alone.

advise proposes, never writes. It answers the question the project was founded on — a dead topic has been occupying 30K tokens for forty minutes. The tool cannot see your window, so you tell it what is in there:

memshelf advise --shelf ~/my-shelf \
  --occupant 'auth refactor=42000,closed' \
  --occupant 'search dump=9000,idle=18' \
  --occupant 'Case B verdict=12000,live,episode=2026-07-22-case-b-verdict'

Three things keep it honest: it counts itself (INDEX + digests are in the report, not left out of it), it verifies episode= claims before proposing a drop, and it reports net — a topic too small to pay for its own digest is not proposed at all.

Rollup shrinks navigation and nothing else. When INDEX grows into a real share of your window, rollup collapses a period into one digest-of-digests and moves the originals to archive/ — still reachable by recall and search, every ledger row intact. The rollup digest is yours, not the tool's: synthesizing a quarter is the part a tool cannot do.

index-bloat is not what a rollup is for. INDEX lists your episodes, so its size grows with the shelf by design; its budget grows with the shelf too (INDEX_BASE_TOKENS + INDEX_TOKENS_PER_ENTRY × listed). Over budget therefore means entries are overpriced, never that there are too many of them — so doctor reports the cost of one line, and the fix is to trim it and rebuild. A rollup would remove entries and their allowance together and leave the price where it was. Having the two paired the other way is what made "archive a third of your memory" the standard way to silence a formatting problem.

purge deletes the working tree, not history. Retention is opt-in per episode (--retain-until); purge is a dry run until --apply — and even then git history still has the file. Real erasure is a deliberate filter-repo pass over the whole repository, never a side effect of a tool call, and the purge report says so.

resolve regenerates derived paths, never merges them — a derived file has no history, only a current correct value. The one file it unions is recall-log.tsv, because a recall is an event, not a fact about the episodes. Conflicting episodes are content, not mechanics: resolve reports them and steps aside.

The design rationale behind each rule lives in docs/DECISIONS.md and docs/ARCHITECTURE.md.

One memory, multiple AIs

The memory is vendor-portable, and that is a measured fact, not a design intention: the same live shelf has been read and cross-written by Claude Code (Anthropic) and Gemini CLI (Google) through one shelf-spec server — protocol and field notes in docs/portability.md.

Status

M0 complete: the pattern was validated with zero code on a live shelf — retro-import of months of material, then a week of shelve-at-close (docs/M0.md). M1 shipped the server/CLI that enforces it, plus the Claude Code plugin. Next milestones with exit criteria: docs/ROADMAP.md; release history: CHANGELOG.md.

Documents

Rendered site: https://ignatenkofi.github.io/memshelf-mcp/ — including the week-report infographic from the dogfood shelf.

Doc

What it covers

docs/MANIFEST.md

Problem, the bet, hero scenarios, principles, non-goals

docs/tools.md

Tool reference: the long-form description of every memshelf_* tool (the MCP schema carries only the short one)

docs/ARCHITECTURE.md

Episode format, digest contract, storage modes, triggers, MCP tool surface, portability model, privacy, failure modes

docs/LANDSCAPE.md

Prior-art survey (2026-07), platform built-ins, positioning, risks

docs/ROADMAP.md

Milestones M0–M3 with exit criteria

docs/DECISIONS.md

Decision log

docs/M0.md

M0 experiment protocol and results: cases, token ledger, recall test

docs/demo.md

Measured numbers from the dogfood shelf: compression, recall test, doctor findings

docs/portability.md

One memory, multiple AIs: the cross-vendor experiment

docs/examples/

A worked episode file and a memory-shelf INDEX

adapters/claude-code/

Claude Code plugin: /shelve skill + SessionStart/SessionEnd/PreCompact hooks

adapters/claude-desktop/

Claude Desktop .mcpb extension: builder, bundle checker, default-shelf setting

adapters/claude-account/

Mirror of record for the claude.ai account skill — not installable, exists to be compared

Project memory shelf

shelf/ is this project's own memory shelf, dogfooding the tool it ships: session episodes with decisions, rejected options and their reasons. Before asserting anything about past work here, read shelf/INDEX.md and fetch the one episode it points at — a guess about a past decision is a defect, not an estimate. Derived files (ledger.tsv, INDEX.md, stats.svg, .meta.json) are written by the same commit as the episode (memshelf rebuild --shelf shelf); the shelf-pr-guard workflow fails a PR or a push to main where they drifted.

Origin

Designed as RFC-0001 in the docshelf-mcp repo (#42, #43, #44); this repo is the project's home from 2026-07-13 on. The docshelf copy is frozen as a historical snapshot.

  • docshelf-mcp — the sibling project and storage layer: PDFs/Markdown → chat-project-friendly document shelves with the same index-and-fetch economics (measured: ~3.7K tokens vs 1.2M per question). memshelf was born as RFC-0001 in its repo and reuses its splitter/indexer/read/search verbatim.

  • The dogfood memory shelf is a private repo — by design (MANIFEST principle 5).

License

MIT — see LICENSE.


mcp-name: io.github.ignatenkofi/memshelf-mcp

Available Tools

14 tools
memshelf_adviseA
Read-onlyIdempotent

Report what your context window is made of and what you could put down — breakdown plus ranked proposals; writes nothing. Pass your window's occupants (label, size, live or not); with none it reports the shelf alone.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already establish readOnlyHint=true, idempotentHint=true and destructiveHint=false, so the safety profile is covered. The description mainly restates that ('writes nothing') and adds the modest detail that an empty occupants list is legal and produces an explicitly degraded report. It does not mention the verification behavior for episode_id claims, which the schema covers instead.

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

Conciseness4/5

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

Two dense sentences with the core purpose front-loaded and the fallback case parenthesized at the end; no filler. The em-dash clause stack is slightly compressed but still parseable.

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?

With full annotations, a rich nested schema and an output schema, the agent needs little more than purpose and payload shape, both of which are present. The one gap is that the description never situates this tool among its twelve siblings, which matters for a diagnostic-style tool.

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 top-level schema is only a 'params' wrapper (reported coverage 0%), so the description has to carry semantic load - and it does, mapping the occupant fields to plain language ('label, size, live or not'). The nested definitions are also well documented, so the agent can populate the payload without guessing, though budget/staleness semantics are left entirely to the schema.

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

Purpose4/5

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

States a specific verb+resource: it reports the composition of the caller's context window and returns 'ranked proposals' for what to drop, and it explicitly says it 'writes nothing'. That distinguishes it from write-oriented siblings like memshelf_shelve and memshelf_purge. It does not name any sibling directly, so it stops short of top marks.

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

Usage Guidelines3/5

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

It gives a usable usage condition - pass occupants when you want the window side analyzed, omit them and you get the shelf side only - so the agent can infer when to call it. However, it never contrasts itself with the many nearby read siblings (memshelf_stats, memshelf_recall, memshelf_search), so routing between them is left to inference.

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

memshelf_doctorA
Read-onlyIdempotent

Diagnose shelf integrity: episode schema, digest contract at rest, leaked secrets, ledger consistency, INDEX budget. Read-only; fixes nothing. check_remote adds the network probe for a public remote.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive/openWorld, so safety is covered; the description adds genuine extra context by listing the specific invariants checked, stating it performs no repairs, and disclosing that check_remote hits the network and is off by default. It does not describe failure reporting or exit behavior, but that is largely covered by the output schema.

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

Conciseness5/5

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

Two tight sentences, heavily front-loaded with the diagnosis scope, followed by the non-fixing guarantee and the one parameter caveat that changes behavior. 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?

For a read-only diagnostic tool with an output schema, the description covers scope, non-mutating behavior, and the network caveat — enough to invoke correctly. Minor gap: it never states what a failure result looks like, though the output schema plausibly carries that.

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?

Top-level coverage reads as 0% (the single visible param is the wrapper), but the nested DoctorInput fields are themselves well documented in the schema. The description adds real meaning only for check_remote (network probe for a publicly visible remote) and says nothing about shelf_path defaults or derived_stale_after_hours, so it sits at the schema-does-the-work baseline.

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 concrete verb and resource ("Diagnose shelf integrity") and enumerates the exact checks performed: episode schema, digest contract, leaked secrets, ledger consistency, INDEX budget. That scope is more specific than siblings, though it never names memshelf_lint_digest or memshelf_advise to draw the boundary 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-only; fixes nothing" implicitly tells the agent this is the inspection step rather than the repair step, and the check_remote sentence explains when the optional network probe applies. However, there is no explicit when-to-use / when-not guidance and no routing to overlapping siblings like lint_digest or stats.

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

memshelf_importA
Idempotent

Retro-shelve an exported dialog without pulling it through context: discover lists conversations by content markers, extract writes one cleaned conversation to a working file for segmenting and shelving.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare write behavior (readOnlyHint=false), idempotency, and no destructiveness, so the safety profile is covered. The description adds the notable trait 'without pulling it through context' and that extract writes to a working file, but says nothing about permissions, error behavior, or what the write touches.

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

Conciseness4/5

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

Front-loaded with the core purpose followed by the method breakdown in two tight clauses. No filler, though the sentence is dense with backticked terms that blur quick scanning.

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 described, and annotations cover the safety profile. The description covers the dual-mode workflow adequately, leaving only minor gaps around preconditions and parameter specifics.

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?

The description adds meaning for the `method` enum by describing both modes, but with reported schema coverage at 0% it does not compensate for path, out, select, markers, or limit. It only partially carries the parameter burden.

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 names a specific action (retro-shelve an exported dialog) and immediately breaks it into its two operational modes (`discover` lists, `extract` cleans and writes). It does not explicitly contrast itself with siblings like memshelf_shelve, but the verb+resource is clear enough to place it.

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

Usage Guidelines3/5

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

It distinguishes the two methods by function ('discover' lists conversations, 'extract' cleans one to a working file), which implies which to pick. However it never states prerequisites, when-not-to-use, or how this differs from memshelf_shelve or memshelf_index, leaving the agent to infer routing.

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

memshelf_indexA
Read-onlyIdempotent

Return the shelf INDEX — the small recall entry point. Read it before answering anything about past work, then recall only what you need.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered. The description adds that the payload is small and read whole, which is useful sizing context, but it does not disclose anything further about auth or scope. Adequate but not rich given the low bar set by annotations.

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

Conciseness5/5

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

Two short sentences, zero waste, with the primary instruction (read this first) front-loaded ahead of the follow-up action.

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

Completeness4/5

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

For a one-parameter read tool with an output schema, the description covers purpose, ordering, and the alternative. Minor gap: it never mentions shelf selection, though the input schema handles that adequately.

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?

The description says nothing about the shelf_path parameter, so it adds no meaning beyond the schema. The schema's own description does explain the $MEMSHELF_SHELF_PATH default and when to override it, so semantics are documented somewhere; the description simply does not contribute.

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

Purpose5/5

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

States a specific verb and resource ("Return the shelf INDEX") and immediately characterizes it as "the small recall entry point," which distinguishes it from the sibling memshelf_recall without the agent needing to open either schema.

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

Usage Guidelines5/5

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

Explicitly prescribes when to call it ("Read it before answering anything about past work") and how it relates to the alternative ("then recall only what you need"), effectively routing the agent to memshelf_recall as the follow-up rather than as a substitute.

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

memshelf_initB
Idempotent

Create (or top up) a memory shelf: layout, categories, INDEX preamble, POLICY.md, shelf.yml. Idempotent; never overwrites existing files.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior4/5

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

Annotations already declare destructiveHint=false, idempotentHint=true, and readOnlyHint=false, so the safety profile is covered; the description adds value by enumerating exactly what gets created and by promising it never overwrites existing files. It does repeat the idempotency claim slightly, but the non-overwrite guarantee is genuine added context.

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

Conciseness4/5

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

Two tight sentences with no filler; the create action and artifact list come first, the idempotency/non-overwrite guarantee second. Efficient and front-loaded.

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?

An output schema exists, so return values need no explanation, and annotations cover the safety profile. The gap is on the input side: for a bootstrapping tool with nested params at 0% coverage, the description should at least hint at storage modes and the shelf_path/env-var interaction, which it omits.

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

Parameters2/5

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

Schema description coverage is 0% per the signals, so the description should compensate, but it says nothing about the name, storage mode (plain/git-local/git-remote), remote URL constraints, or the shelf_path env-var fallback. An agent must rely entirely on the nested schema, and the meaningful storage-mode semantics are left unexplained.

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?

Specific verb (create/top up) plus resource (memory shelf) and an explicit list of artifacts produced (layout, categories, INDEX preamble, POLICY.md, shelf.yml). It is clearly distinguishable from siblings like rebuild, purge, or import, though it never names an alternative tool directly.

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?

'Create (or top up)' implies this is the bootstrap/first-run step, and the idempotency note hints it is safe to re-run. However, there is no explicit when-to-use vs. when-to-prefer-siblings guidance (e.g., versus memshelf_rebuild or memshelf_import), leaving routing to inference.

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

memshelf_lint_digestA
Read-onlyIdempotent

Check a digest against the contract while it is still being written — the same validator memshelf_shelve runs, writing nothing. strict turns warnings into failures.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so safety is covered. The description adds value beyond them by explaining that `strict` escalates warnings to failures and that this is the identical validator used at shelf time, though 'writing nothing' partly restates the readOnly annotation.

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

Conciseness5/5

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

Two tight sentences, front-loaded with the core action and the writing-nothing guarantee, followed by the strict-mode modifier. No filler and nothing redundant.

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 annotations cover the safety profile. The description supplies the purpose, the timing, and the strict behavior, though it could have clarified the digest parameter for full completeness.

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 reported as 0%, so the description should carry the load. It explains the `strict` behavior and its effect (warnings become failures), but says nothing about the `digest` parameter itself, leaving its semantics to the schema alone.

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

Purpose5/5

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

States a specific verb (check/lint), resource (a digest), and scope (against the contract, while being written), and explicitly links itself to the sibling `memshelf_shelve` by noting it is the same validator that tool runs. An agent can distinguish this from `memshelf_shelve` without opening either schema.

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 clearly frames the use case — validating a digest in-progress before it is shelved — and names the related tool it mirrors. It stops short of an explicit when-not or a statement of what to call instead once the digest is finalized, but the timing condition is well conveyed.

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

memshelf_purgeA
DestructiveIdempotent

Drop episodes past retain_until, then reindex. Dry run unless apply=true; removes working-tree files only, git history keeps them.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior5/5

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

Goes well beyond the annotations' destructiveHint/idempotentHint by disclosing that the default is a dry run, that deletion is scoped to working-tree files, and that git history retains the removed episodes, plus a reindex is triggered afterward. These are exactly the safety details an agent needs before invoking a destructive tool.

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

Conciseness5/5

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

Two short sentences, no filler; the destructive condition and the reversibility caveat are both front-loaded and immediately actionable.

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

Completeness5/5

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

With destructive annotations, an output schema covering return values, and only one nested parameter object, the remaining burden is behavioral disclosure and the description supplies it (dry run, scope of deletion, git retention, reindex). Nothing material is missing.

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

Parameters3/5

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

Schema coverage is reported at 0%, so the description must carry parameter meaning; it does cover the semantics of `apply` (dry run vs real delete) but is silent on `today` and `shelf_path`, which the nested schema documents instead. Partial compensation for the coverage gap.

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 states a specific verb ("Drop") plus the exact resource and selection rule ("episodes past `retain_until`"), then adds the follow-on action ("then reindex"). This is clearly separable from maintenance siblings like memshelf_rollup or memshelf_rebuild 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?

It tells the agent the default mode (dry run unless `apply=true`), which is strong operational guidance, but says nothing about when to purge versus other maintenance tools, nor any precondition (e.g. that it should be run after retain_until changes). Usage is implied rather than specified.

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

memshelf_rebuildA
Idempotent

Regenerate the derived files (ledger.tsv, .meta.json, INDEX.md, stats.svg) from the episodes; check=true only reports drift. Hand-run it only on a shelf whose bot is not rendering.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, idempotentHint=true, destructiveHint=false, so safety is partly covered. The description adds real context beyond that: which files are rewritten, that check=true is non-mutating drift reporting, and the concurrency caveat about not running while a bot is rendering. It doesn't cover atomicity or failure behavior, keeping it out of 5 territory.

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

Conciseness5/5

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

Two compact sentences: the primary action and its outputs come first, followed by the mode qualifier and the operational caveat. No filler, no repetition of the title.

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?

With an output schema present and annotations covering idempotency and mutation profile, the description supplies what's missing: artifact names, the two modes, and the recommended run condition. The only gap is guidance on choosing between check and full rebuild in normal workflows, which an agent must infer.

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?

The schema's own nested descriptions for adopt, check, and shelf_path are already detailed; the description only restates the check=true semantics ('only reports drift') and adds nothing for adopt or shelf_path. Reported top-level schema coverage is 0%, but the nested field documentation carries the burden, so this lands at the baseline rather than below it.

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?

Specific verb ('Regenerate') plus resource ('the derived files') and it enumerates the exact artifacts produced (ledger.tsv, .meta.json, INDEX.md, stats.svg), so an agent knows precisely what this produces. It does not name the sibling tools it overlaps with (memshelf_index, memshelf_rollup, memshelf_stats), so disambiguation from those still requires inference.

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

Usage Guidelines4/5

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

Gives a clear operational condition: 'Hand-run it only on a shelf whose bot is not rendering', which tells the agent when this is appropriate vs. letting the automated path handle it. The check=true mode is also framed as a reporting-only path. It stops short of naming an alternative tool for the report-only case (e.g., lint/doctor siblings).

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

memshelf_recallA
Read-onlyIdempotent

Fetch a shelved episode by id, or one ## Section of it, as a data envelope. Prefer the section when it answers the question.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered by structured data. The description adds only the vague 'as a data envelope' return-shape hint and says nothing about the default side effect of appending a recall-log entry (documented only in the `log` schema property) or about shelf resolution via $MEMSHELF_SHELF_PATH.

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

Conciseness4/5

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

Two compact sentences with the core fetch semantics front-loaded and no filler. The second sentence earns its place by routing the `section` choice, though it could have been folded into the first for a tighter single-sentence definition.

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?

With an output schema present, the description needn't explain the envelope contents, and read-only safety is covered by annotations. What is missing is minimal but real: no note that recalls are logged by default, which is the one behavior an agent might want to know before calling it.

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?

The visible schema itself documents episode_id, section, log, and shelf_path in some depth, so the description is not obligated to carry the full load; it reinforces the id and `## Section` selectors but says nothing about `log`, `max_bytes`, or `shelf_path`. The raw coverage signal (0%) reflects the top-level `params` wrapper, but the nested schema descriptions mean the description's marginal contribution is small.

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?

Specific verb ('Fetch') plus resource ('a shelved episode by id, or one `## Section` of it') tells the agent exactly what comes back, and 'by id' implicitly separates this from the keyword-oriented memshelf_search sibling. It stops short of naming any sibling explicitly, so the differentiation is inferred rather than stated.

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?

'Prefer the section when it answers the question' is a genuine when-to-use hint for the `section` parameter, which is the main branching decision in this tool. However, there is no guidance on when to recall by id versus using memshelf_search, memshelf_advise, or memshelf_resolve, nor any stated precondition that the episode must already have been shelved.

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

memshelf_resolveA
Idempotent

Settle the two-writers-on-parallel-branches conflict: union derived rows, rebuild INDEX, run doctor. Episode conflicts are reported, never auto-merged; safe outside a conflict too.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare non-readonly, idempotent, non-destructive behavior, but the description goes further: it discloses that derived rows are unioned (no loss), that INDEX is rebuilt and doctor is run as side effects, and that episode conflicts are reported rather than auto-merged. This clarifies the limits of automated resolution beyond what the hints convey, though auth/permission requirements are unstated.

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 dense sentences with the core purpose front-loaded and no filler; each clause carries information about behavior or scope. The structure is terse but readable, though the compound second clause packs several operations together.

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?

With an output schema present, return values need not be explained, and the description covers the mutation's side effects, conflict semantics, and safety conditions. The only real gap is parameter-level guidance (commit/shelf_path), which is left entirely to the nested schema.

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?

The description never mentions the commit flag or shelf_path, and notably omits the staged-vs-committed distinction that the commit parameter controls. The reported schema description coverage is 0% for the top-level parameter, so the description is expected to compensate for parameter behavior and does not.

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

Purpose5/5

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

States a specific verb and scenario ("Settle the two-writers-on-parallel-branches conflict") and enumerates the concrete operation steps it performs: union derived rows, rebuild INDEX, run doctor. It also implicitly distinguishes itself from siblings like memshelf_index and memshelf_doctor by showing those are internal sub-steps of resolve rather than separate calls.

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?

Names the triggering situation (two writers on parallel branches) and adds "safe outside a conflict too," which tells the agent the tool is not restricted to conflict state. It does not explicitly name alternatives or exclusions, but the usage context is clear enough to route correctly.

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

memshelf_rollupB

Archive a period's episodes behind one digest-of-digests you write, shrinking INDEX; nothing is deleted. Not the answer to index-bloat.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false and idempotentHint=false. The description usefully reinforces the non-destructive contract ('nothing is deleted') and discloses the effect on INDEX ('shrinking INDEX'). However it never addresses the notable idempotency=false trait (what happens on repeat calls) or reversibility, so the added behavioral context is only partial.

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

Conciseness4/5

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

Two tight sentences, front-loaded with the core action and the non-destructive guarantee. The trailing 'Not the answer to `index-bloat`' is compact but its cryptic reference to an external concept costs a little clarity for the space it saves.

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?

With an output schema present, return values need not be explained, and the mutation semantics are largely covered by annotations. Still, the description leaves the agent without a clear picture of when this beats memshelf_shelve or memshelf_purge, and the ambiguous 'index-bloat' reference is not self-explanatory.

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?

The description clarifies the single most important argument — 'a digest-of-digests you write', i.e. the digest must be the caller's own synthesis — which matches the schema's digest contract. It adds nothing about date/until/slug/episode_ids/sections/display_title, so it does not meaningfully extend parameter meaning beyond the schema.

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

Purpose4/5

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

States a specific verb and resource: it archives episodes 'behind one digest-of-digests', names the affected artifact (INDEX) and clarifies scope ('a period's episodes'). An agent understands the operation, though differentiation from siblings like memshelf_shelve is only gestured at via the cryptic 'Not the answer to `index-bloat`' line.

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 'Not the answer to `index-bloat`' is an implicit exclusion, telling the agent this is the wrong tool for that problem, but it never names the correct alternative nor states a positive when-to-use condition. Usage is implied rather than explicit.

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

memshelf_shelveA
Idempotent

Offload one closed topic to the shelf as a durable, indexed episode — redaction, digest contract and git commit included. Derived files are not written here — they are rendered by memshelf_rebuild or the shelf's bot. Details: docs/tools.md.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=true, openWorldHint=false), so the bar is lower. The description still adds real behavioral detail beyond them: redaction runs, a digest contract is enforced, and a git commit is produced, plus an explicit statement that derived artifacts are written by a different tool. It does not mention push/publish side effects, but the schema carries those.

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: what it does, what it deliberately does not do, and where the full documentation lives. The purpose is front-loaded and nothing is redundant — a good model of density for a tool with a heavy 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 not be explained, and the rich schema plus annotations cover the mechanics. What is missing is onboarding context: the shelf must already exist (the sibling memshelf_init / default $MEMSHELF_SHELF_PATH is only implied), and no pointer is given to the lint/advise steps that normally precede a shelve.

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?

The description contributes nothing about arguments. The reported 0% schema description coverage is an artifact of the top-level 'params' wrapper having no description; the nested ShelveInput properties are in fact documented at high density (push/publish exclusivity, sync refusal behavior, amend semantics, retention, approx_tokens absent-vs-zero). With the schema effectively doing the work, the baseline of 3 applies.

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

Purpose4/5

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

States a specific verb and resource — offloading one closed topic into a durable, indexed episode — with concrete constituents (redaction, digest contract, git commit). It also marks a boundary against memshelf_rebuild ('derived files are not written here'), which helps an agent separate the two. It does not distinguish itself from memshelf_import or memshelf_advise, so it stops short of full sibling differentiation.

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?

'Offload one closed topic' implies the trigger condition (a topic has been completed) and the rebuild reference routes one sub-concern elsewhere, but there is no explicit when-to-use/when-not guidance against the 13 siblings. The reader must infer that this is the write path that precede rebuild/index. Implied usage only.

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

memshelf_statsA
Read-onlyIdempotent

Report the shelf's token economy: standing cost vs shelved mass, claimed compression, realized savings from logged recalls.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=false, and destructiveHint=false, so the safety profile is fully covered by structured data. The description adds meaningful context about what the report contains (standing cost, compression claims, realized savings), but says nothing about cost of computation, staleness, or whether stats are recomputed on demand.

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

Conciseness4/5

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

A single front-loaded sentence with no filler; the colon-and-list structure efficiently names the three accounting outputs. Slightly telegraphic ('standing cost vs shelved mass'), but every phrase carries information.

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 annotations plus detailed nested parameter docs cover safety and invocation. For a read-only single-parameter stats tool this is close to sufficient; only the absence of any usage framing keeps it from being 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?

The reported schema_description_coverage of 0% applies only to the top-level 'params' wrapper; the nested StatsInput properties actually carry rich descriptions covering the $MEMSHELF_SHELF_PATH default, the $MEMSHELF_CONTEXT_WINDOW fallback chain, the 200,000 default, and units in tokens. The description itself contributes no parameter meaning, so the schema is doing all the work.

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 ('Report') and a precisely scoped resource ('the shelf's token economy'), then enumerates the exact metrics returned: standing cost vs shelved mass, claimed compression, realized savings from logged recalls. This is clearly distinguishable from siblings like memshelf_recall, memshelf_search, or memshelf_doctor 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 Guidelines2/5

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

There is no when-to-use guidance, no prerequisites, and no mention of alternatives or complementary tools (e.g. memshelf_recall, which is referenced indirectly via 'logged recalls'). The agent must infer that this is a reporting tool used to inspect token accounting.

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. 14 tool updatesv0.3.0
    • Addedmemshelf_advise
    • Changedmemshelf_doctor5 fields changed
      • addedInput schema / $defs / DoctorInput / additionalProperties
        Added value: +false
      • addedInput schema / $defs / DoctorInput / properties / derived_stale_after_hours
        Added value: +{
        +  "default": 24,
        +  "description": "Hours the derived layer may go unrewritten with uncounted episodes before `derived-stale` fires (#89). A shelf picks its own threshold — a bot that renders in minutes deserves a far shorter one than the day-long default.",
        +  "exclusiveMinimum": 0,
        +  "title": "Derived Stale After Hours",
        +  "type": "number"
        +}
      • addedInput schema / $defs / DoctorInput / properties / shelf_path / default
        Added value: +""
      • changedInput schema / $defs / DoctorInput / properties / shelf_path / description
        Previous value: -"Path to an initialized memory shelf."New value: +"Path to an initialized memory shelf. Optional: when omitted, the shelf named by $MEMSHELF_SHELF_PATH is used. Pass it explicitly to address a different shelf than that default."
      • removedInput schema / $defs / DoctorInput / required
        Removed value: -[
        -  "shelf_path"
        -]
    • Changedmemshelf_import1 field changed
      • addedInput schema / $defs / ImportInput / additionalProperties
        Added value: +false
    • Changedmemshelf_index5 fields changed
      • addedInput schema / $defs / IndexInput / additionalProperties
        Added value: +false
      • addedInput schema / $defs / IndexInput / description
        Added value: +"Nothing beyond the shelf: INDEX is small and read whole."
      • addedInput schema / $defs / IndexInput / properties / shelf_path / default
        Added value: +""
      • changedInput schema / $defs / IndexInput / properties / shelf_path / description
        Previous value: -"Path to an initialized memory shelf."New value: +"Path to an initialized memory shelf. Optional: when omitted, the shelf named by $MEMSHELF_SHELF_PATH is used. Pass it explicitly to address a different shelf than that default."
      • removedInput schema / $defs / IndexInput / required
        Removed value: -[
        -  "shelf_path"
        -]
    • Changedmemshelf_init4 fields changed
      • addedInput schema / $defs / InitInput / additionalProperties
        Added value: +false
      • addedInput schema / $defs / InitInput / properties / shelf_path / default
        Added value: +""
      • changedInput schema / $defs / InitInput / properties / shelf_path / description
        Previous value: -"Directory to create (or top up) the shelf in."New value: +"Directory to create (or top up) the shelf in. Optional: when omitted, $MEMSHELF_SHELF_PATH is used."
      • removedInput schema / $defs / InitInput / required
        Removed value: -[
        -  "shelf_path"
        -]
    • Addedmemshelf_lint_digest
    • Addedmemshelf_purge
    • Addedmemshelf_rebuild
    • Changedmemshelf_recall6 fields changed
      • addedInput schema / $defs / RecallInput / additionalProperties
        Added value: +false
      • changedInput schema / $defs / RecallInput / properties / log / default
        Previous value: -falseNew value: +true
      • changedInput schema / $defs / RecallInput / properties / log / description
        Previous value: -"Append this recall to recall-log.tsv (feeds realized-economy stats)."New value: +"Append this recall to recall-log.tsv (feeds realized-economy stats). On by default (#112): without the counter there is no way to know whether the reading habit ever took; pass false to read without a trace."
      • addedInput schema / $defs / RecallInput / properties / shelf_path / default
        Added value: +""
      • changedInput schema / $defs / RecallInput / properties / shelf_path / description
        Previous value: -"Path to an initialized memory shelf."New value: +"Path to an initialized memory shelf. Optional: when omitted, the shelf named by $MEMSHELF_SHELF_PATH is used. Pass it explicitly to address a different shelf than that default."
      • changedInput schema / $defs / RecallInput / required
        Previous value: -[
        -  "shelf_path",
        -  "episode_id"
        -]New value: +[
        +  "episode_id"
        +]
    • Changedmemshelf_resolve4 fields changed
      • addedInput schema / $defs / ResolveInput / additionalProperties
        Added value: +false
      • addedInput schema / $defs / ResolveInput / properties / shelf_path / default
        Added value: +""
      • changedInput schema / $defs / ResolveInput / properties / shelf_path / description
        Previous value: -"Path to an initialized memory shelf."New value: +"Path to an initialized memory shelf. Optional: when omitted, the shelf named by $MEMSHELF_SHELF_PATH is used. Pass it explicitly to address a different shelf than that default."
      • removedInput schema / $defs / ResolveInput / required
        Removed value: -[
        -  "shelf_path"
        -]
    • Addedmemshelf_rollup
    • Changedmemshelf_search4 fields changed
      • addedInput schema / $defs / SearchInput / additionalProperties
        Added value: +false
      • addedInput schema / $defs / SearchInput / properties / shelf_path / default
        Added value: +""
      • changedInput schema / $defs / SearchInput / properties / shelf_path / description
        Previous value: -"Path to an initialized memory shelf."New value: +"Path to an initialized memory shelf. Optional: when omitted, the shelf named by $MEMSHELF_SHELF_PATH is used. Pass it explicitly to address a different shelf than that default."
      • changedInput schema / $defs / SearchInput / required
        Previous value: -[
        -  "shelf_path",
        -  "query"
        -]New value: +[
        +  "query"
        +]
    • Changedmemshelf_shelve14 fields changed
      • addedInput schema / $defs / ShelveInput / additionalProperties
        Added value: +false
      • addedInput schema / $defs / ShelveInput / properties / amend
        Added value: +{
        +  "default": false,
        +  "description": "Rewrite an episode already on the shelf, under the same slug (#71): one episode, one recomputed ledger row, redaction and the digest contract re-run. Errors if the slug is not there — that is a typo, not a create.",
        +  "title": "Amend",
        +  "type": "boolean"
        +}
      • addedInput schema / $defs / ShelveInput / properties / approx_tokens / anyOf
        Added value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / $defs / ShelveInput / properties / approx_tokens / default
        Previous value: -0New value: +null
      • addedInput schema / $defs / ShelveInput / properties / approx_tokens / description
        Added value: +"Rough in-window size in tokens; an eyeball estimate is fine. OMIT when nothing was measured or estimated — the episode is then recorded as approx_tokens_source: unmeasured instead of a silent 0 (#113): absence of measurement must not look like a measured zero."
      • removedInput schema / $defs / ShelveInput / properties / approx_tokens / type
        Removed value: -"integer"
      • addedInput schema / $defs / ShelveInput / properties / approx_tokens_source
        Added value: +{
        +  "anyOf": [
        +    {
        +      "enum": [
        +        "estimate",
        +        "measured"
        +      ],
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Where the number came from (#79). Default for any passed number is 'estimate' — that is what callers actually produce; say 'measured' only when it was. Contradiction (a source with no number) is refused.",
        +  "title": "Approx Tokens Source"
        +}
      • addedInput schema / $defs / ShelveInput / properties / publish
        Added value: +{
        +  "default": false,
        +  "description": "Publish the shelve commit to origin as a NEW branch shelve/<slug> and report a one-click compare link (#118) — the mode for shelves whose main requires a PR. Exclusive with `push`; the local checkout never switches branches, so recall keeps working from this clone.",
        +  "title": "Publish",
        +  "type": "boolean"
        +}
      • addedInput schema / $defs / ShelveInput / properties / push
        Added value: +{
        +  "default": false,
        +  "description": "Push the shelve commit; on a rejection, rebase and retry exactly once (#108). The result then carries the post-push sha — the only sha worth quoting, since a rebase rewrites the local one.",
        +  "title": "Push",
        +  "type": "boolean"
        +}
      • addedInput schema / $defs / ShelveInput / properties / retain_until
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Retention (#15): ISO date after which `memshelf purge` drops this episode. Absent means keep — retention is opt-in per episode.",
        +  "title": "Retain Until"
        +}
      • addedInput schema / $defs / ShelveInput / properties / shelf_path / default
        Added value: +""
      • changedInput schema / $defs / ShelveInput / properties / shelf_path / description
        Previous value: -"Path to an initialized memory shelf."New value: +"Path to an initialized memory shelf. Optional: when omitted, the shelf named by $MEMSHELF_SHELF_PATH is used. Pass it explicitly to address a different shelf than that default."
      • addedInput schema / $defs / ShelveInput / properties / sync
        Added value: +{
        +  "default": true,
        +  "description": "Fetch + fast-forward the shelf to its remote before anything is written (#108): a dirty tracked tree or a diverged branch refuses the shelve with the fix in the message instead of silently writing onto a stale base. A failed fetch (offline) does not refuse — it is reported loudly.",
        +  "title": "Sync",
        +  "type": "boolean"
        +}
      • changedInput schema / $defs / ShelveInput / required
        Previous value: -[
        -  "shelf_path",
        -  "slug",
        -  "kind",
        -  "digest"
        -]New value: +[
        +  "slug",
        +  "kind",
        +  "digest"
        +]
    • Changedmemshelf_stats6 fields changed
      • addedInput schema / $defs / StatsInput / additionalProperties
        Added value: +false
      • addedInput schema / $defs / StatsInput / description
        Added value: +"Beyond the shelf, only the bound on one episode's claim."
      • addedInput schema / $defs / StatsInput / properties / context_window
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Context window in tokens, used as the per-episode cap on claimed mass (#110). Optional: falls back to $MEMSHELF_CONTEXT_WINDOW, then to 200,000 — the standard window of the clients this shelf is written for. Pass your client's real window if it is larger.",
        +  "title": "Context Window"
        +}
      • addedInput schema / $defs / StatsInput / properties / shelf_path / default
        Added value: +""
      • changedInput schema / $defs / StatsInput / properties / shelf_path / description
        Previous value: -"Path to an initialized memory shelf."New value: +"Path to an initialized memory shelf. Optional: when omitted, the shelf named by $MEMSHELF_SHELF_PATH is used. Pass it explicitly to address a different shelf than that default."
      • removedInput schema / $defs / StatsInput / required
        Removed value: -[
        -  "shelf_path"
        -]
  2. 9 tool updatesv0.1.0
    • First observedmemshelf_doctor
    • First observedmemshelf_import
    • First observedmemshelf_index
    • First observedmemshelf_init
    • First observedmemshelf_recall
    • First observedmemshelf_resolve
    • First observedmemshelf_search
    • First observedmemshelf_shelve
    • First observedmemshelf_stats

TDQS

A4/5.0

Scored across 14 tools

Disambiguation5/5

Each tool targets a clearly distinct operation within the memory-shelf lifecycle: reading (index, recall, search), writing (shelve, import), diagnostics (lint_digest, doctor), maintenance (rebuild, rollup, purge, resolve), and insights (stats, advise). Potential overlaps like lint_digest vs. doctor or rebuild vs. resolve are explicitly differentiated by scope and timing in the descriptions.

Naming Consistency5/5

All 14 tools consistently use the memshelf_ prefix and lower snake_case. The action/artifact naming is predictable across the set, even when a few names are noun-like (stats, doctor) rather than purely verb_noun.

Tool Count5/5

With 14 tools, the server sits in the well-scoped 3-15 range and covers a full lifecycle without obvious filler. Each tool maps to a distinct phase or concern of managing a memory shelf.

Completeness4/5

The surface covers initialization, creation, import, retrieval, search, metrics, validation, rebuild, rollup, retention purge, conflict resolution, and diagnosis. Minor gaps remain, such as no direct per-episode edit, manual delete, or export operation, though retention and rollup mitigate deletion and archival needs.

Maintenance

ActivityActive
ResponsivenessSlow

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables persistent, graph-based memory for AI agents, allowing them to store, traverse, and recall relationships between facts, decisions, and context across sessions for efficient reasoning and reduced token usage.
    MIT