Skip to main content
Glama

vault-mcp

Английский | Português

CI npm

Долговременная память для агента кодирования: он ищет в вашем хранилище Obsidian перед ответом, цитирует path:line и записывает то, что узнал, не спрашивая, куда сохранить.

MCP-сервер для поиска, чтения и записи хранилища знаний Obsidian. Поиск по лексическому BM25 плюс один переход по wiki-ссылке; интеллектуальный захват знаний, который решает между созданием новой заметки и добавлением к существующей; автоматическое распространение на MOC домена и дневную заметку, а также на индекс знаний, если домен новый. Перемещение, переименование, повышение, архивирование и удаление заметки также проходят через сервер, поэтому ссылки и записи MOC остаются корректными, а не молча гниют.

Пример

Реальный вывод двух инструментов, определяющих проект, запущенный на тестовом хранилище этого репозитория.

Сервер отвечает на португальском: хранилище, которое он обслуживает, написано на португальском, и ответы его инструментов тоже. Вывод ниже приведён дословно, без перевода.

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 не соответствует ни одному термину в запросе. Он подтягивается через один переход по wiki-ссылке из заметки, которая совпала, с ослабленным баллом — именно это отмечает via grafo (через граф).

vault_learn самостоятельно решает, создать ли заметку или добавить к существующей, записывает до четырёх файлов и делает один коммит:

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)

Четыре файла, один коммит docs(vault): {titulo} — отмена всего обучения это git revert на нём. Домен concorrencia не существовал, поэтому вызов содержал confirm_novo_dominio: true, MOC был создан с нуля, а индекс знаний получил строку, указывающую на него.

Related MCP server: mcp-obsidian-vault

Установка

Опубликован как @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`

Область видимости не для украшения: голый vault-mcp на npm — это 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, никогда без кода выхода.

Конфигурация

Хранилище передаётся через переменную окружения:

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.

Регистрация в 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 нет подстановки переменных, поэтому относительный путь здесь превращается в сервер, который не запускается. -y в npx важен для 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, следуя upstream ветки: репозиторий, который не был настроен, сообщает об этом, а не угадывает удалённый репозиторий и ветку.

  • он всегда завершается предупреждением, а не откатом. Заметка уже на диске и закоммичена; отменять это из-за сбоя сети было бы худшим вариантом. Ответ инструмента получает строку Push: sim|não, которая появляется только тогда, когда push действительно был ПОПЫТАН.

  • удалённый репозиторий, ушедший вперёд, не разрешается сам по себе. Pull, rebase и merge переписывают базу знаний пользователя, и это его решение — а не побочный эффект сохранения одной заметки. Предупреждение называет ситуацию и останавливается.

  • ограничено 30 с, с GIT_TERMINAL_PROMPT=0: у stdio-сервера нет терминала, на котором можно ответить на запрос учётных данных, поэтому запрос привёл бы к зависанию. Учётные данные должны поступать от помощника (например, gh auth git-credential) или от SSH-ключа.

Девять инструментов

Инструмент

Входные данные

Когда вызывать

vault_search

query (обязательно); limit, tipo, folder, include_raw (необязательно)

Перед ответом о решениях, паттернах, граблях или истории пользователя. Результат по умолчанию: 6 сниппетов. Заметки в 01-raw/ по умолчанию исключены.

vault_get_note

path (относительный путь, напр. 02-wiki/nestjs/auth-guard.md)

После vault_search, когда сниппета недостаточно, или перед редактированием заметки. Возвращает заметку с frontmatter, разрешёнными ссылками и битыми ссылками. Тело ограничено 20 000 символов; более крупные заметки помечаются как […nota cortada em 20000 caracteres].

vault_list

tipo, tags, status, folder (все необязательные)

Инвентаризация заметок по метаданным (напр. «какие проекты активны?», «какие заметки несут тег jwt?»). Контент не ищет — для этого используйте vault_search.

vault_backlinks

path (относительный путь)

Оценить, насколько связана тема, найти MOC, который индексирует заметку, оценить влияние изменения. Дедуплицирует ссылки: заметка, ссылающаяся на цель дважды, считается одним обратным ссылкой.

vault_write_note

path, content (обязательно); frontmatter (необязательно)

Создать или заменить заметку целиком. 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 (необязательно)

Записать усвоенный урок во время сессии (архитектурное решение, паттерн, грабли, ловушка). Не спрашивайте, куда сохранить — сервер решает сам. Показывает diff пользователю. Если домена не существует в 02-wiki/, вызов завершается ошибкой; используйте confirm_novo_dominio: true, чтобы создать его.

vault_move

from, to (обязательно); confirm_novo_dominio (необязательно)

Переместить, переименовать, повысить из 01-raw/ или архивировать в 99-archive/ — все четыре операции это один и тот же вызов, потому что 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 ищет тему, комбинируя заголовок и insight. Кандидатами на получение урока являются только заметки уже находящиеся в 02-wiki/ и найденные прямым BM25 (не через расширение графа). Если такой кандидат найден:

  1. Коэффициент 1.8×: лучший результат должен выделяться над вторым по крайней мере в 1.8 раза. Без этого есть сомнение, и создаётся новая заметка.

  2. Конъюнктивное пересечение: лучший результат должен разделять тег С ВХОДНЫМИ ДАННЫМИ, ИЛИ находиться в том же домене (02-wiki/<dominio>/). Без пересечения создаётся новая заметка, даже если оценка высокая.

Когда оба условия выполняются, он дополняет существующую заметку разделом ## YYYY-MM-DD — Title. В противном случае он создаёт новую заметку в 02-wiki/<dominio>/.

Смещение намеренное: при сомнении создайте новую заметку, а не хороните урок не в том месте. Объединить заметки позже всегда возможно; восстановить потерянный урок — нет.

Запасные выходы

Три исключения могут изменить конечное место назначения:

  1. Коллизия заголовков: правило дубликатов говорит «нет», но файл с таким именем уже существует (более старая заметка с тем же slug). Сервер всё равно дополняет её и предупреждает anexado em <path> por coincidência de título; a checagem de duplicata não indicou essa nota. Это возвращает потерянную заметку в поток накопления.

  2. Целевой дубликат не может принять текст: сервер решает дополнить кандидатную заметку, но её нельзя редактировать. Сервер создаёт новую заметку под именем, производным от slug (напр. multi-stage-cache-de-camadas.md вместо multi-stage.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>. Предупреждение называет точный путь, куда был записан урок.

В любом случае ни один insight не теряется — в ответе точно указано, где оказался урок.

Что записывает vault_learn

Один вызов vault_learn может затронуть до 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. Умножает балл соседей по графу — связанных заметок. Один переход, не несколько. Зафиксировано в 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/

  • Символических ссылок (разрешаются перед записью)

  • Жёстких ссылок

В рамках одного экземпляра сервера два параллельных вызова vault_learn или vault_write_note изначально не перемешиваются: каждая запись ожидает завершения предыдущей. Если запись зависает (например, git заблокирован), 60-секундный тайм-аут освобождает очередь для следующей записи, а не для вызывающего — более ранний вызов продолжает ждать своего реального результата. Как только следующая запись начинается, обе могут выполняться — вызов получает предупреждение о том, что эксклюзивность не гарантирована. Это НЕ защищает от одновременных записей из Obsidian, от второго экземпляра сервера или от git checkout в хранилище.

Поиск и извлечение

Поиск выполняет BM25 по фрагментам из 2–3 уровней заголовков, охватывая прозу, теги и заголовки с разными весами. Если ни один термин запроса не попадает ни в одну заметку, он пытается предложить похожие термины (расстояние Левенштейна ≤ 2).

После чистого поиска BM25 он расширяется на один переход по вики-ссылке: соседи заметок, которые попали, наследуют 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/: архивные заметки (доступны для чтения, не для записи)

Известные ограничения

Три вещи, которые этот сервер не делает, каждая выбрана осознанно, а не упущена:

  • Архивирование в 99-archive/ теряет — summary в записи заметки в её исходном MOC. vault_move удаляет строку из исходного MOC и не имеет целевого MOC, чтобы вставить её обратно, а архив — область без записи, поэтому текст негде разместить. Разархивирование воссоздаёт голую - [[slug]], а не запись как она была. Альтернативы — сохранить сводку в собственном frontmatter перемещённой заметки или в боковом индексе — обе стоят больше, чем потеря. Что операция никогда не делает — так это не выдумывает сводку: без исходной строки запись получается короткой и правдивой.

  • Вики-ссылка, существующая только во frontmatter, не переписывается с помощью vault_move. Кандидатные заметки выбираются из тела, откуда также строится граф ссылок, поэтому заметка, которую этот фильтр пропускает, — это заметка, рёбра которой vault_backlinks также не имеет. Расширение перезаписи без расширения сканера привело бы к худшей асимметрии: исправленная ссылка, которую не видит ни один инструмент чтения.

  • vault_get_note возвращает тело заметки как есть. Экранирование молча сломало бы чтение-затем-редактирование именно для тех заметок, которые содержат управляющий символ, поскольку vault_edit_note сопоставляет old_text как точную подстроку файла. Поверхности, которые делают построчные утверждения — фрагмент vault_search и diff — санитизированы.

Шестнадцать последующих проблем, поднятых на данный момент, были исправлены — включая алиасированный frontmatter, который блокировал цикл событий на ~5 с, жёсткую ссылку, индексируемую на пути чтения, и гонку записи между процессами. 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 ответил ровно девятью инструментами. Он покрывает точку входа, которая решает, что это библиотека, и ничего не запускает — чистый выход 0 для оболочки, вечное ожидание для клиента — и именно это делает engines.node >= 20 проверяемым утверждением: CI запускает его на Node 20, а также на закреплённой 26, поскольку сам набор не может работать на 20 (test/frontmatter.test.ts зависит от удаления типов в рантайме), в то время как скомпилированный JavaScript может.

Сообщения коммитов и собственные пользовательские строки сервера — описания инструментов, сообщения об ошибках, проза внутри diff — написаны на португальском (BR): хранилище, которому он служит, — это португалоязычная база знаний, а его читатель — португалоязычная модель. Комментарии к коду и docblocks — на английском, при этом 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