Skip to main content
Glama

vault-mcp

英語 | ポルトガル語

CI npm

コーディングエージェントのための長期記憶:回答する前にObsidianボールトを検索し、path:lineを引用し、どこに保存するかを尋ねずに学んだことを記録します。

Obsidianナレッジボールトを検索・読み取り・書き込みするためのMCPサーバー。語彙BM25と1ホップのwikiリンクによる検索。新しいノートを作成するか既存のノートに追記するかを決定する学習のインテリジェントなキャプチャ。ドメインMOCとデイリーノートへの自動伝播、およびドメインが新しい場合のナレッジインデックスへの自動伝播。ノートの移動、名前変更、昇格、アーカイブ、削除もサーバーを通じて行われるため、リンクとMOCエントリは静かに腐ることなく正しく保たれます。

Example

このプロジェクトを定義する2つのツールからの実際の出力で、このリポジトリのテストボールトに対して実行されたものです。

サーバーはポルトガル語で応答します。提供するボールトはポルトガル語で書かれており、ツールの応答も同様です。以下の出力はそのままのもので、翻訳されていません。

vault_search は、すでにアドレス指定されたスニペットを返します — caminho:linha(path:line)は、エージェントが引用するように指示されているものです。

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 はクエリ内のどの用語にも一致しません。一致したノートから 1ホップのwikiリンク によって引き込まれ、スコアが減衰されます — それが via grafo(グラフ経由)が示すものです。

vault_learn は、ノートを作成するか既存のノートに追記するかを独自に決定し、最大4つのファイルを書き込み、1回 コミットします。

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)

4つのファイル、1つの docs(vault): {titulo} コミット — 学習全体を元に戻すには、そのコミットに対して git revert を実行します。concorrencia ドメインは存在しなかったため、呼び出しに confirm_novo_dominio: true が含まれ、MOCはゼロから構築され、ナレッジインデックスにそれを指す行が追加されました。

Related MCP server: mcp-obsidian-vault

Installation

@andreymudri/vault-mcp として公開されているため、実行するためにクローンする必要はありません。

npx @andreymudri/vault-mcp        # no install; npm fetches and runs it
npm i -g @andreymudri/vault-mcp   # or install once, then `vault-mcp`

スコープは飾りではありません。npm上の裸の vault-mcp は別の作者による443バイトの名前空間プレースホルダーであり、npx vault-mcp はこのパッケージではなくそのパッケージを実行します。スコープ内のコマンドは短い名前を維持します — npx @andreymudri/vault-mcp はパッケージ内から bin を解決します。

クローンから開発するには:

npm install
npm run build
npm test
  • Node >= 20 でサーバーを実行します(dist/ はプレーンなJavaScriptです)。compat CIジョブが毎プッシュで検証し、20でビルドしてスモークスタートします。

  • スイートの実行にはそれ以上が必要です: test/frontmatter.test.ts は、タイムゾーンに固定された子プロセスで実際の parseFile を実行し、その子は node <file>.ts です — Node自身の型ストリッピングに依存しています。CIは26に固定されており、これは開発されているバージョンです。

  • スイートは19ファイル、1,155テストで、約10秒かかります。npm test は最初に型チェック(pretest)を実行し、スイートを時計で制限します:ハングしたスイートは終了コード124で終了し、終了コードなしになることはありません。

Configuration

ボールトは環境変数を介して渡されます:

VAULT_PATH="/absolute/path/to/vault" npx @andreymudri/vault-mcp

クローンからは、レジストリなしで同じことを行います:

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

/absolute/path/to/vault をボールトのルートに置き換えてください。VAULT_PATH は必須です。設定されていない場合、またはディレクトリでない場合、サーバーはコード1で終了し、理由をstderrに書き込みます。

Registering with Claude Code

MCPを追加するには:

claude mcp add vault --scope user \
  -e "VAULT_PATH=/absolute/path/to/vault" \
  -e "VAULT_AUTO_PUSH=1" -- \
  npx -y @andreymudri/vault-mcp

クローンからは、代わりに -- の後に node /absolute/path/to/vault-mcp/dist/server/index.js を置きます。

ボールトのパスは絶対パスであり、-e に単一の KEY=value ペアとして入れます — ペア全体を引用符で囲むことで、パスにスペースを含むボールトが機能します。JSONでは変数展開がないため、相対パスはサーバーが起動しない原因になります。npx の -y はstdioサーバーにとって重要です:これがないと、初回実行時に誰も見ていないターミナルでインストールプロンプトで停止する可能性があります。

--scope user は ~/.claude.json に登録され、すべてのプロジェクトでツールを利用可能にします。これがポイントです:別のリポジトリで作業中にボールトが決定やパターンについて回答します。フラグがない場合のデフォルトは local(現在のディレクトリのみ)です。claude mcp get vault で確認し、削除するには claude mcp remove vault -s user を使用します。

VAULT_AUTO_PUSH

すべての書き込み(vault_write_note、vault_edit_note、vault_learn、vault_move、vault_delete)はすでにボールトのgitにコミットします。VAULT_AUTO_PUSH=1 はコミット後に git push を追加します — これがないとコミットはマシン上にのみ残り、リモートを複数の場所に保持しているボールトは静かに分岐します。

デフォルトではオフです。これはこのサーバーがマシンの外に出る唯一の操作だからです。オンにすると:

  • git push をrefspecなしで実行し、ブランチの上流に従います:設定されていないリポジトリは、リモートとブランチを推測される代わりにその旨を伝えます。

  • 失敗は常に警告として扱われ、ロールバックにはなりません。 ノートはすでにディスク上にありコミットされています。ネットワークがダウンしたからといってそれを元に戻すのは、利用可能な最悪のトレードオフです。ツールの応答には Push: sim|não 行が追加され、これは実際にプッシュが試行された場合にのみ表示されます。

  • 先行したリモートは自動では解決されません。 プル、リベース、マージはユーザーのナレッジベースを書き換えるため、それはユーザーの決定です — 1つのノートを保存する副作用ではありません。警告は状況を明示して停止します。

  • 30秒に制限され、GIT_TERMINAL_PROMPT=0 が設定されます:stdioサーバーには資格情報プロンプトに応答するターミナルがないため、プロンプトはハングになります。資格情報はヘルパー(例:gh auth git-credential)またはSSHキーから取得する必要があります。

The Nine Tools

ツール

入力

呼び出すタイミング

vault_search

query(必須); limit、tipo、folder、include_raw(任意)

ユーザーの決定、パターン、落とし穴、履歴について回答する前に。デフォルトの結果: スニペット6件。01-raw/ 内のノートはデフォルトで除外。

vault_get_note

path(相対パス、例: 02-wiki/nestjs/auth-guard.md)

vault_search の後に、スニペットでは不十分な場合、またはノートを編集する前に。フロントマター、解決済みリンク、壊れたリンクを含むノートを返す。本文は20,000文字に制限され、より大きなノートには […nota cortada em 20000 caracteres] とマークされる。

vault_list

tipo、tags、status、folder(すべて任意)

メタデータによるノートの一覧(例: 「どのプロジェクトがアクティブか?」「jwt タグが付いたノートはどれか?」)。コンテンツは検索しない — その場合は vault_search を使用。

vault_backlinks

path(相対パス)

主題のつながりの強さを測り、ノートを索引付けする MOC を見つけ、変更の影響を評価する。リンクは重複排除される: 対象を2回リンクするノートは1つのバックリンクとして数えられる。

vault_write_note

path、content(必須); frontmatter(任意)

ノート全体を作成または置換する。フロントマターは保証される。自動的にコミットされる。一節を変更するには vault_edit_note を使用; 学びを記録するには vault_learn を使用。

vault_edit_note

path、old_text、new_text(必須)

ノートの正確な一節を置換する。その一節が存在しない場合や複数回出現する場合は失敗する — その場合は old_text により多くの文脈を含める。

vault_learn

titulo、insight、contexto、dominio(必須); projeto、tags、links、confirm_novo_dominio(任意)

セッション中の学び(アーキテクチャ決定、パターン、落とし穴、罠)を記録する。保存先を尋ねない — サーバーが決定する。差分をユーザーに表示する。ドメインが 02-wiki/ に存在しない場合、呼び出しは失敗する; 作成するには confirm_novo_dominio: true を使用。

vault_move

from、to(必須); confirm_novo_dominio(任意)

移動、名前変更、01-raw/ からの昇格、99-archive/ へのアーカイブ — 4つすべてが同じ呼び出し。なぜなら to が完全なパスだから。別のノートを指すことになるすべてのリンクを自動的に修正し、ドメイン MOC 間のエントリを — resumo を保持したまま移行し、すべてをまとめてコミットする。99-archive/ は送信元かつ宛先として数えられる。これがアーカイブとアーカイブ解除を可能にする。存在しない宛先 MOC には confirm_novo_dominio: true が必要。 デイリーノートは決して触れられない。

vault_delete

path(必須); confirm(任意)

ノートを削除し、MOC からその行を削除する。ノートに HEAD 内のコミット済みバージョンがない場合 — 戻る手段がなくなるため —、構造的なノート(MOC、デイリーノート、インデックス)の場合、または 99-archive/ 内にある場合は、削除せずに拒否する。他のノートから参照されているノートには confirm: true が必要で、拒否時には誰が参照しているかを列挙する。回答にはそれを元に戻す正確なコマンドが含まれる。

vault_learn の決定方法

vault_learn はタイトルとインサイトを組み合わせて主題を検索する。すでに 02-wiki/ にあり、直接の BM25 で到達した(グラフ展開ではない)ノートのみが学びを受け取る候補となる。そのような候補が見つかった場合:

  1. 1.8倍の比率: 最上位のヒットは2位に対して少なくとも1.8倍の差をつけなければならない。その差がなければ疑念が残るため、新しいノートを作成する。

  2. 論理積の重なり: 最上位のヒットは入力とタグを共有しているか、同じドメイン(02-wiki/<dominio>/)にある必要がある。重なりがなければ、スコアが高くても新しいノートを作成する。

両方の条件が満たされた場合、既存のノートの ## YYYY-MM-DD — Title セクションの下に追記する。それ以外の場合は 02-wiki/<dominio>/ に新しいノートを作成する。

この偏りは意図的である: 疑わしい場合は、学びを間違った場所に埋めるのではなく、新しいノートを作成する。後でノートを統合することは常に可能だが、失われた学びを回復することはできない。

逃げ道

最終的な保存先を変更できる例外が3つある:

  1. タイトルの衝突: 重複ルールは「いいえ」と言うが、その名前のファイルがすでに存在する(同じスラッグを持つ古いノート)。サーバーはとにかくそれに追記し、anexado em <path> por coincidência de título; a checagem de duplicata não indicou essa nota と警告する。これにより、失われたノートが蓄積フローに戻る。

  2. 重複対象がテキストを受け取れない: サーバーが候補ノートに追記することを決定したが、編集できない。サーバーはスラッグから派生した名前で新しいノートを作成し(例: multi-stage.md の代わりに multi-stage-cache-de-camadas.md)、não foi possível anexar em <path>; aprendizado gravado em <outro-path> と警告する。警告は学びが書き込まれた正確なパスを指定する。

  3. ノートのパスが非ノートによってブロックされている: ノートが作成されるはずのパス(例: 02-wiki/docker/titulo.md)が FIFO、シンボリックリンク、ディレクトリ、ハードリンク(上書きできないもの)によって占有されている。サーバーは日付サフィックス付きの新しいノートを作成し(例: titulo-2026-08-25.md)、<path> não é uma nota (link, diretório ou dispositivo); aprendizado gravado em <outro-path> と警告する。警告は学びが書き込まれた正確なパスを指定する。

いずれの場合も、インサイトは失われない — 応答は学びがどこに保存されたかを正確に示す。

vault_learn が書き込むもの

vault_learn の1回の呼び出しで最大4つのファイルに触れることができ、すべて単一のコミットでメッセージ docs(vault): {titulo} とともに行われる:

  1. ノート(02-wiki/<dominio>/<slug>.md): 作成されるか、学びが追記される。常に書き込まれる。

  2. ドメイン MOC(02-wiki/<dominio>/<dominio>-moc.md): 存在しない場合は作成される。呼び出しのたびに atualizado: で更新される。ノートが新しい場合のみ - [[<slug>]] — <resumo> 行が追加される。コンテンツが変更された場合のみ書き込まれる。

  3. ナレッジインデックス(00-index/index-knowledge.md): ドメインが以前存在しなかった場合にのみ更新される。コンテンツが変更された場合のみ書き込まれる。

  4. デイリーノート(04-daily/YYYY-MM-DD.md): 存在しない場合は作成される。キャプチャ - HH:MM [[<slug>]] (<tipo>, <projeto>) がまだ存在しない場合のみ更新される。コンテンツが変更された場合のみ書き込まれる。

すべてのファイルはアトミックに書き込まれる。伝播が失敗した場合(例: ディスク容量不足)、ファイルはディスク上に残り、応答には更新されなかった対象を指定する警告が含まれる。git コミットが失敗した場合(例: リポジトリが存在しない)、ファイルはディスク上に書き込まれたまま残り、応答には警告が含まれる。

学び全体を元に戻すには:

git revert <commit-hash>

ランキングの調整

以下のパラメータの変更はすべて、完全なスイート npm test に合格する必要がある。各定数は特定の場所に固定されている:

  • FIELD_WEIGHTS(src/index/inverted-index.ts):heading: 3.0, tags: 2.0, prose: 1.0, code: 0.5。各フィールドの頻度に対する重み。test/bm25.test.ts で固定されている。

  • NOTE_TYPE_WEIGHTS(src/index/inverted-index.ts):moc: 0.3, daily: 0.3。MOC またはデイリーノートの最終スコアに乗算される。この係数があるのは、それらのノートが短いチャンクにわたってクエリを繰り返すためであり、係数がないと MOC がそのノートが指すノートを上回ってしまう。test/bm25.test.ts:370-374 のリテラルアサーションで固定されている。test/golden-queries.test.ts と test/retrieval.test.ts は、削除された場合にのみ失敗し、再調整された場合には失敗しない。

  • GRAPH_DAMPING(src/retrieval/budget.ts):0.4。グラフ隣接ノート(リンクされたノート)のスコアに乗算される。1ホップであり、複数ホップではない。test/retrieval.test.ts:522 で固定されている。

  • K1 と B(src/index/bm25.ts):1.2 と 0.75。BM25 パラメータ。test/bm25.test.ts:232-233 で固定されている。

  • DUPLICATE_SCORE_RATIO(src/write/learn.ts):1.8。追記を行うための最上位ヒットと次点の最小比率。test/learn.test.ts:336 で固定されている。

フルスイートの実行:

npm test

セキュリティ保証

以下のパスへの書き込みは拒否される:

  • ボールト外のパス

  • .git/、.obsidian/、node_modules/、_templates/、99-archive/ 内のパス

  • シンボリックリンク(書き込み前に解決される)

  • ハードリンク

単一のサーバーインスタンス内では、2つの同時 vault_learn または vault_write_note 呼び出しはそもそもインターリーブしない。各書き込みは前の書き込みの完了を待つ。書き込みがハングした場合(例:git がブロックされた場合)、60秒のタイムアウトは呼び出し元ではなく次の書き込みのためにキューを解放する — 先の呼び出しは実際の結果を待ち続ける。次の書き込みが開始されると、両方が実行中になる可能性があり、呼び出しは排他性が保証されなかったという警告を受け取る。これは、Obsidian からの同時書き込み、2番目のサーバーインスタンスからの書き込み、またはボールト内の git checkout からの書き込みに対しては保護されない。

検索と取得

検索は、2〜3レベルの見出しのチャンクに対して BM25 を実行し、散文、タグ、見出しを異なる重みでカバーする。クエリのどの用語もどのノートにもヒットしない場合、類似用語の提案を試みる(レーベンシュタイン距離 ≤ 2)。

純粋な BM25 検索の後、1ホップの wiki リンクで展開する:ヒットしたノートの隣接ノートは、ソースのスコアに GRAPH_DAMPING を乗算した値を継承する。

すべての結果は caminho:linha(パス:行)を引用する — これがノートの実際のアドレスである。ノートのスニペットには vault_search で > がプレフィックスされ、ボールトのコンテンツとサーバーの行を区別する。

ボールト構造

ディレクトリ規約:

  • 00-index/:ナレッジインデックスとルート MOC

  • 01-raw/:生のキャプチャとクリッピング(デフォルトで検索から除外)

  • 02-wiki/:ドメインごとに整理された知識(nestjs/、docker/ など)

  • 03-projects/:プロジェクトノート

  • 04-daily/:デイリーノート(YYYY-MM-DD.md)

  • _templates/:Obsidian テンプレート(インデックス作成から無視)

  • 99-archive/:アーカイブされたノート(読み取り可能、書き込み不可)

既知の制限

このサーバーが行わない3つのこと。それぞれ見落としではなく選択されたもの:

  • 99-archive/ へのアーカイブは、ソース MOC 内のノートのエントリから — summary を失う。 vault_move は元の MOC から行を削除し、再挿入するための宛先 MOC を持たず、 アーカイブは書き込み禁止領域であるため、テキストを置く場所がない。アーカイブ解除は 元のエントリではなく、素の - [[slug]] を再作成する。代替案 — 移動したノート自身の frontmatter にサマリーを格納するか、サイドインデックスに格納するか — はどちらも損失以上のコストがかかる。 この操作が決して行わないのは、サマリーをでっち上げることである:元の行がない場合、 エントリは短く真実のまま出力される。

  • frontmatter にのみ存在する wiki リンクは、vault_move によって書き換えられない。 候補 ノートは本文から選択され、リンクグラフもそこから構築されるため、このフィルタが スキップするノートは、vault_backlinks もエッジを持たないノートである。スキャナを 広げずに書き換えを広げると、より悪い非対称性が生じる:どの読み取りツールも 見ることのできない修正済みリンク。

  • vault_get_note はノート本文を生のまま返す。 エスケープすると、制御文字を含む まさにそのノートに対して読み取り後の編集が静かに壊れる。なぜなら vault_edit_note は old_text をファイルの正確な部分文字列として照合するからである。行単位の主張を行う サーフェス — vault_search のスニペットと diff — はサニタイズされる。

これまでに提起された16のフォローアップはすべて修正された — イベントループを約5秒間ブロックした エイリアス付き frontmatter、読み取りパスでインデックス化されたハードリンク、クロスプロセスの 書き込み競合を含む。docs/followups.md が記録を保持している:各項目について、それを特徴づけた 測定値、適用された修正、それを固定するテスト、および上記の各受け入れ判断の完全な根拠。

開発

コードの変更後:

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)

ビルドの tsconfig.json は src/ のみをカバーする — 出力されるものはテストをコンパイルしない。tsconfig.test.json は noEmit で両方をカバーし、npm の pretest がスイートの前にそれを実行する:宣言したインターフェースを implements で満たさなくなったテストフェイクは、実行時ではなく型チェックで失敗する。

フルスイートは約10秒かかる。一部のテストは長時間実行の操作をシミュレートするために FIFO を使用する。それらはすべて 自分で書き込み側を開く(withFifoWatch)ため、ランナーのタイムアウトに頼る代わりに数秒で失敗する。npm test は scripts/test.mjs を通じて実行され、時計によってスイートを制限し(15分、VAULT_MCP_TEST_TIMEOUT_MS)、 プロセスグループを強制終了する:ハングしたスイートは終了コードなしの無期限のストールではなく、終了コード124になる。

npm run smoke はスイートができないチェックである:コンパイル済みの dist/server/index.js を 使い捨てボールトに対するプログラムとして起動し、MCP ハンドシェイクを完了し、tools/list が 正確に9つのツールで応答することを要求する。これは、エントリポイントがライブラリであると判断して何も起動しないことをカバーする — シェルにはクリーンな終了コード0、クライアントには永遠の待機 — そしてこれが engines.node >= 20 を 検証済みの主張にするものである:CI は固定された26に加えて Node 20 でもこれを実行する。スイート自体は 20では実行できない(test/frontmatter.test.ts はランタイムの型ストリッピングに依存している)一方で、 コンパイル済み JavaScript は実行できるからである。

コミットメッセージとサーバー自身のユーザー向け文字列 — ツールの説明、エラーメッセージ、 diff 内の散文 — はポルトガル語(ブラジル)で書かれている:このサーバーが提供するボールトはポルトガル語の ナレッジベースであり、その読者はポルトガル語を話すモデルである。コードコメントと docblock は 英語で書かれており、src/index/bm25.ts は最初のパスからポルトガル語のまま残されている。

ライセンス

MIT © 2026 Andrey Mudri

Available Tools

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

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesVault-relative path, with `.md`.
confirmNoConfirms deleting even with other notes pointing at this one; their links will break.

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesVault-relative path, with `.md`.
new_textYesThe text that takes its place.
old_textYesThe exact passage to replace; it must be unique within the note.

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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

The description uses a specific verb and resource: '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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesVault-relative path, with `.md`.
offsetNoFirst 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

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagsNoTags for the note's frontmatter.
linksNoRelated wiki-links, without the brackets.
tituloYesShort title for the learning; it becomes the filename.
dominioYesDomain under `02-wiki/`, e.g. nestjs, docker, patterns. A new domain requires confirm_novo_dominio.
insightYesThe learning itself, in markdown.
projetoNoName of the project under `03-projects/` this learning belongs to; it goes into the daily note's capture line.
contextoYesWhere and why this came up.
confirm_novo_dominioNoConfirms creating a domain that does not yet exist under `02-wiki/`.

TDQS

A4.3/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagsNoEvery one of these tags must be on the note.
tipoNoFrontmatter `tipo`: wiki, moc, projeto, daily.
folderNoVault folder, matched on a segment boundary.
statusNoFrontmatter `status`, e.g. ativo, pausado.

TDQS

A4.2/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
toYesFull destination path, vault-relative, with `.md`. Moving, renaming and promoting are the same operation.
fromYesThe note's current vault-relative path, with `.md`.
confirm_novo_dominioNoConfirms creating the MOC of a destination domain that does not have one yet.

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesVault-relative path, with `.md`.
contentYesThe note's markdown body, without the frontmatter block.
frontmatterNoFrontmatter fields, e.g. `{ "tipo": "wiki", "tags": ["jwt"] }`.

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

  1. 9 tool updatesv0.3.0
    • First observedvault_backlinks
    • First observedvault_delete
    • First observedvault_edit_note
    • First observedvault_get_note
    • First observedvault_learn
    • First observedvault_list
    • First observedvault_move
    • First observedvault_search
    • First observedvault_write_note

TDQS

A4.4/5.0

Scored across 9 tools

Disambiguation5/5

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.

Naming Consistency4/5

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.

Tool Count5/5

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.

Completeness5/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    Provides AI agents with direct filesystem access to an Obsidian vault for note management, task orchestration, context persistence, and git synchronization.
    27
    86 npm
    3
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Enables 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.
    11
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables 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