Skip to main content
Glama

Docmancer

Your AI coding environment, restored on every machine.

PyPI version Downloads Python 3.11+ License: MIT Stars

Website  ·  Documentation  ·  Blog  ·  Changelog  ·  Discussions

Your coding agents remember what happened on one machine

Agent backup and restore are development-preview commands. Local encrypted archives are available now. Managed Cloud snapshots remain gated on migration and recovery acceptance.

Docmancer securely restores their sessions, memory, and setup, then makes the useful project context available to every agent you use.

Claude Code and Codex can search the files they already wrote on one machine. A normal dotfile tool can copy directories. Neither gives you an agent-aware, secret-stripped backup with structural verification, project mapping, conflict quarantine, and a reviewed path from raw history to shared project memory.

Start by seeing what Docmancer can protect:

docmancer backup --dry-run

Create a free passphrase-encrypted local archive:

docmancer backup --local --to ~/Backups/agents.dmbak

On a new machine, close Claude Code and Codex and preview the restore:

docmancer restore ~/Backups/agents.dmbak --dry-run
docmancer restore ~/Backups/agents.dmbak

Docmancer restores missing history, skips identical files, merges only safe configuration, and quarantines divergent sessions. It never copies authentication stores, .env files, literal MCP environment values, caches, logs, telemetry, or machine keys.

After backup or restore, local consolidation finds durable decisions and constraints in the protected histories. Every proposal links to exact transcript evidence and waits for review:

docmancer consolidate
docmancer consolidate --review PROPOSAL_ID
docmancer consolidate --approve PROPOSAL_ID

Related MCP server: Stoa

Your agents already learned this. They just cannot tell each other.

Claude Code knows why you moved off Railway. Codex learned your migration convention. Cursor is still following a rule you overruled two months ago. Each agent wrote something down, none of them agree, and none of it is anywhere you can read.

That knowledge is real, and it is already on your disk. It is sitting in CLAUDE.md files, AGENTS.md files, Cursor rules, agent memory directories, and session history, in a different place and a different format for every tool you use.

Docmancer is built around two questions, in this order:

  1. I re-explain my project to every coding agent. How do I get them all working from the same context? Docmancer arranges the durable parts as plain local Markdown you can read and edit, then delivers the relevant files to every agent you connect, so a decision you record once reaches all of them.

  2. What do my coding agents already know about me and my working style? Docmancer indexes the memory, instructions, and rules they wrote on this machine, and keeps the contributing source attached to every claim, so you can read the answer instead of guessing at it.

Nothing leaves your machine unless you ask it to. There is no telemetry, no account, and no API key needed for the core product.

Install

pipx install docmancer
pipx ensurepath
export PATH="$(pipx environment --value PIPX_BIN_DIR):$PATH"
docmancer setup

pipx ensurepath makes the change persistent for future terminals. The export line makes Docmancer available in the current terminal immediately, which matters in an existing SSH session. If docmancer still reports command not found, reconnect over SSH and try again.

If you use uv, uv tool install docmancer installs it the same way.

setup finds every supported coding agent, shows you one complete plan and privacy warning, and waits for your confirmation before it changes anything. Then it indexes what it found, builds your canonical memory, installs the agent skills, and turns on automatic recall where the agent supports it.

Ask it something:

docmancer ask "Why did we choose Railway?"

You get a bounded, cited answer built from your own agents' evidence. Then open the app for the current project:

cd /path/to/your-project
docmancer web

That is the whole first run. It takes about a minute, and setup does not modify the project you are standing in.

What you get

One memory instead of six. Every supported agent reads from the same canonical Markdown, so a decision recorded once is available to Claude Code, Codex, Cursor, Gemini, and the rest without you copying it around.

Answers with receipts. Recall returns the mandatory policy, the curated memory, and the supporting agent evidence with stable citations, so you can see which agent said what and when. The optional language model turns that evidence into prose but never chooses what goes into it.

Files you own, not a database. Shared Memory is ordinary Markdown in ordinary directories. You can open it in your editor, commit it, grep it, or delete it. Stable docmancer://memory/<id> addresses keep working even after you move a file.

Local and offline by default. The default profile uses SQLite FTS5, sqlite-vec, and a small vendored embedding model. No daemon, no model download, no network call, no key.

Edits that cannot clobber each other. Changing or moving an existing memory file requires the content hash you last read, so one agent cannot silently overwrite a newer decision made by another.

Approval before anything is written. When you ask Docmancer to remember or change something, it prepares one complete file proposal and shows you the diff. The default answer is no, and a later "yes" in conversation never applies a stored proposal.

Take the same memory to a VPS or another machine

The complete product above is free on one machine. Optional paid Personal Sync adds encrypted transport, managed revision history, devices, and recovery when you work across a laptop, VPS, or other machines.

On the machine that already has your memory, run:

docmancer cloud connect

Sign in through the browser. Docmancer creates and checks a recovery kit, shows it once for offline storage, and starts the first encrypted upload automatically. The account page then asks for a payment method to start the 30-day trial. There is no separate recovery verification or first-sync command.

On the VPS or second machine, install Docmancer and run:

docmancer setup
docmancer cloud connect

The new machine shows a four-word pairing code. Run docmancer cloud connect on an already connected machine, confirm the same four words, and approve it. Then run the command once more on the new machine. Docmancer downloads the machine-wide Shared Memory tree and any project trees mapped on that machine. If every connected machine is unavailable, use docmancer cloud connect --recover and enter the offline recovery kit.

The selected monthly or yearly subscription begins automatically after the trial unless you cancel. A failed renewal has a fixed 7-day upload grace period, followed by a 30-day read-only pull and export window before hosted ciphertext is scheduled for deletion. Local memory and every local feature keep working in every billing state. See the Personal Sync guide for the full journey.

See what each agent actually receives

Run docmancer web and open Shared Memory. The left pane is the real file tree on disk, the middle pane reads the selected file with its provenance, and the right pane lists your connected agents. Select an agent to inspect the exact bounded projection it will receive, before it receives it.

The scaffold is opinionated, but the files are yours:

~/.docmancer/tree/                 # machine-wide, follows you between projects
├── profile/
│   ├── about.md
│   └── preferences.md
├── principles/
│   └── working-style.md
├── projects/
│   └── active.md
└── shared/

<project>/.docmancer/tree/         # per project
├── overview.md
├── decisions/
├── constraints/
├── workflows/
└── lessons/

Connect your agents

docmancer setup installs everything it detects. To manage one integration on its own:

docmancer agent install claude-code --hooks
docmancer agent install codex --hooks

Agent

Skill file

Automatic recall

Session capture

MCP

Claude Code

Yes

Yes

Yes

Yes

Codex (CLI, app, desktop)

Yes

Yes

Yes

Yes

Cursor

Yes

Cline

Yes

Gemini CLI

Yes

OpenCode

Yes

GitHub Copilot

Yes

Claude Desktop

Manual upload

Yes

Installed skills teach an agent when to ask Docmancer for prior decisions and how to write deliberate memory when you explicitly request it, which is why every supported agent can use the same memory. Automatic recall and session capture need lifecycle hooks, and only Claude Code and Codex expose those today, so the other agents recall on demand through their skill file instead.

MCP is an alternative transport over the same local services, not a second memory store:

docmancer mcp install codex
docmancer mcp doctor

Record a decision on purpose

Discovery finds what your agents already wrote. When you want something recorded deliberately:

docmancer write $'# Deployment\n\nDeploy the API on Railway.' \
  --path decisions/deployment.md \
  --scope project

Read it back later, from any agent or from your shell:

docmancer read decisions/deployment.md

Or let Ask do it, with an approval step:

docmancer ask "Remember that production releases require a smoke test"
docmancer ask "Update decisions/release.md to require two reviewers" --apply

Everyday commands

Command

Purpose

docmancer setup

Discover agent memory and connect every supported agent.

docmancer ask "..."

Recall evidence, answer a question, or propose one memory change.

docmancer web

Open the local app for the current project.

docmancer common

Show what several agents recorded independently.

docmancer delivery

Show installed integrations, recall state, and recent use.

docmancer timeline

Show how curated memory changed over time.

docmancer write ... --path file.md

Write one deliberate Markdown memory file.

docmancer read <address-or-path>

Read one memory file with its provenance.

docmancer edit ... --expected-hash <hash>

Safely edit a memory file.

docmancer move ... --expected-hash <hash>

Safely rename or move a memory file.

docmancer import ./notes

Copy arbitrary Markdown into the project inbox.

docmancer docs query "..."

Search the separate documentation Library.

docmancer status

Show memory, source, security, integration, and Cloud health.

docmancer doctor

Diagnose installation and configuration problems.

docmancer cloud connect

Connect this machine, approve another machine by four-word code, and start encrypted sync.

docmancer cloud estimate

Preview the next encrypted upload size, batching, and current plan limits without queueing or sending it.

Run docmancer --help or docmancer <command> --help for exact arguments, and see the command reference for the full surface.

Documentation is a separate Library

Your decisions and a vendor's API reference answer different questions, so Docmancer keeps them apart. Library content is searchable but is never injected into your personal memory automatically.

docmancer docs add https://docs.pytest.org
docmancer docs query "How do I parametrize a fixture?"

Use ask for your own decisions, preferences, and rules. Use docs query for libraries, APIs, and vendor documentation.

Choose a retrieval profile

The default needs no daemon and no large download:

docmancer setup --profile local

It runs SQLite FTS5, sqlite-vec, and the bundled Model2Vec model. For sustained ingestion and filtered vector search across roughly 50,000 to 100,000 documents, switch to the scale profile:

pipx install "docmancer[embeddings-heavy]"
docmancer qdrant up
docmancer setup --profile scale

If you use uv, the first line becomes uv tool install "docmancer[embeddings-heavy]".

Scale uses Qdrant, FastEmbed dense embeddings, sparse SPLADE retrieval, and reciprocal-rank fusion. It helps with vector filtering, concurrent writes, and operational headroom. It will not fix poor source coverage or weak evaluation, and both profiles implement identical memory semantics: switching changes storage and capacity, never authority, provenance, or what counts as Shared Memory.

Privacy

Your memory, credentials, indexes, and the local app stay on your machine, and Docmancer has no telemetry. It reaches the network only when you explicitly fetch online documentation, use an external model, check a package registry, or enable Cloud.

Everything above is free and stays free. There are two problems the free single-machine product does not solve, and those are what the paid tiers exist for. The first is that your memory is built on one machine while you work on more than one, which optional paid Personal Sync answers by carrying the same canonical memory to every machine you approve, encrypted on the device before it leaves, with managed revision history and recovery. Its normal setup is one docmancer cloud connect command on each machine, followed by a four-word approval on a machine you already trust. The second is that the context your agents accumulated about a feature is stranded on one machine where the rest of your team cannot reach it, which is the problem Team Sync is being designed to solve. Team Sync is not available yet.

The hosted service receives ciphertext, and it cannot read your plaintext memory or run anything on your machine. The security architecture describes exactly what metadata remains visible rather than claiming the server knows nothing.

Where things live

Location

Contents

~/.docmancer/tree/

Machine-wide Markdown under profile/, principles/, projects/, shared/.

<project>/.docmancer/tree/

Project memory under decisions/, constraints/, workflows/, lessons/.

<project>/.docmancer/inbox/

Markdown you imported, waiting for optional curation.

<project>/.docmancer/trash/

Recoverable deleted memory files.

<project>/.docmancer/state/decision-journal.jsonl

Append-only history of curated files.

~/.docmancer/memory.db

Rebuildable machine-wide index.

~/.docmancer/docmancer.yaml

Local configuration.

Requirements

Docmancer supports Python 3.11 and newer, including 3.14, so the install command does not need an interpreter pin. pipx install docmancer (or uv tool install docmancer) can use whichever recent Python your machine already provides. If pipx installs successfully but the shell cannot find docmancer, run pipx ensurepath, export the bin directory with export PATH="$(pipx environment --value PIPX_BIN_DIR):$PATH", and try again. For problems after the command starts, docmancer doctor will tell you why.

Contributing

Issues and pull requests are welcome. Start with CONTRIBUTING.md for project layout and extension points, and open a discussion if you want to talk through an idea first. Security reports have their own private channel, described in SECURITY.md.

For architecture, supported sources, Cloud boundaries, and troubleshooting, see the wiki or the full documentation.

License

MIT. See LICENSE.

Available Tools

20 tools
ask_memoryA
Read-onlyIdempotent

READ-ONLY: recall one bounded bundle of everything local memory knows about a task, combining mandatory policy, curated memory, and supporting harvested agent evidence in priority order. This is the default recall tool and the right first call when you do not already know which store holds the answer; search_memory and search_evidence each cover only one store. Local and free by default. Returns an empty bundle rather than an error when nothing relevant exists, so an empty result means the memory is genuinely silent. Parameters: task is the natural-language task or question to recall for; answer defaults to false and returns the raw bundle, and setting it true spends a configured provider call, which may leave the machine, to produce a grounded cited answer; mode sets that answer's verbosity to concise, normal, or thorough and is ignored when answer is false; token_budget bounds the bundle size in approximate tokens (default 4000); limit caps how many supporting evidence items are considered (default 12); include_history adds superseded evidence; agent is the requesting agent identifier recorded for attribution (default mcp-client); project_path project root whose memory tree the operation applies to. Omit it to use the machine-wide tree, and always omit it when this server was started pinned to a project. Returns an object with the mandatory policy, curated memory, and evidence sections, each carrying source citations, plus the generated answer when answer is true.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoAnswer verbosity when answer is true. Ignored when answer is false. Defaults to normal.normal
taskYesNatural-language task or question to recall relevant policy, memory, and evidence for.
agentNoTarget agent identifier used to shape and attribute the result. Defaults are tool-specific.mcp-client
limitNoMaximum number of matching results to return. Defaults are tool-specific.
answerNoWhen true, spend a configured provider call to generate a grounded cited answer from the recalled memory instead of returning the bundle alone.
project_pathNoProject root whose memory tree the operation applies to. Omit it to use the machine-wide tree, and always omit it when this server was started pinned to a project.
token_budgetNoApproximate maximum token size of the returned bundle. Omit to use the tool default.
include_historyNoWhen true, include historical or superseded memory evidence in addition to active evidence.

TDQS

A4.9/5.0
Behavior5/5

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

The description adds substantial behavior beyond the readOnly/idempotent annotations: it returns an empty bundle rather than erroring, answer=true may send data to a provider and 'may leave the machine,' and it is local/free by default. It also explains include_history semantics and priority ordering, none of which contradict the annotations.

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

Conciseness4/5

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

The description is front-loaded with purpose and usage, then systematically covers parameters. It is longer than typical one-liners, but every sentence adds necessary nuance for an 8-parameter tool; slight length keeps it from a perfect conciseness score.

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 no output schema, the description fully explains the return shape: mandatory policy, curated memory, evidence sections with citations, and the optional generated answer. It also covers defaults, edge cases like empty results, and external side effects, making it complete for an agent to select and invoke the tool.

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

Parameters5/5

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

Even though schema coverage is 100%, the description enriches every parameter: answer's default and provider-call implication, mode being ignored when answer is false, limit capping supporting evidence, include_history adding superseded evidence, agent attribution, token_budget bounding size, and project_path omission rules. This is far beyond the schema.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'recall one bounded bundle of everything local memory knows about a task.' It also explicitly distinguishes itself from search_memory and search_evidence, making it clear this is the broad default recall tool rather than a store-specific search.

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?

The description states this is 'the default recall tool and the right first call' when the correct store is unknown, and notes that search_memory and search_evidence each cover only one store. It also provides clear guidance on when to omit project_path, including the pinned-project exception.

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

canonical_memoryA
Read-onlyIdempotent

READ-ONLY: read the machine-wide canonical memory, which is what docmancer has reconciled about this user across every agent and project. Local disk read, machine-wide, so it takes no project_path. Call it before asking the user something they may already have told another agent. Not a search tool: it returns whole prepared sections rather than matches, so use search_memory or ask_memory to look something up. To change what it returns, use pin_memory rather than edit_memory. Parameters: section selects one of about (who the user is), preferences (how they want to work), working-principles (cross-project rules), active-projects (what they are working on), or canonical-memory (a description of the store itself); omit section entirely for a status summary of every section. Returns, with a section, that section split into its pinned zone (durable, survives reconciliation) and its generated zone (rewritten automatically), plus content_hash and revision id. Without a section, returns per-section presence and pinned-line counts.

ParametersJSON Schema
NameRequiredDescriptionDefault
sectionNoCanonical section to read. Omit for a status summary of every section.

TDQS

A5/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, and the description adds materially: local disk read, machine-wide scope, no project_path, the pinned vs generated zone split, content_hash/revision id, and the status summary behavior. No contradiction with 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?

Although longer than average, every sentence earns its place: it front-loads READ-ONLY, then explains what/why/when, alternative tools, parameter semantics, and return behavior in a logical flow. There is no filler or redundancy.

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?

The description covers purpose, usage timing, return values (with and without a section), alternatives, and limitations (not a search tool). Given the simplicity of the input schema and lack of output schema, the description fully compensates and leaves no relevant question unanswered.

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

Parameters5/5

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

Schema coverage is 100% for the single parameter, but the description goes beyond by explaining each enum value (about, preferences, working-principles, active-projects, canonical-memory) and the behavior when omitted. This adds clarity beyond the bare schema.

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 uses a specific verb ('read') and a clearly defined resource ('machine-wide canonical memory'), and explicitly distinguishes itself from sibling tools by stating 'Not a search tool' and pointing to search_memory/ask_memory. It also contrasts with mutation tools (pin_memory vs edit_memory), so the agent knows exactly what this tool does.

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?

Provides explicit when-to-use guidance: 'Call it before asking the user something they may already have told another agent.' It also gives clear exclusions and alternatives: 'use search_memory or ask_memory to look something up' and 'To change what it returns, use pin_memory rather than edit_memory.'

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

common_memoryA
Read-onlyIdempotent

READ-ONLY: list the memories that recur across two or more independent agent harnesses. This is a local disk read over already-harvested evidence; docmancer's own generated integration copies are excluded so they cannot manufacture agreement. Recurrence is evidence of salience, not proof of correctness, so treat the result as a signal worth checking rather than settled truth. Takes no query: it returns the whole recurring set. Use search_evidence to look something specific up instead. Parameters: project_path project root whose memory tree the operation applies to. Omit it to use the machine-wide tree, and always omit it when this server was started pinned to a project. Returns a list of objects describing each recurring memory and the harnesses it was seen in. Returns [] when nothing recurs.

ParametersJSON Schema
NameRequiredDescriptionDefault
project_pathNoProject root whose memory tree the operation applies to. Omit it to use the machine-wide tree, and always omit it when this server was started pinned to a project.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

While annotations already declare readOnlyHint=true, the description goes well beyond by explaining that this is a local disk read over already-harvested evidence, that docmancer's own generated integration copies are excluded to avoid manufacturing agreement, and that recurrence is only a signal, not proof of correctness. It also discloses the empty-return behavior, adding substantial epistemic nuance beyond 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?

Every sentence earns its place: purpose, operational mode, exclusion rule, epistemic caveat, alternative guidance, parameter clarification, and return behavior. It is front-loaded with the most important purpose and remains tight despite its length.

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?

The description fully prepares an agent to select and invoke the tool: it defines the return shape, the empty case, the project_path semantics, and the intended use context. An output schema exists, but the description still explains the function's behavior comprehensively enough even without relying on 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 schema provides 100% coverage of the only parameter, project_path, with a thorough description that the tool description simply echoes. The description adds no new parameter-level insight beyond the schema, so a baseline 3 is appropriate.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'list the memories that recur across two or more independent agent harnesses.' This clearly states what the tool does and distinguishes it from common memory cousins like search_memory or canonical_memory. It also adds a title-equivalent phrase and notes the local disk nature.

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?

The description explicitly tells the agent when to use this tool versus an alternative: 'Use search_evidence to look something specific up instead.' It also clarifies that this tool takes no query and returns the whole recurring set, and gives project_path omission guidance. This makes selection straightforward.

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

context_deliveryA
Read-onlyIdempotent

READ-ONLY: show, per agent, whether context is actually reaching it, listing each supported agent's integration mode, hook installation status, and the revision and hash of the last context bundle it was observed to receive. Local disk read with no side effects. This is the delivery question, so use it to diagnose why one agent seems to be missing context that another has. It is one of three context tools: context_status answers what the current context revision contains and how fresh it is, and context_projection renders the actual text one agent would receive. Read-only across all three; installing hooks and refreshing context are deliberately human-only CLI or local-web operations. Parameters: project_path project root whose memory tree the operation applies to. Omit it to use the machine-wide tree, and always omit it when this server was started pinned to a project. Returns a list with one row per agent giving its integration mode, hook status, and last delivered revision and hash. A stale or absent revision on one row is the signal to look for.

ParametersJSON Schema
NameRequiredDescriptionDefault
project_pathNoProject root whose memory tree the operation applies to. Omit it to use the machine-wide tree, and always omit it when this server was started pinned to a project.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

The annotations already declare readOnlyHint, idempotentHint, and destructiveHint. The description adds valuable context: 'Local disk read with no side effects,' 'Read-only across all three,' and explains that installing hooks and refreshing context are human-only. It also discloses return shape and diagnostic signal: 'A stale or absent revision on one row is the signal to look for.' No contradiction with 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?

The description is dense but every sentence earns its place: purpose, safety, usage guidance, sibling differentiation, parameter explanation, return value, and diagnostic hint. It is front-loaded with 'READ-ONLY' and the core purpose, followed by succinct supporting details.

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

Completeness5/5

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

Given the tool's moderate complexity, the description covers all necessary aspects: purpose, safety, parameter semantics, return format, sibling differentiation, and practical diagnostic guidance. An output schema exists, and the description still summarizes the return value, so the agent has a complete picture without needing to inspect structured fields.

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 100% and the description repeats the schema's parameter description nearly verbatim ('project_path project root whose memory tree the operation applies to. Omit it to use the machine-wide tree, and always omit it when this server was started pinned to a project.'). It adds no new semantic information beyond what the schema already provides.

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 action and resource: 'show, per agent, whether context is actually reaching it, listing each supported agent's integration mode, hook installation status, and the revision and hash of the last context bundle.' It also distinguishes itself from sibling tools: context_status answers what the current context revision contains and context_projection renders the actual text one agent would receive.

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 says when to use: 'use it to diagnose why one agent seems to be missing context that another has.' It also provides alternatives by naming context_status and context_projection and clarifying they are different questions, plus notes that installing hooks and refreshing context are deliberately human-only operations.

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

context_projectionA
Read-onlyIdempotent

READ-ONLY: render the actual bounded context text one named agent would receive, linked to the current revision. Local disk read that renders without writing, refreshing, or delivering anything, so it is safe to preview repeatedly. This is the show-me-the-content question, so use it to check what an agent will actually see before installing or debugging an integration. It is one of three context tools: context_status reports the revision and its freshness, and context_delivery reports whether each agent is receiving it. Refresh, rollback, adopt, and retire are human-only CLI or local-web operations. Parameters: agent is the required target agent identifier, and the projection is shaped for that agent's integration; token_budget bounds the rendered size in approximate tokens (default 2000), so raising it returns more content and lowering it truncates by priority; project_path project root whose memory tree the operation applies to. Omit it to use the machine-wide tree, and always omit it when this server was started pinned to a project. Returns an object with the rendered projection text and the revision it was built from.

ParametersJSON Schema
NameRequiredDescriptionDefault
agentYesTarget agent identifier used to shape and attribute the result. Defaults are tool-specific.
project_pathNoProject root whose memory tree the operation applies to. Omit it to use the machine-wide tree, and always omit it when this server was started pinned to a project.
token_budgetNoApproximate maximum token size of the returned context projection.

TDQS

A4.9/5.0
Behavior5/5

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

The description fully discloses side effects: 'READ-ONLY', 'Local disk read that renders without writing, refreshing, or delivering anything', and 'safe to preview repeatedly'. This goes beyond the annotations (readOnlyHint, idempotentHint, destructiveHint) by explaining what is NOT done and the practical implication of safety. No contradiction exists.

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

Conciseness4/5

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

The description is well-structured and front-loaded with the safety and purpose, then usage context, then parameter walkthrough. It is longer than strictly minimal but every sentence contributes either to distinguishing the tool or to parameter semantics. Slightly verbose, but appropriate for the tool's complexity and sibling set.

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?

The description covers the tool's purpose, safety profile, relationship to two sibling tools, human-only alternatives, all parameters, the return object ('rendered projection text and the revision it was built from'), and project scope handling. Given the tool's moderate complexity and minimal schema/annotations, this is fully complete.

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

Parameters5/5

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

Even though schema description coverage is 100%, the description adds meaningful behavioral detail for token_budget ('raising it returns more content and lowering it truncates by priority'), project_path ('always omit it when this server was started pinned to a project'), and clarifies agent as the required target. These nuances are not present in the schema descriptions.

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 uses a precise verb+resource ('render the actual bounded context text one named agent would receive') and explicitly distinguishes itself from sibling tools by stating what context_status and context_delivery do differently. It clearly identifies this as the 'show-me-the-content' tool.

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?

It provides explicit when-to-use guidance ('check what an agent will actually see before installing or debugging an integration') and when-not-to-use guidance by noting that refresh/rollback/adopt/retire are human-only CLI/local-web operations. It also names the alternative tools for revision freshness and delivery status, making the decision matrix clear.

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

context_statusA
Read-onlyIdempotent

READ-ONLY: inspect the consolidated Context itself, reporting its current revision id, how fresh it is, which sources are excluded, and its cluster metadata. Local disk read with no side effects. This is the what-and-how-fresh question, so use it to decide whether the context an agent is working from is stale or is missing something on purpose. It is one of three context tools: context_delivery answers whether each agent is actually receiving it, and context_projection renders the actual text one agent would receive. Refresh, rollback, adopt, and retire are deliberately human-only CLI or local-web operations, so no MCP tool can change what this reports. Parameters: project_path project root whose memory tree the operation applies to. Omit it to use the machine-wide tree, and always omit it when this server was started pinned to a project. Returns an object with the current revision, its scope and freshness, the active exclusions, and cluster metadata.

ParametersJSON Schema
NameRequiredDescriptionDefault
project_pathNoProject root whose memory tree the operation applies to. Omit it to use the machine-wide tree, and always omit it when this server was started pinned to a project.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, and the description aligns with them ('READ-ONLY', 'Local disk read with no side effects'). It adds extra context: the tool returns an object with specific fields, and explicitly says no MCP tool can change what it reports. This goes beyond the bare annotations and gives a clear behavioral model.

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

Conciseness4/5

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

The description is densely packed and every clause adds information, but it runs long as one paragraph. It front-loads READ-ONLY and the core function, then proceeds logically through usage, alternatives, constraints, and return value. It could be slightly trimmed, but there is no filler or redundancy.

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?

For a read-only status tool with no output schema, the description covers purpose, usage context, sibling relationships, human-only mutation boundary, parameter semantics, and the return shape (revision, scope, freshness, exclusions, cluster metadata). This is fully adequate for an agent to select and invoke the tool correctly.

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 has 100% description coverage for the single parameter project_path, and the description restates the exact same guidance (omit to use machine-wide, omit when pinned). Since the schema already fully explains the parameter, the description adds no new semantic value here, keeping the score at the baseline for full coverage.

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 uses a specific verb ('inspect') and names the resource ('the consolidated Context itself'), then lists exactly what it reports: revision id, freshness, excluded sources, and cluster metadata. It also distinguishes itself from sibling tools by naming context_delivery and context_projection, making its purpose unmistakable.

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 states when to use it: 'use it to decide whether the context an agent is working from is stale or is missing something on purpose.' It also gives alternatives by comparing with context_delivery and context_projection, and states that refresh/rollback/adopt/retire are human-only, so this tool is not for mutations.

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

decision_timelineA
Read-onlyIdempotent

READ-ONLY: show the append-only history of how memory changed over time, with a human-readable diff per entry. Local disk read over a log that is only ever appended to, so nothing here can be rewritten and the record is trustworthy. Use it to answer when and how a memory changed, or to recover text that an edit replaced. Newest entries come first. This is history, not content: use search_memory or read_memory for what a file says now. Parameters: file_id restricts the timeline to one memory file's own history, which is the usual way to trace a single decision; operation restricts it to one kind of change, one of create, edit, move, duplicate, trash, restore, pin, or reconcile; limit caps how many entries come back (default 100); project_path project root whose memory tree the operation applies to. Omit it to use the machine-wide tree, and always omit it when this server was started pinned to a project. Omit every filter for the whole recent history. Returns a list of entries with the operation, timestamp, affected file, revision ids, and a readable diff.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of matching results to return. Defaults are tool-specific.
file_idNoStable memory file identifier. Supply it to restrict the timeline to one file's history.
operationNoOperation name used to restrict the timeline to one kind of change. Omit for every operation.
project_pathNoProject root whose memory tree the operation applies to. Omit it to use the machine-wide tree, and always omit it when this server was started pinned to a project.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, but the description adds valuable behavioral context: the log is append-only, 'nothing here can be rewritten and the record is trustworthy,' and results are newest-first. This goes beyond annotations without contradicting them.

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

Conciseness4/5

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

The description is a single dense paragraph but front-loaded with the core purpose. Each sentence adds information (filters, return format, ordering). It could be split for readability, but every sentence earns its place with no fluff.

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

Completeness5/5

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

The description covers the tool's purpose, usage context, parameter semantics, and return format ('a list of entries with the operation, timestamp, affected file, revision ids, and a readable diff'). It also disambiguates from sibling tools. It is complete for a read-only history tool with an output schema present.

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

Parameters4/5

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

Schema coverage is 100%, so the schema documents all parameters. The description adds meaningful context beyond the schema, such as explaining that file_id restricts to one file's history, operation enum values, and project_path behavior (including the instruction to always omit it when pinned to a project).

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

Purpose5/5

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

The description opens with a specific verb and resource: 'show the append-only history of how memory changed over time, with a human-readable diff per entry.' It distinguishes itself from sibling tools by explicitly contrasting with 'search_memory or read_memory for what a file says now,' clarifying that this is history, not content.

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?

It clearly states when to use the tool ('to answer when and how a memory changed, or to recover text that an edit replaced') and provides explicit alternatives ('use search_memory or read_memory for what a file says now'). It also gives detailed parameter usage guidance, including how to filter and when to omit project_path.

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

duplicate_memoryA

MUTATING: copy one curated memory file to a new path under a new stable identity. Writes to local disk and appends to the change timeline. The original is left untouched, and the copy gets its own docmancer://memory address and its own history, so the two diverge from here and editing one does not affect the other. Use it to fork an existing memory into a variant. Use move_memory instead when the original should not survive. Not idempotent: calling it twice with the same new_relative_path fails on the second call rather than creating a second copy. Parameters: address identifies the file to copy; new_relative_path is the copy's path in the tree, including the .md suffix, and must not already exist; expected_hash is the source file's current content_hash from read_memory, which guards against copying a revision you have not seen; project_path project root whose memory tree the operation applies to. Omit it to use the machine-wide tree, and always omit it when this server was started pinned to a project. Returns an object with the new copy's address, path, content_hash, and revision id.

ParametersJSON Schema
NameRequiredDescriptionDefault
addressYesStable docmancer://memory/<id> address, relative path, or exact title of the memory file.
project_pathNoProject root whose memory tree the operation applies to. Omit it to use the machine-wide tree, and always omit it when this server was started pinned to a project.
expected_hashYesThe file's current content_hash from a prior read_memory call. A stale value fails safely instead of overwriting a newer revision.
new_relative_pathYesRelative path, including the .md suffix, for the memory file inside its selected memory tree.

TDQS

A4.9/5.0
Behavior5/5

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

The description goes well beyond the annotations (readOnlyHint=false, idempotentHint=false) by disclosing concrete side effects: 'Writes to local disk and appends to the change timeline,' original untouched, copy gets its own history, and the exact failure behavior on second call. This adds valuable context about mutations, safety (expected_hash), and project pinning behavior.

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?

Although longer than typical, every sentence earns its place. The structure is logical: core action, side effects, usage alternatives, idempotency warning, parameter explanations, project_path nuance, and return value. No redundancy or filler; information is dense but well-organized.

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 no output schema, the description correctly specifies the return object ('address, path, content_hash, and revision id'). It also covers critical context such as project_path behavior, expected_hash safety, the divergence behavior, and failure mode, making it fully complete for a mutation tool of this complexity.

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

Parameters4/5

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

Schema coverage is 100% with detailed descriptions for each parameter, so the baseline is 3. The description adds meaning by noting new_relative_path 'must not already exist' and explaining expected_hash as a guard against copying unseen revisions, providing slightly more context than 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?

The description opens with a specific verb and resource: 'copy one curated memory file to a new path under a new stable identity.' It clearly distinguishes from siblings by stating 'Use move_memory instead when the original should not survive,' and reinforces the copy semantics by explaining divergence and independent histories.

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 states when to use ('Use it to fork an existing memory into a variant') and when not to ('Use move_memory instead when the original should not survive'). Also provides operational guidance on project_path omission and warns against non-idempotent double calls, giving clear context and exclusions.

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

edit_memoryA

MUTATING: replace the body of one existing curated memory file while preserving its frontmatter, address, and history. Writes to local disk and appends to the change timeline. The write is guarded: a stale expected_hash fails without changing anything and returns a structured error naming the re-read-and-retry next action, so concurrent edits cannot be lost. Read the file first to obtain the hash. Not for canonical memory about the user, which reconciliation regenerates: use pin_memory there. Not for creating a new file: use write_memory. Parameters: address identifies the file to edit; text is the complete replacement Markdown body, which overwrites rather than appends; expected_hash is the content_hash from the read that produced text; project_path project root whose memory tree the operation applies to. Omit it to use the machine-wide tree, and always omit it when this server was started pinned to a project. Returns an object with the address and the new content_hash and revision id.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesMarkdown body to write or replace. Replaces the body wholesale; it is not appended.
addressYesStable docmancer://memory/<id> address, relative path, or exact title of the memory file.
project_pathNoProject root whose memory tree the operation applies to. Omit it to use the machine-wide tree, and always omit it when this server was started pinned to a project.
expected_hashYesThe file's current content_hash from a prior read_memory call. A stale value fails safely instead of overwriting a newer revision.

TDQS

A4.9/5.0
Behavior5/5

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

The description discloses safety behavior beyond annotations: guarded write with stale expected_hash fails safely, appends to change timeline, and preserves frontmatter/address/history. There is no contradiction with annotations; readOnlyHint=false aligns with 'MUTATING', and destructiveHint=false is consistent with the guarded, preserving nature.

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?

The description is dense but every sentence adds value—scope, safety guard, exclusions, parameter rundown, and return value. It is well-structured with a clear opening and parameter list.

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

Completeness5/5

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

Given no output schema, the description explains the return object and failure mode. It also covers project_path semantics and when to omit, making the tool fully understandable for invocation.

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?

With 100% schema coverage, the description adds nuance by tying expected_hash to 'the read that produced text' and explaining the complete-replacement semantics. While most info is also in the schema, this contextual linkage provides extra meaning.

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 uses a specific verb 'replace' and clearly states the scope: 'the body of one existing curated memory file while preserving its frontmatter, address, and history.' It distinguishes from siblings by explicitly saying 'Not for creating a new file: use write_memory' and 'Not for canonical memory... use pin_memory there.'

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?

It provides explicit when-to-use context: 'Read the file first to obtain the hash' and exclusions for pin_memory and write_memory. It also gives project_path guidance for pinned servers, making alternatives and prerequisites clear.

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

evidence_statusA
Read-onlyIdempotent

READ-ONLY: report whether the local evidence index that search_evidence queries is present and populated, including its on-disk path and its source and section counts. Local only, and takes no parameters. Call it first when search_evidence returns nothing, to tell an empty index apart from a genuine miss; an empty one means the user has not run docmancer setup yet. Not for curated memory health, which is context_status, nor for per-agent delivery, which is context_delivery. Returns an object with the index path and the number of indexed sources and sections.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/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, covering the safety profile. The description adds meaningful behavioral context: it is local-only, takes no parameters, clarifies that an empty index means the user hasn't run docmancer setup, and describes the return object (path and counts). This goes beyond the bare 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?

The description is compact yet information-dense, opening with the core purpose and then covering usage guidance, exclusions, and return shape without redundancy. Every sentence earns its place, and the structure front-loads the most important information.

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?

For a simple no-parameter tool with no output schema, this description fully equips the agent: it explains what the tool does, when to call it, what it returns, and how it differs from related tools. No critical gaps remain, and the lack of an output schema is compensated by the explicit mention of return contents.

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

Parameters4/5

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

The tool has zero parameters and the schema covers 100% of them (none). The description explicitly reaffirms 'takes no parameters', so the agent can be confident no arguments are needed. Per the rubric, no-parameter tools receive a baseline of 4.

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 clearly defines the tool as a read-only diagnostic for the local evidence index used by search_evidence, specifying that it reports presence, population, path, and source/section counts. It explicitly distinguishes itself from context_status and context_delivery, ensuring no ambiguity about its role.

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?

It gives an explicit when-to-use instruction: 'Call it first when search_evidence returns nothing, to tell an empty index apart from a genuine miss.' It also states when not to use it and names the correct alternatives (context_status, context_delivery), making tool selection unambiguous.

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

move_memoryA
Destructive

MUTATING and DESTRUCTIVE at the old path: move or rename one curated memory file. Writes to local disk and appends to the change timeline. The file's stable docmancer://memory address survives the move, so existing references by address keep working, but the old relative path stops resolving and anything referring to it by path breaks. Guarded by expected_hash, so a stale hash fails without changing anything. The body is untouched: use edit_memory to change content, or duplicate_memory to copy rather than move. Parameters: address identifies the file to move; new_relative_path is its destination path in the tree, including the .md suffix, and renaming is just a move within the same directory; expected_hash is the file's current content_hash from read_memory; project_path project root whose memory tree the operation applies to. Omit it to use the machine-wide tree, and always omit it when this server was started pinned to a project. Returns an object with the unchanged address, the new path, and the new revision id.

ParametersJSON Schema
NameRequiredDescriptionDefault
addressYesStable docmancer://memory/<id> address, relative path, or exact title of the memory file.
project_pathNoProject root whose memory tree the operation applies to. Omit it to use the machine-wide tree, and always omit it when this server was started pinned to a project.
expected_hashYesThe file's current content_hash from a prior read_memory call. A stale value fails safely instead of overwriting a newer revision.
new_relative_pathYesRelative path, including the .md suffix, for the memory file inside its selected memory tree.

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the annotations (destructiveHint=true), the description discloses on-disk writes, timeline appends, address stability, and path breakage. It also explains the expected_hash guard with a safety guarantee: 'a stale hash fails without changing anything.' This is rich, non-obvious behavioral context.

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?

The description is dense but every clause earns its place, covering why, how, safety, and relationships to siblings. It is well-structured with a clear flow from action to implications to parameter guidance, and ends with return-value notes.

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 no output schema, the description explicitly states the return shape: 'an object with the unchanged address, the new path, and the new revision id.' It also addresses the mutating/destructive nature, safety guard, and all relevant usage contexts, making it fully self-contained.

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

Parameters4/5

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

Schema coverage is 100%, giving a baseline of 3. The description adds meaningful context to new_relative_path ('renaming is just a move within the same directory') and clarifies the hash's role from read_memory, enhancing the schema's static descriptions.

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

Purpose5/5

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

The description opens with 'move or rename one curated memory file', a specific verb and resource. It further distinguishes from siblings by explicitly pointing to edit_memory for content changes and duplicate_memory for copying, so the agent instantly knows which tool to pick.

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

Usage Guidelines5/5

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

It clearly states when to use this tool (move/rename) and provides explicit alternatives: 'use edit_memory to change content, or duplicate_memory to copy rather than move.' It also gives practical guidance on project_path usage and omission rules.

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

pin_memoryA
Idempotent

MUTATING: pin one durable line into a canonical memory section. Writes to local disk, machine-wide, so it takes no project_path. The pinned zone is the ONLY part of a canonical section that survives automatic reconciliation, so use this, not edit_memory or write_memory, for any correction, standing preference, or fact the reconciler got wrong or left out. Idempotent: pinning the same line twice changes nothing. Use unpin_memory to reverse it, and canonical_memory to see the result. Parameters: section selects which canonical section to pin into, one of about, preferences, working-principles, or active-projects; text is the complete line to pin, which should read as a standalone statement because it is stored verbatim. Returns an object with the section, its path, and the updated pinned-line count.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesComplete durable line to add to the selected canonical section's pinned zone.
sectionYesCanonical section to modify. canonical-memory is excluded because it describes the store itself and is regenerated wholesale.

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the idempotentHint and destructiveHint annotations, the description reveals machine-wide disk persistence, the reconciliation survival property, the meaning of idempotency, and the return value shape. There is no contradiction with the annotations; instead, it adds substantial context.

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?

Despite being lengthy, every sentence contributes essential information: action, persistence semantics, reconciliation behavior, usage guidance, idempotency, reversal, parameter details, and return value. There is no redundancy or filler; the structure is front-loaded and logical.

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?

The description is comprehensive for a mutating tool with subtle reconciliation implications. It covers the purpose, the critical survival property, when to use it, how to undo it, parameter semantics, and the return value. Since there is no output schema, the return-value note is essential and provided clearly.

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?

Although the schema already covers 100% of parameters, the description adds the key semantic that the text 'should read as a standalone statement because it is stored verbatim', which is not present in the schema. This elevates the parameter guidance beyond the baseline.

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

Purpose5/5

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

The description opens with 'pin one durable line into a canonical memory section', clearly stating the action and resource. It explicitly distinguishes from edit_memory and write_memory by specifying that this tool is for corrections, standing preferences, or facts the reconciler got wrong, giving it a clear purpose among siblings.

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?

It provides explicit when-to-use guidance ('for any correction, standing preference, or fact the reconciler got wrong or left out') and when-not-to-use alternatives ('use this, not edit_memory or write_memory'). It also mentions unpin_memory for reversal and canonical_memory for inspection, offering complete usage context.

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

read_memoryA
Read-onlyIdempotent

READ-ONLY: read one curated memory file in full, resolved by stable address, relative path, or exact title. Local disk read with no side effects. Ambiguous title or path matches return every candidate address rather than guessing, so a caller can retry with an exact address. This is also how you obtain the content_hash that edit_memory, move_memory, duplicate_memory, and trash_memory all require. Use search_memory first when you do not already know which file you want. Parameters: address is the docmancer://memory/ address, the relative path, or the exact title; project_path project root whose memory tree the operation applies to. Omit it to use the machine-wide tree, and always omit it when this server was started pinned to a project. Returns an object with the body, frontmatter, address, content_hash, and revision id, or a candidates list when the address was ambiguous.

ParametersJSON Schema
NameRequiredDescriptionDefault
addressYesStable docmancer://memory/<id> address, relative path, or exact title of the memory file.
project_pathNoProject root whose memory tree the operation applies to. Omit it to use the machine-wide tree, and always omit it when this server was started pinned to a project.

TDQS

A5/5.0
Behavior5/5

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

Beyond annotations, it discloses local disk read with no side effects, and the ambiguous-match behavior that returns all candidate addresses instead of guessing. It also states the return shape including candidates list.

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?

The description is dense but every sentence adds value, starting with 'READ-ONLY' and the core action, then addressing ambiguity, related tools, parameters, and return value. No fluff.

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

Completeness5/5

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

With no output schema, the description covers return values (body, frontmatter, address, content_hash, revision id, or candidates list). It also covers parameter nuances, relationship to sibling tools, and side effects, making it complete for the tool's complexity.

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

Parameters5/5

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

Schema coverage is 100%, but description adds contextual meaning: address can be docmancer URI, relative path, or exact title, and project_path clarifies machine-wide vs. pinned project usage. This exceeds the schema descriptions.

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 clearly states the tool reads one curated memory file in full, resolved by stable address, relative path, or exact title. It distinguishes itself from sibling tools by explicitly directing to search_memory for unknown targets.

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 advises using search_memory first when the target file is unknown, and notes this tool is the way to obtain content_hash for edit/move/duplicate/trash operations. This gives clear when-to-use and context.

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

restore_memoryA

MUTATING: undo a trash_memory call by restoring one curated memory file from its restore token. Writes to local disk and appends to the change timeline. The file returns to its original path with its address and history intact, so references by address resume working. A token is single-use and only valid for the tree it was issued against, so a spent or foreign token fails without changing anything. Restoring is only possible while the token is known: there is no way to browse trash from MCP. Parameters: restore_token is the exact token returned by the trash_memory call being undone; project_path project root whose memory tree the operation applies to. Omit it to use the machine-wide tree, and always omit it when this server was started pinned to a project. Returns an object with the restored address, path, and revision id.

ParametersJSON Schema
NameRequiredDescriptionDefault
project_pathNoProject root whose memory tree the operation applies to. Omit it to use the machine-wide tree, and always omit it when this server was started pinned to a project.
restore_tokenYesRestore token returned by a prior trash_memory call, identifying the file to restore.

TDQS

A5/5.0
Behavior5/5

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

The description richly discloses behavior beyond the annotations: it is mutating (writes to disk, appends to timeline), tokens are single-use and tree-scoped, failure modes are non-destructive (spent/foreign token fails without changing anything), and it returns an object with address, path, and revision id. This far exceeds the minimal annotation information.

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?

The description is front-loaded with the key action ('MUTATING: undo a trash_memory call') and then provides focused, necessary details in a logical order. Every sentence adds value, and the parameter explanations are concise yet comprehensive.

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?

For a mutating restore operation with no output schema, the description covers the full lifecycle: what it does, side effects, failure modes, parameter semantics, and return value. It is complete enough for an agent to invoke correctly and anticipate outcomes.

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

Parameters5/5

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

While the schema already covers both parameters, the description adds crucial semantics: restore_token must be the exact token from a prior trash_memory call, and project_path carries a special omission rule when the server is pinned. This clarifies usage beyond the schema descriptions.

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 clearly states the specific action: 'undo a trash_memory call by restoring one curated memory file from its restore token.' It names the exact resource (curated memory file) and distinguishes itself from siblings by being the inverse of trash_memory.

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?

It explicitly frames the tool as undoing a trash_memory call, making the trigger condition clear. It also provides guidance on when to omit project_path (pinned server case) and notes that there is no way to browse trash from MCP, helping the agent decide whether this is the right tool.

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

search_docsA
Read-onlyIdempotent

READ-ONLY: search the local documentation index built by docmancer docs add, covering library, API, and vendor documentation the user chose to ingest. Runs entirely locally; no network call, so it only ever returns docs already added on this machine and returns [] when none have been. Use it for version-specific library or vendor behaviour. Not for anything about this user or their projects: use search_memory, search_evidence, or ask_memory for that. Parameters: query is the natural-language text to match against the indexed documentation; limit caps the number of results (default 8). Returns a list of objects with the matching excerpt, its source document, and a relevance score.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of matching results to return. Defaults are tool-specific.
queryYesNatural-language terms to search for in the local memory or documentation index.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare read-only/idempotent/non-destructive, but the description adds valuable context: fully local execution, no network calls, returns [] when no docs indexed, and describes the return structure (excerpt, source document, relevance score). This goes well beyond the annotation hints and clarifies operational behavior.

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?

The description is compact and front-loaded with 'READ-ONLY'. Four sentences cover purpose, local behavior, usage boundaries, and parameters/return value without redundancy. Every sentence earns its place.

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

Completeness5/5

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

Given the tool's simple read-only nature, the description fully covers what it does, when to use it, its behavioral constraints (local-only, empty result), parameters, and output shape. An output schema exists, so the return format summary is supplementary but not 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 100% and both parameters have descriptions. The description adds a little context (e.g., 'natural-language text', 'default 8') but largely paraphrases the schema. Baseline 3 is appropriate since the schema carries the parameter semantics.

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 clearly states the tool searches the local documentation index, with a specific verb ('search') and resource ('local documentation index'). It also distinguishes from siblings by explicitly noting it's for version-specific library/vendor behavior and not for user/project data, directing to search_memory, search_evidence, or ask_memory.

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?

Provides explicit usage context: 'Use it for version-specific library or vendor behaviour' and clearly excludes user/project queries, naming alternative tools. This is strong when-to-use/when-not-to-use guidance that goes beyond mere inference.

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

search_evidenceA
Read-onlyIdempotent

READ-ONLY: semantic search over the raw evidence index, meaning the memory, instruction, and rule files that other coding agents already wrote on this machine and that docmancer harvested. Runs entirely locally against the embedding index; no network call, no cost. Use it to find what an agent originally recorded, with a relevance score and the file it came from. Not for curated memory you or an agent deliberately wrote: that lives in a separate tree, so use search_memory for it, or ask_memory to get both at once. Parameters: query is the natural-language text to match; limit caps the number of results (default 8); include_history adds superseded evidence to the active evidence; expand_relations adds items linked to a direct match. Returns a list of objects with score, excerpt, source_path, scope, kind, lifecycle_state, and a docmancer://record/ record_uri. Returns [] when nothing matches.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of matching results to return. Defaults are tool-specific.
queryYesNatural-language terms to search for in the local memory or documentation index.
include_historyNoWhen true, include historical or superseded memory evidence in addition to active evidence.
expand_relationsNoWhen true, include related memory items alongside direct matches.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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

The description adds substantial behavioral context beyond the annotations: it runs entirely locally with no network call or cost, returns [] when nothing matches, and describes the return object fields including record_uri. It also explains the semantic difference between raw evidence and curated memory. These details are not in the annotations and align with the readOnly/idempotent hints.

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?

The description is front-loaded with the READ-ONLY label and core purpose, then efficiently covers scope, alternatives, parameters, and return format. Every sentence adds value and there is no repetition or fluff. Despite being long, it remains structured and scannable.

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

Completeness5/5

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

Given the tool's complexity (4 parameters, 1 required, output schema, and sibling tools), the description is complete. It explains the source index, local execution, parameter semantics, return object fields, and empty-result behavior. With the annotations also provided, an agent has everything needed to invoke it correctly.

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?

Although schema coverage is 100%, the description goes slightly beyond by specifying the default limit of 8, clarifying that include_history adds 'superseded' evidence, and expand_relations adds 'items linked to a direct match.' It also describes the expected return structure, which helps an agent understand parameter effects. Baseline was 3, but the added clarification justifies a 4.

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 clearly states 'semantic search over the raw evidence index' and specifies that it searches memory, instruction, and rule files harvested by docmancer. It distinguishes the tool from siblings by explicitly contrasting with search_memory and ask_memory, making the purpose and resource unambiguous.

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?

The description explicitly says 'Not for curated memory you or an agent deliberately wrote: that lives in a separate tree, so use search_memory for it, or ask_memory to get both at once.' This provides clear when-to-use and when-not-to-use guidance and names specific alternatives, making it easy for an agent to select the correct tool.

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

search_memoryA
Read-onlyIdempotent

READ-ONLY: lexical search over the curated memory tree, meaning the decisions, constraints, and conventions deliberately written by the user or an agent. Local disk read, no embedding call, no cost. Only active entries are searched; archived and trashed files are excluded. Returns [] rather than an error when nothing is relevant or the tree is empty, so an empty result is a real answer and not a failure. Not the same store as search_evidence, which searches raw harvested agent files instead; use ask_memory when you want both stores plus mandatory policy in one bundle. Parameters: query is the natural-language text to match; limit caps the number of results (default 8, capped at 50); project_path project root whose memory tree the operation applies to. Omit it to use the machine-wide tree, and always omit it when this server was started pinned to a project. Returns a list of objects with the docmancer://memory address, title, excerpt, authority, and source_type. Pass an address to read_memory for the full file.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of matching results to return. Defaults are tool-specific.
queryYesNatural-language terms to search for in the local memory or documentation index.
project_pathNoProject root whose memory tree the operation applies to. Omit it to use the machine-wide tree, and always omit it when this server was started pinned to a project.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

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

Annotations already declare readOnly, idempotent, and non-destructive, but the description adds valuable behavioral details: local disk read, no embedding call, no cost, excludes archived/trashed files, and returns [] instead of an error. These go beyond the structured annotations and help the agent predict runtime behavior accurately.

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?

The description is dense with information but every sentence serves a purpose. It is front-loaded with the core purpose ('READ-ONLY: lexical search...') and logically flows through scope, exclusions, return behavior, parameter details, and return format. No wasted words for a tool this nuanced.

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

Completeness5/5

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

Given the tool's complexity (3 params, output schema, multiple siblings), the description is fully self-contained. It covers purpose, filtering, empty-result semantics, sibling distinctions, parameter interpretation, return object fields, and the next step (read_memory). Nothing important is left to inference.

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

Parameters5/5

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

Schema coverage is 100% with descriptions for all three parameters, and the description enriches each: query is natural-language text, limit has default 8 and cap 50, project_path explains the machine-wide vs project-pinned behavior. This adds meaningful semantics beyond the raw schema.

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 clearly states the tool performs 'lexical search over the curated memory tree' and specifies what that includes (decisions, constraints, conventions). It explicitly differentiates from siblings by noting it is 'Not the same store as search_evidence' and directs to ask_memory for a combined store, making the purpose unambiguous.

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?

Provides explicit usage guidance: when to use this tool (lexical search over curated memory), when not to use it (search_evidence for raw files), and the alternative for both plus policy (ask_memory). Also explains the 'returns []' behavior, giving clear context for interpreting results.

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

trash_memoryA
Destructive

DESTRUCTIVE BUT REVERSIBLE: move one curated memory file to trash so it stops being read or recalled. Writes to local disk and appends to the change timeline. Nothing is erased: the call returns a restore_token that restore_memory consumes to bring the file back, so keep that token in your reply if the user might change their mind. Guarded by expected_hash, so a stale hash fails without trashing anything. Prefer setting status='archived' with write_memory when the file should stay readable but stop being recalled. Parameters: address identifies the file to trash; expected_hash is its current content_hash from read_memory, confirming you are discarding the revision you actually saw; project_path project root whose memory tree the operation applies to. Omit it to use the machine-wide tree, and always omit it when this server was started pinned to a project. Returns an object with the trashed address and the restore_token needed to undo it.

ParametersJSON Schema
NameRequiredDescriptionDefault
addressYesStable docmancer://memory/<id> address, relative path, or exact title of the memory file.
project_pathNoProject root whose memory tree the operation applies to. Omit it to use the machine-wide tree, and always omit it when this server was started pinned to a project.
expected_hashYesThe file's current content_hash from a prior read_memory call. A stale value fails safely instead of overwriting a newer revision.

TDQS

A4.9/5.0
Behavior5/5

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

Goes well beyond the destructiveHint annotation by disclosing reversibility, the restore_token mechanism, disk writes, timeline appends, and the safe-failure behavior on stale hashes. It also explains that nothing is erased, which is critical for a destructive operation.

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

Conciseness5/5

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

The description is dense but each clause adds a distinct fact: identity, effect, guard, return value, and alternative. The most critical warning (reversible/destructive) is front-loaded, and there is no filler or repetition of schema fields.

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

Completeness5/5

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

Given no output schema, the description fully specifies the return shape (address + restore_token) and the failure condition (stale hash). It also covers the write side effects and the conditional project_path behavior, making it self-sufficient for a destructive operation.

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

Parameters4/5

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

Schema already covers all three parameters, but the description enriches them: expected_hash is tied to a prior read_memory call and stale-failure semantics, project_path's omit-when-pinned rule is explicit, and address aliases are contextualized. The description adds meaning beyond the schema's basic type info.

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

Purpose5/5

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

The description opens with a clear verb-object-effect: 'move one curated memory file to trash so it stops being read or recalled.' It differentiates from siblings by explicitly naming restore_memory and write_memory as alternatives, making the tool's unique role unmistakable.

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 states when to prefer write_memory's status='archived' instead of trashing, and frames conditions for omitting project_path when pinned to a project. The expected_hash guard is presented as a safety precondition, providing concrete guidance for correct usage.

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

unpin_memoryA
Destructive

MUTATING and DESTRUCTIVE: permanently remove pinned lines from a canonical memory section by case-insensitive substring match, with no undo and no restore token. Writes to local disk, machine-wide, so it takes no project_path. A substring can match more lines than intended, so read the section with canonical_memory first and pass text specific enough to hit only what you mean. Fails without changing anything when nothing matches, which makes a dry run safe. Only pinned lines are removable; generated content is rewritten by reconciliation instead. Parameters: section selects which canonical section to modify, one of about, preferences, working-principles, or active-projects; text is the case-insensitive substring, not a whole line and not a pattern, identifying the pinned lines to delete. Returns an object with the section and how many lines were removed.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesCase-insensitive substring identifying pinned lines to remove from the selected section.
sectionYesCanonical section to modify. canonical-memory is excluded because it describes the store itself and is regenerated wholesale.

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the destructiveHint annotation, the description discloses that deletion is permanent with no undo or restore token, writes machine-wide to local disk, takes no project_path, uses case-insensitive matching, and fails without changes when nothing matches. It also explains that only pinned lines are affected, providing rich behavioral context beyond structured hints.

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?

The description opens with a clear MUTATING and DESTRUCTIVE warning, then states the core action, and follows with crucial caveats about matching, failure behavior, scope, parameters, and return value. Every sentence carries important information without redundancy, making it well-structured and appropriately sized.

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?

The description covers the destructive nature, exact matching semantics, failure behavior, scope limitations, and the return object shape. Since there is no output schema, explaining the return format is particularly valuable. Combined with the annotations and input schema, the description fully equips an agent to select and safely invoke the 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 input schema already fully documents the parameters, but the description adds essential clarification: text must be a case-insensitive substring, not a whole line and not a pattern. It also enumerates the allowed sections and reiterates the canonical-memory exclusion, supplementing the schema's descriptions.

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 clearly states the tool's function: permanently removing pinned lines from a canonical memory section via case-insensitive substring match. It also distinguishes itself from siblings by noting that only pinned lines are removable and that generated content is handled by reconciliation, making its purpose unambiguous.

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?

The description provides explicit usage guidance: read the section with canonical_memory first to avoid unintended matches, warns that a substring can match multiple lines, and clarifies that generated content should not be modified with this tool. It also notes that no-match failures are safe, enabling dry runs, and implicitly contrasts with alternatives by explaining what it cannot do.

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

write_memoryA

MUTATING: create or update one curated memory file in the memory tree, addressed as docmancer://memory/. Writes to local disk and appends to the change timeline; never silently clobbers, because the expect guard decides whether an existing file may be replaced. Use it to record a durable decision, constraint, or convention. Not for correcting the reconciled canonical memory about the user, which is regenerated and would discard the edit: use pin_memory for that. To change only the body of an existing file, prefer edit_memory. Parameters: relative_path is the file's path in the tree and must include the Markdown suffix; text is the full Markdown body; expect is the write guard, 'absent' (default) to create only and fail if the path exists, or the current content_hash to permit a guarded overwrite; memory_type, scope, authority, status, and curation_origin are frontmatter labels described in the schema; project_id names the owning project; sources lists backing file paths or URLs; tags lists retrieval labels; project_path project root whose memory tree the operation applies to. Omit it to use the machine-wide tree, and always omit it when this server was started pinned to a project. Returns an object with the stable address, the new content_hash, and the revision id, all of which later guarded calls need.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagsNoLabels used to classify and retrieve the memory content.
textYesMarkdown body to write or replace. Replaces the body wholesale; it is not appended.
scopeNoMemory visibility scope stored in frontmatter. Use global for machine-wide memory or project for project-scoped memory.global
expectNoCreate/update guard, and not an enum: pass the literal string absent for create-only, or the file's current content_hash for a guarded update.absent
statusNoFree-form lifecycle status stored in frontmatter. Only active entries are recalled. Defaults to active.active
sourcesNoSource references that back the memory content.
authorityNoHow binding the memory is. mandatory entries are always included in a recall bundle; advisory entries compete on relevance. Defaults to advisory.advisory
project_idNoProject identifier stored in the memory file frontmatter. Omit unless the memory belongs to a named project.
memory_typeNoFree-form memory classification stored in frontmatter. Defaults to fact.fact
project_pathNoProject root whose memory tree the operation applies to. Omit it to use the machine-wide tree, and always omit it when this server was started pinned to a project.
relative_pathYesRelative path, including the .md suffix, for the memory file inside its selected memory tree.
curation_originNoFree-form origin label stored in frontmatter recording how the memory was created. Defaults to deliberate_write.deliberate_write

TDQS

A4.9/5.0
Behavior5/5

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

Beyond annotations, it discloses 'Writes to local disk and appends to the change timeline; never silently clobbers, because the expect guard decides whether an existing file may be replaced.' It also explains the canonical-memory regeneration pitfall and the return object, adding meaningful behavioral context without contradicting 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?

The description is dense but front-loaded with the mutation warning and core purpose, then flows into usage guidance, alternatives, and parameter explanations. Every section carries unique information; the length is justified for a 12-parameter tool.

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?

Despite lacking an output schema, the description names return fields ('stable address, new content_hash, and revision id'), explains the guard behavior, warns about canonical memory, and covers all parameter groups. It is sufficiently complete for a complex write operation with no output schema.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3. The description adds value by explaining the expect guard mechanics ('absent' default, content_hash for guarded update), requiring the Markdown suffix on relative_path, and offering the project_path caveat about machine-wide vs pinned-project usage. This goes beyond schema paraphrasing.

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

Purpose5/5

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

The description opens with 'MUTATING: create or update one curated memory file in the memory tree', giving a specific verb, resource, and scope. It also distinguishes itself from siblings by explicitly contrasting with pin_memory and edit_memory.

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?

Provides explicit guidance: 'Use it to record a durable decision, constraint, or convention.' It also states when not to use it ('Not for correcting the reconciled canonical memory... use pin_memory') and when to prefer edit_memory, meeting the full when/when-not/alternatives bar.

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. 3 tool updatesv0.9.16
    • Changedask_memory1 field changed
      • changedInput schema / properties / agent / description
        Previous value: -"Target agent identifier, such as claude-code or cursor, used to shape and attribute the result. Defaults are tool-specific."New value: +"Target agent identifier used to shape and attribute the result. Defaults are tool-specific."
    • Changedcontext_projection1 field changed
      • changedInput schema / properties / agent / description
        Previous value: -"Target agent identifier, such as claude-code or cursor, used to shape and attribute the result. Defaults are tool-specific."New value: +"Target agent identifier used to shape and attribute the result. Defaults are tool-specific."
    • Changedwrite_memory3 fields changed
      • changedInput schema / properties / memory_type / description
        Previous value: -"Free-form memory classification stored in frontmatter, such as fact, decision, preference, or constraint. Defaults to fact."New value: +"Free-form memory classification stored in frontmatter. Defaults to fact."
      • changedInput schema / properties / sources / description
        Previous value: -"Source references, such as file paths or URLs, that back the memory content."New value: +"Source references that back the memory content."
      • changedInput schema / properties / status / description
        Previous value: -"Free-form lifecycle status stored in frontmatter, such as active, draft, or archived. Only active entries are recalled. Defaults to active."New value: +"Free-form lifecycle status stored in frontmatter. Only active entries are recalled. Defaults to active."
  2. 23 tool updatesv0.9.13
    • Changedask_memory15 fields changed
      • addedInput schema / properties / agent / description
        Added value: +"Target agent identifier, such as claude-code or cursor, used to shape and attribute the result. Defaults are tool-specific."
      • addedInput schema / properties / answer / description
        Added value: +"When true, spend a configured provider call to generate a grounded cited answer from the recalled memory instead of returning the bundle alone."
      • removedInput schema / properties / budget
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "integer"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "title": "Budget"
        -}
      • addedInput schema / properties / include_history / description
        Added value: +"When true, include historical or superseded memory evidence in addition to active evidence."
      • addedInput schema / properties / limit / description
        Added value: +"Maximum number of matching results to return. Defaults are tool-specific."
      • addedInput schema / properties / mode / description
        Added value: +"Answer verbosity when answer is true. Ignored when answer is false. Defaults to normal."
      • addedInput schema / properties / mode / enum
        Added value: +[
        +  "concise",
        +  "normal",
        +  "thorough"
        +]
      • addedInput schema / properties / project_path / description
        Added value: +"Project root whose memory tree the operation applies to. Omit it to use the machine-wide tree, and always omit it when this server was started pinned to a project."
      • removedInput schema / properties / query
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "title": "Query"
        -}
      • removedInput schema / properties / task / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / task / default
        Removed value: -null
      • addedInput schema / properties / task / description
        Added value: +"Natural-language task or question to recall relevant policy, memory, and evidence for."
      • addedInput schema / properties / task / type
        Added value: +"string"
      • addedInput schema / properties / token_budget / description
        Added value: +"Approximate maximum token size of the returned bundle. Omit to use the tool default."
      • addedInput schema / required
        Added value: +[
        +  "task"
        +]
    • Changedcanonical_memory2 fields changed
      • changedInput schema / properties / section / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "enum": [
        +      "about",
        +      "preferences",
        +      "working-principles",
        +      "active-projects",
        +      "canonical-memory"
        +    ],
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / section / description
        Added value: +"Canonical section to read. Omit for a status summary of every section."
    • Changedcommon_memory1 field changed
      • addedInput schema / properties / project_path / description
        Added value: +"Project root whose memory tree the operation applies to. Omit it to use the machine-wide tree, and always omit it when this server was started pinned to a project."
    • Changedcontext_delivery1 field changed
      • addedInput schema / properties / project_path / description
        Added value: +"Project root whose memory tree the operation applies to. Omit it to use the machine-wide tree, and always omit it when this server was started pinned to a project."
    • Changedcontext_projection3 fields changed
      • addedInput schema / properties / agent / description
        Added value: +"Target agent identifier, such as claude-code or cursor, used to shape and attribute the result. Defaults are tool-specific."
      • addedInput schema / properties / project_path / description
        Added value: +"Project root whose memory tree the operation applies to. Omit it to use the machine-wide tree, and always omit it when this server was started pinned to a project."
      • addedInput schema / properties / token_budget / description
        Added value: +"Approximate maximum token size of the returned context projection."
    • Changedcontext_status1 field changed
      • addedInput schema / properties / project_path / description
        Added value: +"Project root whose memory tree the operation applies to. Omit it to use the machine-wide tree, and always omit it when this server was started pinned to a project."
    • Changeddecision_timeline5 fields changed
      • addedInput schema / properties / file_id / description
        Added value: +"Stable memory file identifier. Supply it to restrict the timeline to one file's history."
      • addedInput schema / properties / limit / description
        Added value: +"Maximum number of matching results to return. Defaults are tool-specific."
      • changedInput schema / properties / operation / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "enum": [
        +      "create",
        +      "edit",
        +      "move",
        +      "duplicate",
        +      "trash",
        +      "restore",
        +      "pin",
        +      "reconcile"
        +    ],
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / operation / description
        Added value: +"Operation name used to restrict the timeline to one kind of change. Omit for every operation."
      • addedInput schema / properties / project_path / description
        Added value: +"Project root whose memory tree the operation applies to. Omit it to use the machine-wide tree, and always omit it when this server was started pinned to a project."
    • Removeddocmancer_docs_search
    • Removeddocmancer_memory_search
    • Removeddocmancer_memory_status
    • Changedduplicate_memory4 fields changed
      • addedInput schema / properties / address / description
        Added value: +"Stable docmancer://memory/<id> address, relative path, or exact title of the memory file."
      • addedInput schema / properties / expected_hash / description
        Added value: +"The file's current content_hash from a prior read_memory call. A stale value fails safely instead of overwriting a newer revision."
      • addedInput schema / properties / new_relative_path / description
        Added value: +"Relative path, including the .md suffix, for the memory file inside its selected memory tree."
      • addedInput schema / properties / project_path / description
        Added value: +"Project root whose memory tree the operation applies to. Omit it to use the machine-wide tree, and always omit it when this server was started pinned to a project."
    • Changededit_memory17 fields changed
      • removedInput schema / properties / address / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / address / default
        Removed value: -null
      • addedInput schema / properties / address / description
        Added value: +"Stable docmancer://memory/<id> address, relative path, or exact title of the memory file."
      • addedInput schema / properties / address / type
        Added value: +"string"
      • removedInput schema / properties / content
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "title": "Content"
        -}
      • removedInput schema / properties / expected_hash / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / expected_hash / default
        Removed value: -null
      • addedInput schema / properties / expected_hash / description
        Added value: +"The file's current content_hash from a prior read_memory call. A stale value fails safely instead of overwriting a newer revision."
      • addedInput schema / properties / expected_hash / type
        Added value: +"string"
      • removedInput schema / properties / hash
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "title": "Hash"
        -}
      • addedInput schema / properties / project_path / description
        Added value: +"Project root whose memory tree the operation applies to. Omit it to use the machine-wide tree, and always omit it when this server was started pinned to a project."
      • removedInput schema / properties / target
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "title": "Target"
        -}
      • removedInput schema / properties / text / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / text / default
        Removed value: -null
      • addedInput schema / properties / text / description
        Added value: +"Markdown body to write or replace. Replaces the body wholesale; it is not appended."
      • addedInput schema / properties / text / type
        Added value: +"string"
      • addedInput schema / required
        Added value: +[
        +  "address",
        +  "text",
        +  "expected_hash"
        +]
    • Addedevidence_status
    • Changedmove_memory17 fields changed
      • removedInput schema / properties / address / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / address / default
        Removed value: -null
      • addedInput schema / properties / address / description
        Added value: +"Stable docmancer://memory/<id> address, relative path, or exact title of the memory file."
      • addedInput schema / properties / address / type
        Added value: +"string"
      • removedInput schema / properties / expected_hash / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / expected_hash / default
        Removed value: -null
      • addedInput schema / properties / expected_hash / description
        Added value: +"The file's current content_hash from a prior read_memory call. A stale value fails safely instead of overwriting a newer revision."
      • addedInput schema / properties / expected_hash / type
        Added value: +"string"
      • removedInput schema / properties / hash
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "title": "Hash"
        -}
      • removedInput schema / properties / new_path
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "title": "New Path"
        -}
      • removedInput schema / properties / new_relative_path / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / new_relative_path / default
        Removed value: -null
      • addedInput schema / properties / new_relative_path / description
        Added value: +"Relative path, including the .md suffix, for the memory file inside its selected memory tree."
      • addedInput schema / properties / new_relative_path / type
        Added value: +"string"
      • addedInput schema / properties / project_path / description
        Added value: +"Project root whose memory tree the operation applies to. Omit it to use the machine-wide tree, and always omit it when this server was started pinned to a project."
      • removedInput schema / properties / target
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "title": "Target"
        -}
      • addedInput schema / required
        Added value: +[
        +  "address",
        +  "new_relative_path",
        +  "expected_hash"
        +]
    • Changedpin_memory10 fields changed
      • removedInput schema / properties / section / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / section / default
        Removed value: -null
      • addedInput schema / properties / section / description
        Added value: +"Canonical section to modify. canonical-memory is excluded because it describes the store itself and is regenerated wholesale."
      • addedInput schema / properties / section / enum
        Added value: +[
        +  "about",
        +  "preferences",
        +  "working-principles",
        +  "active-projects"
        +]
      • addedInput schema / properties / section / type
        Added value: +"string"
      • removedInput schema / properties / text / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / text / default
        Removed value: -null
      • addedInput schema / properties / text / description
        Added value: +"Complete durable line to add to the selected canonical section's pinned zone."
      • addedInput schema / properties / text / type
        Added value: +"string"
      • addedInput schema / required
        Added value: +[
        +  "section",
        +  "text"
        +]
    • Changedread_memory8 fields changed
      • removedInput schema / properties / address / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / address / default
        Removed value: -null
      • addedInput schema / properties / address / description
        Added value: +"Stable docmancer://memory/<id> address, relative path, or exact title of the memory file."
      • addedInput schema / properties / address / type
        Added value: +"string"
      • removedInput schema / properties / memory_id
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "title": "Memory Id"
        -}
      • addedInput schema / properties / project_path / description
        Added value: +"Project root whose memory tree the operation applies to. Omit it to use the machine-wide tree, and always omit it when this server was started pinned to a project."
      • removedInput schema / properties / target
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "title": "Target"
        -}
      • addedInput schema / required
        Added value: +[
        +  "address"
        +]
    • Changedrestore_memory2 fields changed
      • addedInput schema / properties / project_path / description
        Added value: +"Project root whose memory tree the operation applies to. Omit it to use the machine-wide tree, and always omit it when this server was started pinned to a project."
      • addedInput schema / properties / restore_token / description
        Added value: +"Restore token returned by a prior trash_memory call, identifying the file to restore."
    • Addedsearch_docs
    • Addedsearch_evidence
    • Changedsearch_memory8 fields changed
      • addedInput schema / properties / limit / description
        Added value: +"Maximum number of matching results to return. Defaults are tool-specific."
      • addedInput schema / properties / project_path / description
        Added value: +"Project root whose memory tree the operation applies to. Omit it to use the machine-wide tree, and always omit it when this server was started pinned to a project."
      • removedInput schema / properties / query / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / query / default
        Removed value: -null
      • addedInput schema / properties / query / description
        Added value: +"Natural-language terms to search for in the local memory or documentation index."
      • addedInput schema / properties / query / type
        Added value: +"string"
      • removedInput schema / properties / text
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "title": "Text"
        -}
      • addedInput schema / required
        Added value: +[
        +  "query"
        +]
    • Changedtrash_memory3 fields changed
      • addedInput schema / properties / address / description
        Added value: +"Stable docmancer://memory/<id> address, relative path, or exact title of the memory file."
      • addedInput schema / properties / expected_hash / description
        Added value: +"The file's current content_hash from a prior read_memory call. A stale value fails safely instead of overwriting a newer revision."
      • addedInput schema / properties / project_path / description
        Added value: +"Project root whose memory tree the operation applies to. Omit it to use the machine-wide tree, and always omit it when this server was started pinned to a project."
    • Changedunpin_memory10 fields changed
      • removedInput schema / properties / section / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / section / default
        Removed value: -null
      • addedInput schema / properties / section / description
        Added value: +"Canonical section to modify. canonical-memory is excluded because it describes the store itself and is regenerated wholesale."
      • addedInput schema / properties / section / enum
        Added value: +[
        +  "about",
        +  "preferences",
        +  "working-principles",
        +  "active-projects"
        +]
      • addedInput schema / properties / section / type
        Added value: +"string"
      • removedInput schema / properties / text / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / text / default
        Removed value: -null
      • addedInput schema / properties / text / description
        Added value: +"Case-insensitive substring identifying pinned lines to remove from the selected section."
      • addedInput schema / properties / text / type
        Added value: +"string"
      • addedInput schema / required
        Added value: +[
        +  "section",
        +  "text"
        +]
    • Changedwrite_memory25 fields changed
      • addedInput schema / properties / authority / description
        Added value: +"How binding the memory is. mandatory entries are always included in a recall bundle; advisory entries compete on relevance. Defaults to advisory."
      • addedInput schema / properties / authority / enum
        Added value: +[
        +  "advisory",
        +  "mandatory"
        +]
      • removedInput schema / properties / content
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "title": "Content"
        -}
      • addedInput schema / properties / curation_origin / description
        Added value: +"Free-form origin label stored in frontmatter recording how the memory was created. Defaults to deliberate_write."
      • removedInput schema / properties / expect / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / expect / description
        Added value: +"Create/update guard, and not an enum: pass the literal string absent for create-only, or the file's current content_hash for a guarded update."
      • addedInput schema / properties / expect / type
        Added value: +"string"
      • addedInput schema / properties / memory_type / description
        Added value: +"Free-form memory classification stored in frontmatter, such as fact, decision, preference, or constraint. Defaults to fact."
      • removedInput schema / properties / path
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "title": "Path"
        -}
      • addedInput schema / properties / project_id / description
        Added value: +"Project identifier stored in the memory file frontmatter. Omit unless the memory belongs to a named project."
      • addedInput schema / properties / project_path / description
        Added value: +"Project root whose memory tree the operation applies to. Omit it to use the machine-wide tree, and always omit it when this server was started pinned to a project."
      • removedInput schema / properties / relative_path / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / relative_path / default
        Removed value: -null
      • addedInput schema / properties / relative_path / description
        Added value: +"Relative path, including the .md suffix, for the memory file inside its selected memory tree."
      • addedInput schema / properties / relative_path / type
        Added value: +"string"
      • addedInput schema / properties / scope / description
        Added value: +"Memory visibility scope stored in frontmatter. Use global for machine-wide memory or project for project-scoped memory."
      • addedInput schema / properties / scope / enum
        Added value: +[
        +  "global",
        +  "project"
        +]
      • addedInput schema / properties / sources / description
        Added value: +"Source references, such as file paths or URLs, that back the memory content."
      • addedInput schema / properties / status / description
        Added value: +"Free-form lifecycle status stored in frontmatter, such as active, draft, or archived. Only active entries are recalled. Defaults to active."
      • addedInput schema / properties / tags / description
        Added value: +"Labels used to classify and retrieve the memory content."
      • removedInput schema / properties / text / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / text / default
        Removed value: -null
      • addedInput schema / properties / text / description
        Added value: +"Markdown body to write or replace. Replaces the body wholesale; it is not appended."
      • addedInput schema / properties / text / type
        Added value: +"string"
      • addedInput schema / required
        Added value: +[
        +  "relative_path",
        +  "text"
        +]
  3. 20 tool updatesv0.1.0
    • First observedask_memory
    • First observedcanonical_memory
    • First observedcommon_memory
    • First observedcontext_delivery
    • First observedcontext_projection
    • First observedcontext_status
    • First observeddecision_timeline
    • First observeddocmancer_docs_search
    • First observeddocmancer_memory_search
    • First observeddocmancer_memory_status
    • First observedduplicate_memory
    • First observededit_memory
    • First observedmove_memory
    • First observedpin_memory
    • First observedread_memory
    • First observedrestore_memory
    • First observedsearch_memory
    • First observedtrash_memory
    • First observedunpin_memory
    • First observedwrite_memory

TDQS

A4.7/5.0

Scored across 20 tools

Disambiguation5/5

Each tool targets a distinct store, lifecycle stage, or diagnostic question (search vs evidence vs memory vs context vs timeline), and overlapping tools like search_memory, search_evidence, and ask_memory explicitly define their boundaries. No two tools are confusable in purpose.

Naming Consistency4/5

Actions follow verb_noun (write_memory, search_docs, restore_memory), while inspection tools use noun-like names (evidence_status, context_delivery, canonical_memory), creating a mild but readable inconsistency. The family prefixes (search_, *_memory, context_) make the pattern predictable despite the mix.

Tool Count4/5

20 tools is on the heavy side but justified by the server's broad scope: docs search, evidence search, memory CRUD, canonical memory pinning, context diagnostics, and a timeline. Each tool has a clear role, though some consolidation could reduce overlap.

Completeness5/5

The lifecycle for curated memory is comprehensive (create, read, edit, move, duplicate, trash, restore), plus search and combined recall. Evidence and context are read-only but deliberately so, and the missing operations (add docs, refresh context) are explicitly human-only. No obvious gaps.

Maintenance

ActivitySlowing
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Persistent shared memory for AI coding agents that turns a folder of markdown files into searchable memory across sessions, repos, and machines.
    5 npm
    Functional Source , Version 1.1, MIT Future
  • A
    license
    Not graded
    quality
    B
    maintenance
    Provides persistent, local-first memory for coding agents with Markdown as the source of truth, exposed via CLI, loopback API, MCP, and Codex hooks for context retrieval and durable writes.
    MIT