Skip to main content
Glama

Datacron

Serveur MCP local pour interroger et maintenir un vault Markdown depuis Claude, Codex, Gemini ou un autre client MCP stdio, sans envoyer tout le vault dans le contexte.

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

Français | English

À quoi sert Datacron ?

Retrouver le contexte d'un projet, préparer un échange et garder la trace des engagements : Datacron donne à ton assistant accès à une mémoire durable, lisible et modifiable en Markdown. Les notes restent utilisables indépendamment du client choisi.

Besoin

Exemple de demande à ton assistant

Reprendre un projet

« Où en étions-nous ? Retrouve les décisions et les prochaines actions. »

Préparer une réunion

« Résume nos derniers échanges et les points encore ouverts, avec leurs sources. »

Retrouver une personne

« Qui est cette personne, dans quel contexte l'ai-je rencontrée et que devons-nous suivre ? »

Suivre des objectifs

« Retrouve les engagements et les réalisations utiles à mon prochain entretien. »

Garder une trace fiable

« Enregistre cette décision, rattache-la au projet et vérifie qu'elle est sauvegardée. »

L'assistant orchestre ces demandes avec les outils disponibles et les droits accordés. Le protocole commun guide la lecture, l'enrichissement des fiches personnes et la vérification des écritures. Une identité ambiguë demande clarification ; une échéance enregistrée ne programme pas de rappel. Découvrir le suivi quotidien.

Commencer : installer · première session · guide utilisateur · référence MCP · vie privée.

Related MCP server: markdown-vault-mcp

Installation

Windows : installeur en un double-clic

Le plus simple sous Windows : télécharge Datacron-Setup.exe depuis la dernière Release, double-clique, et choisis ton vault. Aucun Python, aucun terminal, aucun droit administrateur ; Datacron s'enregistre automatiquement dans tes clients IA. Guide détaillé : Installation sous Windows.

Python : depuis PyPI

python -m pip install datacron
datacron setup

Depuis les sources

Depuis un clone du repo :

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

Ou, pour installer seulement l'application :

python -m pip install -e .

Prérequis runtime :

  • Python 3.11+

  • ripgrep disponible dans le PATH pour search_regex

  • un dossier de notes Markdown

  • un client MCP stdio pris en charge, par exemple Claude Desktop, Codex CLI ou Gemini CLI

Première session

  1. Choisis ton dossier de notes avec l'installeur ou datacron setup.

  2. Reconnecte Datacron dans ton client MCP pour charger les outils et les instructions.

  3. Demande : « Retrouve les notes de mon projet et résume son état avec les sources. »

Pour les sessions de mémoire, session_context fournit un contexte borné et le protocole commun. prepare_follow_up prépare les mises à jour sourcées ; les outils d'écriture les appliquent selon les permissions. get_follow_up retrouve les dernières révisions structurées. Les anciennes notes en prose restent à consulter ; elles ne sont pas converties automatiquement.

Le serveur travaille localement. Ton client peut transmettre les extraits retournés à son fournisseur de modèle : voir vie privée et sécurité.

Démarrage rapide

Le plus simple - une commande détecte tes clients IA, initialise le vault, l'indexe et enregistre Datacron partout :

datacron setup            # interactif ; ajoute --yes pour tout par défaut

Voir le guide d'installation pour les options (--client, --scope, écriture, durabilité). Ou étape par étape :

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

La sous-commande mcp install ci-dessus est dédiée à Claude Desktop. Pour Codex CLI, Gemini CLI, Antigravity, LM Studio, Cursor et les autres clients, utilise le setup multi-client avec datacron setup --client <identifiant> ou l'auto-détection avec --client all.

Ajouter Datacron à LM Studio

LM Studio 0.3.17+ possède une configuration utilisateur unique et aucun scope projet. La commande recommandée est :

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

Pour une installation Python où datacron-mcp est dans le PATH, la configuration équivalente en lecture seule peut aussi être importée avec ce deeplink officiel :

Add to LM Studio

Le lien importe cet exemple. Ouvre l'éditeur MCP de LM Studio et remplace les deux placeholders <YOUR_VAULT> avant de démarrer le serveur :

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

L'exemple n'active pas les outils d'écriture. Le setup CLI est plus sûr pour les installations packagées, car il écrit automatiquement le vrai chemin de l'exécutable.

Redémarre le ou les clients configurés après l'installation.

Pour lancer le serveur manuellement :

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

L'entrée script directe utilisée par l'installateur est aussi disponible :

datacron-mcp

datacron-mcp lit le vault depuis DATACRON_VAULT_ROOT.

Configuration

datacron init crée .datacron/VAULT.yaml. Ce fichier peut porter la configuration vault-local, notamment la query-expansion :

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

Variables d'environnement utiles :

Variable

Défaut

Rôle

DATACRON_VAULT_ROOT

non définie

fallback après --vault ; le répertoire courant n'est accepté que s'il contient .datacron/VAULT.yaml

DATACRON_READ_PATHS

vide

allowlist de lecture ; le setup des clients la fixe au vault

DATACRON_WRITE_PATHS

vide

allowlist d'écriture ; vide = write tools désactivés

DATACRON_MAX_RESULT_COUNT

20

nombre max de résultats retournés

DATACRON_MAX_RESULT_TOKENS

8000

budget token des résultats de recherche

DATACRON_REPAIR_MIN_INTERVAL_SECONDS

30

intervalle minimal entre les sweeps repair-on-read ; 0 = chaque lecture

DATACRON_GET_NOTE_MAX_TOKENS

25000

budget de get_note(format="full")

DATACRON_CHUNK_MAX_TOKENS

1024

taille cible max des chunks

DATACRON_RIPGREP_PATH

rg

binaire ripgrep

Les listes de chemins utilisent le séparateur de l'OS (: sous Unix, ; sous Windows).

Écriture

Les writes sont volontairement OFF par défaut. Sans DATACRON_WRITE_PATHS, les tools d'écriture renvoient une erreur claire et ne créent aucun fichier.

Pour activer l'écriture sur un sous-dossier précis :

$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 peut aussi poser l'allowlist au niveau du poste (variable d'environnement utilisateur, opt-in) pour que tous les clients MCP en héritent ; défaut : _memory, _drafts, _journal. Voir le guide d'installation.

Tools d'écriture disponibles :

  • create_note_ai : crée une note Markdown typée, sans overwrite.

  • append_journal : ajoute une entrée sous un heading d'une note existante.

  • set_frontmatter : met à jour les champs de cycle de vie et la liste rejected (options écartées) sans modifier le corps Markdown.

  • patch_note_preamble : remplace ou supprime le préambule Markdown avant le premier titre Markdown reconnu (ATX ou Setext), avec contrôle CAS obligatoire.

  • patch_note_section : remplace le contenu sous un heading existant avec contrôle CAS.

  • delete_note_section : supprime explicitement une section H2-H6 (ATX ou Setext) et son sous-arbre.

  • rename_note_section : renomme uniquement le titre d'une section H2-H6 (ATX ou Setext).

  • revert_note : restaure les octets exacts d'une version conservée dans l'historique.

  • apply_organization_manifest : valide puis applique un bundle local adressé par contenu, après confirmation liée au pré-état exact admis de l'organisation.

Garanties :

  • confinement strict des notes dans DATACRON_WRITE_PATHS ; les sources et cibles notes d'un batch d'organisation doivent aussi rester dans le organization.scope live inchangé et passer la politique live d'admission des notes, exclusions comprises

  • deux cibles internes sous CAS exact pour un batch d'organisation : .datacron/VAULT.yaml, seulement pour modifier le mapping top-level organization sans changer organization.scope, et .datacron/ulids.json, seulement quand Datacron dérive la migration de clé imposée par un move_replace_exact

  • overwrite atomique via fichier temporaire + os.replace

  • historique adressé par contenu avant modification d'une note existante

  • reconcile() synchrone après un write normal ; la disponibilité immédiate dans la recherche n'est garantie que si cette réconciliation réussit

  • audit log local

  • pour un manifeste d'organisation : transaction récupérable après crash et remplacement atomique de chaque fichier ; la visibilité simultanée de plusieurs chemins n'est pas garantie

Le mode concurrent multi-machines n'est pas supporté pour les écritures : garde une règle single-writer sur le vault.

Pour apply_organization_manifest, arrête aussi les autres clients et serveurs Datacron pendant la fenêtre de maintenance. Avant l'application, conserve hors du vault une sauvegarde exacte aux octets et vérifiée des notes affectées et du répertoire .datacron complet jusqu'à ce que tous les contrôles post-commit soient verts. Appelle d'abord mode="validate", contrôle les hashes bornés retournés, puis réutilise l'exact confirmation_token avec mode="apply". Le token lie le manifeste et ses payloads, toutes les notes Markdown admises dans organization.scope, la configuration exacte du vault et les sidecars d'identité, ainsi que le rapport projeté. Il ne lie délibérément pas les octets de notes sans rapport situées hors de organization.scope. Toute modification d'un composant authentifié invalide la confirmation avant mutation. history_mode=full est requis dès la validation. Si Datacron dérive un nettoyage de collisions de casse du sidecar, contrôle aussi identity_sidecar_case_canonicalization_count et son SHA-256 content-free avant d'appliquer ; ces deux preuves sont liées au token et conservées dans le reçu durable. Une source existante de replace_exact ou move_replace_exact doit porter son id dans le frontmatter ; une identité disponible uniquement dans le sidecar n'est pas prise en charge par ce schéma v1. Si le batch a déjà atteint son commit durable mais que la réconciliation ou l'oracle planner échoue, la réponse le dit explicitement (committed_index_incomplete ou committed_report_mismatch) et le même appel peut être rejoué avec le même token. Un blocage de batch d'organisation est rapporté par datacron ops inspect avec une raison pending_batch_ et les deux réparations limitées à une note indisponibles ; applique alors le rollback hors ligne complet du guide de santé opérationnelle, sans réparer ni isoler un seul membre.

Fonctions disponibles

Datacron indexe un dossier de notes Markdown, expose un serveur MCP local, puis renvoie au client les notes ou chunks pertinents au lieu d'un dump complet. Le vault reste un dossier Markdown normal : Datacron ajoute seulement un sidecar .datacron/ pour l'index, les logs, les ULID internes, l'historique et le journal d'opérations.

Surface

État actuel

Lecture vault

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

Recherche

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

Graphe local

Wikilinks et backlinks via get_backlinks

Écriture

8 tools de note + 1 lot d'organisation, confinés et journalisés, désactivés par défaut sans DATACRON_WRITE_PATHS

Transport MCP

SDK Python MCP v2 via MCPServer, stdio local uniquement ; protocole moderne 2026-07-28 et compatibilité legacy 2025-11-25, sans listener HTTP

Index

datacron index incrémental, datacron reindex complet, réparation conditionnelle à la lecture

Organisation

Bloc organization facultatif dans VAULT.yaml ; datacron reorganize --dry-run mesure l'écart en lecture seule, apply_organization_manifest applique

Évaluation

datacron eval sur le pipeline MCP réel : recall@k, MRR, nDCG, fraîcheur, latence et payload tokens

Setup guidé

datacron setup : init + index + enregistrement MCP en une commande

Clients

Auto-détection et enregistrement via datacron setup --client all : Claude Desktop, Claude Code, Cursor, Gemini CLI, Antigravity, LM Studio, Codex CLI, Windsurf, VS Code

Mémoire quotidienne

session_context, prepare_follow_up, get_follow_up : contexte borné, suivis sourcés et états structurés

Protocole mémoire

Contrat commun versionné pour le serveur et les clients ; protocol status vérifie sa distribution, pas le comportement du modèle

Distribution

Installeur Windows (Datacron-Setup.exe), exécutable autonome (PyInstaller) sans Python requis, ou installation depuis les sources

MCP Tools

Lecture

Tool

Description

session_context

Contexte initial borné et protocole commun versionné.

prepare_follow_up

Prépare les suivis sourcés sans écrire.

get_follow_up

Dernières révisions des suivis structurés.

list_notes

retourne une liste paginée, filtrable par dossier, tags et paires frontmatter clé/valeur, avec ULID, titre, tags, alias et dates

get_note

lit une note par ULID, chunk id ou chemin relatif, en contenu paginé, chunk ou plan de headings

search_text

effectue une recherche BM25 sur l'index FTS5 avec snippets classés et notes obsolètes démotées par défaut

search_regex

effectue une recherche regex via ripgrep et résout les lignes trouvées vers les chunks indexés

get_backlinks

retourne les chunks dont les wikilinks ciblent un ULID ou un alias résolu

Écriture

Tool

Description

create_note_ai

crée une nouvelle note _memory typée, confinée aux chemins autorisés, sans overwrite et avec journal durable

append_journal

ajoute une entrée Markdown sous un heading, avec confinement, historique exact et écriture atomique

set_frontmatter

modifie uniquement les champs de cycle de vie, la liste rejected et la date updated, en préservant le corps Markdown

patch_note_preamble

remplace ou supprime le préambule avant le premier titre Markdown reconnu (ATX ou Setext), avec CAS obligatoire et préservation du suffixe

patch_note_section

remplace le contenu d'un heading existant avec CAS, historique exact et préservation des autres sections

delete_note_section

supprime explicitement une section H2-H6 (ATX ou Setext) et son sous-arbre, avec CAS optionnel et historique exact

rename_note_section

renomme le titre d'une section H2-H6 (ATX ou Setext) sans modifier son contenu ni son sous-arbre

revert_note

restaure une note depuis son historique adressé par contenu ; l'opération reste durable, réversible et auditée

apply_organization_manifest

valide un bundle local content-addressed contenant au moins une opération exacte sur une note et/ou un remplacement exact de la configuration organization, puis applique ses membres déclarés et, si nécessaire, la migration dérivée du sidecar ULID sous CAS ; l'application est journalisée et récupérable après crash

Opérationnel

Tool

Description

get_health

retourne l'état réel de fraîcheur de l'index, d'intégrité, de checksum, de durabilité et des invariants

get_note_history

liste les métadonnées d'opérations validées d'une note sans lire le contenu historique ni modifier le journal

audit_query

interroge les métadonnées d'opérations par période, tool ou note sans modifier le journal ni le vault

Advisory (expérimental)

Tool

Description

contradiction_scan

scan live, déterministe et borné des contradictions/raffinements entre sections ; propose puis confirme en lecture seule un appel CAS explicite, sans jamais écrire automatiquement

Resources MCP :

  • datacron://vault/map

  • datacron://vault/info

  • datacron://policy/active

Recherche

search_text combine plusieurs signaux :

  • FTS5/BM25 pour le score lexical de base

  • query-expansion FR↔EN configurée dans VAULT.yaml

  • re-rank temporel conservateur :

    • une note citée dans le supersedes d'une autre est fortement démotée

    • confidence: low et confidence: needs_verification appliquent une pénalité légère

    • include_superseded=true permet de remonter les notes historiques

search_regex reste littéral : il n'applique ni query-expansion ni re-rank temporel.

Ces mesures portent sur un jeu de 19 questions et une configuration précise. Elles ne constituent pas un benchmark de la version courante ni une garantie sur un autre vault.

Mesure locale du pipeline tool/impl réellement reçu par l'agent, 19 questions, configuration 8k tokens / 20 résultats, 17 juillet 2026 :

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

Sur ce jeu historique, le recall@5 du tool atteignait celui du store BM25. Pour mesurer le comportement sur tes propres notes, utilise datacron eval et un jeu de questions adapté.

Vie privée et sécurité

  • Datacron ne fait pas de télémétrie.

  • Datacron n'appelle pas de LLM cloud.

  • Le client MCP, par exemple Claude, Codex ou Gemini, peut envoyer à son fournisseur les chunks que Datacron lui retourne. Datacron ne lui envoie pas le vault complet.

  • Le contenu retourné aux clients est enveloppé dans <vault_content>...</vault_content>.

  • Les résultats sont bornés par nombre et par budget token.

  • Les accès filesystem sont confinés par DATACRON_READ_PATHS et DATACRON_WRITE_PATHS.

  • Les opérations MCP sont auditées dans les logs locaux.

Commandes CLI

datacron setup                      # parcours guidé : init + index + config client
datacron setup --yes                # tout par défaut, sans question
datacron setup --client all --scope both --vault /path/to/vault
datacron setup --protocol           # installe aussi les règles mémoire des clients
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          # mesure l'organisation, lecture seule
datacron reorganize --vault /path/to/vault --dry-run --json   # rapport machine stable
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  # dédié Claude Desktop
datacron unregister --client all --scope both --vault /path/to/vault
datacron protocol uninstall --client all

Limites actuelles

  • Recherche lexicale : pas de recherche vectorielle ni d’embeddings.

  • Pas d'agent autonome : le client MCP orchestre.

  • Pas de GUI.

  • Pas de writes concurrents multi-machines.

  • La détection des clients par datacron setup est best-effort (présence d'un dossier de config ou d'un binaire sur le PATH) ; une installation dans un emplacement non standard peut être manquée et se configure alors à la main.

Documentation

Sommaire complet : docs/fr/index.md | English index.

Pour démarrer :

Références techniques :

Développement

La CI exécute les invariants et toute la suite de régression sur Linux/Python 3.12 pour les changements limités aux README, au CHANGELOG et aux pages Markdown de docs/fr/ ou docs/en/. Tout autre changement conserve les six combinaisons Linux/Windows et Python 3.11–3.13. Les publications imposent la matrice complète ; un diff vide ou invérifiable aussi. ShellCheck, l’audit des dépendances et le contrôle obligatoire Quality gate restent actifs dans les deux parcours. La première poussée d’une nouvelle branche utilise également la matrice complète, faute de point de comparaison précédent.

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

Licence

Copyright 2026 Julien Bombled.

Licensed under the Apache License, Version 2.0.

Écritures fiables et contrôles qualité

Available Tools

20 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
note_pathsYes
include_closedNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
omittedNo
recordsNo
coverageNo
returnedNo
truncatedNo
legacy_notesNo

TDQS

A4.9/5.0
Behavior5/5

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

The description adds significant behavior beyond the readOnly/destructive annotations: closed records are hidden by default, history remains intact, legacy prose is not parsed, and source freshness is not revalidated. No annotation is contradicted; the openWorldHint=false applies within the canonical-note scope, while the caveat warns about commitments outside that scope.

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 the purpose first, followed by behavioral limits and routing guidance. Every clause contributes useful information with 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?

With an output schema present, return-value description is unnecessary. The definition covers scope, default filtering, hidden history, legacy parsing limits, freshness, and the correct sibling for alternative use, making it fully actionable.

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 parameter context. 'Explicit canonical notes' defines what note_paths should reference, and 'Completed/cancelled records are hidden by default' matches include_closed's default. It does not name the parameters, but their names are self-explanatory and the semantics are reasonably covered.

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 precise verb and resource: 'Read latest structured follow-up revisions in explicit canonical notes.' It also distinguishes the tool from get_note, which handles legacy notes and original evidence, so an agent can select it correctly without opening sibling schemas.

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 defines when to use the tool (structured follow-ups in canonical notes) and when not to ('Use get_note for legacy notes and original evidence'). The caveat that absence is not proof adds a clear decision rule against over-interpreting empty results.

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
formatNofull
offsetNo
id_or_pathYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
tagsNo
titleNo
formatNo
offsetNo
aliasesNo
contentNo
createdNo
note_idNo
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.8/5.0
Behavior5/5

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

Annotations already mark this as read-only (readOnlyHint=true), but the description adds substantial behavioral detail: chunk_id returns format='chunk' with sandbox-wrapped body, parent-hash mismatch returns a stale-chunk error, chunk reads ignore offset/limit, and format='full' paginates by character range. This goes far beyond 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?

The description is dense but well-structured: purpose, id forms, chunk behavior, then full/map behavior. Every sentence earns its place, and semicolons keep related ideas together. It is appropriately sized for the tool's complexity.

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 covers all necessary aspects: input types, format behaviors, pagination, and error conditions. It leaves no ambiguity about what to expect, making it complete for effective tool use.

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%, but the description compensates fully. It explains the meaning of id_or_path (ULID, chunk_id, path), the format enum values (full, map, chunk), and clarifies that offset/limit page by character range in full format and are ignored for chunk reads. This adds significant meaning beyond the raw schema.

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

Purpose5/5

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

The description clearly states the tool's function: 'Fetch the full context behind a search hit' and 'Fetch a single note by its ULID, indexed chunk_id, or vault-relative path.' This is a specific verb+resource that distinguishes it from siblings like search_text or get_note_history.

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 opening sentence gives clear usage context: use this before answering from a snippet alone. It also provides guidance within the tool, such as using format='map' as a 'cheap to scan' option. However, it does not explicitly name sibling alternatives or state when not to use this tool, so it misses the full 'when/when-not' explicit guidance.

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.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
recordsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
plansNo
statusNo
committedNo
validationNo
next_actionNo
writes_enabledNo
already_recordedNo

TDQS

A4.5/5.0
Behavior5/5

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

Beyond the readOnlyHint and destructiveHint annotations, the description adds important behavioral context: validation is structural, not a truth verdict; existing headings are required; person targets require identity confirmation; and results are bounded plans, not writes. This gives the agent a genuinely accurate mental model.

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?

Five dense sentences, each adding real value: scope, prerequisites, identity caveat, non-writing behavior, and follow-up workflow. Information is front-loaded and there is 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?

Given the output schema exists and annotations cover the read-only safety profile, the description is complete enough for safe and correct invocation. It covers preconditions, identity handling, output type, and post-invocation steps like verifying receipts.

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 does provide key conceptual guidance: use stable record/revision IDs, compare against live hashes and exact source excerpts, and confirm identity for person targets. However, it does not meaningfully explain the richer nested fields like status, due_date, event_date, or previous_revision, leaving some semantics to the schema.

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

Purpose5/5

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

The description names a specific verb ('Validate') and a specific resource ('sourced actions, interactions, objectives and state revisions') and makes the output explicit: 'Returns bounded append_journal plans, never writes.' This clearly distinguishes it from writer tools like append_journal and readers like get_follow_up.

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 clear preconditions: existing target history headings are required, person targets need identity confirmation, and homonyms should be clarified first. It also states when not to use it ('never writes') and instructs to apply generated plans with existing writers, though it does not name the specific sibling tools to use.

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 rg on PATH and datacron index for chunk resolution.

ParametersJSON Schema
NameRequiredDescriptionDefault
globNo
limitNo
patternYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and destructiveHint, so the safety profile is known. The description adds valuable behavioral context: output is ranked, sandbox-wrapped, highlighted, resolved to indexed chunks, and depends on external binaries. It does not mention pagination or limit behavior, but the output schema exists to cover return details.

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 concise sentences front-load the core purpose and then add essential details. Every phrase earns its place—output format, scoping, and prerequisites—without redundancy.

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

Completeness5/5

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

Given the presence of an output schema and read-only annotations, the description covers purpose, output characteristics, glob scoping, and external dependencies. It is sufficiently complete for an agent to correctly invoke and interpret results. The only minor gap is limit semantics, but the schema default mitigates that.

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

Parameters3/5

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

Schema description coverage is 0%, so the description must compensate. It explains glob ('Restrict file scope') and pattern implicitly via 'Regex search', but limit is not mentioned at all. The schema provides the default and type, but not the meaning. This partial coverage leaves limit semantics undocumented.

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 'Regex search via ripgrep', a specific verb+resource statement that clearly differentiates this tool from sibling search_text. It further specifies the output format (ranked sandbox-wrapped match lines with term highlighting) and the prerequisite tools, leaving no doubt about what the tool does.

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

Usage Guidelines4/5

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

It provides clear usage context: it is for regex search, file scope can be restricted with glob, and it requires rg and datacron index. It does not explicitly name alternatives or state when not to use it, but the purpose is distinct enough that no exclusion is necessary.

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. Returns ranked sandbox-wrapped snippets with term highlighting. 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
limitNo
queryYes
include_supersededNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
queryNo
resultsNo
returnedNo
timings_msNo
index_repairNo
limit_appliedNo
truncated_for_tokensNo

TDQS

A4.5/5.0
Behavior5/5

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

Beyond the annotations (readOnlyHint=true, destructiveHint=false), the description adds critical behavioral context: requires `datacron index` to have been run first, demotes superseded notes by default, and explains the include_superseded flag. It also discloses the output format (ranked sandbox-wrapped snippets with term highlighting). This goes well beyond what annotations alone 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 four sentences, front-loaded with the key usage directive ('First stop...'), and every sentence adds value. No redundant or filler content.

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

Completeness5/5

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

The description is complete for a search tool: it covers the prerequisite (indexing), default behavior (superseded demotion), a key option (include_superseded), and output characteristics. An output schema exists to formalize the return structure, so detailed return values don't need to be in the description. It also provides enough context to differentiate from sibling search tools.

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 carries the burden. It explains include_superseded and its default behavior, but does not explain `query` or `limit` beyond their existence in the schema. Since `query` is self-explanatory and `limit` has an obvious default, partial compensation is present, but it's not complete.

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?

Description clearly states it performs full-text BM25 search over the user's notes, with a specific verb (search) and resource (FTS5 index). It also positions itself as the 'first stop' for questions, distinguishing it from siblings like search_regex by emphasizing it as the default search 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?

Provides clear when-to-use guidance ('First stop for any question... search before saying you do not know'), indicating it should be the initial tool. However, it does not explicitly mention alternatives such as search_regex or specify when not to use it, so it lacks 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, and the automatic updated timestamp; the Markdown body is preserved.

ParametersJSON Schema
NameRequiredDescriptionDefault
originNo
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.3/5.0
Behavior5/5

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

Annotations already mark this as destructive, but the description goes beyond that by listing exactly which fields change, noting the body is preserved, and mentioning the automatic updated timestamp. It also reveals the invalidation convention that keeps history queryable, which is valuable behavioral context not available from annotations alone.

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 tightly packed and front-loaded with the primary use case. Every sentence adds useful guidance or behavioral scope, and the field list is precise without being bloated.

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

Completeness3/5

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

For an 11-parameter tool with zero schema descriptions, this is a solid but incomplete definition: the core lifecycle workflow is well covered, yet several parameters remain unexplained in terms of accepted formats or vocabularies. The output schema exists, so missing return-value documentation is less of a concern, and the destructive scope is clearly bounded.

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 carries the full burden of documenting parameters. It explains the lifecycle meaning of invalid_at/invalidated_by, the 'option -- reason' format for rejected, and the list of mutable fields. However, it leaves expected_hash, request_id, confidence values, origin values, and date formats undefined, so some parameters still lack usable 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 states a specific verb and resource: 'Update frontmatter fields on an existing memory note,' and it names the exact lifecycle triggers. It distinguishes itself from siblings like patch_note_section by limiting scope to frontmatter and enumerating the fields it affects.

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 explicitly says when to use the tool ('when a fact's lifecycle changes') and gives a strong preference rule: invalidate outdated facts rather than deleting or rewriting them. It does not explicitly name sibling alternatives for body edits, but the claim that the Markdown body is preserved implies that boundary.

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. Dates show when Glama detected each change.

  1. 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"
        +]
  2. 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
  3. 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
Disambiguation4/5

Most tools target distinct resources/actions (search vs. get vs. list vs. write), but get_note_history and audit_query both query operation metadata with overlapping scope, and the four section-editing tools (patch preamble, patch section, rename section, delete section) form a close family that could cause misselection despite thorough descriptions.

Naming Consistency4/5

The dominant snake_case verb_noun pattern is predictable (get_note, append_journal, list_notes, search_text, set_frontmatter). Minor deviations: session_context has no verb, contradiction_scan reverses the verb-object order, and create_note_ai carries an unexplained 'ai' suffix.

Tool Count3/5

20 tools sits in the heavy range per calibration. The four section-edit tools share CAS/AST machinery and could plausibly be consolidated, and get_note_history/audit_query overlap, though the broad scope (search, backlinks, contradiction scanning, follow-ups, audit, health) mostly justifies the count.

Completeness4/5

Lifecycle coverage is strong: create, append, section-level edit/rename/delete, frontmatter invalidation, revert, history, audit, and multiple retrieval paths. Minor gaps exist—no note-level rename/move tool, and whole-note deletion is only available via invalidation since delete_note_section refuses H1—but these appear deliberate design choices.

Maintenance

ActivityNo data
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    A
    maintenance
    A generic Markdown vault MCP server with FTS5 full-text search, semantic vector search, frontmatter-aware indexing, incremental reindexing, and non-markdown attachment support that exposes search, read, write, and edit tools.
    38
    31
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/VBlackJack/Datacron'

If you have feedback or need assistance with the MCP directory API, please join our Discord server