Datacron
Datacron is a local MCP server that lets AI clients query and maintain a Markdown vault over stdio, returning only relevant notes or chunks instead of the full vault.
Read & discover:
list_notes,get_note(full/map/chunk formats), and MCP resources for vault map, vault info, and active policy.Search:
search_textBM25 full-text search with FR/EN query expansion and temporal re-ranking;search_regexvia ripgrep for literal regex matches.Graph:
get_backlinksresolves wikilinks and aliases to find related context.Operational insight:
get_healthreports index freshness, integrity, checksums, durability, and invariants;get_note_historyandaudit_queryinspect committed operations.Write (opt-in): when
DATACRON_WRITE_PATHSis set, create typed notes, append journal entries, update lifecycle frontmatter, patch/rename/delete note sections, revert to exact historical bytes, and apply an organization manifest — all confined, atomic, CAS-protected, and audited.Advisory:
contradiction_scanproposes read-only contradiction/refinement candidates and exact write-tool calls without writing automatically.Ops & setup: CLI commands for guided setup, init, incremental/full indexing, MCP client registration, protocol installation, evaluation, and manual server serving.
Provides tools for indexing, searching, reading, and maintaining a local Markdown vault, including full-text search, backlink discovery, section-level editing, and note lifecycle management.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@DatacronFind notes mentioning 'roadmap' and list their backlinks"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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.
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 setupDepuis 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+
ripgrepdisponible dans lePATHpoursearch_regexun dossier de notes Markdown
un client MCP stdio pris en charge, par exemple Claude Desktop, Codex CLI ou Gemini CLI
Première session
Choisis ton dossier de notes avec l'installeur ou
datacron setup.Reconnecte Datacron dans ton client MCP pour charger les outils et les instructions.
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éfautVoir 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/vaultLa 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 userPour 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 :
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/vaultL'entrée script directe utilisée par l'installateur est aussi disponible :
datacron-mcpdatacron-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 |
| non définie | fallback après |
| vide | allowlist de lecture ; le setup des clients la fixe au vault |
| vide | allowlist d'écriture ; vide = write tools désactivés |
|
| nombre max de résultats retournés |
|
| budget token des résultats de recherche |
|
| intervalle minimal entre les sweeps repair-on-read ; |
|
| budget de |
|
| taille cible max des chunks |
|
| 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:\_DATAdatacron 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 listerejected(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 leorganization.scopelive inchangé et passer la politique live d'admission des notes, exclusions comprisesdeux cibles internes sous CAS exact pour un batch d'organisation :
.datacron/VAULT.yaml, seulement pour modifier le mapping top-levelorganizationsans changerorganization.scope, et.datacron/ulids.json, seulement quand Datacron dérive la migration de clé imposée par unmove_replace_exactoverwrite atomique via fichier temporaire +
os.replacehistorique 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éussitaudit 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 |
|
Recherche | SQLite FTS5/BM25, query-expansion FR↔EN, re-rank temporel, |
Graphe local | Wikilinks et backlinks via |
Écriture | 8 tools de note + 1 lot d'organisation, confinés et journalisés, désactivés par défaut sans |
Transport MCP | SDK Python MCP v2 via |
Index |
|
Organisation | Bloc |
Évaluation |
|
Setup guidé |
|
Clients | Auto-détection et enregistrement via |
Mémoire quotidienne |
|
Protocole mémoire | Contrat commun versionné pour le serveur et les clients ; |
Distribution | Installeur Windows ( |
MCP Tools
Lecture
Tool | Description |
| Contexte initial borné et protocole commun versionné. |
| Prépare les suivis sourcés sans écrire. |
| Dernières révisions des suivis structurés. |
| retourne une liste paginée, filtrable par dossier, tags et paires frontmatter clé/valeur, avec ULID, titre, tags, alias et dates |
| lit une note par ULID, chunk id ou chemin relatif, en contenu paginé, chunk ou plan de headings |
| effectue une recherche BM25 sur l'index FTS5 avec snippets classés et notes obsolètes démotées par défaut |
| effectue une recherche regex via ripgrep et résout les lignes trouvées vers les chunks indexés |
| retourne les chunks dont les wikilinks ciblent un ULID ou un alias résolu |
Écriture
Tool | Description |
| crée une nouvelle note |
| ajoute une entrée Markdown sous un heading, avec confinement, historique exact et écriture atomique |
| modifie uniquement les champs de cycle de vie, la liste |
| remplace ou supprime le préambule avant le premier titre Markdown reconnu (ATX ou Setext), avec CAS obligatoire et préservation du suffixe |
| remplace le contenu d'un heading existant avec CAS, historique exact et préservation des autres sections |
| supprime explicitement une section H2-H6 (ATX ou Setext) et son sous-arbre, avec CAS optionnel et historique exact |
| renomme le titre d'une section H2-H6 (ATX ou Setext) sans modifier son contenu ni son sous-arbre |
| restaure une note depuis son historique adressé par contenu ; l'opération reste durable, réversible et auditée |
| valide un bundle local content-addressed contenant au moins une opération exacte sur une note et/ou un remplacement exact de la configuration |
Opérationnel
Tool | Description |
| retourne l'état réel de fraîcheur de l'index, d'intégrité, de checksum, de durabilité et des invariants |
| liste les métadonnées d'opérations validées d'une note sans lire le contenu historique ni modifier le journal |
| 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 |
| 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/mapdatacron://vault/infodatacron://policy/active
Recherche
search_text combine plusieurs signaux :
FTS5/BM25 pour le score lexical de base
query-expansion FR↔EN configurée dans
VAULT.yamlre-rank temporel conservateur :
une note citée dans le
supersedesd'une autre est fortement démotéeconfidence: lowetconfidence: needs_verificationappliquent une pénalité légèreinclude_superseded=truepermet 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 90567Sur 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_PATHSetDATACRON_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 allLimites 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 setupest best-effort (présence d'un dossier de config ou d'un binaire sur lePATH) ; 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
pytestLicence
Copyright 2026 Julien Bombled.
Licensed under the Apache License, Version 2.0.
Available Tools
20 toolsappend_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.
| Name | Required | Description | Default |
|---|---|---|---|
| entry | Yes | ||
| heading | Yes | ||
| rel_path | Yes | ||
| request_id | No | ||
| expected_hash | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| indexed | Yes | |
| appended | No | |
| rel_path | No | |
| replayed | No | |
| committed | No | |
| content_hash | Yes | |
| operation_id | No |
TDQS
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.
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.
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.
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.
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.
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 logARead-only
Query committed operation metadata by time range, tool, or note. This read-only operation never changes the journal or vault.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | ||
| note | No | ||
| tool | No | ||
| limit | No | ||
| start | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 candidatesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | scan | |
| detail | No | summary | |
| proposal_token | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | No | |
| limits | No | |
| candidates | No | |
| confirmation | No | |
| index_repair | No | |
| section_count | No | |
| examined_pairs | No | |
| schema_version | No | |
| candidate_count | No | |
| elicitation_action | No | |
| deterministic_order | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | ||
| tags | Yes | ||
| title | Yes | ||
| origin | Yes | ||
| rejected | No | ||
| rel_path | Yes | ||
| confidence | Yes | ||
| request_id | No | ||
| supersedes | No | ||
| expected_hash | No | ||
| last_verified | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| created | No | |
| indexed | Yes | |
| rel_path | No | |
| replayed | No | |
| committed | No | |
| content_hash | Yes | |
| operation_id | No |
TDQS
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.
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.
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.
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.
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.
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 sectionADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| heading | Yes | ||
| rel_path | Yes | ||
| request_id | No | ||
| expected_hash | No | ||
| heading_level | No | ||
| heading_occurrence | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| deleted | No | |
| indexed | Yes | |
| rel_path | No | |
| replayed | No | |
| committed | No | |
| content_hash | Yes | |
| operation_id | No |
TDQS
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.
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.
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.
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.
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.
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_backlinksGet backlinksARead-only
Use this to find related context the user did not mention. Return chunks whose wikilinks point at the given target. Target may be a note ULID or a wikilink alias (resolved via title -> filename -> aliases). Empty list if unresolved or no incoming links.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| target | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description significantly adds behavioral context beyond the annotations. It explains the target resolution order ('title -> filename -> aliases') and the empty list behavior for unresolved targets or no incoming links. This gives the agent a precise understanding of edge cases and resolution logic, which is valuable given the annotations only declare read-only safety.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four concise sentences, each earning its place. It is front-loaded with the primary use case, then provides technical resolution details, and ends with the edge-case empty list behavior. There is no fluff or repetition, making it highly efficient for an agent to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity and the presence of an output schema (which negates the need to describe return values), the description covers the core aspects: use case, target resolution, and empty behavior. It does not explicitly address the limit parameter behavior, but that is a minor omission given the schema provides the default. Overall, it is sufficiently complete 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description carries the burden for parameter semantics. It thoroughly explains the 'target' parameter, including acceptable formats (ULID or wikilink alias) and resolution precedence. The 'limit' parameter is not mentioned, but its meaning is conventional and its default (20) is in the schema. The description adds significant meaning for the key parameter, so a 4 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool's function: 'Return chunks whose wikilinks point at the given target.' It also adds a specific use case ('find related context the user did not mention') that distinguishes it from general search tools like search_text or search_regex. The verb 'Return' and resource 'chunks with wikilinks' 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The opening phrase 'Use this to find related context the user did not mention' provides a clear scenario for when the tool is appropriate. However, it does not explicitly mention alternatives or state when not to use it, so it lacks exclusion guidance. This earns a 4 for clear context without full differentiation.
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-upARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| note_paths | Yes | ||
| include_closed | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| omitted | No | |
| records | No | |
| coverage | No | |
| returned | No | |
| truncated | No | |
| legacy_notes | No |
TDQS
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.
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.
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.
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.
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.
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 healthARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| detail | No | summary |
Output Schema
| Name | Required | Description |
|---|---|---|
| index | Yes | |
| status | Yes | |
| recovery | Yes | |
| scrubber | Yes | |
| integrity | Yes | |
| read_only | Yes | |
| durability | Yes | |
| invariants | Yes | |
| server_version | Yes | |
| vault_checksum | Yes |
TDQS
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.
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.
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.
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.
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.
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 noteARead-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).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| format | No | full | |
| offset | No | ||
| id_or_path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| tags | No | |
| title | No | |
| format | No | |
| offset | No | |
| aliases | No | |
| content | No | |
| created | No | |
| note_id | No | |
| updated | No | |
| chunk_id | No | |
| headings | No | |
| line_end | No | |
| rel_path | No | |
| truncated | No | |
| line_start | No | |
| chunk_count | No | |
| frontmatter | No | |
| header_path | No | |
| next_offset | No | |
| total_chars | No | |
| content_hash | No | |
| limit_applied | No | |
| next_chunk_id | No | |
| prev_chunk_id | No | |
| returned_chars | No | |
| estimated_tokens | No | |
| note_content_hash | No | |
| chunk_content_hash | No | |
| content_hash_contract | No | |
| returned_estimated_tokens | No |
TDQS
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.
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.
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.
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.
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.
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 historyARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| note | Yes | ||
| limit | No | ||
| request_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 notesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | ||
| limit | No | ||
| folder | No | ||
| offset | No | ||
| frontmatter | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| notes | Yes | |
| total | Yes | |
| offset | Yes | |
| returned | Yes | |
| truncated | Yes | |
| next_offset | Yes | |
| limit_applied | Yes |
TDQS
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.
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.
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.
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.
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.
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 preambleADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| rel_path | Yes | ||
| request_id | No | ||
| new_content | Yes | ||
| expected_hash | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| indexed | Yes | |
| patched | No | |
| rel_path | No | |
| replayed | No | |
| committed | No | |
| content_hash | Yes | |
| operation_id | No |
TDQS
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.
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.
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.
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.
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.
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 sectionADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| heading | Yes | ||
| rel_path | Yes | ||
| request_id | No | ||
| new_content | Yes | ||
| expected_hash | No | ||
| heading_level | No | ||
| heading_occurrence | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| indexed | Yes | |
| patched | No | |
| rel_path | No | |
| replayed | No | |
| committed | No | |
| content_hash | Yes | |
| operation_id | No |
TDQS
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.
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.
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.
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.
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.
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-upARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| records | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| plans | No | |
| status | No | |
| committed | No | |
| validation | No | |
| next_action | No | |
| writes_enabled | No | |
| already_recorded | No |
TDQS
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.
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.
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.
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.
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.
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 sectionADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| heading | Yes | ||
| rel_path | Yes | ||
| request_id | No | ||
| new_heading | Yes | ||
| expected_hash | No | ||
| heading_level | No | ||
| heading_occurrence | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| indexed | Yes | |
| renamed | No | |
| rel_path | No | |
| replayed | No | |
| committed | No | |
| content_hash | Yes | |
| operation_id | No |
TDQS
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.
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.
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.
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.
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.
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 historyADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| note | Yes | ||
| to_hash | Yes | ||
| request_id | No | ||
| expected_hash | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| indexed | Yes | |
| rel_path | No | |
| replayed | No | |
| reverted | No | |
| committed | No | |
| content_hash | Yes | |
| operation_id | No |
TDQS
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.
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.
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.
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.
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.
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)ARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| glob | No | ||
| limit | No | ||
| pattern | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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)ARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | ||
| include_superseded | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| query | No | |
| results | No | |
| returned | No | |
| timings_ms | No | |
| index_repair | No | |
| limit_applied | No | |
| truncated_for_tokens | No |
TDQS
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.
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.
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.
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.
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.
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 sessionARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | No | all | |
| subject | No | ||
| max_tokens | No | ||
| note_paths | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| omitted | No | |
| sources | No | |
| contract | No | |
| coverage | No | |
| evidence | No | |
| identity | No | |
| truncated | No | |
| unavailable | No | |
| capabilities | No | |
| index_repaired | No |
TDQS
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.
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.
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.
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.
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.
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 frontmatterADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| origin | No | ||
| rejected | No | ||
| rel_path | Yes | ||
| confidence | No | ||
| invalid_at | No | ||
| request_id | No | ||
| supersedes | No | ||
| valid_from | No | ||
| expected_hash | No | ||
| last_verified | No | ||
| invalidated_by | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| indexed | Yes | |
| updated | No | |
| rel_path | No | |
| replayed | No | |
| committed | No | |
| content_hash | Yes | |
| operation_id | No |
TDQS
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.
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.
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.
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.
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.
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.
12 tool updates
v0.1.5- Changed
append_journal9 fields changed- added
Input schema / properties / request_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Request Id" +} - removed
Output schema / properties / appended / $refRemoved value: -"#/$defs/AppendedNoteOutput" - added
Output schema / properties / appended / anyOfAdded value: +[ + { + "$ref": "#/$defs/AppendedNoteOutput" + }, + { + "type": "null" + } +] - added
Output schema / properties / appended / defaultAdded value: +null - added
Output schema / properties / committedAdded value: +{ + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Committed" +} - added
Output schema / properties / operation_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Operation Id" +} - added
Output schema / properties / rel_pathAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Rel Path" +} - added
Output schema / properties / replayedAdded value: +{ + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Replayed" +} - changed
Output schema / requiredPrevious value: -[ - "appended", - "content_hash", - "indexed" -]New value: +[ + "content_hash", + "indexed" +]
- Changed
create_note_ai9 fields changed- added
Input schema / properties / request_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Request Id" +} - added
Output schema / properties / committedAdded value: +{ + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Committed" +} - removed
Output schema / properties / created / $refRemoved value: -"#/$defs/CreatedNoteOutput" - added
Output schema / properties / created / anyOfAdded value: +[ + { + "$ref": "#/$defs/CreatedNoteOutput" + }, + { + "type": "null" + } +] - added
Output schema / properties / created / defaultAdded value: +null - added
Output schema / properties / operation_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Operation Id" +} - added
Output schema / properties / rel_pathAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Rel Path" +} - added
Output schema / properties / replayedAdded value: +{ + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Replayed" +} - changed
Output schema / requiredPrevious value: -[ - "created", - "content_hash", - "indexed" -]New value: +[ + "content_hash", + "indexed" +]
- Changed
delete_note_section9 fields changed- added
Input schema / properties / request_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Request Id" +} - added
Output schema / properties / committedAdded value: +{ + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Committed" +} - removed
Output schema / properties / deleted / $refRemoved value: -"#/$defs/DeletedSectionOutput" - added
Output schema / properties / deleted / anyOfAdded value: +[ + { + "$ref": "#/$defs/DeletedSectionOutput" + }, + { + "type": "null" + } +] - added
Output schema / properties / deleted / defaultAdded value: +null - added
Output schema / properties / operation_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Operation Id" +} - added
Output schema / properties / rel_pathAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Rel Path" +} - added
Output schema / properties / replayedAdded value: +{ + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Replayed" +} - changed
Output schema / requiredPrevious value: -[ - "deleted", - "content_hash", - "indexed" -]New value: +[ + "content_hash", + "indexed" +]
- Added
get_follow_up - Changed
get_note_history1 field changed- added
Input schema / properties / request_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Request Id" +}
- Changed
patch_note_preamble9 fields changed- added
Input schema / properties / request_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Request Id" +} - added
Output schema / properties / committedAdded value: +{ + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Committed" +} - added
Output schema / properties / operation_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Operation Id" +} - removed
Output schema / properties / patched / $refRemoved value: -"#/$defs/PatchedPreambleOutput" - added
Output schema / properties / patched / anyOfAdded value: +[ + { + "$ref": "#/$defs/PatchedPreambleOutput" + }, + { + "type": "null" + } +] - added
Output schema / properties / patched / defaultAdded value: +null - added
Output schema / properties / rel_pathAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Rel Path" +} - added
Output schema / properties / replayedAdded value: +{ + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Replayed" +} - changed
Output schema / requiredPrevious value: -[ - "patched", - "content_hash", - "indexed" -]New value: +[ + "content_hash", + "indexed" +]
- Changed
patch_note_section9 fields changed- added
Input schema / properties / request_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Request Id" +} - added
Output schema / properties / committedAdded value: +{ + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Committed" +} - added
Output schema / properties / operation_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Operation Id" +} - removed
Output schema / properties / patched / $refRemoved value: -"#/$defs/PatchedSectionOutput" - added
Output schema / properties / patched / anyOfAdded value: +[ + { + "$ref": "#/$defs/PatchedSectionOutput" + }, + { + "type": "null" + } +] - added
Output schema / properties / patched / defaultAdded value: +null - added
Output schema / properties / rel_pathAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Rel Path" +} - added
Output schema / properties / replayedAdded value: +{ + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Replayed" +} - changed
Output schema / requiredPrevious value: -[ - "patched", - "content_hash", - "indexed" -]New value: +[ + "content_hash", + "indexed" +]
- Added
prepare_follow_up - Changed
rename_note_section9 fields changed- added
Input schema / properties / request_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Request Id" +} - added
Output schema / properties / committedAdded value: +{ + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Committed" +} - added
Output schema / properties / operation_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Operation Id" +} - added
Output schema / properties / rel_pathAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Rel Path" +} - removed
Output schema / properties / renamed / $refRemoved value: -"#/$defs/RenamedSectionOutput" - added
Output schema / properties / renamed / anyOfAdded value: +[ + { + "$ref": "#/$defs/RenamedSectionOutput" + }, + { + "type": "null" + } +] - added
Output schema / properties / renamed / defaultAdded value: +null - added
Output schema / properties / replayedAdded value: +{ + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Replayed" +} - changed
Output schema / requiredPrevious value: -[ - "renamed", - "content_hash", - "indexed" -]New value: +[ + "content_hash", + "indexed" +]
- Changed
revert_note9 fields changed- added
Input schema / properties / request_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Request Id" +} - added
Output schema / properties / committedAdded value: +{ + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Committed" +} - added
Output schema / properties / operation_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Operation Id" +} - added
Output schema / properties / rel_pathAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Rel Path" +} - added
Output schema / properties / replayedAdded value: +{ + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Replayed" +} - removed
Output schema / properties / reverted / $refRemoved value: -"#/$defs/RevertedNoteOutput" - added
Output schema / properties / reverted / anyOfAdded value: +[ + { + "$ref": "#/$defs/RevertedNoteOutput" + }, + { + "type": "null" + } +] - added
Output schema / properties / reverted / defaultAdded value: +null - changed
Output schema / requiredPrevious value: -[ - "reverted", - "content_hash", - "indexed" -]New value: +[ + "content_hash", + "indexed" +]
- Added
session_context - Changed
set_frontmatter9 fields changed- added
Input schema / properties / request_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Request Id" +} - added
Output schema / properties / committedAdded value: +{ + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Committed" +} - added
Output schema / properties / operation_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Operation Id" +} - added
Output schema / properties / rel_pathAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Rel Path" +} - added
Output schema / properties / replayedAdded value: +{ + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Replayed" +} - removed
Output schema / properties / updated / $refRemoved value: -"#/$defs/UpdatedFrontmatterOutput" - added
Output schema / properties / updated / anyOfAdded value: +[ + { + "$ref": "#/$defs/UpdatedFrontmatterOutput" + }, + { + "type": "null" + } +] - added
Output schema / properties / updated / defaultAdded value: +null - changed
Output schema / requiredPrevious value: -[ - "updated", - "content_hash", - "indexed" -]New value: +[ + "content_hash", + "indexed" +]
5 tool updates
v0.1.3- Added
delete_note_section - Changed
get_health14 fields changed- added
Input schema / properties / detailAdded value: +{ + "default": "summary", + "enum": [ + "summary", + "full" + ], + "title": "Detail", + "type": "string" +} - added
Input schema / properties / limitAdded value: +{ + "default": 0, + "title": "Limit", + "type": "integer" +} - added
Output schema / $defs / HealthFindingsOutputAdded 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" +} - added
Output schema / $defs / HealthFlaggedPathsOutputAdded 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" +} - changed
Output schema / $defs / HealthIntegrityOutput / descriptionPrevious value: -"Vault integrity counters included in operational health."New value: +"Vault integrity counters and optional detailed findings." - added
Output schema / $defs / HealthIntegrityOutput / properties / broken_wikilinks_misdirectedAdded value: +{ + "title": "Broken Wikilinks Misdirected", + "type": "integer" +} - added
Output schema / $defs / HealthIntegrityOutput / properties / detailAdded value: +{ + "enum": [ + "summary", + "full" + ], + "title": "Detail", + "type": "string" +} - added
Output schema / $defs / HealthIntegrityOutput / properties / findingsAdded value: +{ + "$ref": "#/$defs/HealthFindingsOutput" +} - changed
Output schema / $defs / HealthIntegrityOutput / requiredPrevious 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" +] - added
Output schema / $defs / HealthRecoveryOperationOutputAdded 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" +} - added
Output schema / $defs / HealthRecoveryOutputAdded 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" +} - added
Output schema / $defs / HealthViolationOutputAdded 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" +} - added
Output schema / properties / recoveryAdded value: +{ + "$ref": "#/$defs/HealthRecoveryOutput" +} - changed
Output schema / requiredPrevious 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" +]
- Added
patch_note_preamble - Changed
patch_note_section2 fields changed- added
Input schema / properties / heading_occurrenceAdded value: +{ + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Heading Occurrence" +} - added
Output schema / $defs / PatchedSectionOutput / properties / heading_occurrenceAdded value: +{ + "title": "Heading Occurrence", + "type": "integer" +}
- Added
rename_note_section
14 tool updates
v0.1.0- First observed
append_journal - First observed
audit_query - First observed
contradiction_scan - First observed
create_note_ai - First observed
get_backlinks - First observed
get_health - First observed
get_note - First observed
get_note_history - First observed
list_notes - First observed
patch_note_section - First observed
revert_note - First observed
search_regex - First observed
search_text - First observed
set_frontmatter
TDQS
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.
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.
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.
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
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
Serve a folder of Markdown notes as an MCP server: hybrid search, reading, and sourced answers.
Markdown-based note-taking with a hosted MCP server. Your notes serve you and your AI.
Agent-native MCP server over the public saagarpatel.dev corpus. Read-only, stateless.
OAuth-protected, read-only-by-default MCP server for provenance-labeled QuillCaddie project memory.
Related MCP Servers
- FlicenseNot gradedqualityCmaintenanceMCP server that enables full-text search and link navigation over Markdown files as a knowledge graph.-
- AlicenseAqualityAmaintenanceA 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.3831MIT
- AlicenseNot gradedqualityCmaintenancePython MCP server for programmatic access to markdown-based knowledge vaults, enabling AI assistants to browse, read, search, update, and manage notes, tasks, and projects.1MIT
- FlicenseCqualityCmaintenanceMCP server to query and modify an Obsidian vault or any folder of markdown files. It provides search, tag filtering, backlinks, and CRUD operations on notes, with path traversal protection.11-
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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