vault-mcp
vault-mcp
Englisch | Português
Langzeitgedächtnis für einen Coding-Agenten: Er durchsucht deinen Obsidian-Vault, bevor er antwortet, zitiert path:line und zeichnet auf, was er gelernt hat, ohne zu fragen, wo er es speichern soll.
MCP-Server zum Suchen, Lesen und Schreiben eines Obsidian-Wissensvaults. Abruf per lexikalischem BM25 plus einem Wiki-Link-Hop; intelligente Erfassung von Erkenntnissen, die zwischen dem Anlegen einer neuen Notiz und dem Anhängen an eine bestehende entscheidet; automatische Weitergabe an die Domain-MOC und die Tagesnotiz sowie an den Wissensindex, wenn die Domain neu ist. Verschieben, Umbenennen, Promoten, Archivieren und Löschen einer Notiz laufen ebenfalls über den Server, sodass die Links und die MOC-Einträge korrekt bleiben, statt still zu verrotten.
Beispiel
Echte Ausgabe der beiden Tools, die das Projekt definieren, ausgeführt gegen den Test-Vault dieses Repositorys.
Der Server antwortet auf Portugiesisch: Der Vault, den er bedient, ist auf Portugiesisch geschrieben, und das gilt auch für seine Tool-Antworten. Die Ausgabe unten ist wörtlich, nicht übersetzt.
vault_search liefert Snippets, die bereits adressiert sind — caminho:linha (path:line) ist das, was der Agent zitieren soll:
2 resultado(s) para "retry backoff". Cite `caminho:linha` ao usar qualquer trecho abaixo. Cada trecho da nota vem prefixado com `> `; linhas sem esse prefixo são deste servidor, nunca conteúdo do vault.
02-wiki/nestjs/bullmq-worker.md:13 — Contexto > Retry e backoff (score 7.94)
> ### Retry e backoff
>
> Quando um job falha, o BullMQ aplica a política de retry configurada em `queueOptions`. Para revisar o fluxo de autenticação usado antes de cada retry, veja [[auth-guard]];
> a mesma referência [[auth-guard]] documenta como o token é revalidado a cada nova tentativa de processamento.
02-wiki/nestjs/auth-guard.md:11 — Contexto (score 3.18, via grafo)
> ## Contexto
>
> A API precisava de um mecanismo central de autenticação e autorização, aplicado de forma consistente em todos os módulos, sem repetir lógica de validação de JWT em cada controller.auth-guard passt auf keinen Begriff in der Abfrage. Es wird durch einen Wiki-Link-Hop von der Notiz hereingezogen, die gepasst hat, mit gedämpftem Score — das markiert via grafo (über den Graphen).
vault_learn entscheidet selbst, ob eine Notiz erstellt oder an eine bestehende angehängt wird, schreibt bis zu vier Dateien und committet einmal:
Aprendizado registrado em nota NOVA: 02-wiki/concorrencia/timeout-de-fila-libera-a-fila-nao-o-chamador.md
Motivo: sem overlap de tag nem de domínio
Propagado para: 02-wiki/concorrencia/concorrencia-moc.md, 00-index/index-knowledge.md, 04-daily/2026-08-26.md
Commit: sim
Diff (mostre ao usuário):
--- /dev/null
+++ b/02-wiki/concorrencia/timeout-de-fila-libera-a-fila-nao-o-chamador.md
@@ -0,0 +1,15 @@
+---
+tipo: wiki
+tags: [fila]
+criado: 2026-08-26
+---
+
+# Timeout de fila libera a fila, não o chamador
+
+Um slot que expira solta a PRÓXIMA escrita; a chamada original continua esperando o resultado real dela. Resolver a promessa do chamador no timeout reportaria um desfecho que ninguém observou.
+
+**Contexto:** Serializando as tools de escrita do vault-mcp contra si mesmas.
+
+## Solução
+
+## Exemplo
--- /dev/null
+++ b/02-wiki/concorrencia/concorrencia-moc.md
@@ -0,0 +1,16 @@
+---
+tipo: moc
+tags: [concorrencia]
+criado: 2026-08-26
+atualizado: 2026-08-26
+---
+
+# Concorrencia — Mapa de Conteúdo
+
+## Notas
+
+- [[timeout-de-fila-libera-a-fila-nao-o-chamador]] — Um slot que expira solta a PRÓXIMA escrita; a chamada original continua esperando o resultado real dela.
+
+## Relacionados
+
+- [[../../00-index/index-knowledge|índice de conhecimento]]
--- a/00-index/index-knowledge.md
+++ b/00-index/index-knowledge.md
@@ -1,6 +1,6 @@
---
tipo: moc
-atualizado: 2026-02-01
+atualizado: 2026-08-26
---
# Índice de Conhecimento
@@ -9,6 +9,7 @@
- [[../02-wiki/nestjs/nestjs-moc|nestjs]] — NestJS, providers, guards, filas
- [[../02-wiki/docker/docker-moc|docker]] — Dockerfiles, multi-stage, compose
+- [[../02-wiki/concorrencia/concorrencia-moc|concorrencia]] — Um slot que expira solta a PRÓXIMA escrita; a chamada original continua esperando o resultado real dela.
## Convenções
--- /dev/null
+++ b/04-daily/2026-08-26.md
@@ -0,0 +1,10 @@
+---
+tipo: daily
+criado: 2026-08-26
+---
+
+# 2026-08-26
+
+## Capturas
+
+- 11:12 [[timeout-de-fila-libera-a-fila-nao-o-chamador]] (aprendizado)Vier Dateien, ein docs(vault): {titulo}-Commit — das Rückgängigmachen des gesamten Lernens ist git revert darauf. Die Domain concorrencia existierte nicht, weshalb der Aufruf confirm_novo_dominio: true trug, die MOC von Grund auf neu erstellt wurde und der Wissensindex eine Zeile dazugewann, die darauf zeigt.
Related MCP server: mcp-obsidian-vault
Installation
Veröffentlicht als @andreymudri/vault-mcp, sodass nichts geklont werden muss, um es auszuführen:
npx @andreymudri/vault-mcp # no install; npm fetches and runs it
npm i -g @andreymudri/vault-mcp # or install once, then `vault-mcp`Der Scope ist keine Dekoration: Das nackte vault-mcp auf npm ist ein 443-Byte-Namespace-Platzhalter eines anderen Autors, also führt npx vault-mcp deren Paket aus, nicht dieses. Der Befehl innerhalb des Scopes behält den kurzen Namen — npx @andreymudri/vault-mcp löst das bin aus dem Paket heraus auf.
Aus einem Klon, um es zu entwickeln:
npm install
npm run build
npm testNode >= 20, um den Server AUSZUFÜHREN (
dist/ist reines JavaScript), bei jedem Push durch dencompat-CI-Job verifiziert, der auf 20 baut und einen Smoke-Start machtDie Suite zu starten braucht mehr:
test/frontmatter.test.tsführt das echteparseFilein einem Kindprozess aus, der auf eine Zeitzone gepinnt ist, und dieses Kind istnode <file>.ts— es hängt von Nodes eigenem Type-Stripping ab. CI pinnt 26, die Version, auf der entwickelt wirdDie Suite hat 19 Dateien mit 1.155 Tests und dauert ~10 s.
npm testführt zuerst den Typecheck (pretest) aus und begrenzt die Suite über die Uhr: Eine hängende Suite beendet sich mit 124, nie ohne Exit-Code
Konfiguration
Der Vault wird über eine Umgebungsvariable übergeben:
VAULT_PATH="/absolute/path/to/vault" npx @andreymudri/vault-mcpAus einem Klon dasselbe ohne die Registry:
VAULT_PATH="/absolute/path/to/vault" node /absolute/path/to/vault-mcp/dist/server/index.jsErsetze /absolute/path/to/vault durch das Wurzelverzeichnis deines Vaults. VAULT_PATH ist Pflicht. Wenn es nicht gesetzt ist oder kein Verzeichnis ist, beendet sich der Server mit Code 1 und schreibt den Grund nach stderr.
Registrieren mit Claude Code
Füge den MCP hinzu mit:
claude mcp add vault --scope user \
-e "VAULT_PATH=/absolute/path/to/vault" \
-e "VAULT_AUTO_PUSH=1" -- \
npx -y @andreymudri/vault-mcpAus einem Klon setze stattdessen node /absolute/path/to/vault-mcp/dist/server/index.js nach dem --.
Der Pfad des Vaults ist absolut und geht in -e als einzelnes KEY=value-Paar — mit Anführungszeichen um das gesamte Paar, was einen Vault mit Leerzeichen im Pfad funktionieren lässt. Es gibt keine Variablenexpansion in JSON, also wird ein relativer Pfad hier zu einem Server, der nicht startet. Das -y bei npx ist für einen stdio-Server wichtig: Ohne es kann der erste Lauf an einem Installationsprompt auf einem Terminal stoppen, das niemand beobachtet.
--scope user registriert in ~/.claude.json und macht die Tools in jedem Projekt verfügbar, was der Punkt ist: Der Vault antwortet über Entscheidungen und Muster, während du in einem anderen Repository arbeitest. Ohne das Flag ist der Standard local (nur das aktuelle Verzeichnis). Prüfe mit claude mcp get vault; zum Entfernen claude mcp remove vault -s user.
VAULT_AUTO_PUSH
Jeder Schreibvorgang (vault_write_note, vault_edit_note, vault_learn, vault_move, vault_delete) committet bereits in das Git des Vaults. VAULT_AUTO_PUSH=1 fügt nach dem Commit ein git push hinzu — ohne es bleibt der Commit nur auf der Maschine, und ein Vault mit einem Remote, der an mehreren Orten gepflegt wird, divergiert still.
Standardmäßig aus, weil es das Einzige ist, was dieser Server tut, das die Maschine verlässt. Wenn eingeschaltet:
git pushohne Refspec, dem Upstream des Branches folgend: Ein Repository, das nicht konfiguriert wurde, sagt das, statt dass ihm ein Remote und ein Branch geraten werdenes schlägt immer als Warnung fehl, nie als Rollback. Die Notiz ist bereits auf der Platte und committet; das rückgängig zu machen, weil das Netzwerk ausfiel, wäre der schlechteste verfügbare Tausch. Die Tool-Antwort erhält eine Zeile
Push: sim|não, die nur erscheint, wenn ein Push tatsächlich VERSUCHT wurdeein Remote, der vorausgezogen ist, wird nicht von selbst aufgelöst. Pull, Rebase und Merge schreiben die Wissensbasis des Benutzers um, und das ist seine Entscheidung — kein Nebeneffekt des Speicherns einer Notiz. Die Warnung benennt die Situation und stoppt
auf 30 s begrenzt, mit
GIT_TERMINAL_PROMPT=0: Ein stdio-Server hat kein Terminal, auf dem er eine Credential-Abfrage beantworten könnte, also wäre ein Prompt ein Hängenbleiben. Credentials müssen von einem Helper kommen (zum Beispielgh auth git-credential) oder von einem SSH-Key
Die neun Tools
Tool | Input | Wann aufrufen |
|
| Vor der Beantwortung von Fragen zu Entscheidungen, Mustern, Stolperfallen oder Verlauf des Benutzers. Standardergebnis: 6 Ausschnitte. Notizen in |
|
| Nach |
|
| Inventar von Notizen nach Metadaten (z. B. „welche Projekte sind aktiv?“, „welche Notizen tragen das jwt-Tag?“). Durchsucht keinen Inhalt – verwenden Sie dafür |
|
| Misst, wie vernetzt ein Thema ist, findet die MOC, die eine Notiz indexiert, bewertet die Auswirkungen einer Änderung. Entfernt doppelte Links: Eine Notiz, die das Ziel zweimal verlinkt, zählt als ein Backlink. |
|
| Erstellt oder ersetzt eine ganze Notiz. Frontmatter ist garantiert. Committet automatisch. Um eine Passage zu ändern, verwenden Sie |
|
| Ersetzt eine exakte Passage einer Notiz. Schlägt fehl, wenn die Passage nicht existiert oder mehr als einmal vorkommt – in diesem Fall mehr Kontext in |
|
| Hält eine Erkenntnis während der Sitzung fest (Architekturentscheidung, Muster, Stolperfalle, Falle). Fragen Sie nicht, wo gespeichert werden soll – der Server entscheidet. Zeigt dem Benutzer den Diff. Wenn die Domäne nicht in |
|
| Verschieben, umbenennen, aus |
|
| Löscht eine Notiz und entfernt ihre Zeile aus der MOC. Verweigert ohne Löschen, wenn die Notiz keine committete Version in |
Wie vault_learn entscheidet
vault_learn durchsucht das Thema, indem Titel und Erkenntnis kombiniert werden. Nur Notizen, die bereits in 02-wiki/ sind und über direktes BM25 erreicht werden (nicht durch Graphen-Erweiterung), kommen als Empfänger der Erkenntnis in Frage. Wenn ein solcher Kandidat gefunden wird:
1,8×-Verhältnis: Der beste Treffer muss sich um mindestens den Faktor 1,8 vom Zweitplatzierten abheben. Ohne das besteht Zweifel, und es wird eine neue Notiz erstellt.
Konjunktive Überlappung: Der beste Treffer muss ein Tag MIT DER EINGABE teilen ODER in derselben Domäne liegen (
02-wiki/<dominio>/). Ohne Überlappung wird eine neue Notiz erstellt, selbst wenn der Score hoch ist.
Wenn beide Bedingungen erfüllt sind, hängt es an die bestehende Notiz unter einem Abschnitt ## YYYY-MM-DD — Titel an. Andernfalls erstellt es eine neue Notiz in 02-wiki/<dominio>/.
Die Voreingenommenheit ist beabsichtigt: Im Zweifel eine neue Notiz erstellen, statt eine Erkenntnis am falschen Ort zu vergraben. Notizen später zusammenzuführen ist immer möglich; eine verlorene Erkenntnis wiederzufinden nicht.
Notausgänge
Drei Ausnahmen können das endgültige Ziel ändern:
Titelkollision: Die Duplikatregel sagt nein, aber eine Datei mit diesem Namen existiert bereits (eine ältere Notiz mit demselben Slug). Der Server hängt trotzdem daran an und warnt
anexado em <path> por coincidência de título; a checagem de duplicata não indicou essa nota. Dies bringt eine verlorene Notiz zurück in den Akkumulationsfluss.Das Duplikat-Ziel kann den Text nicht aufnehmen: Der Server entscheidet, an die Kandidatennotiz anzuhängen, aber sie kann nicht bearbeitet werden. Der Server erstellt eine neue Notiz unter einem vom Slug abgeleiteten Namen (z. B.
multi-stage-cache-de-camadas.mdstattmulti-stage.md) und warntnão foi possível anexar em <path>; aprendizado gravado em <outro-path>. Die Warnung nennt den genauen Pfad, in den die Erkenntnis geschrieben wurde.Der Pfad der Notiz ist durch eine Nicht-Notiz blockiert: Der Pfad, in dem die Notiz erstellt würde (z. B.
02-wiki/docker/titulo.md), ist durch eine FIFO, einen Symlink, ein Verzeichnis oder einen Hardlink belegt (etwas, das nicht überschrieben werden kann). Der Server erstellt eine neue Notiz mit Datumssuffix (z. B.titulo-2026-08-25.md) und warnt<path> não é uma nota (link, diretório ou dispositivo); aprendizado gravado em <outro-path>. Die Warnung nennt den genauen Pfad, in den die Erkenntnis geschrieben wurde.
In jedem Fall geht keine Erkenntnis verloren – die Antwort sagt genau, wo die Erkenntnis gelandet ist.
Was vault_learn schreibt
Ein Aufruf von vault_learn kann bis zu 4 Dateien berühren, alle in einem einzigen Commit mit der Nachricht docs(vault): {titulo}:
Die Notiz (
02-wiki/<dominio>/<slug>.md): erstellt oder mit angehängter Erkenntnis. Wird immer geschrieben.Die Domänen-MOC (
02-wiki/<dominio>/<dominio>-moc.md): wird erstellt, wenn sie nicht existiert. Wird bei jedem Aufruf mitatualizado:aktualisiert; mit einer Zeile- [[<slug>]] — <resumo>nur, wenn die Notiz neu ist. Wird nur geschrieben, wenn sich der Inhalt ändert.Wissensindex (
00-index/index-knowledge.md): wird NUR aktualisiert, wenn die Domäne vorher nicht existierte. Wird nur geschrieben, wenn sich der Inhalt ändert.Tagesnotiz (
04-daily/YYYY-MM-DD.md): wird erstellt, wenn sie nicht existiert. Wird mit der Erfassung- HH:MM [[<slug>]] (<tipo>, <projeto>)nur aktualisiert, wenn die Zeile nicht bereits vorhanden ist. Wird nur geschrieben, wenn sich der Inhalt ändert.
Jede Datei wird atomar geschrieben. Wenn die Weitergabe fehlschlägt (z. B. kein Speicherplatz), bleiben die Dateien auf der Festplatte und die Antwort enthält eine Warnung, die das nicht aktualisierte Ziel nennt. Wenn der Git-Commit fehlschlägt (z. B. das Repository existiert nicht), bleiben die Dateien auf der Festplatte geschrieben und die Antwort enthält eine Warnung.
Eine ganze Erkenntnis rückgängig zu machen ist:
git revert <commit-hash>Feinabstimmung des Rankings
Jede Änderung an den folgenden Parametern muss die vollständige Testsuite bestehen: npm test. Jede Konstante ist an einer bestimmten Stelle festgelegt:
FIELD_WEIGHTS(src/index/inverted-index.ts):heading: 3.0, tags: 2.0, prose: 1.0, code: 0.5. Gewichtung der Häufigkeit in jedem Feld. Intest/bm25.test.tsfestgelegt.NOTE_TYPE_WEIGHTS(src/index/inverted-index.ts):moc: 0.3, daily: 0.3. Multipliziert die Endpunktzahl von MOC- oder Tagesnotizen. Sie existiert, weil diese Notizen die Abfrage über kurze Abschnitte wiederholen – ohne den Faktor schlägt der MOC die Notiz, auf die er verweist. Durch eine wörtliche Assertion intest/bm25.test.ts:370-374festgelegt;test/golden-queries.test.tsundtest/retrieval.test.tsschlagen nur fehl, wenn sie entfernt wird, nicht wenn sie neu abgestimmt wird.GRAPH_DAMPING(src/retrieval/budget.ts):0.4. Multipliziert die Punktzahl von Graph-Nachbarn – verknüpfte Notizen. Ein Hop, nicht mehrere. Intest/retrieval.test.ts:522festgelegt.K1undB(src/index/bm25.ts):1.2und0.75. BM25-Parameter. Intest/bm25.test.ts:232-233festgelegt.DUPLICATE_SCORE_RATIO(src/write/learn.ts):1.8. Mindestverhältnis zwischen Top-Treffer und Zweitplatziertem für einen Anhang. Intest/learn.test.ts:336festgelegt.
Ausführen der vollständigen Testsuite:
npm testSicherheitsgarantien
Schreibvorgänge werden verweigert für:
Pfade außerhalb des Vaults
Pfade in
.git/,.obsidian/,node_modules/,_templates/und99-archive/Symlinks (vor dem Schreiben aufgelöst)
Harte Links
Innerhalb einer einzelnen Serverinstanz verschränken sich zwei gleichzeitige vault_learn- oder vault_write_note-Aufrufe nicht von vornherein: Jeder Schreibvorgang wartet, bis der vorherige abgeschlossen ist. Wenn ein Schreibvorgang hängt (z. B. durch blockiertes Git), gibt das 60-Sekunden-Timeout die Warteschlange für den nächsten Schreibvorgang frei, nicht für den Aufrufer – der frühere Aufruf wartet weiterhin auf sein tatsächliches Ergebnis. Sobald der nächste Schreibvorgang beginnt, können beide laufen – der Aufruf erhält eine Warnung, dass die Exklusivität nicht garantiert wurde. Dies schützt NICHT vor gleichzeitigen Schreibvorgängen aus Obsidian, von einer zweiten Serverinstanz oder durch einen git checkout im Vault.
Suche und Abruf
Die Suche führt BM25 über Abschnitte von 2–3 Überschriftsebenen aus und deckt Prosa, Tags und Überschriften mit unterschiedlichen Gewichten ab. Wenn kein Begriff der Abfrage eine Notiz trifft, versucht sie, ähnliche Begriffe vorzuschlagen (Levenshtein-Distanz ≤ 2).
Nach der reinen BM25-Suche erweitert sie um einen Wiki-Link-Hop: Nachbarn der Notizen, die getroffen haben, erben GRAPH_DAMPING mal die Punktzahl der Quelle.
Jedes Ergebnis zitiert caminho:linha (Pfad:Zeile) – das ist die tatsächliche Adresse der Notiz. Notizausschnitte werden in vault_search mit > präfixiert, um Vault-Inhalte von Serverzeilen zu unterscheiden.
Vault-Struktur
Verzeichniskonvention:
00-index/: Wissensindex und Root-MOCs01-raw/: Roherfassungen und Ausschnitte (standardmäßig von der Suche ausgeschlossen)02-wiki/: nach Domäne organisiertes Wissen (nestjs/,docker/usw.)03-projects/: Projektnotizen04-daily/: Tagesnotizen (YYYY-MM-DD.md)_templates/: Obsidian-Vorlagen (bei der Indizierung ignoriert)99-archive/: Archivierte Notizen (lesbar, nicht beschreibbar)
Bekannte Einschränkungen
Drei Dinge, die dieser Server nicht tut, jeweils bewusst gewählt und nicht übersehen:
Das Archivieren in
99-archive/verliert die— Zusammenfassungim Eintrag der Notiz in ihrem Quell-MOC.vault_moveentfernt die Zeile aus dem Ursprungs-MOC und hat kein Ziel-MOC, in das sie wieder eingefügt werden könnte, und das Archiv ist ein schreibfreier Bereich, sodass es keinen Ort gibt, um den Text abzulegen. Das Wiederherstellen erstellt einen nackten- [[slug]], nicht den Eintrag wie er war. Die Alternativen – die Zusammenfassung im Frontmatter der verschobenen Notiz zu speichern oder in einem Nebenindex – kosten beide mehr als der Verlust. Was die Operation niemals tut, ist eine Zusammenfassung zu erfinden: Ohne Ursprungszeile kommt der Eintrag kurz und wahr heraus.Ein Wiki-Link, der nur im Frontmatter existiert, wird von
vault_movenicht umgeschrieben. Kandidaten notizen werden aus dem Textkörper ausgewählt, aus dem auch der Linkgraph aufgebaut wird, sodass eine Notiz, die dieser Filter überspringt, eine Notiz ist, deren Kantenvault_backlinksebenfalls nicht hat. Die Umschreibung zu erweitern, ohne den Scanner zu erweitern, würde die schlimmere Asymmetrie erzeugen: einen korrigierten Link, den kein Lesewerkzeug sehen kann.vault_get_notegibt den Notiztext roh zurück. Das Escapen würde das Lesen-dann-Bearbeiten für genau die Notizen stillschweigend brechen, die ein Steuerzeichen enthalten, davault_edit_noteold_textals exakte Teilzeichenkette der Datei abgleicht. Die Oberflächen, die zeilenweise Angaben machen – dervault_search-Ausschnitt und der Diff – sind bereinigt.
Die sechzehn bisher aufgeworfenen Folgepunkte wurden behoben – einschließlich des aliased Frontmatters, das die
Event-Schleife für ~5 s blockierte, des harten Links, der auf dem Lesepfad indiziert wurde, und der prozessübergreifenden Schreibwettlaufsituation.
docs/followups.md führt das Protokoll: jedes Element mit der Messung, die es charakterisierte, der angewendeten
Korrektur und dem Test, der es festhält, plus die vollständige Begründung hinter jeder obigen Annahme.
Entwicklung
Nach einer Änderung am Code:
npm run build # Compiles TypeScript (src/ only, emits dist/)
npm run typecheck # tsc over src/ AND test/, without emitting
npm test # Runs the typecheck (pretest) and then the vitest suite
npm run smoke # Starts the built dist/ and demands the nine tools over stdio
npm run dev # Watch mode (if needed)Das Build-tsconfig.json deckt nur src/ ab – was emittiert wird, kompiliert keine Tests. tsconfig.test.json
deckt beide mit noEmit ab, und npm's pretest führt es vor der Suite aus: Ein Test-Fake, das nicht mehr
die Schnittstelle erfüllt, die es als implements deklariert, schlägt beim Typprüfen fehl, nicht zur Laufzeit.
Die vollständige Suite dauert ~10 s. Einige Tests verwenden FIFOs, um langlaufende Operationen zu simulieren; alle
öffnen das Schreibende selbst (withFifoWatch), sodass sie in Sekunden fehlschlagen, anstatt sich auf das Timeout des
Runners zu verlassen. npm test läuft über scripts/test.mjs, das die Suite durch die Uhr begrenzt
(15 min, VAULT_MCP_TEST_TIMEOUT_MS) und die Prozessgruppe beendet: Eine hängende Suite wird zu Exit 124,
nicht zu einem unbestimmten Stillstand ohne Exit-Code.
npm run smoke ist die Prüfung, die die Suite nicht sein kann: Sie startet das kompilierte dist/server/index.js als
Programm gegen einen Wegwerf-Vault, führt den MCP-Handshake ab und verlangt, dass tools/list mit
genau den neun Tools antwortet. Sie deckt den Einstiegspunkt ab, der entscheidet, dass es eine Bibliothek ist und nichts startet –
ein sauberer Exit 0 an eine Shell, ein ewiges Warten an einen Client – und sie macht engines.node >= 20 zu einer
verifizierten Behauptung: CI führt sie auf Node 20 sowie auf dem festgelegten 26 aus, da die Suite selbst nicht auf 20 laufen kann
(test/frontmatter.test.ts hängt vom Typ-Stripping der Laufzeit ab), während kompiliertes JavaScript es kann.
Commit-Nachrichten und die benutzerorientierten Zeichenketten des Servers selbst – Tool-Beschreibungen, Fehlermeldungen, die
Prosa in einem Diff – sind auf Portugiesisch (BR) geschrieben: Der Vault, den dieser Server bedient, ist eine portugiesischsprachige
Wissensdatenbank und sein Leser ist ein portugiesischsprachiges Modell. Code-Kommentare und Docblocks sind auf
Englisch, wobei src/index/bm25.ts aus dem ersten Durchgang auf Portugiesisch belassen wurde.
Lizenz
MIT © 2026 Andrey Mudri
Available Tools
9 toolsvault_backlinksA
Lists the notes pointing at the given note. Use it to gauge how connected a subject is, to find the MOC that indexes the note, or to weigh the impact of changing or renaming it.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Vault-relative path, with `.md`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description carries the behavioral burden. It clearly indicates a read-only listing operation, but it does not disclose the output shape, ordering, or whether only direct inbound links are returned. This is adequate for a simple tool but leaves some behavioral details unspecified.
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, purposeful sentences. The first defines the primary action, and the second adds valuable usage context without wordiness. 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?
For a single-parameter read-only tool, the description is largely complete: it states the resource, the behavior, and practical use cases. The lack of an output schema is the main gap, but the phrase 'Lists the notes' gives sufficient expectation of what the call returns for selection and invocation.
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 100%, so the schema already documents the single `path` parameter. The description only refers to 'the given note' without adding additional parameter-level detail, so the baseline 3 applies.
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: 'Lists the notes pointing at the given note.' This clearly defines the backlinks functionality and distinguishes it from siblings like vault_get_note, vault_search, and vault_list, which serve different purposes.
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 clear use cases: gauging connectedness, finding the MOC that indexes the note, and weighing the impact of changing or renaming it. It does not explicitly mention when not to use it or name alternative tools, but the context is strong enough for an agent to decide when this tool fits.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vault_deleteA
Deletes a note and commits, removing its line from the domain MOC. Refuses, without deleting, if the note has no committed version in HEAD (there would be no way to undo), if it is structural (MOC, daily note, index) or if it lives under 99-archive/. Notes pointed at by others require confirm, and the refusal lists who points at them — their links will break. The answer carries the exact command that undoes it.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Vault-relative path, with `.md`. | |
| confirm | No | Confirms deleting even with other notes pointing at this one; their links will break. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden, and it does an excellent job: it discloses that the tool commits, removes the MOC line, refuses to delete unsafe candidates, lists who points at the note, breaks links, and returns an undo command. This is exceptional behavioral transparency.
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 perfectly structured: the core action comes first, followed by refusal conditions, confirmation behavior, and the undo guarantee. Every sentence adds meaningful information with no fluff.
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, mutating tool with no annotations and no output schema, this description covers all the essential context an agent needs: side effects, refusal conditions, confirmation requirements, and even the undo command in the response. It is remarkably 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 100%, so the baseline is 3. The description does not add significant new meaning for 'path' or 'confirm' beyond what the schema already provides; it mostly restates the safety conditions rather than elaborating parameter formats or values.
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 ('Deletes a note and commits'), a resource ('note', 'domain MOC'), and a distinctive side effect (removing its line from the MOC). It also enumerates refusal conditions, so an agent can clearly tell it apart from write, edit, and move siblings.
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 concrete context for when deletion is allowed vs refused: requires a committed version in HEAD, cannot target structural notes or archive paths, and needs confirm when backlinks exist. It does not explicitly name alternatives like vault_move for archiving, so it falls just short of full guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vault_edit_noteA
Replaces ONE exact passage of an existing note and commits. Fails, without writing, if the passage does not appear or appears more than once — in that case send more context in old_text.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Vault-relative path, with `.md`. | |
| new_text | Yes | The text that takes its place. | |
| old_text | Yes | The exact passage to replace; it must be unique within the note. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the full burden and does so well. It discloses the commit side effect, the atomic failure mode ('Fails, without writing'), and the exact uniqueness condition that triggers failure. This is valuable behavioral information beyond the schema.
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?
A single dense sentence conveys the operation, constraints, failure mode, and remediation without wasted words. The most important behavioral constraint, uniqueness and no-partial-write, is front-loaded.
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 three-parameter edit tool with no output schema and no annotations, this description is complete enough for an agent to invoke it correctly: it knows what the tool edits, when it fails, and how to recover. The schema covers parameter details, and the description covers behavior and error handling.
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 schema already documents all three parameters with 100% coverage, so the baseline is 3. The description adds extra semantic guidance on old_text: it must be unique and can be expanded with more context if the initial attempt fails. This goes beyond the schema's static descriptions.
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: 'Replaces ONE exact passage of an existing note'. This clearly distinguishes it from sibling tools like vault_write_note (writing a whole note) and read/list tools, even though it does not name them explicitly.
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?
Usage is implied: use this to replace one exact passage in an existing note. The description does not explicitly contrast it with alternatives or state when not to use it, but it does provide actionable guidance on how to resolve ambiguity by sending more context in old_text.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vault_get_noteA
Reads a whole note by its vault-relative path (e.g. 02-wiki/nestjs/auth-guard.md), with frontmatter, resolved links and broken links. Use it after vault_search when the snippet is not enough, or before editing the note.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Vault-relative path, with `.md`. | |
| offset | No | First character of the BODY to return, for reading a note that did not fit in one answer. Omit it on the first call; afterwards use the offset the cut marker announces. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the burden. It marks the tool as a read operation and discloses the return payload's key components (frontmatter, resolved links, broken links). It does not mention pagination/truncation with the offset parameter, but the schema already documents that behavior.
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 sentences, front-loaded with the action and resource, followed by a workflow note. No filler; the example 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?
For a two-parameter read tool with no output schema, the description gives path format, return contents, and usage context. The offset/cut-marker behavior is captured in the parameter schema, so nothing critical is 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?
Input schema covers 100% of parameters, so the description need not add much beyond the baseline. The path example ('02-wiki/nestjs/auth-guard.md') provides helpful formatting guidance beyond the schema's 'vault-relative path'.
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?
States the exact operation ('Reads a whole note') and object (vault-relative path with example), and adds what is included (frontmatter, resolved links, broken links). This clearly separates it from the vault_search snippet behavior.
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?
Explicitly instructs to use it after vault_search when the snippet is insufficient and before editing, naming a concrete alternative and two workflow triggers. This gives an agent decision rules rather than leaving usage to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vault_learnA
Records a learning in the vault. Call it whenever something non-obvious and reusable comes up during the session — an architecture decision, a pattern, a gotcha, a configuration trap — without asking first where to save it: the server decides on its own between appending to the existing note that already covers the subject and creating a new one (the bias is to create), and propagates on its own to the domain MOC and the daily note (and to the knowledge index when the domain is new), all in a single commit. Show the returned diff to the user.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Tags for the note's frontmatter. | |
| links | No | Related wiki-links, without the brackets. | |
| titulo | Yes | Short title for the learning; it becomes the filename. | |
| dominio | Yes | Domain under `02-wiki/`, e.g. nestjs, docker, patterns. A new domain requires confirm_novo_dominio. | |
| insight | Yes | The learning itself, in markdown. | |
| projeto | No | Name of the project under `03-projects/` this learning belongs to; it goes into the daily note's capture line. | |
| contexto | Yes | Where and why this came up. | |
| confirm_novo_dominio | No | Confirms creating a domain that does not yet exist under `02-wiki/`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the full burden of behavioral disclosure and delivers it: server-side routing between append and create, propagation to domain MOC, daily note, and knowledge index for new domains, atomicity ('all in a single commit'), and the returned diff to show the user. This reveals side effects and internal logic that neither the name nor the schema conveys.
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 core action is front-loaded ('Records a learning in the vault') followed by usage triggers, routing behavior, propagation, and return handling. Every clause earns its place and nothing is wasted, though the single run-on sentence with nested dashes and parentheticals is harder to parse than shorter sentences would be.
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 tool with no annotations and no output schema, the description covers purpose, when to call, routing decision, multi-target side effects, atomicity, and the diff return — nearly everything an agent needs. The main gaps are not mentioning the new-domain confirmation flow behind confirm_novo_dominio and not describing failure or error behavior, which is minor against the overall complexity.
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 100%, so the baseline of 3 applies. The description adds modest extra color by tying the domain parameter to propagation behavior (knowledge index for new domains), but it does not need to compensate for missing schema text and does not explain individual parameter syntax beyond it.
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?
States a specific verb and resource — 'Records a learning in the vault' — with concrete examples of what counts (architecture decision, pattern, gotcha, configuration trap). The auto-routing behavior ('the server decides on its own... the bias is to create') clearly distinguishes it from the write/edit siblings, so an agent can tell them apart.
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?
Gives explicit trigger conditions: 'Call it whenever something non-obvious and reusable comes up' plus concrete scenarios, and instructs the agent not to ask where to save. However, it never names alternatives (e.g., vault_write_note, vault_edit_note) or states when not to use this tool, so the exclusion side is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vault_listA
Lists notes by metadata — tipo, tags, status, folder — without looking at content. Use it for inventory ("which projects are active?", "which notes carry the jwt tag?"), not to search by subject: for subject use vault_search.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Every one of these tags must be on the note. | |
| tipo | No | Frontmatter `tipo`: wiki, moc, projeto, daily. | |
| folder | No | Vault folder, matched on a segment boundary. | |
| status | No | Frontmatter `status`, e.g. ativo, pausado. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the behavioral burden. It adds useful context by disclosing that the tool filters by metadata and ignores content, but it does not describe return shape, pagination, ordering, or any side effects. 'Lists' implies read-only behavior, but that is not stated explicitly.
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 sentences with no filler. The core behavior is front-loaded, the metadata filter types are listed, and the exclusion/alternative is given in the second 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?
For a filtered-list tool with four optional, well-documented parameters, the description gives enough context for an agent to call it correctly. The absence of an output schema leaves some ambiguity about what fields are returned, but the primary decision of when to use vault_list versus vault_search is fully covered.
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 100%, so each parameter already has a clear description in the schema. The tool description reinforces that these are metadata filters but adds no new meaning beyond what the schema provides, so the baseline of 3 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?
States a specific verb ('Lists') and resource ('notes by metadata'), and explicitly clarifies it does not look at content. It distinguishes itself from vault_search by name, so an agent can tell the two tools apart immediately.
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 via inventory examples and directly says 'not to search by subject: for subject use vault_search.' This clearly routes the agent to the correct sibling tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vault_moveA
Moves, renames, promotes or archives a note, fixing on its own every link that would otherwise start pointing somewhere else, migrating its entry between domain MOCs and committing it all at once. to is the full path with .md, so the four operations are one: 01-raw/inbox/rascunho.md → 02-wiki/nestjs/auth-guard.md promotes, renames and changes domain together. 99-archive/ counts as BOTH source and destination, which gives you archive and unarchive. A destination domain with no MOC requires confirm_novo_dominio. Show the returned diff to the user.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Full destination path, vault-relative, with `.md`. Moving, renaming and promoting are the same operation. | |
| from | Yes | The note's current vault-relative path, with `.md`. | |
| confirm_novo_dominio | No | Confirms creating the MOC of a destination domain that does not have one yet. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does it well: it discloses automatic link fixing, MOC migration, atomic commit behavior, confirmation requirements for new domains, and that a diff is returned. This goes well beyond the bare move/rename semantics and gives an agent a realistic model of the tool's effects.
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: it defines the operation, clarifies path semantics with a concrete example, explains the archive special case, and states the confirmation requirement. The most important behavioral fact (link fixing) is front-loaded.
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 complex multi-purpose tool with no output schema and no annotations, the description is remarkably complete. It covers the input semantics, the domain-MOC behavior, the archive/unarchive case, the confirmation flow, and the expected user-facing output. An agent has enough to call it correctly in most scenarios.
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 coverage is 100%, so the baseline is a 3. The description adds real value by explaining how 'to' encodes the operation kind, that 99-archive can be both source and destination for archive/unarchive, and when confirm_novo_dominio is required. This enriches the schema descriptions without repeating them.
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 set ('Moves, renames, promotes or archives a note') and precisely identifies the resource (a vault note) and the core side effect (fixing every link). It distinguishes itself from siblings like vault_edit_note and vault_delete by explaining the unified path-based operation with domain MOC migration.
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 implies when to use the tool: for any move/rename/promote/archive operation that should stay link-consistent. It gives concrete path examples and explains special cases like 99-archive and confirm_novo_dominio. However, it never explicitly states when NOT to use it or names alternatives like vault_edit_note for content-only edits.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vault_searchA
Lexical-semantic search over the vault (BM25 plus one wiki-link hop). Call it before answering any question about the user's decisions, patterns, gotchas or history, and before recording a new learning. Returns snippets already cited as path:line — repeat that citation in your answer. Notes under 01-raw/ are excluded unless include_raw.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Filters by frontmatter tags. A note must carry ALL of them; case does not matter. | |
| tipo | No | Filter by the frontmatter `tipo`: wiki, moc, projeto, daily. | |
| limit | No | Maximum snippets returned (default 6). | |
| query | Yes | Search terms in natural language. | |
| folder | No | Restrict to a vault folder, e.g. `02-wiki/nestjs`. | |
| status | No | Filters by the frontmatter `status`, e.g. `ativo`. | |
| include_raw | No | Include `01-raw/` (unvetted capture), left out of results by default. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it discloses the key behavioral traits: search quality, exclusion of 01-raw notes unless include_raw, and the path:line citation format. It does not need to discuss side effects because the tool name clearly indicates a read-only search operation.
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 compact and front-loaded: purpose first, then usage, then output behavior, then the raw-notes exception. Every sentence conveys a distinct, necessary piece of 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?
Given the 7-parameter schema, the absence of annotations, and the absence of an output schema, the description covers what the agent needs most: when to use the tool, how results are formatted, and the one non-obvious inclusion/exclusion rule. The remaining parameter details are fully handled by the schema.
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 100%, so all seven parameters are already documented in the input schema. The description only restates the include_raw behavior, which is already expressed in the schema, so it adds no meaningful semantic value beyond what the agent already has.
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 defines the tool as a vault-wide lexical-semantic search using BM25 plus one wiki-link hop, which is specific and immediately distinguishes it from sibling tools like vault_list and vault_backlinks. It states the verb, resource, and retrieval behavior without ambiguity.
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 explicit instructions on when to call it: before answering questions about the user's decisions, patterns, gotchas, or history, and before recording new learnings. It does not explicitly state when not to use it or name an alternative tool, but the context is clear enough for correct routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vault_write_noteA
Creates or replaces a whole note, with frontmatter guaranteed, and commits it to the vault's git. It replaces the entire file: to change one passage use vault_edit_note, and to record a learning use vault_learn, which picks the destination and propagates on its own.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Vault-relative path, with `.md`. | |
| content | Yes | The note's markdown body, without the frontmatter block. | |
| frontmatter | No | Frontmatter fields, e.g. `{ "tipo": "wiki", "tags": ["jwt"] }`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden — and it delivers. It discloses that the tool replaces the entire file (destructive), commits to the vault's git (side effect), and guarantees a frontmatter block (behavioral guarantee). This is exactly the kind of context an agent needs before calling a write tool.
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 sentences with the core behavior front-loaded and the caveat plus alternatives in the second. Minor redundancy exists between 'Creates or replaces a whole note' and 'It replaces the entire file,' but the former sets scope while the latter emphasizes destructiveness, so each clause 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?
For a write tool with no output schema and no annotations, it covers the essentials: operation, destructive scope, git-commit side effect, frontmatter handling, and sibling routing. The one gap is that it never describes the return value or confirmation behavior on success, which would be valuable given there is no output schema. Otherwise an agent has everything needed to call it 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?
Schema description coverage is 100%, so path, content, and frontmatter are already fully documented. The description adds marginal value with 'frontmatter guaranteed' (clarifying the caller avoids the frontmatter block in content), but provides no extra format or syntax details. Baseline 3 is appropriate since the schema does the heavy lifting.
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?
States a specific verb ('Creates or replaces'), a clear resource (a whole note), and unique scope: it replaces the entire file while guaranteeing a frontmatter block. It also names sibling tools vault_edit_note and vault_learn as the tools for different jobs, so an agent can distinguish it without opening 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?
Explicitly routes away from this tool: 'to change one passage use vault_edit_note' and 'to record a learning use vault_learn' with the reasoning that vault_learn picks the destination and propagates on its own. The whole-file vs one-passage distinction gives a clear decision rule for when to use vault_write_note instead.
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.
9 tool updates
v0.3.0- First observed
vault_backlinks - First observed
vault_delete - First observed
vault_edit_note - First observed
vault_get_note - First observed
vault_learn - First observed
vault_list - First observed
vault_move - First observed
vault_search - First observed
vault_write_note
TDQS
Scored across 9 tools
Each tool targets a distinct operation: search, list metadata, read note, backlinks, whole-file write, passage edit, automatic learning, move, and delete. The descriptions explicitly contrast overlapping-sounding tools (vault_write_note vs vault_edit_note vs vault_learn; vault_search vs vault_list), leaving little room for misselection.
All tools share the vault_ prefix and snake_case, and most follow a verb_noun shape like vault_get_note, vault_write_note, and vault_edit_note. A few names are bare verbs or nouns without an explicit object (vault_search, vault_learn, vault_backlinks), but the pattern is still predictable and readable.
Nine tools is well-scoped for a knowledge vault server: there is a clear placement for reading, searching, listing, writing, editing, learning, moving, and deleting notes. Each tool earns its place and none is redundant.
The tool set covers the full note lifecycle — discovery, retrieval, creation, editing, deletion, and move/rename — plus vault-specific needs like backlinks, link fixing, MOC propagation, and git commits. No critical dead ends are obvious from the described surface.
Maintenance
Related MCP Connectors
Persistent memory and knowledge management for AI agents with semantic search and 50+ tools.
Shared memory for coding agents. Stop re-explaining your codebase every session.
Connect AI assistants to your GitHub-hosted Obsidian vault to seamlessly access, search, and analy…
Token-efficient MCP memory for Markdown vaults. Tiered search, GraphRAG, AI memories.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to maintain a structured Markdown or Obsidian memory vault with tools for reading, writing, searching, and organizing notes.MIT
- AlicenseAqualityCmaintenanceProvides AI agents with direct filesystem access to an Obsidian vault for note management, task orchestration, context persistence, and git synchronization.2786 npm3MIT
- AlicenseAqualityBmaintenanceEnables AI agents to use Obsidian vaults as persistent, bidirectional knowledge workspaces with wikilink/backlink resolution, structured frontmatter/tag indexing, task aggregation, and Obsidian Headless Sync.11MIT
- AlicenseNot gradedqualityBmaintenanceEnables agents to search, read, and write notes in an Obsidian vault, including creating and updating notes in an inbox and syncing changes with Gitea/GitHub.MIT