Skip to main content
Glama

Datacron

Local MCP server to query and maintain a Markdown vault from Claude, Codex, Gemini, or another stdio MCP client, without sending the whole vault into the context.

License: Apache 2.0 Python: 3.11+ MCP: local stdio CI

English | Français

What can you do with Datacron?

Recover project context, prepare for a conversation, and keep track of commitments. Datacron gives your assistant durable memory in readable, editable Markdown. Your notes remain usable independently of the client you choose.

Need

Example request to your assistant

Resume a project

"Where did we leave off? Find the decisions and next actions."

Prepare a meeting

"Summarize our recent conversations and open points, with sources."

Remember a person

"Who is this person, how have we interacted, and what should we follow up on?"

Track objectives

"Find the commitments and achievements relevant to my next review."

Preserve a reliable record

"Save this decision, link it to the project, and verify that it was stored."

The assistant orchestrates these requests using the available tools and granted permissions. A shared protocol guides reading, people updates, and write verification. Ambiguous identities require clarification; storing a deadline does not schedule a reminder. Explore daily follow-up.

Start here: install · first session · user guide · MCP reference · privacy.

Related MCP server: markdown-vault-mcp

Installation

Windows: one double-click installer

The easiest way on Windows: download Datacron-Setup.exe from the latest Release, double-click it, and pick your vault. No Python, no terminal, no administrator rights; Datacron registers itself with your AI clients automatically. Full guide: Windows installation.

Python: from PyPI

python -m pip install datacron
datacron setup

From source

From a clone of the repository:

python -m pip install -e ".[dev]"

Or, to install only the application:

python -m pip install -e .

Runtime prerequisites:

  • Python 3.11+

  • ripgrep available on the PATH for search_regex; without it that tool falls back to a slower scan of indexed chunk bodies

  • a folder of Markdown notes

  • a supported stdio MCP client, such as Claude Desktop, Codex CLI, or Gemini CLI

First session

  1. Choose your notes folder with the installer or datacron setup.

  2. Reconnect Datacron in your MCP client to load the tools and instructions. The Claude Desktop chat does not present the server instructions: paste the session start line printed by setup into your Claude preferences (see setup).

  3. Ask: "Find the notes for my project and summarize its status with sources."

For memory sessions, session_context returns bounded context and the shared protocol. prepare_follow_up prepares sourced updates; existing writers apply them according to permissions. get_follow_up retrieves the latest structured revisions. Existing prose notes remain readable and are not automatically converted.

The server operates locally. Your client may send returned excerpts to its model provider; see privacy and security.

Quick start

The easy path - one command detects your AI clients, initializes the vault, indexes it, and registers Datacron everywhere:

datacron setup            # interactive; add --yes for all defaults

See the installation guide for options (--client, --scope, writing, durability). Or step by step:

datacron init /path/to/vault
datacron index --vault /path/to/vault
datacron status --vault /path/to/vault
datacron mcp install --client claude-desktop --vault /path/to/vault

The mcp install subcommand above is dedicated to Claude Desktop. For Codex CLI, Gemini CLI, Antigravity, LM Studio, Cursor, and the other clients, use multi-client setup with datacron setup --client <identifier> or auto-detection with --client all.

Add to LM Studio

LM Studio 0.3.17+ has one user configuration and no project scope. The preferred command is:

datacron setup --yes --vault "VAULT_PATH" --client lmstudio --scope user

For a Python installation where datacron-mcp is on PATH, the equivalent read-only configuration can also be imported with this official deeplink:

Add to LM Studio

The link imports this example. Open LM Studio's MCP editor and replace both <YOUR_VAULT> placeholders before starting the server:

{
  "mcpServers": {
    "datacron": {
      "command": "datacron-mcp",
      "args": [],
      "env": {
        "DATACRON_VAULT_ROOT": "<YOUR_VAULT>",
        "DATACRON_READ_PATHS": "<YOUR_VAULT>",
        "DATACRON_DURABILITY": "best-effort"
      }
    }
  }
}

The example does not enable write tools. CLI setup is safer for packaged installations because it writes the actual executable path automatically.

Restart the configured client or clients after installation.

To run the server manually:

datacron mcp serve --vault /path/to/vault

The direct script entry used by the installer is also available:

datacron-mcp

datacron-mcp reads the vault from DATACRON_VAULT_ROOT.

Configuration

datacron init creates .datacron/VAULT.yaml. That file can carry vault-local configuration, notably query expansion:

query_expansion:
  supervision: [monitoring]
  sauvegarde: [backup]
  restauration: [restore]
  chiffrement: [encryption]
  sécurité: [security]
  validité: [validity]
  certificat: [certificate]

Useful environment variables:

Variable

Default

Role

DATACRON_VAULT_ROOT

unset

fallback after --vault; the current directory is accepted only when it contains .datacron/VAULT.yaml

DATACRON_READ_PATHS

empty

read allowlist; client setup sets it to the vault

DATACRON_WRITE_PATHS

empty

write allowlist; empty = write tools disabled

DATACRON_MAX_RESULT_COUNT

20

maximum number of results returned

DATACRON_MAX_RESULT_TOKENS

8000

token budget for search results

DATACRON_REPAIR_MIN_INTERVAL_SECONDS

30

minimum interval between repair-on-read sweeps; 0 = every read

DATACRON_GET_NOTE_MAX_TOKENS

25000

budget for get_note(format="full")

DATACRON_SESSION_CONTEXT_SECTIONS

INIT template sections

JSON mapping of note paths to heading paths for bounded orientation excerpts

DATACRON_CHUNK_MAX_TOKENS

1024

target maximum chunk size

DATACRON_RIPGREP_PATH

rg

ripgrep binary

Path lists use the OS separator (: on Unix, ; on Windows).

Writing

Writes are deliberately OFF by default. Without DATACRON_WRITE_PATHS, write tools return a clear error and create no file.

To enable writing to a specific subfolder:

$env:DATACRON_VAULT_ROOT = "G:\_DATA"
$env:DATACRON_READ_PATHS = "G:\_DATA"
$env:DATACRON_WRITE_PATHS = "G:\_DATA\_memory"
datacron mcp serve --vault G:\_DATA

datacron setup can also apply the allowlist machine-wide (user environment variable, opt-in) so every MCP client inherits it; default: _memory, _drafts, _journal. See the setup guide.

Available write tools:

  • create_note_ai: creates a typed Markdown note, without overwrite.

  • append_journal: adds an entry under a heading of an existing note.

  • set_frontmatter: updates lifecycle fields, the rejected options list, and the monotone last_id counter without modifying the Markdown body.

  • patch_note_preamble: replaces or removes the Markdown preamble before the first recognized Markdown heading (ATX or Setext), with mandatory CAS control.

  • patch_note_section: replaces the content under an existing heading with CAS control.

  • delete_note_section: explicitly deletes an H2-H6 section (ATX or Setext) and its subtree.

  • rename_note_section: renames only the title of an H2-H6 section (ATX or Setext).

  • move_note_section: previews or commits an exact H2-H6 subtree move within a note, with mandatory CAS.

  • revert_note: restores the exact bytes of a version kept in history.

  • apply_organization_manifest: validates and then applies a local content-addressed bundle after confirmation bound to the exact admitted organization pre-state.

Guarantees:

  • strict note confinement within DATACRON_WRITE_PATHS; organization-batch note sources and targets must also stay inside the unchanged live organization.scope and pass the live note-admission policy, including exclusions

  • two internal exact-CAS targets for an organization batch: .datacron/VAULT.yaml, only to change the top-level organization mapping without changing organization.scope, and .datacron/ulids.json, only when Datacron derives the key migration required by a move_replace_exact

  • atomic overwrite via temporary file + os.replace

  • content-addressed history before modifying an existing note

  • synchronous reconcile() after a normal write; immediate searchability is guaranteed only when reconciliation succeeds

  • local audit log

  • for an organization manifest: crash-consistent recovery and atomic replacement of each file; simultaneous visibility across several paths is not guaranteed

Concurrent multi-machine mode is not supported for writes: keep a single-writer rule on the vault.

For apply_organization_manifest, also stop every other Datacron client and server during the maintenance window. Before applying, keep a verified byte-exact backup outside the vault of the affected notes and the complete .datacron directory until every post-commit check is green. Call mode="validate" first, review the bounded hashes it returns, then reuse the exact confirmation_token with mode="apply". The token binds the manifest and payloads, all admitted Markdown notes inside organization.scope, the exact vault configuration and identity sidecars, and the projected report. It deliberately does not bind unrelated note bytes outside organization.scope. A change to any authenticated component invalidates the confirmation before mutation. history_mode=full is required at validation time. If Datacron derives identity-sidecar case-collision cleanup, also review identity_sidecar_case_canonicalization_count and its content-free SHA-256 before applying; both proofs are token-bound and retained in the durable receipt. An existing replace_exact or move_replace_exact source must carry its id in frontmatter; an identity available only from the sidecar is unsupported by this v1 schema. If the batch is already durably committed but index reconciliation or the planner oracle fails, the response says so explicitly (committed_index_incomplete or committed_report_mismatch) and the same call can be retried with the same token. An organization-batch blocker is reported by datacron ops inspect with a pending_batch_ reason and both single-note repair actions unavailable; use the full offline rollback procedure in the operational-health guide rather than repairing or quarantining one member.

Available capabilities

Datacron indexes a folder of Markdown notes, exposes a local MCP server, then returns the relevant notes or chunks to the client instead of a full dump. The vault stays an ordinary Markdown folder: Datacron only adds a .datacron/ sidecar for the index, logs, internal ULIDs, history, and the operation journal.

Surface

Current state

Vault reading

list_notes, get_note, resources datacron://vault/map, vault/info, policy/active

Search

SQLite FTS5/BM25, FR↔EN query expansion, temporal re-rank, ripgrep via search_regex

Local graph

Wikilinks and backlinks via get_backlinks

Writing

9 confined note tools + 1 organization batch, journaled and disabled by default without DATACRON_WRITE_PATHS

MCP transport

Python MCP SDK v2 through MCPServer, local stdio only; modern 2026-07-28 protocol and legacy 2025-11-25 compatibility, with no HTTP listener

Index

datacron index incremental, datacron reindex full, conditional repair on read

Organization

Optional organization block in VAULT.yaml; datacron reorganize --dry-run measures the gap read-only, apply_organization_manifest applies

Evaluation

datacron eval over the real MCP pipeline: recall@k, MRR, nDCG, freshness, latency, and payload tokens

Guided setup

datacron setup: init + index + MCP registration in one command

Clients

Auto-detect and register via datacron setup --client all: Claude Desktop, Claude Code, Cursor, Gemini CLI, Antigravity, LM Studio, Codex CLI, Windsurf, VS Code

Daily memory

session_context, prepare_follow_up, get_follow_up: bounded context, sourced follow-up, and structured state

Memory protocol

Shared versioned server/client contract; protocol status checks distribution, not model behavior

Distribution

Windows installer (Datacron-Setup.exe), standalone executable (PyInstaller) with no Python required, or installation from source

MCP Tools

Reading

Tool

Description

session_context

Bounded session context and versioned common protocol.

prepare_follow_up

Prepare sourced follow-up plans without writing.

get_follow_up

Latest structured follow-up revisions with snapshot-bound pagination.

list_notes

returns a paginated list, filterable by folder, tags, and frontmatter key/value pairs, with ULID, title, tags, aliases, and dates

get_note

reads a note or an exact heading subtree, with pagination, chunk lookup, or a heading outline

search_text

runs a BM25 search on the FTS5 index with ranked snippets and stale notes demoted by default

search_regex

runs a regex search via ripgrep and resolves the found lines to indexed chunks

get_backlinks

returns chunks whose wikilinks target a ULID or a resolved alias

Writing

Tool

Description

create_note_ai

creates a new typed _memory note, confined to allowed paths, without overwrite and with a durable journal

append_journal

adds a Markdown entry under a heading, with confinement, exact history, and atomic write

set_frontmatter

updates allowed lifecycle fields, rejected, the monotone last_id counter, and updated, preserving the Markdown body

patch_note_preamble

replaces or removes the preamble before the first recognized Markdown heading (ATX or Setext), with mandatory CAS and suffix preservation

patch_note_section

replaces the content of an existing heading with CAS, exact history, and preservation of other sections

move_note_section

previews or commits an exact subtree move beneath an existing heading in the same note

delete_note_section

explicitly deletes an H2-H6 section (ATX or Setext) and its subtree, with optional CAS and exact history

rename_note_section

renames the title of an H2-H6 section (ATX or Setext) without modifying its content or subtree

revert_note

restores a note from its content-addressed history; the operation stays durable, reversible, and audited

apply_organization_manifest

validates a local content-addressed bundle containing at least one exact note operation and/or an exact organization configuration replacement, then applies its declared members and any required derived ULID-sidecar migration under CAS; application is journaled and crash-consistent

Operational

Tool

Description

get_health

returns the real state of index freshness, integrity, checksum, durability, and invariants

get_note_history

lists the committed operation metadata of a note without reading historical content or modifying the journal

audit_query

queries operation metadata by period, tool, or note without modifying the journal or the vault

Advisory (experimental)

Tool

Description

contradiction_scan

live, deterministic, bounded scan of contradictions/refinements between sections; proposes and confirms an explicit CAS call read-only, without ever writing automatically

MCP resources:

  • datacron://vault/map

  • datacron://vault/info

  • datacron://policy/active

search_text combines several signals:

  • FTS5/BM25 for the base lexical score

  • a heavier weight on the note title and heading trail than on the chunk body, so a note about a subject outranks a note that merely mentions it

  • FR↔EN query expansion configured in VAULT.yaml

  • conservative temporal re-rank:

    • a note referenced in another note's supersedes is strongly demoted

    • confidence: low and confidence: needs_verification apply a light penalty

    • include_superseded=true brings historical notes back up

  • optional scope: folder, tags, and frontmatter narrow the searched notes with the same semantics as list_notes; the response echoes the filters actually applied

  • optional grouping: group_by_note=true keeps the best chunk of each note and reports how many of its chunks matched, which cuts the returned tokens by about 40 percent on the eval corpus

search_regex stays literal: it applies neither query expansion nor temporal re-rank.

These measurements cover 19 questions and one configuration. They are not a benchmark of the current release or a guarantee for another vault.

Local measurement of the tool/impl pipeline actually received by the agent, 19 questions, 8k-token / 20-result configuration, July 17, 2026:

recall@5       0.89
recall@10      0.95
recall@20      0.95
MRR            0.73
nDCG@10        0.79
latency p50    57 ms
latency p95    276 ms
payload tokens 90567

On this historical set, tool-level recall@5 matched the BM25 store. Use datacron eval with a suitable question set to measure behavior on your own notes.

Privacy and security

  • Datacron does no telemetry.

  • Datacron calls no cloud LLM.

  • The MCP client, for example Claude, Codex, or Gemini, may send the chunks that Datacron returns to its provider. Datacron does not send it the full vault.

  • Content returned to clients is wrapped in <vault_content>...</vault_content>.

  • Results are bounded by count and by token budget.

  • Filesystem access is confined by DATACRON_READ_PATHS and DATACRON_WRITE_PATHS.

  • MCP operations are audited in the local logs.

CLI commands

datacron setup                      # guided path: init + index + client config
datacron setup --yes                # all defaults, no prompts
datacron setup --client all --scope both --vault /path/to/vault
datacron setup --protocol           # also install client memory rules
datacron protocol install --client all
datacron protocol status --client all --scope user
datacron init /path/to/vault
datacron status --vault /path/to/vault
datacron index --vault /path/to/vault
datacron reindex --vault /path/to/vault
datacron scrub-init --vault /path/to/vault
datacron scrub --vault /path/to/vault
datacron reorganize --vault /path/to/vault --dry-run          # measure organization, read-only
datacron reorganize --vault /path/to/vault --dry-run --json   # stable machine-readable report
datacron eval --questions examples/eval-questions.example.yaml --vault /path/to/vault
datacron eval --questions local/golden.yaml --vault /path/to/vault --save-baseline
datacron eval --questions local/golden.yaml --vault /path/to/vault --compare --json
datacron mcp serve --vault /path/to/vault
datacron mcp install --client claude-desktop --vault /path/to/vault  # Claude Desktop only
datacron unregister --client all --scope both --vault /path/to/vault
datacron protocol uninstall --client all

Current limitations

  • Lexical search only: no vector search or embeddings.

  • No autonomous agent: the MCP client orchestrates.

  • No GUI.

  • No concurrent multi-machine writes.

  • Client detection in datacron setup is best-effort (a config directory or a binary on the PATH); an install in a non-standard location may be missed and can then be configured by hand.

Documentation

Full index: docs/en/index.md | Index français.

To get started:

Technical references:

Development

CI runs the invariants and the entire regression suite on Linux/Python 3.12 for changes limited to the READMEs, CHANGELOG, and Markdown pages under docs/fr/ or docs/en/. All other changes retain the six Linux/Windows and Python 3.11-3.13 combinations. Publications require the full matrix, as do empty or unverifiable diffs. ShellCheck, the dependency audit, and the required Quality gate remain active in both paths. The first push of a new branch also uses the full matrix because no previous comparison point is available.

python -m pip install -e ".[dev]"
ruff check .
ruff format --check .
mypy
pytest

License

Copyright 2026 Julien Bombled.

Licensed under the Apache License, Version 2.0.

Reliable writes and quality gates

Available Tools

21 tools
append_journalAppend to memory noteA

Use this when new information extends a topic that already has a note, instead of creating a duplicate. Append a Markdown entry under a heading in an existing memory note. This is a write operation: it is confined to DATACRON_WRITE_PATHS, stores content-addressed history, writes atomically, and relies on the MCP client's tool approval for human-in-the-loop review.

ParametersJSON Schema
NameRequiredDescriptionDefault
entryYes
headingYes
rel_pathYes
request_idNo
expected_hashNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
indexedYes
appendedNo
rel_pathNo
replayedNo
committedNo
content_hashYes
operation_idNo

TDQS

A4.4/5.0
Behavior5/5

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

The description goes well beyond the annotations by disclosing that this is a write operation confined to DATACRON_WRITE_PATHS, stores content-addressed history, writes atomically, and depends on MCP client tool approval. This gives the agent a clear safety and side-effect profile.

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

Conciseness5/5

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

Three sentences, each earning its place: usage condition, core action, and behavioral/safety context. Information is front-loaded and nothing is redundant.

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

Completeness4/5

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

The description is complete for the core required parameters and gives strong behavioral context, and an output schema exists so return-value explanation is unnecessary. However, the optional request_id and expected_hash parameters remain opaque, which is a minor completeness gap for a tool with this many parameters.

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

Parameters3/5

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

The description conveys the meaning of entry, heading, and rel_path through context ('Append a Markdown entry under a heading in an existing memory note'), but schema description coverage is 0% and the optional request_id and expected_hash parameters are not explained at all. The description partially compensates for the missing schema descriptions but not fully.

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 — append a Markdown entry under a heading in an existing memory note — and explicitly frames it as the right choice when new information extends an existing topic rather than creating a duplicate. This makes the tool's purpose clear and distinguishes it from the create-note sibling.

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

Usage Guidelines4/5

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

It gives an explicit usage condition: use when new information extends a topic that already has a note, instead of creating a duplicate. However, it does not address when not to use this tool relative to other note-modification siblings like patch_note_section or rename_note_section.

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

audit_queryQuery operation audit logA
Read-only

Query committed operation metadata by time range, tool, or note. This read-only operation never changes the journal or vault.

ParametersJSON Schema
NameRequiredDescriptionDefault
endNo
noteNo
toolNo
limitNo
startNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

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

The description adds that the operation is read-only and never changes the journal or vault, providing specificity beyond the readOnlyHint annotation. It does not disclose return behavior or error conditions, but the annotation already establishes safety.

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

Conciseness5/5

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

Two short sentences deliver the essential purpose and safety guarantee without redundancy.

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

Completeness4/5

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

For a read-only query tool with an output schema and annotations, the description covers purpose, filtering dimensions, and safety. It could mention the default limit or return format, but the output schema likely covers the latter.

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

Parameters3/5

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

The description maps the start/end parameters to 'time range' and mentions tool and note filters, but does not describe the 'limit' parameter or value formats. With 0% schema coverage, this partially compensates but leaves some parameters underspecified.

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 queries committed operation metadata with filters for time range, tool, or note. It distinguishes itself from sibling note/search tools by focusing on the audit log.

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

Usage Guidelines3/5

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

The description implies usage for reviewing audit metadata but does not explicitly state when to prefer this over alternatives. No exclusions or alternative tool references are provided.

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

contradiction_scanScan live contradiction candidatesA
Read-only

Use this when indexed sections may conflict or refine one another. Scan mode returns deterministic section-level candidates and read-only proposal tokens; summary detail omits redundant alternative previews while full detail retains them for debugging. confirm mode validates one token and returns an exact existing write-tool call. This tool never writes, including after elicitation or confirmation.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoscan
detailNosummary
proposal_tokenNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
modeNo
limitsNo
candidatesNo
confirmationNo
index_repairNo
section_countNo
examined_pairsNo
schema_versionNo
candidate_countNo
elicitation_actionNo
deterministic_orderNo

TDQS

A4.6/5.0
Behavior5/5

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

The description disclosed that the tool never writes, even after elicitation or confirmation, which directly reinforces the readOnlyHint annotation and adds important context about the confirm mode's behavior. It also explains that scan mode returns deterministic candidates and read-only proposal tokens, and clarifies the difference between summary and full detail. These details go beyond what annotations provide.

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 two sentences, front-loads the usage condition, and packs essential information about modes, detail levels, and safety 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.

Completeness4/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 core behavior, modes, and read-only guarantee. Since an output schema exists, return values are not the description's responsibility. However, it could be slightly more complete by explicitly tying proposal_token to confirm mode, but this is a minor gap. Overall it is sufficient for an agent to use the tool 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?

With 0% schema description coverage, the description must compensate, and it does. It explains the 'mode' parameter (scan vs confirm), the 'detail' parameter (summary vs full), and implies the 'proposal_token' parameter through 'confirm mode validates one token.' However, it does not explicitly name the proposal_token parameter or state that it is required for confirm mode, leaving some inference to the reader.

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 scans for contradiction candidates between indexed sections that may conflict or refine each other. It distinguishes itself from sibling tools by describing its specific analytical purpose and the two modes (scan/confirm). The verb 'scan' and explicit resource 'contradiction candidates' make 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 Guidelines4/5

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

The description provides explicit usage context: 'Use this when indexed sections may conflict or refine one another.' It distinguishes between scan and confirm modes and explains when each is appropriate. However, it does not explicitly mention when not to use this tool or name alternative sibling tools, so it lacks explicit exclusions or alternatives.

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

create_note_aiCreate memory noteA

Call this proactively when a durable fact, confirmed decision, or user preference emerges in conversation - do not wait to be asked. Skip speculation and one-off chatter. Write a new typed _memory Markdown note. Use rejected entries in 'option -- reason' format to record discarded options so a future agent does not propose them again. This is a write operation: it is confined to DATACRON_WRITE_PATHS, never overwrites existing files, writes a durable operation record, and relies on the MCP client's tool approval for human-in-the-loop review.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyYes
tagsYes
titleYes
originYes
rejectedNo
rel_pathYes
confidenceYes
request_idNo
supersedesNo
expected_hashNo
last_verifiedNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
createdNo
indexedYes
rel_pathNo
replayedNo
committedNo
content_hashYes
operation_idNo

TDQS

A4.4/5.0
Behavior5/5

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

Adds substantial context beyond the annotations: confinement to DATACRON_WRITE_PATHS, the never-overwrite guarantee, the durable operation record, and reliance on MCP client approval for human-in-the-loop review. This gives an agent a full safety picture. The write claim is consistent with readOnlyHint=false and the non-destructive claim is consistent with destructiveHint=false.

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?

Four tightly packed sentences, each earning its place: proactive trigger, what to skip, what to write plus rejected-format rule, and safety behavior. The most decision-relevant information is front-loaded before the safety details.

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

Completeness4/5

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

The description fully covers the call decision (when, what, safety) for an 11-parameter operation, and the output schema covers return values so those need not be described. Minor gaps remain: no differentiation from append_journal as an alternative, and the optional metadata parameters (supersedes, expected_hash, last_verified, request_id) are unexplained — a small but real completeness cost for a tool this complex.

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?

With 0% schema description coverage across 11 parameters, the description must compensate heavily. It does clarify one parameter concretely — 'rejected entries in option -- reason format' — and 'typed _memory Markdown note' hints at title/rel_path/body. However, the other required parameters (tags, origin, confidence) and optional metadata fields (supersedes, expected_hash, last_verified, request_id) receive no semantic explanation, leaving meaningful gaps.

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

Purpose5/5

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

The description states a specific verb and resource — 'Write a new typed _memory Markdown note' — and gives the exact trigger conditions (durable fact, confirmed decision, user preference). It differentiates from the patch/update siblings by emphasizing 'new' and 'never overwrites existing files,' and from append_journal by the memory-note vs journal distinction.

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

Usage Guidelines4/5

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

Provides explicit when-to-use guidance ('Call this proactively when a durable fact, confirmed decision, or user preference emerges... do not wait to be asked') and clear exclusions ('Skip speculation and one-off chatter'). It stops short of naming sibling alternatives and stating when to choose them instead, so the alternative-routing dimension is not fully covered.

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

delete_note_sectionDelete note sectionA
Destructive

Use this only to remove an explicitly obsolete H2-H6 Markdown section and all of its subordinate headings. Prefer lifecycle invalidation with set_frontmatter when the fact must remain queryable. Pass the note's current content_hash as expected_hash for CAS. The operation stores exact prior history, writes atomically, and refuses every level-1 heading. For duplicate titles, pass 1-based heading_occurrence with heading_level and the exact expected_hash; the ordinal follows document order for those hashed bytes. Do not use chunk_id.

ParametersJSON Schema
NameRequiredDescriptionDefault
headingYes
rel_pathYes
request_idNo
expected_hashNo
heading_levelNo
heading_occurrenceNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
deletedNo
indexedYes
rel_pathNo
replayedNo
committedNo
content_hashYes
operation_idNo

TDQS

A4.9/5.0
Behavior5/5

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

The annotations already mark destructiveHint=true, and the description adds useful behavioral context: the operation stores exact prior history, writes atomically, refuses level-1 headings, and requires the current content_hash for CAS. This exceeds what annotations alone provide and aligns with the destructive hint.

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?

Four dense sentences, all earning their place and front-loaded with the core purpose. There is no filler or repetition of schema field titles; each sentence adds critical operational guidance.

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 destructive nature and six parameters, the description covers scope, exclusion of H1, concurrency control via CAS, duplicate resolution, atomicity, history preservation, and the alternative lifecycle-invalidation approach. The output schema exists, so return-value explanation is unnecessary. The tool is fully callable from this description alone.

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

Parameters4/5

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

Schema description coverage is 0%, so the description carries the burden. It explains expected_hash as the current content_hash for CAS, and clarifies heading_occurrence and heading_level for duplicate titles. However, rel_path and request_id are not explained in the description, and heading is only indirectly described as the section title. Strong compensation for the complex parameters, but not complete coverage of all six.

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

Purpose5/5

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

The description states a specific verb and resource: remove an H2-H6 Markdown section and all subordinate headings. It also differentiates from the sibling set_frontmatter by declaring when that alternative should be preferred instead. This is unambiguous and not a tautology.

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 says to use this only for obsolete sections, directs to set_frontmatter when the fact must remain queryable, and gives concrete guidance for CAS via expected_hash and duplicate title handling. This clearly tells an agent when to choose this tool over alternatives.

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

get_follow_upRead current follow-upA
Read-only

Read latest structured follow-up revisions in explicit canonical notes. Completed/cancelled records are hidden by default; history remains intact. Legacy prose is not parsed and source freshness is not revalidated. Use get_note for legacy notes and original evidence; absence is not proof that no commitments exist. Continue with next_offset and expected_snapshot=snapshot_hash, keeping note_paths and include_closed unchanged. Restart from offset 0 if sources change.

ParametersJSON Schema
NameRequiredDescriptionDefault
offsetNo
note_pathsYes
include_closedNo
expected_snapshotNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
totalNo
offsetNo
omittedNo
recordsNo
coverageNo
returnedNo
truncatedNo
next_offsetNo
legacy_notesNo
snapshot_hashNo

TDQS

A5/5.0
Behavior5/5

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

Beyond the readOnlyHint=true and destructiveHint=false annotations, the description discloses important behaviors: completed/cancelled records are hidden by default, history remains intact, legacy prose is not parsed, and source freshness is not revalidated. It also interprets the significance of an empty result, which is valuable for correct use. There is no contradiction with 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.

Conciseness5/5

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

Every sentence earns its place: the core action, default filtering and history guarantee, parsing/freshness limitations, sibling routing, and pagination rules. The description is compact even while covering substantial operational ground, and it front-loads the most important semantic.

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 that an output schema exists, the description need not restate return values. It covers what is read, what is hidden, what is not validated, what the absence of results means, how to paginate, and how to keep reads consistent via the snapshot token. A caller has enough behavioral context to invoke the tool correctly.

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 description coverage is 0%, so the description carries the full burden of explaining parameters. It operationally covers note_paths, include_closed, offset/next_offset, and expected_snapshot: 'keeping note_paths and include_closed unchanged,' 'Continue with next_offset and expected_snapshot=snapshot_hash,' and 'Restart from offset 0 if sources change.' This compensates completely for the schema's lack of parameter 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 a specific verb-resource pair: 'Read latest structured follow-up revisions in explicit canonical notes.' It also explicitly distinguishes itself from get_note, saying 'Use get_note for legacy notes and original evidence,' so an agent can tell this tool apart from a key sibling without guessing.

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 gives clear when-to-use guidance by naming get_note as the alternative for legacy notes and original evidence, and warns that absence is not proof that no commitments exist. It also provides explicit pagination instructions: continue with next_offset and expected_snapshot, keep note_paths and include_closed unchanged, and restart from offset 0 if sources change.

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

get_healthGet operational healthA
Read-only

Return truthful read-only health for index freshness, vault integrity, point-in-time checksum, durability capability, and invariant evidence. Use detail='full' to include bounded integrity findings. In full mode, limit <= 0 selects the server ceiling and positive limits are capped by settings.max_result_count. Fingerprints are opaque baseline identifiers derived from raw keys, not hashes of sanitized published keys. Only top-level violation rel_path and mixed_eol_notes entries preserve addressable paths; details such as candidate_paths are sanitized display metadata. Findings do not include line numbers.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
detailNosummary

Output Schema

ParametersJSON Schema
NameRequiredDescription
indexYes
statusYes
recoveryYes
scrubberYes
integrityYes
read_onlyYes
durabilityYes
invariantsYes
server_versionYes
vault_checksumYes

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already set readOnlyHint=true and destructiveHint=false, and the description reinforces this with 'truthful read-only.' It goes well beyond annotations by explaining sanitization behavior (fingerprints are opaque baseline identifiers derived from raw keys, not hashes of sanitized published keys), the addressability of rel_path and mixed_eol_notes entries, and that candidate_paths are sanitized display metadata. It also discloses that findings do not include line numbers. This is richly transparent about behavioral traits an agent must know before trusting the output.

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 sentence adds a distinct fact: truthful read-only health, the purpose of detail='full', limit semantics, fingerprint semantics, and path sanitization caveats. It is front-loaded with the core purpose and then layers the caveats. No filler or repetition.

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 tool has an output schema, so return values need not be described in the description. What remains is the behavioral context needed to call it correctly: what full mode does, how limits are capped, what the fingerprints mean, which paths are addressable, and that line numbers are absent. Given the safety profile already carried by annotations and the output schema, this description is complete.

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

Parameters3/5

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

Schema description coverage is 0%, so the description must compensate. The description does explain the effect of both parameters: detail='full' to include bounded integrity findings, and limit semantics (<=0 selects server ceiling, positive capped by settings.max_result_count). The limit semantics are only explained in the context of full mode, so summary-mode limit behavior is not explicitly stated. The description adds meaning beyond the bare schema but leaves a small gap.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Return truthful read-only health for index freshness, vault integrity, point-in-time checksum, durability capability, and invariant evidence.' This is not a tautology; it states exactly what the tool reports and even qualifies the response as truthful, echoing the readOnly annotation. It also distinguishes itself from siblings by being a health/read-only tool rather than a query, note-fetch, or mutation tool.

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

Usage Guidelines4/5

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

It clearly indicates when to use detail='full' vs the default summary mode: 'Use detail='full' to include bounded integrity findings.' It explains the limit semantics for full mode (limit <= 0 selects server ceiling; positive limits capped by settings.max_result_count). It doesn't explicitly say when not to use this tool vs alternatives, but the sibling list includes read-only tools like list_notes and get_note, and the health-specific scope implies when this is the right choice. There is no explicit exclusion of alternative tools, but the context is clear.

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

get_noteGet a noteA
Read-only

Fetch the full context behind a search hit before answering from a snippet alone. Fetch a single note by its ULID, indexed chunk_id, or vault-relative path. chunk_id inputs return format='chunk' with the sandbox-wrapped chunk body; a parent-hash mismatch returns an explicit stale-chunk error. Chunk reads ignore offset/limit. For note inputs, format='full' returns the sandbox-wrapped body and offset/limit page large notes by character range; format='map' returns the heading outline only (cheap to scan before requesting full content). heading_path selects exact rendered heading ancestry including its subtree; repeated paths require a 1-based heading_occurrence. Section reads require full format and a note input, include source line spans and the original note hash, and paginate relative to the redacted section.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
formatNofull
offsetNo
id_or_pathYes
heading_pathNo
heading_occurrenceNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
tagsNo
titleNo
formatNo
offsetNo
aliasesNo
contentNo
createdNo
note_idNo
sectionNo
updatedNo
chunk_idNo
headingsNo
line_endNo
rel_pathNo
truncatedNo
line_startNo
chunk_countNo
frontmatterNo
header_pathNo
next_offsetNo
total_charsNo
content_hashNo
limit_appliedNo
next_chunk_idNo
prev_chunk_idNo
returned_charsNo
estimated_tokensNo
note_content_hashNo
chunk_content_hashNo
content_hash_contractNo
returned_estimated_tokensNo

TDQS

A4.3/5.0
Behavior5/5

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

With annotations already declaring readOnly/no-destruction, the description goes well beyond them: chunk reads ignore offset/limit, a parent-hash mismatch yields an explicit stale-chunk error, section reads require full format and carry source line spans plus the original note hash, and pagination is relative to the redacted section. This is exactly the extra behavioral context annotations cannot convey.

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?

Purpose and the snippet-vs-full rationale are front-loaded, and most clauses carry distinct operational information rather than filler. The middle section is dense and clause-heavy, but little of it is genuinely redundant.

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 6-parameter fetch tool with an output schema and read-only annotations, the description covers input forms, format-selection trade-offs, edge-case errors, and format-specific constraints. Nothing an agent needs to invoke it correctly is missing.

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

Parameters4/5

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

Schema coverage is 0%, so the description carries the full burden and largely meets it: it explains the format enum (full/map/chunk), the offset/limit character-range paging, heading_path ancestry plus subtree, and the 1-based heading_occurrence needed for repeated paths. limit's unit of measure is only implied via the offset/limit pairing rather than stated outright, keeping it from a 5.

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

Purpose4/5

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

The opening states a specific verb and resource plus the three accepted identifier forms (ULID, indexed chunk_id, vault-relative path), so an agent knows exactly what it retrieves. It stops short of differentiating itself from siblings such as get_note_history or list_notes, so differentiation is left to inference.

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

Usage Guidelines4/5

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

"Fetch the full context behind a search hit before answering from a snippet alone" gives a clear context for use, and the format='map' note ('cheap to scan before requesting full content') offers a concrete workflow trigger. No sibling tool is named as an alternative and there is no explicit when-not-to-use, so it falls just short of 5.

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

get_note_historyGet note operation historyA
Read-only

Filter by request_id to retrieve an ordinary-write receipt. List committed operation metadata for one note without reading history content or modifying the journal.

ParametersJSON Schema
NameRequiredDescriptionDefault
noteYes
limitNo
request_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/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, lowering the burden on the description. The description usefully adds that it returns committed operation metadata, avoids reading history content, and does not modify the journal. No contradiction with 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.

Conciseness5/5

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

Two compact sentences with no filler. The most important filtering behavior is front-loaded, and every clause adds meaningful information.

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

Completeness4/5

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

The tool is simple, has an output schema, and annotations cover safety behavior. The description provides the core semantic context needed to call it correctly; the only notable gap is the undocumented limit parameter, which is optional and low-risk due to its default value.

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

Parameters3/5

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

Schema description coverage is 0%, so the description must compensate. It explains that request_id filters for an ordinary-write receipt and that the call is scoped to one note, but it does not explain the limit parameter or its behavior. This is partial compensation, not full.

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 and resource: 'List committed operation metadata for one note.' It also distinguishes itself from content-reading tools by adding 'without reading history content,' making the tool's 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 Guidelines4/5

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

The description clearly indicates when the tool is relevant ('Filter by request_id to retrieve an ordinary-write receipt') and states what it does not do ('without reading history content or modifying the journal'). It does not explicitly name sibling alternatives, but the usage context is easy to infer.

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

list_notesList notesA
Read-only

Use this to discover vault structure before deeper reads. Return an offset/limit paginated list of notes in the vault, optionally scoped to a subfolder and/or filtered by tags or top-level frontmatter (for example, frontmatter={'confidence': 'needs_verification'}). Each entry includes the stable ULID, title, tags, aliases, and timestamps.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagsNo
limitNo
folderNo
offsetNo
frontmatterNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
notesYes
totalYes
offsetYes
returnedYes
truncatedYes
next_offsetYes
limit_appliedYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare this as read-only and non-destructive. The description adds valuable behavioral context: pagination with offset/limit, optional scoping to a subfolder, filtering by tags or frontmatter, and the specific fields returned per entry. 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 two sentences with no waste. It front-loads the primary use case, then concisely lists the key features (pagination, filters, entry fields), earning every word.

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 output schema exists and annotations provide safety context, the description is complete for selection and invocation. It covers the use case, filter options, result contents, and pagination behavior, leaving no significant gaps for an agent.

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

Parameters3/5

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

Schema description coverage is 0%, so the description must compensate. It explains the meaning of tags, folder, frontmatter, and pagination, with a useful frontmatter example. However, limit and offset are only implied by 'paginated' and lack explicit semantic detail beyond what the schema's defaults suggest.

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 returns a paginated list of notes, with optional filters for subfolder, tags, and frontmatter. It uses a specific verb ('Return') and resource ('list of notes'), and distinguishes itself from siblings like get_note (deeper reads) by framing it as a discovery tool.

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

Usage Guidelines4/5

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

The first sentence explicitly instructs to use this tool for discovering vault structure before deeper reads, providing clear contextual guidance. It doesn't explicitly name alternatives or exclusions, but the contrast with 'deeper reads' implies when not to use it.

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

move_note_sectionMove a note sectionA
Destructive

Use this to preview an exact single-note H2-H6 subtree move to an existing heading's final child position. Both headings must exist; no releveling. Requires expected_hash. Default confirm=false returns selection coordinates and before/projected hashes without writing; confirm=true commits with durable history and index reconciliation. Preserves all text and frontmatter bytes; mixed EOLs, unsafe boundaries and invalid child hierarchy are refused. AST selectors support ATX/Setext and ignore fences. Duplicate titles require the respective level and 1-based occurrence. Use a stable request_id when committing for durable replay receipts.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNo
headingYes
rel_pathYes
request_idNo
expected_hashYes
heading_levelNo
destination_levelNo
heading_occurrenceNo
destination_headingYes
destination_occurrenceNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
indexedNo
rel_pathNo
replayedNo
committedNo
selectionNo
before_hashNo
content_hashNo
operation_idNo
projected_hashNo

TDQS

A4.5/5.0
Behavior5/5

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

Annotations declare mutation (readOnlyHint=false), destructiveness, and non-idempotency, and the description adds substantial context beyond them: preview returns selection coordinates and before/projected hashes without writing, confirm commits with durable history and index reconciliation, bytes/frontmatter are preserved, and mixed EOLs, unsafe boundaries, and invalid child hierarchy are refused. This is rich behavioral disclosure.

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

Conciseness4/5

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

Front-loaded with the core purpose, then flows into preview/commit behavior and constraints with little waste. It is dense and slightly packed, but nearly every sentence carries distinct information.

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

Completeness4/5

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

For a 10-parameter destructive mutation with an output schema present, the description covers preview vs commit, hashing, occurrence disambiguation, and refusal conditions. It omits what rel_path means and what happens on a hash mismatch, leaving minor gaps.

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

Parameters4/5

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

Schema description coverage is 0%, so the description must carry the load, and it does for most params: expected_hash is required, confirm defaults to false, request_id is for durable replay receipts, and heading_level/occurrence and destination_level/occurrence resolve duplicate titles with 1-based occurrence. Only rel_path is left unexplained, keeping it from a 5.

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

Purpose5/5

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

States a specific verb and resource with precise scope: 'preview an exact single-note H2-H6 subtree move to an existing heading's final child position.' This clearly distinguishes it from siblings like rename_note_section, delete_note_section, and patch_note_section without needing to open any schema.

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

Usage Guidelines4/5

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

Gives clear when-to-use context: default confirm=false for preview, confirm=true to commit, and request_id for durable replay when committing. It does not name sibling alternatives (e.g., patch_note_section vs this) or state exclusions, so it falls short of a 5.

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

patch_note_preamblePatch note preambleA
Destructive

Use this to replace or remove content strictly before the first Markdown heading recognized by the current write selector. Pass the note's exact expected_hash for CAS. Empty or whitespace-only new_content removes the preamble. The first heading and all following content preserve exact bytes when the file uses uniform line endings; mixed-EOL files follow the existing global dominant-EOL normalization. Notes without a recognized Markdown heading are refused fail-closed. The shared AST selector supports ATX and Setext headings, normalizes closing hashes, and ignores headings inside fenced code.

ParametersJSON Schema
NameRequiredDescriptionDefault
rel_pathYes
request_idNo
new_contentYes
expected_hashYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
indexedYes
patchedNo
rel_pathNo
replayedNo
committedNo
content_hashYes
operation_idNo

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the destructiveHint annotation, the description discloses exact mutation scope, CAS requirements, empty-content removal semantics, byte-preservation behavior under uniform vs mixed line endings, and fail-closed refusal for unheaded notes. It also explains the shared AST selector's edge-case behavior with ATX/Setext headings and fenced code. This is rich behavioral context that annotations alone cannot provide.

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: operation, CAS, removal semantics, EOL behavior, fail-closed behavior, and selector details. The main usage guidance is front-loaded, with edge cases following logically. There is no filler or repetition of schema 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?

Given the tool's complexity and the presence of an output schema, the description is complete. It covers what the tool does, how the heading selector behaves, when it refuses, how content removal works, and how byte preservation behaves across EOL styles. Nothing an agent needs to call this tool correctly is materially missing.

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

Parameters4/5

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

With 0% schema description coverage, the description compensates by explaining the key parameters: expected_hash must be the note's exact CAS value, and new_content can be empty or whitespace-only to remove the preamble. rel_path is not explicitly described, but its title 'Rel Path' makes its role clear. request_id is not explained, but it is optional and likely a standard correlation identifier, so this is a minor gap.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'replace or remove content strictly before the first Markdown heading.' This precisely defines the tool's scope and distinguishes it from siblings like patch_note_section, which target different structural regions. The operation is immediately understandable from the first sentence.

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

Usage Guidelines4/5

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

The description explicitly says 'Use this to...' and clearly defines when the tool applies: only to content before the first recognized Markdown heading. It also states that notes without such a heading are refused fail-closed, giving a hard boundary. It does not explicitly name alternatives or say when to prefer a sibling tool, which keeps it just short of a 5.

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

patch_note_sectionPatch note sectionA
Destructive

Use this to rewrite an outdated section in place when the topic already has a note. Replace the content under one existing Markdown heading. Pass the note's current content_hash as expected_hash for CAS. The operation preserves the heading line and non-target sections, stores exact prior history, and writes atomically. It refuses a level-1 heading that contains subsections; patch a lower-level heading instead. For duplicate titles, pass 1-based heading_occurrence with heading_level and the exact expected_hash; the ordinal follows document order for those hashed bytes. Do not use chunk_id.

ParametersJSON Schema
NameRequiredDescriptionDefault
headingYes
rel_pathYes
request_idNo
new_contentYes
expected_hashNo
heading_levelNo
heading_occurrenceNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
indexedYes
patchedNo
rel_pathNo
replayedNo
committedNo
content_hashYes
operation_idNo

TDQS

A4.2/5.0
Behavior5/5

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

Even though destructiveHint=true already signals mutation, the description goes further: it states the operation preserves the heading line and non-target sections, stores exact prior history, writes atomically, and enforces CAS via expected_hash. It also documents the duplicate-title ordinal behavior. No statement contradicts 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 explanation is dense and mostly front-loaded, with each sentence contributing operational detail. The 'Do not use chunk_id' sentence is out of place because that parameter does not appear in the schema, adding slight noise.

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

Completeness4/5

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

For a destructive, CAS-guarded patch operation this is close to complete: it covers target selection, duplicate resolution, atomicity, history, and a key refusal case. It does not state failure behavior when expected_hash mismatches or when expected_hash is omitted, but the output schema helps fill in return expectations.

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 no schema-level property descriptions, the description carries the burden and does explain the non-obvious parameters: expected_hash for CAS, and heading_level/heading_occurrence for duplicate titles. However, rel_path and request_id are left implicit, and it even mentions a chunk_id that is not present in the schema.

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

Purpose4/5

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

The description uses a specific verb and resource ('rewrite an outdated section in place', 'Replace the content under one existing Markdown heading'), so an agent knows what operation is performed. It does not explicitly name sibling tools such as patch_note_preamble or append_journal, so differentiation relies on the section/heading framing rather than an explicit contrast.

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

Usage Guidelines4/5

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

It gives a clear trigger ('when the topic already has a note') and a conditional instruction ('It refuses a level-1 heading that contains subsections; patch a lower-level heading instead'). It does not name alternative tools for creating a new note or patching the preamble, so exclusions are implicit rather than explicit.

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

prepare_follow_upPrepare sourced follow-upA
Read-only

Validate sourced actions, interactions, objectives and state revisions against live note IDs/hashes and exact source excerpts. Existing target history headings are required. Person targets require contextual identity confirmation; clarify homonyms first. Returns bounded append_journal plans, never writes. Validation is structural, not a truth verdict. Use stable record/revision IDs, then apply with existing writers and verify receipts. Schema constraints, repeated because some clients strip them: required: record_id, revision, kind, target_path, target_id, expected_hash, heading, source_path, source_hash, source_excerpt, summary; extra fields refused; at most 20 records per call, checked at runtime; record_id: pattern ^[A-Za-z0-9][A-Za-z0-9_.-]{0,127}$; revision: pattern ^[A-Za-z0-9][A-Za-z0-9_.-]{0,127}$; previous_revision: pattern ^[A-Za-z0-9][A-Za-z0-9_.-]{0,127}$, or null, default null; kind: one of action, interaction, decision, objective, project_state; target_path: 1 to 4000 characters; target_id: pattern ^[0-9A-HJKMNP-TV-Z]{26}$; expected_hash: pattern ^[0-9a-f]{64}$; heading: 1 to 256 characters; source_path: 1 to 4000 characters; source_hash: pattern ^[0-9a-f]{64}$; source_excerpt: 1 to 4000 characters; summary: 1 to 4000 characters; event_date: ISO date, or null, default null; owner: at most 256 characters, or null, default null; due_date: ISO date, or null, default null; status: one of unknown, proposed, open, in_progress, waiting, completed, cancelled, default "unknown"; identity_confirmed: boolean, default false; identity_basis: at most 1000 characters, or null, default null

ParametersJSON Schema
NameRequiredDescriptionDefault
recordsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
plansNo
statusNo
committedNo
validationNo
next_actionNo
writes_enabledNo
already_recordedNo

TDQS

A4/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 genuinely non-obvious traits: output is bounded append_journal plans rather than writes, validation is structural and 'not a truth verdict', and at most 20 records are checked at runtime. It does not cover auth/permission needs, but the behavioral profile is well beyond what the annotations supply.

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

Conciseness3/5

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

The first three sentences are tight and front-load purpose, prerequisites, and output behavior. The final mega-sentence dumping every pattern, enum, and default is a dense run-on, justified only by the stated client-stripping rationale; it inflates length without adding semantic value.

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

Completeness4/5

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

For a complex nested-record tool, the description covers prerequisites, validation semantics, runtime limits, and the apply-then-verify workflow, and an output schema exists so return values need not be explained. It is nearly complete, missing only feedback on failure modes or how validation errors are surfaced.

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

Parameters3/5

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

Schema description coverage is 0%, so the description must carry meaning; it does convey the conceptual role of target_id/expected_hash/source_hash/source_excerpt ('against live note IDs/hashes and exact source excerpts') and repeats the constraints clients may strip. However it mostly mirrors mechanical schema constraints rather than explaining fields like owner, status, event_date, or due_date semantics, leaving real gaps.

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

Purpose5/5

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

States a specific verb (validate/prepare) and resource (sourced follow-up records, i.e. actions, interactions, objectives, state revisions) with the exact validation basis (live note IDs/hashes and source excerpts). It also distinguishes itself from the writer siblings by noting it returns append_journal plans and never writes, so an agent can separate it from append_journal without opening a schema.

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

Usage Guidelines4/5

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

Gives a clear workflow ('Use stable record/revision IDs, then apply with existing writers and verify receipts') and prerequisites ('Existing target history headings are required', 'clarify homonyms first' for person targets). It stops short of naming the alternative writer explicitly or stating when NOT to use the tool, but the context is unambiguous.

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

rename_note_sectionRename note sectionA
Destructive

Use this only to rename an outdated H2-H6 Markdown section title recognized by the current write selector, without changing its level, content, or subordinate headings. Pass the note's current content_hash as expected_hash for CAS. It refuses H1 because frontmatter title synchronization is outside this tool and refuses collisions recognized by the same AST selector. ATX and Setext headings are supported; fenced-code headings are ignored. For duplicate titles, pass 1-based heading_occurrence with heading_level and the exact expected_hash; the ordinal follows document order for those hashed bytes. Do not use chunk_id.

ParametersJSON Schema
NameRequiredDescriptionDefault
headingYes
rel_pathYes
request_idNo
new_headingYes
expected_hashNo
heading_levelNo
heading_occurrenceNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
indexedYes
renamedNo
rel_pathNo
replayedNo
committedNo
content_hashYes
operation_idNo

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already flag destructive behavior, and the description adds substantial operational detail beyond that: CAS via expected_hash, refusal of H1 and collision headings, ATX/Setext support, fenced-code headings being ignored, and duplicate-ordering semantics. This gives an agent a realistic model of how the tool behaves at runtime.

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: scope, constraints, CAS, format handling, and duplicate behavior are all covered without repetition. The most important usage restriction is front-loaded, and the warning 'Do not use chunk_id' is a valuable, concise final sentence.

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 — 7 parameters, destructive write behavior, CAS, AST-dependent matching, and duplicate titles — the description is remarkably complete. It covers edge cases, format support, exclusions, and parameter semantics, and the presence of an output schema means return-value documentation is unnecessary.

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 0% schema description coverage, the description must compensate, and it does for the most important parameters: expected_hash is explained as CAS, and heading_level/heading_occurrence are explained for duplicate titles with document-order semantics. However, the required rel_path parameter is never mentioned, and request_id is also unaddressed, leaving minor but real gaps.

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 names a specific operation (rename), a specific resource (H2-H6 Markdown section title recognized by the write selector), and explicit scope constraints (no level/content/subordinate changes, H1 refusal). This clearly distinguishes it from siblings like patch_note_section, delete_note_section, and set_frontmatter.

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

Usage Guidelines4/5

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

It opens with 'Use this only to rename...', which establishes precise when-to-use guidance, and adds explicit exclusions: H1, collisions, fenced-code headings, and chunk_id usage. It does not name the alternative tool for H1 frontmatter changes, but the statement that frontmatter synchronization is 'outside this tool' makes the routing intent clear.

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

revert_noteRevert note to exact historyA
DestructiveIdempotent

Use this to undo a bad write by restoring exact prior bytes. Restore a note to exact content-addressed history bytes. Pass the current content_hash as expected_hash for CAS. The revert is itself durable, reversible, indexed, and operation-logged.

ParametersJSON Schema
NameRequiredDescriptionDefault
noteYes
to_hashYes
request_idNo
expected_hashNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
indexedYes
rel_pathNo
replayedNo
revertedNo
committedNo
content_hashYes
operation_idNo

TDQS

A4/5.0
Behavior4/5

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

Annotations already mark the tool as destructive and idempotent. The description adds valuable context by stating the revert is 'durable, reversible, indexed, and operation-logged,' and it explains the CAS expected_hash behavior. This goes beyond what annotations convey 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.

Conciseness5/5

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

Three dense sentences with no filler. Purpose is front-loaded ('undo a bad write'), followed by the mechanism and durability guarantees. Every sentence contributes essential information.

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

Completeness4/5

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

The description covers the primary use case, the key safety behavior (reversible, operation-logged), and the CAS parameter. With an output schema present and annotations providing the safety profile, this is mostly complete. It could mention how to obtain to_hash (e.g., via get_note_history), but this is a minor omission.

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

Parameters3/5

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

Schema description coverage is 0%, so the description must compensate. It explains expected_hash ('Pass the current content_hash as expected_hash for CAS') and implies to_hash is the content-addressed history target. However, the 'note' and 'request_id' parameters receive no explicit semantic guidance, leaving an incomplete picture of all four parameters.

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

Purpose4/5

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

The description clearly states the verb ('undo', 'restore') and resource ('note' / 'exact content-addressed history bytes'), making the tool's function obvious. It does not explicitly name or differentiate against sibling tools like patch_note_section or get_note_history, but the 'undo a bad write' framing is sufficiently distinct from normal edit operations.

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

Usage Guidelines4/5

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

The description gives an explicit trigger condition: 'Use this to undo a bad write by restoring exact prior bytes.' This tells an agent when the tool is appropriate. It does not mention alternatives or explicitly say when not to use it, so it falls short of a 5.

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

search_regexSearch regex (ripgrep)A
Read-only

Regex search via ripgrep. Returns ranked sandbox-wrapped match lines with term highlighting, resolved to indexed chunks. Restrict file scope with glob (e.g. '*.md'). Requires datacron index for chunk resolution. Without rg on PATH it falls back to scanning indexed chunk bodies, which is slower and sees only indexed content.

ParametersJSON Schema
NameRequiredDescriptionDefault
globNo
limitNo
patternYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, the description discloses the fallback to scanning indexed chunk bodies when rg is missing, notes the slower performance and limited visibility, and explains the dependency on 'datacron index'. This adds substantial behavioral context that annotations do not capture.

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 tight and front-loaded: it states the core function in the first sentence, then adds scope control, prerequisites, and fallback behavior in two more sentences. No redundant phrasing or filler.

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

Completeness4/5

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

Given an output schema exists, the return format is already documented. The description covers the glob parameter, the prerequisite index, and the fallback path. The only gap is the lack of explanation for the 'limit' parameter, which is minor but still leaves the agent guessing about its effect. Overall, it is nearly complete for a read-only search tool.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must explain all parameters. It explicitly explains glob ('Restrict file scope with glob') but does not mention 'limit' at all, and only implies 'pattern' as the regex. With three parameters, two of them (pattern and limit) lack explicit explanation, leaving the agent to infer 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 it is a regex search tool using ripgrep, returning ranked match lines with highlighting and chunk resolution. It is specific about the resource (regex search) and the mechanism (ripgrep), making it distinct from sibling search_text which likely handles plain-text search.

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

Usage Guidelines4/5

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

Provides clear usage context: how to restrict scope with glob (e.g., '*.md'), the prerequisite of 'datacron index' for chunk resolution, and a fallback behavior when rg is absent. However, it does not explicitly contrast with search_text or state when not to use it, so it stops short of a full when/when-not guidance.

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

search_textSearch text (BM25)A
Read-only

First stop for any question about the user's notes, projects, decisions, or past work - search before saying you do not know. Full-text BM25 search over the FTS5 index; note titles and heading trails carry extra weight. Returns ranked sandbox-wrapped snippets with term highlighting. Narrow the scope with folder, tags, or frontmatter (same semantics as list_notes); group_by_note=true keeps the best chunk per note. Requires datacron index to have been run first. By default, explicitly superseded notes are demoted; set include_superseded=true to inspect historical notes.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagsNo
limitNo
queryYes
folderNo
frontmatterNo
group_by_noteNo
include_supersededNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
queryNo
filtersNo
resultsNo
returnedNo
timings_msNo
index_repairNo
limit_appliedNo
grouped_by_noteNo
truncated_for_tokensNo

TDQS

A4.8/5.0
Behavior5/5

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

Rich behavioral disclosure beyond the read-only annotation: ranking by BM25, title/heading weighting, snippet format with **term** highlighting, grouping by note, default demotion of superseded notes, and the prerequisite index requirement. No contradiction with annotations; it complements the readOnlyHint/destructiveHint.

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?

Four dense sentences with the primary purpose front-loaded ('First stop...') followed by mechanism, return format, parameter semantics, and prerequisites. Every sentence adds operational value; no filler.

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 7-parameter search tool with an output schema, the description covers the behavior, scoping, grouping, superseded handling, and setup prerequisite. The output schema already exists, so return-value details don't need to be repeated. Only an explicit alternative-routing statement is absent, which is minor given the 'first stop' framing.

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

Parameters5/5

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

With 0% schema description coverage, the description compensates by explaining group_by_note, include_superseded, and scope-narrowing via folder/tags/frontmatter with shared list_notes semantics. It also contextualizes query as BM25 over FTS5. Only 'limit' is left to its schema default, which is low-risk and self-explanatory.

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

Purpose5/5

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

States a specific verb and resource: full-text BM25 search over the FTS5 index. Positions itself as the 'First stop' for questions about notes/projects/decisions/past work, and the BM25 versus regex mechanism differentiates it from search_regex in the sibling list. Also ties to list_notes semantics, reinforcing 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 Guidelines4/5

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

Clear when-to-use guidance: use this first for any question about the user's notes before saying you don't know. It gives prerequisites ('datacron index') and scoping options, but does not explicitly state when to prefer alternatives like search_regex or when not to use it. Thus a clear context with no explicit exclusions.

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

session_contextStart a memory sessionA
Read-only

Start memory-dependent work here. Return the versioned common discipline, effective write capability and bounded live notes. Optional subject finds ranked candidates without repairing the index. Coverage is explicit; candidates never establish a person's identity. Read next pages before relying on incomplete context.

ParametersJSON Schema
NameRequiredDescriptionDefault
domainNoall
subjectNo
max_tokensNo
note_pathsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
omittedNo
sourcesNo
contractNo
coverageNo
evidenceNo
identityNo
truncatedNo
unavailableNo
capabilitiesNo
index_repairedNo

TDQS

A4.1/5.0
Behavior5/5

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

The annotations already declare readOnlyHint=true and destructiveHint=false, and the description adds substantial behavioral detail beyond that: the response is versioned and bounded, subject search does not repair the index, coverage is explicit, candidates never establish identity, and incomplete context requires further reading. No contradiction between description and 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?

Three dense but purposeful sentences with the primary call to action front-loaded. Every sentence earns its place, and there is no repetition of information already present in the schema or annotations.

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

Completeness4/5

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

The description is largely complete for an agent selecting and invoking the tool: it provides the entry-point signal, optional subject behavior, identity limitation, and pagination warning. The presence of an output schema reduces the need to document return values, though note_paths and domain semantics remain underexplained.

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?

With 0% schema description coverage, the description must compensate. It clearly explains the subject parameter ('finds ranked candidates without repairing the index') and implies max_tokens/pagination via 'bounded live notes' and 'read next pages'. However, note_paths and domain receive no explicit semantic treatment, leaving a noticeable gap.

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

Purpose4/5

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

The description clearly states a specific action ('Return the versioned common discipline, effective write capability and bounded live notes') and positions the tool as the entry point for memory-dependent work. It does not explicitly distinguish itself from sibling tools, but the resource and behavior are concrete enough to avoid confusion with note/search operations.

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

Usage Guidelines4/5

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

'Start memory-dependent work here' gives a clear when-to-use signal, and the note about reading next pages before relying on incomplete context sets expectations for multi-page sessions. It does not name alternatives or state exclusions, but the context is strong enough to route an agent.

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

set_frontmatterSet lifecycle frontmatterA
Destructive

Use this when a fact's lifecycle changes: verified today, superseded by a newer note, or confidence raised or lowered. Prefer invalidating an outdated fact (invalid_at + invalidated_by) over deleting or rewriting it: history stays queryable. Use rejected entries in 'option -- reason' format to record discarded options so a future agent does not propose them again. Update frontmatter fields on an existing memory note. This write operation only changes origin, confidence, last_verified, supersedes, rejected, valid_from, invalid_at, invalidated_by, last_id, and the automatic updated timestamp. last_id requires expected_hash, accepts BL- plus at least four ASCII digits, and cannot decrease an existing valid counter. The Markdown body is preserved.

ParametersJSON Schema
NameRequiredDescriptionDefault
originNo
last_idNo
rejectedNo
rel_pathYes
confidenceNo
invalid_atNo
request_idNo
supersedesNo
valid_fromNo
expected_hashNo
last_verifiedNo
invalidated_byNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
indexedYes
updatedNo
rel_pathNo
replayedNo
committedNo
content_hashYes
operation_idNo

TDQS

A4.1/5.0
Behavior4/5

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

Annotations declare this is a destructive, non-read-only, non-idempotent write; the description adds value beyond that by naming exactly which fields are mutated, confirming the Markdown body is preserved, and specifying the last_id format/auth-like constraint (expected_hash required, BL- prefix, no decreasing counter). It does not, however, explain what deletion/destruction actually occurs, which is notable given destructiveHint=true.

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 lifecycle trigger is front-loaded before the operational details, and sentences are dense with substance. Slightly long, but each clause (invalidating over deleting, rejected format, field list, last_id rules) earns its place.

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

Completeness4/5

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

For a 12-parameter destructive write with an output schema (so return values need not be explained), the description covers the lifecycle model, conflict/invalidations semantics, and the highest-risk parameter constraint. It stops short of explaining how several optional fields interact, but the essential calling context is present.

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

Parameters3/5

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

Schema coverage is 0%, so the description must carry the load, and it does add real semantics for the tricky parameters: last_id format and its expected_hash dependency, and the rejected 'option -- reason' format. But the remaining ~9 parameters (origin, supersedes, confidence, valid_from, invalid_at, invalidated_by, last_verified, request_id, expected_hash) are only named, not explained. Partial compensation for a 0% coverage schema.

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

Purpose4/5

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

States a specific verb+resource ('Update frontmatter fields on an existing memory note') and enumerates the exact fields modified, distinguishing it from sibling note-mutation tools like patch_note_preamble and revert_note. It does not directly name alternatives, but the field enumeration makes scope 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?

Gives explicit trigger conditions ('when a fact's lifecycle changes: verified today, superseded by a newer note, or confidence raised or lowered') and a clear preference rule: prefer invalidating over deleting/rewriting, with a stated reason (history stays queryable). It also prescribes a format for the 'rejected' field. This is actionable when-to-use guidance.

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.1.10
    • Changedget_note4 fields changed
      • addedInput schema / properties / heading_occurrence
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Heading Occurrence"
        +}
      • addedInput schema / properties / heading_path
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Heading Path"
        +}
      • addedOutput schema / $defs / NoteSectionOutput
        Added value: +{
        +  "description": "Selected heading subtree; physical line bounds are inclusive and 1-based.",
        +  "properties": {
        +    "heading_occurrence": {
        +      "title": "Heading Occurrence",
        +      "type": "integer"
        +    },
        +    "heading_path": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "title": "Heading Path",
        +      "type": "array"
        +    },
        +    "line_end": {
        +      "title": "Line End",
        +      "type": "integer"
        +    },
        +    "line_start": {
        +      "title": "Line Start",
        +      "type": "integer"
        +    },
        +    "matching_headings": {
        +      "title": "Matching Headings",
        +      "type": "integer"
        +    }
        +  },
        +  "required": [
        +    "heading_path",
        +    "heading_occurrence",
        +    "matching_headings",
        +    "line_start",
        +    "line_end"
        +  ],
        +  "title": "NoteSectionOutput",
        +  "type": "object"
        +}
      • addedOutput schema / properties / section
        Added value: +{
        +  "anyOf": [
        +    {
        +      "$ref": "#/$defs/NoteSectionOutput"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
    • Addedmove_note_section
    • Changedset_frontmatter1 field changed
      • addedInput schema / properties / last_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Last Id"
        +}
  2. 2 tool updatesv0.1.6
    • Changedget_follow_up6 fields changed
      • addedInput schema / properties / expected_snapshot
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Expected Snapshot"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "title": "Offset",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / next_offset
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Next Offset"
        +}
      • addedOutput schema / properties / offset
        Added value: +{
        +  "default": null,
        +  "title": "Offset",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / snapshot_hash
        Added value: +{
        +  "default": null,
        +  "title": "Snapshot Hash",
        +  "type": "string"
        +}
      • addedOutput schema / properties / total
        Added value: +{
        +  "default": null,
        +  "title": "Total",
        +  "type": "integer"
        +}
    • Changedsearch_text8 fields changed
      • addedInput schema / properties / folder
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Folder"
        +}
      • addedInput schema / properties / frontmatter
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Frontmatter"
        +}
      • addedInput schema / properties / group_by_note
        Added value: +{
        +  "default": false,
        +  "title": "Group By Note",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / tags
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Tags"
        +}
      • addedOutput schema / $defs / SearchFiltersOutput
        Added value: +{
        +  "description": "Scope filters actually applied to one ``search_text`` call.",
        +  "properties": {
        +    "folder": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "title": "Folder"
        +    },
        +    "frontmatter": {
        +      "additionalProperties": {
        +        "type": "string"
        +      },
        +      "title": "Frontmatter",
        +      "type": "object"
        +    },
        +    "tags": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "title": "Tags",
        +      "type": "array"
        +    }
        +  },
        +  "title": "SearchFiltersOutput",
        +  "type": "object"
        +}
      • addedOutput schema / $defs / SearchResultOutput / properties / note_matches
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "title": "Note Matches"
        +}
      • addedOutput schema / properties / filters
        Added value: +{
        +  "anyOf": [
        +    {
        +      "$ref": "#/$defs/SearchFiltersOutput"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedOutput schema / properties / grouped_by_note
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Grouped By Note"
        +}
  3. 12 tool updatesv0.1.5
    • Changedappend_journal9 fields changed
      • addedInput schema / properties / request_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Request Id"
        +}
      • removedOutput schema / properties / appended / $ref
        Removed value: -"#/$defs/AppendedNoteOutput"
      • addedOutput schema / properties / appended / anyOf
        Added value: +[
        +  {
        +    "$ref": "#/$defs/AppendedNoteOutput"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedOutput schema / properties / appended / default
        Added value: +null
      • addedOutput schema / properties / committed
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Committed"
        +}
      • addedOutput schema / properties / operation_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Operation Id"
        +}
      • addedOutput schema / properties / rel_path
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Rel Path"
        +}
      • addedOutput schema / properties / replayed
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Replayed"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "appended",
        -  "content_hash",
        -  "indexed"
        -]New value: +[
        +  "content_hash",
        +  "indexed"
        +]
    • Changedcreate_note_ai9 fields changed
      • addedInput schema / properties / request_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Request Id"
        +}
      • addedOutput schema / properties / committed
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Committed"
        +}
      • removedOutput schema / properties / created / $ref
        Removed value: -"#/$defs/CreatedNoteOutput"
      • addedOutput schema / properties / created / anyOf
        Added value: +[
        +  {
        +    "$ref": "#/$defs/CreatedNoteOutput"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedOutput schema / properties / created / default
        Added value: +null
      • addedOutput schema / properties / operation_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Operation Id"
        +}
      • addedOutput schema / properties / rel_path
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Rel Path"
        +}
      • addedOutput schema / properties / replayed
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Replayed"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "created",
        -  "content_hash",
        -  "indexed"
        -]New value: +[
        +  "content_hash",
        +  "indexed"
        +]
    • Changeddelete_note_section9 fields changed
      • addedInput schema / properties / request_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Request Id"
        +}
      • addedOutput schema / properties / committed
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Committed"
        +}
      • removedOutput schema / properties / deleted / $ref
        Removed value: -"#/$defs/DeletedSectionOutput"
      • addedOutput schema / properties / deleted / anyOf
        Added value: +[
        +  {
        +    "$ref": "#/$defs/DeletedSectionOutput"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedOutput schema / properties / deleted / default
        Added value: +null
      • addedOutput schema / properties / operation_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Operation Id"
        +}
      • addedOutput schema / properties / rel_path
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Rel Path"
        +}
      • addedOutput schema / properties / replayed
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Replayed"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "deleted",
        -  "content_hash",
        -  "indexed"
        -]New value: +[
        +  "content_hash",
        +  "indexed"
        +]
    • Addedget_follow_up
    • Changedget_note_history1 field changed
      • addedInput schema / properties / request_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Request Id"
        +}
    • Changedpatch_note_preamble9 fields changed
      • addedInput schema / properties / request_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Request Id"
        +}
      • addedOutput schema / properties / committed
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Committed"
        +}
      • addedOutput schema / properties / operation_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Operation Id"
        +}
      • removedOutput schema / properties / patched / $ref
        Removed value: -"#/$defs/PatchedPreambleOutput"
      • addedOutput schema / properties / patched / anyOf
        Added value: +[
        +  {
        +    "$ref": "#/$defs/PatchedPreambleOutput"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedOutput schema / properties / patched / default
        Added value: +null
      • addedOutput schema / properties / rel_path
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Rel Path"
        +}
      • addedOutput schema / properties / replayed
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Replayed"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "patched",
        -  "content_hash",
        -  "indexed"
        -]New value: +[
        +  "content_hash",
        +  "indexed"
        +]
    • Changedpatch_note_section9 fields changed
      • addedInput schema / properties / request_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Request Id"
        +}
      • addedOutput schema / properties / committed
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Committed"
        +}
      • addedOutput schema / properties / operation_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Operation Id"
        +}
      • removedOutput schema / properties / patched / $ref
        Removed value: -"#/$defs/PatchedSectionOutput"
      • addedOutput schema / properties / patched / anyOf
        Added value: +[
        +  {
        +    "$ref": "#/$defs/PatchedSectionOutput"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedOutput schema / properties / patched / default
        Added value: +null
      • addedOutput schema / properties / rel_path
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Rel Path"
        +}
      • addedOutput schema / properties / replayed
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Replayed"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "patched",
        -  "content_hash",
        -  "indexed"
        -]New value: +[
        +  "content_hash",
        +  "indexed"
        +]
    • Addedprepare_follow_up
    • Changedrename_note_section9 fields changed
      • addedInput schema / properties / request_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Request Id"
        +}
      • addedOutput schema / properties / committed
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Committed"
        +}
      • addedOutput schema / properties / operation_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Operation Id"
        +}
      • addedOutput schema / properties / rel_path
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Rel Path"
        +}
      • removedOutput schema / properties / renamed / $ref
        Removed value: -"#/$defs/RenamedSectionOutput"
      • addedOutput schema / properties / renamed / anyOf
        Added value: +[
        +  {
        +    "$ref": "#/$defs/RenamedSectionOutput"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedOutput schema / properties / renamed / default
        Added value: +null
      • addedOutput schema / properties / replayed
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Replayed"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "renamed",
        -  "content_hash",
        -  "indexed"
        -]New value: +[
        +  "content_hash",
        +  "indexed"
        +]
    • Changedrevert_note9 fields changed
      • addedInput schema / properties / request_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Request Id"
        +}
      • addedOutput schema / properties / committed
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Committed"
        +}
      • addedOutput schema / properties / operation_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Operation Id"
        +}
      • addedOutput schema / properties / rel_path
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Rel Path"
        +}
      • addedOutput schema / properties / replayed
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Replayed"
        +}
      • removedOutput schema / properties / reverted / $ref
        Removed value: -"#/$defs/RevertedNoteOutput"
      • addedOutput schema / properties / reverted / anyOf
        Added value: +[
        +  {
        +    "$ref": "#/$defs/RevertedNoteOutput"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedOutput schema / properties / reverted / default
        Added value: +null
      • changedOutput schema / required
        Previous value: -[
        -  "reverted",
        -  "content_hash",
        -  "indexed"
        -]New value: +[
        +  "content_hash",
        +  "indexed"
        +]
    • Addedsession_context
    • Changedset_frontmatter9 fields changed
      • addedInput schema / properties / request_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Request Id"
        +}
      • addedOutput schema / properties / committed
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Committed"
        +}
      • addedOutput schema / properties / operation_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Operation Id"
        +}
      • addedOutput schema / properties / rel_path
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Rel Path"
        +}
      • addedOutput schema / properties / replayed
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Replayed"
        +}
      • removedOutput schema / properties / updated / $ref
        Removed value: -"#/$defs/UpdatedFrontmatterOutput"
      • addedOutput schema / properties / updated / anyOf
        Added value: +[
        +  {
        +    "$ref": "#/$defs/UpdatedFrontmatterOutput"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedOutput schema / properties / updated / default
        Added value: +null
      • changedOutput schema / required
        Previous value: -[
        -  "updated",
        -  "content_hash",
        -  "indexed"
        -]New value: +[
        +  "content_hash",
        +  "indexed"
        +]
  4. 5 tool updatesv0.1.3
    • Addeddelete_note_section
    • Changedget_health14 fields changed
      • addedInput schema / properties / detail
        Added value: +{
        +  "default": "summary",
        +  "enum": [
        +    "summary",
        +    "full"
        +  ],
        +  "title": "Detail",
        +  "type": "string"
        +}
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 0,
        +  "title": "Limit",
        +  "type": "integer"
        +}
      • addedOutput schema / $defs / HealthFindingsOutput
        Added value: +{
        +  "description": "Bounded detailed reliability findings.",
        +  "properties": {
        +    "flagged_paths": {
        +      "$ref": "#/$defs/HealthFlaggedPathsOutput"
        +    },
        +    "limit_applied": {
        +      "title": "Limit Applied",
        +      "type": "integer"
        +    },
        +    "returned": {
        +      "title": "Returned",
        +      "type": "integer"
        +    },
        +    "total": {
        +      "title": "Total",
        +      "type": "integer"
        +    },
        +    "truncated": {
        +      "title": "Truncated",
        +      "type": "boolean"
        +    },
        +    "violations": {
        +      "items": {
        +        "$ref": "#/$defs/HealthViolationOutput"
        +      },
        +      "title": "Violations",
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "violations",
        +    "flagged_paths",
        +    "total",
        +    "returned",
        +    "limit_applied",
        +    "truncated"
        +  ],
        +  "title": "HealthFindingsOutput",
        +  "type": "object"
        +}
      • addedOutput schema / $defs / HealthFlaggedPathsOutput
        Added value: +{
        +  "description": "Raw mixed-EOL paths and sanitized read, decode, or frontmatter error descriptions.",
        +  "properties": {
        +    "frontmatter_parse_errors": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "title": "Frontmatter Parse Errors",
        +      "type": "array"
        +    },
        +    "mixed_eol_notes": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "title": "Mixed Eol Notes",
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "mixed_eol_notes",
        +    "frontmatter_parse_errors"
        +  ],
        +  "title": "HealthFlaggedPathsOutput",
        +  "type": "object"
        +}
      • changedOutput schema / $defs / HealthIntegrityOutput / description
        Previous value: -"Vault integrity counters included in operational health."New value: +"Vault integrity counters and optional detailed findings."
      • addedOutput schema / $defs / HealthIntegrityOutput / properties / broken_wikilinks_misdirected
        Added value: +{
        +  "title": "Broken Wikilinks Misdirected",
        +  "type": "integer"
        +}
      • addedOutput schema / $defs / HealthIntegrityOutput / properties / detail
        Added value: +{
        +  "enum": [
        +    "summary",
        +    "full"
        +  ],
        +  "title": "Detail",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / HealthIntegrityOutput / properties / findings
        Added value: +{
        +  "$ref": "#/$defs/HealthFindingsOutput"
        +}
      • changedOutput schema / $defs / HealthIntegrityOutput / required
        Previous value: -[
        -  "notes_count",
        -  "id_mismatches",
        -  "broken_wikilinks",
        -  "mixed_eol_notes",
        -  "supersedes_cycles",
        -  "frontmatter_parse_errors"
        -]New value: +[
        +  "notes_count",
        +  "id_mismatches",
        +  "broken_wikilinks",
        +  "broken_wikilinks_misdirected",
        +  "mixed_eol_notes",
        +  "supersedes_cycles",
        +  "frontmatter_parse_errors",
        +  "detail"
        +]
      • addedOutput schema / $defs / HealthRecoveryOperationOutput
        Added value: +{
        +  "description": "Content-free evidence for one operation that requires explicit repair.",
        +  "properties": {
        +    "disk_hash": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "title": "Disk Hash"
        +    },
        +    "expected_after_hash": {
        +      "title": "Expected After Hash",
        +      "type": "string"
        +    },
        +    "expected_before_hash": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "title": "Expected Before Hash"
        +    },
        +    "operation_id": {
        +      "title": "Operation Id",
        +      "type": "string"
        +    },
        +    "reason": {
        +      "title": "Reason",
        +      "type": "string"
        +    },
        +    "rel_path": {
        +      "title": "Rel Path",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "operation_id",
        +    "rel_path",
        +    "reason",
        +    "expected_before_hash",
        +    "expected_after_hash",
        +    "disk_hash"
        +  ],
        +  "title": "HealthRecoveryOperationOutput",
        +  "type": "object"
        +}
      • addedOutput schema / $defs / HealthRecoveryOutput
        Added value: +{
        +  "description": "Bounded recovery evidence included in operational health.",
        +  "properties": {
        +    "blocked_operations": {
        +      "title": "Blocked Operations",
        +      "type": "integer"
        +    },
        +    "operations": {
        +      "items": {
        +        "$ref": "#/$defs/HealthRecoveryOperationOutput"
        +      },
        +      "title": "Operations",
        +      "type": "array"
        +    },
        +    "required": {
        +      "title": "Required",
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "required",
        +    "blocked_operations",
        +    "operations"
        +  ],
        +  "title": "HealthRecoveryOutput",
        +  "type": "object"
        +}
      • addedOutput schema / $defs / HealthViolationOutput
        Added value: +{
        +  "description": "One finding with an addressable path and an opaque baseline fingerprint.",
        +  "properties": {
        +    "classification": {
        +      "title": "Classification",
        +      "type": "string"
        +    },
        +    "details": {
        +      "additionalProperties": {
        +        "type": "string"
        +      },
        +      "title": "Details",
        +      "type": "object"
        +    },
        +    "fingerprint": {
        +      "title": "Fingerprint",
        +      "type": "string"
        +    },
        +    "key": {
        +      "title": "Key",
        +      "type": "string"
        +    },
        +    "kind": {
        +      "title": "Kind",
        +      "type": "string"
        +    },
        +    "rel_path": {
        +      "title": "Rel Path",
        +      "type": "string"
        +    },
        +    "target": {
        +      "title": "Target",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "kind",
        +    "key",
        +    "fingerprint",
        +    "rel_path"
        +  ],
        +  "title": "HealthViolationOutput",
        +  "type": "object"
        +}
      • addedOutput schema / properties / recovery
        Added value: +{
        +  "$ref": "#/$defs/HealthRecoveryOutput"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "status",
        -  "server_version",
        -  "read_only",
        -  "index",
        -  "integrity",
        -  "vault_checksum",
        -  "durability",
        -  "scrubber",
        -  "invariants"
        -]New value: +[
        +  "status",
        +  "server_version",
        +  "read_only",
        +  "index",
        +  "integrity",
        +  "vault_checksum",
        +  "durability",
        +  "recovery",
        +  "scrubber",
        +  "invariants"
        +]
    • Addedpatch_note_preamble
    • Changedpatch_note_section2 fields changed
      • addedInput schema / properties / heading_occurrence
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Heading Occurrence"
        +}
      • addedOutput schema / $defs / PatchedSectionOutput / properties / heading_occurrence
        Added value: +{
        +  "title": "Heading Occurrence",
        +  "type": "integer"
        +}
    • Addedrename_note_section
  5. 14 tool updatesv0.1.0
    • First observedappend_journal
    • First observedaudit_query
    • First observedcontradiction_scan
    • First observedcreate_note_ai
    • First observedget_backlinks
    • First observedget_health
    • First observedget_note
    • First observedget_note_history
    • First observedlist_notes
    • First observedpatch_note_section
    • First observedrevert_note
    • First observedsearch_regex
    • First observedsearch_text
    • First observedset_frontmatter

TDQS

A4.1/5.0

Scored across 21 tools

Disambiguation4/5

Most tools target clearly distinct operations (search vs regex, distinct section verbs move/rename/delete/patch), and the verbose descriptions clarify boundaries. However, get_note_history and audit_query both read committed operation metadata and overlap substantially (the former is essentially a single-note filter of the latter), and create_note_ai vs append_journal requires judgment about when to create new versus extend.

Naming Consistency4/5

Names are uniformly snake_case and predominantly verb-first (get_, set_, move_, prepare_, list_, search_, create_, append_, patch_, rename_, delete_, revert_). A few are noun-first (contradiction_scan, session_context, audit_query), which is a minor deviation but still readable and consistent in casing.

Tool Count3/5

21 tools is on the heavy side for what is fundamentally a notes/memory server. The section-level variants (move/rename/delete/patch_section/patch_preamble) plus overlapping metadata readers inflate the surface, though each does target a distinct operation.

Completeness5/5

The surface covers the full note lifecycle: discovery (list/search/get/backlinks), creation (create_note_ai/append_journal), frontmatter lifecycle, precise section editing, deletion, revert from content-addressed history, plus history, audit, health, and follow-up tracking. No obvious dead ends for the stated vault-memory purpose.

Maintenance

ActivityNo data
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers