Skip to main content
Glama

vault-mcp

Englisch | Português

CI npm

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 test
  • Node >= 20, um den Server AUSZUFÜHREN (dist/ ist reines JavaScript), bei jedem Push durch den compat-CI-Job verifiziert, der auf 20 baut und einen Smoke-Start macht

  • Die Suite zu starten braucht mehr: test/frontmatter.test.ts führt das echte parseFile in einem Kindprozess aus, der auf eine Zeitzone gepinnt ist, und dieses Kind ist node <file>.ts — es hängt von Nodes eigenem Type-Stripping ab. CI pinnt 26, die Version, auf der entwickelt wird

  • Die Suite hat 19 Dateien mit 1.155 Tests und dauert ~10 s. npm test fü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-mcp

Aus einem Klon dasselbe ohne die Registry:

VAULT_PATH="/absolute/path/to/vault" node /absolute/path/to/vault-mcp/dist/server/index.js

Ersetze /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-mcp

Aus 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 push ohne Refspec, dem Upstream des Branches folgend: Ein Repository, das nicht konfiguriert wurde, sagt das, statt dass ihm ein Remote und ein Branch geraten werden

  • es 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 wurde

  • ein 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 Beispiel gh auth git-credential) oder von einem SSH-Key

Die neun Tools

Tool

Input

Wann aufrufen

vault_search

query (erforderlich); limit, tipo, folder, include_raw (optional)

Vor der Beantwortung von Fragen zu Entscheidungen, Mustern, Stolperfallen oder Verlauf des Benutzers. Standardergebnis: 6 Ausschnitte. Notizen in 01-raw/ sind standardmäßig ausgeschlossen.

vault_get_note

path (relativer Pfad, z. B. 02-wiki/nestjs/auth-guard.md)

Nach vault_search, wenn der Ausschnitt nicht ausreicht, oder vor dem Bearbeiten einer Notiz. Gibt die Notiz mit Frontmatter, aufgelösten Links und defekten Links zurück. Der Textkörper ist auf 20.000 Zeichen begrenzt; größere Notizen werden mit […nota cortada em 20000 caracteres] markiert.

vault_list

tipo, tags, status, folder (alle optional)

Inventar von Notizen nach Metadaten (z. B. „welche Projekte sind aktiv?“, „welche Notizen tragen das jwt-Tag?“). Durchsucht keinen Inhalt – verwenden Sie dafür vault_search.

vault_backlinks

path (relativer Pfad)

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.

vault_write_note

path, content (erforderlich); frontmatter (optional)

Erstellt oder ersetzt eine ganze Notiz. Frontmatter ist garantiert. Committet automatisch. Um eine Passage zu ändern, verwenden Sie vault_edit_note; um eine Erkenntnis festzuhalten, verwenden Sie vault_learn.

vault_edit_note

path, old_text, new_text (erforderlich)

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 old_text angeben.

vault_learn

titulo, insight, contexto, dominio (erforderlich); projeto, tags, links, confirm_novo_dominio (optional)

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 02-wiki/ existiert, schlägt der Aufruf fehl; verwenden Sie confirm_novo_dominio: true, um sie zu erstellen.

vault_move

from, to (erforderlich); confirm_novo_dominio (optional)

Verschieben, umbenennen, aus 01-raw/ befördern oder in 99-archive/ archivieren – alle vier sind derselbe Aufruf, weil to der vollständige Pfad ist. Korrigiert von selbst jeden Link, der auf eine andere Notiz zeigen würde, migriert den Eintrag zwischen Domänen-MOCs unter Beibehaltung seines — resumo und committet alles zusammen. 99-archive/ zählt als Quelle und als Ziel, was Archivieren und Wiederherstellen ermöglicht. Ein Ziel-MOC, der nicht existiert, erfordert confirm_novo_dominio: true. Die Tagesnotiz wird nie angefasst.

vault_delete

path (erforderlich); confirm (optional)

Löscht eine Notiz und entfernt ihre Zeile aus der MOC. Verweigert ohne Löschen, wenn die Notiz keine committete Version in HEAD hat – es gäbe kein Zurück –, wenn sie strukturell ist (MOC, Tagesnotiz, Index) oder wenn sie in 99-archive/ liegt. Notizen, auf die andere verweisen, erfordern confirm: true, und die Verweigerung listet auf, wer darauf verweist. Die Antwort enthält den genauen Befehl, der es rückgängig macht.

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

  2. 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:

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

  2. 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.md statt multi-stage.md) und warnt não foi possível anexar em <path>; aprendizado gravado em <outro-path>. Die Warnung nennt den genauen Pfad, in den die Erkenntnis geschrieben wurde.

  3. 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}:

  1. Die Notiz (02-wiki/<dominio>/<slug>.md): erstellt oder mit angehängter Erkenntnis. Wird immer geschrieben.

  2. Die Domänen-MOC (02-wiki/<dominio>/<dominio>-moc.md): wird erstellt, wenn sie nicht existiert. Wird bei jedem Aufruf mit atualizado: aktualisiert; mit einer Zeile - [[<slug>]] — <resumo> nur, wenn die Notiz neu ist. Wird nur geschrieben, wenn sich der Inhalt ändert.

  3. Wissensindex (00-index/index-knowledge.md): wird NUR aktualisiert, wenn die Domäne vorher nicht existierte. Wird nur geschrieben, wenn sich der Inhalt ändert.

  4. 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. In test/bm25.test.ts festgelegt.

  • 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 in test/bm25.test.ts:370-374 festgelegt; test/golden-queries.test.ts und test/retrieval.test.ts schlagen 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. In test/retrieval.test.ts:522 festgelegt.

  • K1 und B (src/index/bm25.ts): 1.2 und 0.75. BM25-Parameter. In test/bm25.test.ts:232-233 festgelegt.

  • DUPLICATE_SCORE_RATIO (src/write/learn.ts): 1.8. Mindestverhältnis zwischen Top-Treffer und Zweitplatziertem für einen Anhang. In test/learn.test.ts:336 festgelegt.

Ausführen der vollständigen Testsuite:

npm test

Sicherheitsgarantien

Schreibvorgänge werden verweigert für:

  • Pfade außerhalb des Vaults

  • Pfade in .git/, .obsidian/, node_modules/, _templates/ und 99-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-MOCs

  • 01-raw/: Roherfassungen und Ausschnitte (standardmäßig von der Suche ausgeschlossen)

  • 02-wiki/: nach Domäne organisiertes Wissen (nestjs/, docker/ usw.)

  • 03-projects/: Projektnotizen

  • 04-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 — Zusammenfassung im Eintrag der Notiz in ihrem Quell-MOC. vault_move entfernt 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_move nicht 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 Kanten vault_backlinks ebenfalls 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_note gibt den Notiztext roh zurück. Das Escapen würde das Lesen-dann-Bearbeiten für genau die Notizen stillschweigend brechen, die ein Steuerzeichen enthalten, da vault_edit_note old_text als exakte Teilzeichenkette der Datei abgleicht. Die Oberflächen, die zeilenweise Angaben machen – der vault_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

A
license - permissive license
Not graded
quality - not tested
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

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

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Provides AI agents with direct filesystem access to an Obsidian vault for note management, task orchestration, context persistence, and git synchronization.
    67
    1
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Provides a durable, Obsidian-compatible knowledge base for agents using markdown notes and wikilinks. Enables agents to store, retrieve, and interlink knowledge persistently, with tools for writing, searching, and managing a graph of notes.
    1
    MIT

View all related MCP servers

Related MCP Connectors

  • Persistent memory and knowledge management for AI agents with semantic search and 50+ tools.

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

View all MCP Connectors

Latest Blog Posts

MCP directory API

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

curl -X GET 'https://glama.ai/api/mcp/v1/servers/andreymudri/vault-mcp'

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