Skip to main content
Glama

Seekstone

obsidian-mcp-server (#1 по загрузкам)

REST-прокси-серверы

Плагин Local REST API

Не нужен

Обязателен

Обязателен

Запущенное приложение Obsidian

Не нужно — работает при закрытом Obsidian

Обязательно

Обязательно

Объём ответа поиска @ 10k заметок

2.0 КБ

47 КБ

до 95 МБ

Задержка тёплого v9

6.2 мс

732 мс (~118 проектка)

до 1 550 мс

Структурированные запросы по frontmatter

Встроен (query_notes) — фильтры]] по свойствам/датам/размеру, ответ занимает несколько сотен байт

JSON-логика через REST

Зависит от сервера

Те же запросы, те же закоммиченные хранилища, 20 прогонов каждый, одна машина — тестовый стенд замерял эталонные состояния с июня по август 2026 (даты указаны в каждом отчёте) — полные результаты по восьми серверам и трём размерам хранилища ниже, полностью воспроизводимые из стенда.



Что такое Seekstone?

Seekstone — это Obsidian MCP-сервер — он даёт Claude (и любому клиенту Model Context Protocol) прямой доступ на чтение и запись к вашему хранилищу Obsidian. Приложение Obsidian не нужно держать открытым, плагины не требуются, и ничего не покидает ваш компьютер.

Он читает ваше хранилище напрямую с диска, а не через плагин Obsidian Local REST API, и хранит в процессе тёплый полнотекстовый индекс. Практическая разница двоякая:

  • Скорость. Поиск по ключевым словам на прогретом индексе возвращается за единицы миллисекунд, семантический поиск — за ~14 мс, что до ~440× быстрее, чем у всех остальных протестированных Obsidian MCP-серверов, потому что не надо порождать подпроцесс и гонять HTTP-запрос на каждый поиск.

  • Контекст. Широкий поиск, который через REST-прокси-сервер возвращает десятки мегабайт и миллионы токенов, через Seekstone возвращает ~2 КБ — снижение до ~47,000×, причём с ростом хранилища оно только увеличивается.

Поиск работает в трёх режимах: ранжированный полнотекстовый поиск (нечёткое и префиксное сопоставление), опциональный локальный семантический поиск (по смыслу, через небольшую встраиваемую модель эмбеддингов — включается вручную и полностью офлайн после единоразовой загрузки ~30 МБ), и структурированные запросы к метаданным — query_notes умеет фильтровать по свойствам frontmatter (status, due, type, …), тегам, папке, времени изменения и размеру, отвечая на вопросы вроде «какие черновые заметки изменились за эту неделю?» за несколько сотен байт, вместо цикла «поиск — потом чтение».

Claude может искать и читать всю вашу библиотеку заметок за миллисекунды и полезно не сжигать на это большуючасть контекстного окна.

Опубликован на npm как seekstone — установка через npx -y Seekstone. (Раньше также выпускался как obsidian-mcp-seekstone; этот псевдоним устарел, но существующие установки продолжат работать.)


Related MCP server: mcp-obsidian-ek

Почему We? Цифры.

Большинство Obsidian MCP-серверов возвращают полное содержимое заметок для каждого найденного документа. При широком запросе это мегабайты текста, который вашей LLM приходится обрабатывать; почти весь он нерелевантен и сжигает контекст. Seekstone же отдаёт короткие ранжированные извлечения (по умолчанию ~120 символов, настраиваетсяв каждом запросе). Мы прогнали Seekstone против 7 другоих Observer MCP-сервера — всего 8 серверов — на трёх размерах хранилища — 1 000 / 5 000 / 10 000 заметок (по 20 прогонов). Каждая цифра ниже полностью воспроизводима: хранилища закоммичены в репозиторий (сгенерированы из общедоступной «Encyclopedia Britannica» 1911 год), так что вы можете склонировать его и запустить точь-то такой же бенчмарк сами.

Смысл тестов в том, что именно здесь расходятся архитектуры — настоящее хранилище только растёт.

Объём ответа поиска — байты на запрос (освобождение по контексту; в чем меньше — тем лучше)

Сервер

Архитектура

1k заметок

5k заметок

10k заметки

🥇 Seekstone

внутрипроцессная индексация

1.6 KB

1.8 KB

2.0 KB

mcpvault

прямой доступ к полетовой системе, субпроцесс

1.7 KB

1.9 KB

2.2 KB

obsidian-mcp-rs

прямой доступ к ФС, сканирование в каждом запросе

10.2 KB

10.8 KB

11.2 KB

obsidian-tc

SQLite-платформа

4.2 KB

6.8 KB

7.2 KB

obsidian-mcp-server

REST API

55 KB

145 KB

232 KB

obsidian-mcp-pro

прямой доступ к ФС, субпроцесс

25 KB

84 KB

114 KB

obsidian-mcp

прямой доступ к ФС, субпроцесс

18 KB

105 KB

201 KB

mcp-obsidian

REST API

356 MB

2.4 GB

4.6 GB

Seekstone остаётся плообитом (~2 KB) независимо от роста вашего хранилища, потому что всегда возвращает ранжированные ранжированные фрагменты — сейчас у него самый маленький из всех протестированных серверов, что делает его даже более лёгким, чем решение mcpvault на всех трёх объёмах. REST-прокси-серверы возвращают полные содержимое для каждого совпадения, поэтому они растут вместе с хранилищем: mcp-obsidian достигает 95 MB при 10k заметк, а один широкий запрос (the capital of) в среднем за 20 прогонов отдавал 370 MB / 97.8m токенов за вызов. При 10k заметках это ~47,000× разница в сжигаемом контексте.

Задержка поиска — средняя по прогреву, ме (чем ниже, тем лучше)

Сервер

1k заметок

5k заметок

10k заметок

Против Seekstone @10k

🥇 Seekstone

1.1

3.1

6.2

—

obsidian-mcp-rs

6.1

19

37

~6× медленнее

obsidian-mcp-pro

46

213

430

~70× медленнее

obsidian-mcp-server

82

356

732

~118× медленнее

obsidian-mcp

82

405

811

~131× медленнее

mcpvault

96

467

958

~155× медленнее

mcp-obsidian

164

740

1,550

~250× медленнее

obsidian-tc

264

1,302

2,714

~440× медленнее

Каждый конкурент порождает подпроцесс или выполняет HTTP-запросы на каждый поисковый запрос, и большинство из них делает работу, объём которой растёт с размером хранилища. Seekstone хранит прогретый внутрипроцессный индекс — без IPC, без сети, — поэтому поиск по ключевым словам остаётся в пределах единиц миллисекунд даже при 10 000 заметок (семантический режим добавляет фиксированные ~8 мс на эмбеддинг и сканирование). И разрыв увеличивается с масштабом: при переходе от 1k к 10k заметок конкуренты замедляются в 5–10×, а Seekstone почти не сдвигается. Даже самый быстрый вариант — obsidian-mcp-rs, который пересканирует хранилище при каждом запросе, — на прогретом индексе при 10k заметок ~6× медленнее с в 3 раза большей полезной нагрузкой, а поколение REST-прокси работает ~90–250× медленнее.

Seekstone — единственный сервер в нашем наборе бенчмарков, который обеспечивает одновременно полезную нагрузку ~2 КБ и задержку поиска в единицы миллисекунд при любом размере хранилища — и, насколько нам известно, единственный Obsidian MCP-сервер с опубликованными воспроизводимыми бенчмарками. Тестовый стенд, синтетические хранилища и полные результаты открыты: см. benchmark-scaling.md и стенд. Клонируйте, запускайте, проверяйте.


Установка

Выберите способ, который подходит вам лучше всего.

Используете ИИ-агента? Вставьте этот промпт

Если вы работаете с Claude Code, Cursor или другим кодинг-агентом, вам не нужно ничего делать самостоятельно — вставьте этот промпт, и агент выполнит установку:

Установите MCP-сервер seekstone для этого редактора. Выполните npx -y seekstone init --client code --write (для других клиентов используйте desktop, cursor или vscode). Он сам определит моё хранилище Obsidian; если в списке будет несколько, спросите меня, какое выбрать, и повторите с --vault "<path>". Передайте мне все ошибки, затем скажите перезапустить эту сессию, чтобы инструменты seekstone загрузились.

seekstone init полностью неинтерактивен — с флагом --write он валидирует хранилище и в один заход обновляет конфиг клиента (Claude Code — через claude mcp add, для других клиентов — аддитивным JSON-патчем с резервной копией по времени).

Вариант 1 — Один клик (Claude Desktop, терминал не нужен)

  1. Скачайте seekstone.mcpb из GitHub Releases

  2. Откройте его в Claude Desktop — двойной клик в Finder или правая кнопка → Открыть с помощью → Claude Desktop

  3. Выберите папку вашего хранилища Obsidian, когда появится запрос.

Вы поймёте, что всё сработало, когда Seekstone появится в панели инструментов Claude. Никакого редактирования JSON, никакого терминала и Node.js не требуется.

Вариант 2 — Пошаговая настройка (рекомендуется пользователям CLI)

Откройте Терминал (macOS: Cmd+Space, введите "Терминал", нажмите Enter) и выполните:

npx -y seekstone init

Вы поймёте, что всё работу сделало, когда Seekstone появится в панели инструментов Claude под значком Plug.

Seekstone читает собственный реестр хранилищ Obsidian, определяет ваше хранилище, валидирует его и либо выводит готовый блок конфигурации для вставки, либо напрямую обновляет конфиг Claude Desktop:

# Auto-detect vault, print config to paste
npx -y seekstone init

# Auto-detect vault, patch Claude Desktop in place (with backup)
npx -y seekstone init --write

# Specify vault explicitly if you have multiple
npx -y seekstone init --vault "/path/to/vault"

# Auto-configure Claude Code in one step (auto-detects vault, runs claude mcp add)
npx -y seekstone init --client code --write

# Or just print the Claude Code command without running it
npx -y seekstone init --client code

Вариант 3 — Ручная настройка (Claude Desktop)

Добавьте в claude_desktop_config.json (Настройки → Разработчик → Изменить конфигурацию):

{
  "mcpServers": {
    "seekstone": {
      "command": "npx",
      "args": ["-y", "seekstone"],
      "env": { "SEEKSTONE_VAULT": "/absolute/path/to/your/vault" }
    }
  }
}

Вариант 4 — Claude Code

Автоматически определяет ваше хранилище и настраивает Claude Code одной командой:

npx -y seekstone init --client code --write

Или вручную, если вы предпочитаете задать путь к хранилищу явно:

claude mcp add seekstone --env SEEKSTONE_VAULT=/absolute/path/to/your/vault -- npx -y seekstone

Вариант 5 — Cursor

Один клик: — затем укажите SEEKSTONE_VAULT как абсолютный путь к вашему хранилищу в настройках MCP Cursor (ссылка устанавливает заглушку/плейсхолдер).

Или позвольте CLI самому найти ваше хранилище и обновите ~/.cursor/mcp.json (с резервной копией):

npx -y seekstone init --client cursor --write

Или добавьте блок вручную в ~/.cursor/mcp.json (глобально) или <project>/.cursor/mcp.json (для проекта):

{
  "mcpServers": {
    "seekstone": {
      "command": "npx",
      "args": ["-y", "seekstone"],
      "env": { "SEEKSTONE_VAULT": "/absolute/path/to/your/vault" }
    }
  }
}

Вариант 6 — VS Code

Один клик: <a href="https://vscode.dev/redirect?url=vscode:mcp/install?%7B%22name%22%3A%22seekstone%22%"},{"url":null,"raw":null} data:, — затем укажите SEEKSTONE_VAULT какабсолютный путь к вашему хранилищу, когда VS Code откроет конфигурацию сервера (ссылка устанавливает заглушку/плейсхолдер).

Или позвольте CLI самому определить хранилище и записать конфигурацию рабочей области (.vscode/mcp.json в текущем каталоге):

npx -y seekstone init --client vscode --write

Или добавьте его из терминала:

code --add-mcp '{"name":"seekstone","command":"npx","args":["-y","seekstone"],"env":{"SEEKSTONE_VAULT":"/absolute/path/to/your/vault"}}'

Или добавьте блок вручную в .vscode/mcp.json (рабочая область) или через палитру команду → MCP: Open User Configuration (пользовательская, глобальная). Учтёте две особенности VS Code: верхнеуровневый ключ — servers (а не mcpServers), и обязателен параметр "type": "stdio":

{
  "servers": {
    "seekstone": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "seekstone"],
      "env": { "SEEKSTONE_VAULT": "/absolute/path/to/your/vault" }
    }
  }
}

Требуется VS Code 1.102+; seekstone появляется в перечне инструментов Agent mode в Copilot Chat.

Другие MCP-клиенты (Windsurf, Cline, …)

Seekstone — это стандартный MCP-сервер stdio — любой MCP-клиент может его запустить. Используйте тот же JSON-блок, что и выше, в MCP-конфиге вашего клиента (command: npx, args: ["-y", "seekstone"], env SEEKSTONE_VAULT).


После установки перезапустите клиент. При запуске Seekstone сканирует хранилище, строит полнотекстовый индекс в памяти (для тысяч заметок — несколько сетей), и держит его актуальным при вашей работе. Следующие 19 инструментов становятся доступны Claude.

Требуется Node.js ≥ 22 для опций CLI. Бандл .mcpb в один клик не имеет внешних требований.

Если Seekstone экономит вам контекст, загляните — и, возможно, ⭐ проспонсируйте репозиторий — это поможет другим найти его.


Что Claude может делать с вашим хранилищем?

Как только Seekstone подключён, вы можете просить Claude, например:

  • «Найди в моих заметках всё про [topic] и выдай сводку» — использует search, возвращает ранжированные фрагменты, а не полные файлы

  • «Найди все заметки с тегом #project и вывади их названия» — использует list_notes с фильтром по тегу

  • «Прочитай только секцию "Decisions" в моей [project]-заметке» — использует read_note с селектором секций, поэтому в контекст входит только этот фрагмент

  • «Какие заметки ссылаются на мою [topic]-заметку, и на какие она ссылается сама?» — использует get_backlinks and get_links для обхода графа

  • «Дополни сегодняшнюю заметку моим стендапом» — использует append_periodic_note, разгоняя путь пополдневной заметки из конфигурации хранилища (Obsidian не должен быть открыт)

  • «Исправь все вхождения старого имени проекта в этой зависимости» — использует replace_in_note, с предпросмотр сухим запуском до записи

  • «Добавь итоговую секцию в конец заметки [note]» — использует append_note, никогда не трогая frontmatter

  • «Перене 2и всем заметки из /inbox в /archive/[year]» — использует move_note

  • «Обнови поле status в frontmatter этой заметки на 'done'» — использует patch_frontmatter, сохраняя порядок ключей и стиль кавычек

  • «Создай новую встречную заметку на сегодня по стандартному шаблону» — использует create_note

Claude никогда не видит всё хранилище целиком — он ищет и читает выборочно, поэтому даже большие хранилища (10k+ заметок) удерживаются в рамках контекстного бюджета.


Инструменты

Чтение

Tool

Описание

search

Полноетекстовый поиск. Возвращает ранжированные фрагменты (по умолчанию ~120 символов, настраивается через excerptLength), а не полные заметки. Нечёткое и префиксное совпадение; с SEEKSTONE_ENANTIC=1, mode: "semantic"/"hybrid" — смысловой поискчерез локальную модель эмбеддингов (ничего не покидает вашу машину).

query_notes

Структурированный запрос по метаданнымго. Фильтры по предикатам «ключ-значение» во frontmatter (eq, ne, contains, exists, missing, gt/gte/lt/lte), тегу, папке, времени изменения и размеру; сортировка и выбор нужных полей. Возвращает компактные строки (путь + заголовок по умолчанию), а не содержимое заметок.

context_pack

Готовый кейс для ответа на вопрос на естественном языке одним запросом, жёсть ограниченным бюджетом байт (по умолчанию ~2 КБ): ранжированные фрагменты, связанные соседние заметки с однострочным пересказом, а также пути к следующим источникам — заменяет цикл search → read → get_backlinks.

read_note

Читать полное содержимое заметки по относительному пути в хранилище. Допускает возврат отдельной секции, блока или диапазона строк.

list_notes

Список заметок, опционально отфильтрованных по префиксу папки или тегу.

list_tags

Список всех тегов в хранилище, отсортированных по частоте использования (или по алфавиту).

outline_note

Возвращает структуру заголовков и блоков заметки без её полного содержимого — дешёвая навигация перед целевым чтением.

get_forward_links

Находит все заметки, которые ссылаются на данную заметку.

get_links

Перечисляет все статически заданные wikilinks markdown-ссылки из заметки.

get_periodic_note

Читает сегодняшнюю — или за любую дату — дневник ведущий, еженедельную, ежемесячную, квартальную или годовую заметку — путь извлекается из конфигурации хранилища, Obsidian не требуется.

Запись

Tool

Description

create_note

Создаёт заметку (опционольный frontmatter + тело); родительские каталоги создаются автоматически.

delete_note

Перемещается заметку в папку .trash/ хранилища (совместимо с Obsidian, можно восстанловить). Передайте permanent:true для необратмого удаления.

move_note

Перемещат или преименовывает заметку — вики-ссылки и markdown-ссылки в других заметках, указывающие на неё, переписываются, чтобы ничене не сломало;с (rewriteLinks: false — для ответа); целевые каталоги создаються автоатчески.

rename_heading

Переименовывает заголоок в заметке — каждая вики-ссылка [[note#heading]] и встреное содержимое по всому хранилищу переписываются, чтобы ссылки продолажали работать (правни свои сохраняются, блоки кода с огравдатель остают).

attach_note

Добавляет текст в тело заметки, не затрагив фронтматтер.

open_note? Wait no, attach_note is line. Actually table row: attach_note

Append text to a note body ... Let's correct: original row attach_note after rename_heading. Yes.

Need not include "open". The tool is append_note. | attach_note | Добавляет текст в тело заметки, не затрагивоing frontmatter. |

| patter_fronter (Wait row is terminate. Actually original table: after attach_note row, there is patter_front? Let's check original in user message:

| create_note | ... | delete_note | ... | move_note | ... | rename_heading | ... | attach_note | ... | patch_frontmatter | ... | patch_note | ... | replace_in_note | ... | append_periodic_note | ...

Need preserve rows. So after attach: patch_frontmatter, patch_note, replace_in_note, append_periodic_note.

I made a typo earlier. Let's list correctly.

Rows: 1 create_note 2 delete_note 3 move_note 4 rename_heading 5 append_note 6 patch_frontmatter 7 patch_note 8 replace_in_note 9 append_periodic_note

Not "create_note" with create_note (the code span should be create_note). Yes.

Need include patch_frontmatter row description.

Let's generate carefully.

For patch_frontmatter: "Устанавливает, обновляет или удаляет ключи frontmatter без перестановки существующих ключей и без измениения стиля квычек."

For patch_note: "Дописывает, вставляет в начало or иеняет тест у заголовка или блочной ссылки (createIfMissing — добавит в раздел; frontmatter не задерживается)."

Replace_in_note: "Ищет и заменяет текст в теле заметки — колбуквально или регулярным вывражением, с учётом регистра, целые слова, опционольный limit (по умолчания заменяются все вхождения), and dry-run просмотр."

append_periodic_note: "Дописывает в сегодняшную периодическую заметку, создавая из шаблона, если ещё не существует."

Then following paragraph.

Need be aware of quoting around frontmatter? "frontmatter" not backC, no issue.

Let's compose entire.

Need decide to translate "wikiLinks" "mockdown-links". Fine.

Need "dry-run" maybe translate "проверочный просмотр" but maybe keep dry-run as term? It appears and "and a dry-run preview" - we can say "и предпросмотр без примененит (dry-run)". Good.

Let's formulate final response in Russian, without code fence.

We'll include heading "## Кonфигура." Actually "## Конфигурация" as translation. Original uses "## Configuration". We'll translate. "## Как это работает" for "## How it works"? Original "## How it works" => "## Как это работает". "## Security & privacy" => "## Безопасность и конфидиенциальность". "## Frequently asked questions" => "## Частые вопросы". Good.

Need keep *** after intro and before "## Configuration"? The original has *** after two paragraphs. In translation, include.

Need preserve "technical terms" e.g., "periodic note" as "периодическая заметка" but "periodic note" is common in Obsidian. Fine.

Need preserve "Obsidian-compatible, restorable" at line.

Let's write final.## Конфигурация

Переменная

Обязательная

Описание

SEEKSTONE_VAULT

Да

Абсолютный путь к вашему хранилищу Obsidian.

SEEKSTONE_LOG_LEVEL

Нет

error | warn | info (по умолчанию) | debug.

SEEKSTONE_LOG_FILE

Нет

Абсолютный путь; при установке JSON-строки логов добавляются в него (с ротацией по размеру).

SEEKSTONE_LOG_MAX_SIZE

Нет

Порог ротации лога для SEEKSTONE_LOG_FILE (например, 10mb; по умолчанию 5 МБ).

SEEKSTONE_WATCH_POLL

Нет

Установите 1, чтобы использовать опрос через stat вместо нативных событий ОС — медленнее, но надёжнее на сетевых дисках, WSL и в некоторых контейнерах.

SEEKSTONE_READ_ONLY

Нет

Установите 1 для работы только на чтение: все 9 инструментов записи полностью удаляются из списка инструментов (и отклоняются при прямом вызове), так что сессия гарантированно не может изменить ваше хранилище.

SEEKSTONE_WRITE_PATHS

Нет

Разделяемые запятыми glob-шаблоны относительно хранилища (например, journal/**,inbox/*.md). Запись разрешена только в таких путях; остальная часть хранилища остаётся только для чтения.

SEEKSTONE_SEMANTIC

Нет

Установите 1 для включения семантического поиска (search получает mode: "semantic" и "hybrid"). Требуется локальная модель эмбедингов — скачайте её один раз с помощью npx -y seekstone fetch-model; работающий сервер никогда не обращается к сети.

SEEKSTONE_MODEL_PATH

Нет

Каталог, содержащий модель эмбедингов Model2Vec (по умолчанию: туда, куда fetch-model её помещает, в каталоге кэша).

SEEKSTONE_CACHE_DIR

Нет

Корневой каталог кэша для скачанной модели и покэшевых эмбедингов каждого хранилища (по умолчанию ~/.cache/seekstone).


Файловое содержимое

Seekstone обходит хранилище с помощью fast-glob, разбирает frontmatter каждой заметки (с учётом байтов, поэтому записи могут доказать, что область frontmatter байт-в-байт идентична до и после записи) и строит в памяти полнотекстовый индекс MiniSearch. Поиск возвращает короткие ранжированные выдержки, а не целые заметки — именно эта конструкция «выдержка, а не документ» даёт выигрыш по контекстным расходам. Кроссплатформенный наблюдатель файлов (chokidar) поддерживает индекс актуальным, пока вы редактируете в Obsidian.

Записи консервативны по замыслу: append_note никогда не затрагивает frontmatter, а patch_frontmatter редактирует YAML-документ на месте, не пере-сериализуя его — сохраняется порядок ключей, стиль цитат и комментарии.

Он построен для беспрерывной работы. Seekstone тестируется на macOS, Linux и Windows в CI на каждом коммите, его инструменты записи защищены от патогенных (ReDoS) входов, а случайный необработанный отказ промиса логируется, а не вызывает сбой — таким образом, ваша долгоживущая MCP-сессия сохраняет прогретый индекс, а не выходит из середины разговора.

Для пошагового обзора кодовой базы — пакеты, внутреннее устройство сервера, полный поток запросов и тестовый каркас измерения — см. docs/ARCHITECTURE.md.


Безопасность и приватность

Seekstone читает — и через инструменты записи изменяет — файлы из SEEKSTONE_VAULT на вашем локальном диске. Работающий сервер не совершает сетевых вызовов и не отправляет телеметрию (единственный сетевой путь в пакете — явная подкоманда npx -y seekstone fetch-model — разовый загрузка опциональной модели для семантического поиска с проверкой SHA-256, которая завершается до запуска сервера). Логи по умолчанию содержат только метаданные (содержимое заметок появляется только на уровне debug). Ничего не записывается за пределами хранилища, кроме опционального файла лога, который вы можете задать, и, при SEEKSTONE_SEMANTIC=1, кэша эмбедингов для каждого хранилища в ~/.cache/seekstone (полученные векторы ваших заметок — они никогда никуда не отправляются).

Write-Safety Contract

Предоставление ИИ права записи в ваши заметки заслуживает большего, чем «доверьтесь нам». Seekstone поставляется с именованным и провереннымй контрактом — docs/WRITE-SAFETY.md — восемь гарантий, каждая из которых связана с кодом, который её реализует, и тестом, который доказывает её работу, подтверждённо байт-в-байт защитным набором в CI на каждям коммите и релизе: ноль сетевых контактов, песочница хранилища, байт-идентичный frontmatter при редактировании тела, атомарные записи (без рваных файлов), создание файла никогда не перезаписывает существующий, обратимое удаление (.trash/), опциональный compare-and-swap для каждого инструмента записи и настраиваемое ограничение зоны записи / режим только чтение. Этот же набор тестов запускается автоматически против других API-напрямую работающих с файлами серверов — сравнительная таблица находится в контракте.


Частые вопросы

Нужно ли мне, чтобы приложение Obsidian было действительно запущено? Нет. Seekstone читает папку хранилища напрямую с диска. Obsidian может быть открыт или был закрыт.

Нужен ли мне плагин Local REST API? Нет. Seekstone полностью его обходит — именно отсюда до 47 000 раз меньше передаваемых данных. Никаких плагинов не требуется.

Какие AI-клиенты поддерживаются? Любой клиент, который поддерживает Model Context Protocol (MCP) через stdio — Claude Desktop, Claude Code, Cursor, Windsurf, Continue и другие.

Безопасно ли использовать это в моём хранилище? Seekstone никогда не изменяет файлы, кроме случаев, когда вы явно вызываете один из его инструментов записи (те девять, что в таблице выше — create_note, append_note, patch_note, patch_frontmatter, replace_in_note, move_note, rename_heading, delete_note, append_periodic_note). Запущенный сервер не выполняет сетевых запросов (модель семантического поиска загружается один раз, отдельным шагом, по явной подкоманде fetch-model). Путь к хранилищу изолирован в песочнице — ни один инструмент не может читать или писать вне его. И вы можете ужесточить это ещё сильнее: SEEKSTONE_READ_ONLY=1 полностью убирает инструменты записи из сеанса, а SEEKSTONE_WRITE_PATHS ограничивает запись только теми папками, которые вы разрешили (например, только journal/**). Оба ограничения проверяются на уровне диспетчеризации, а не на уровне каждого инструмента, так что ни один инструмент не сможет «забыть» эту проверку.

Работает ли он в Windows? Да. Seekstone тестируется на macOS, Linux и Windows в CI при каждом коммите.

С хранилищами Obsidian какого размера он справляется? Seekstone профилировался на хранилищах с тысячами заметок. На эталонном хранилище из 10 000 заметок, включённом в репозиторий, холодная сборка индекса занимает десятки секунд, а RSS процесса укладывается ниже ~100 МБ; типичные личные хранилища индексируются за несколько секунд. Семантический режим после запуска вычисляет эмбеддинги в фоне (~20 с на 10 тыс. заметок), а затем они кэшируются для каждого хранилища, так что повторные запуски загружают всё значительно быстрее секунды.

Как seekstone init находит моё хранилище автоматически? Он читает собственный реестр хранилищ Obsidian (obsidian.json) — тот же файл, который Obsidian использует для отслеживания ваших известных хранилищ. Если у вас одно хранилище, оно выбирается автоматически. Если несколько — выводится их список, и вам предлагается выбрать с помощью --vault.

Что такое файл .mcpb? MCP Bundle — самодостаточный zip-файл с сервером и его манифестом. Чтобы установить: дважды щёлкните в Finder (или правая кнопка → «Открыть с помощью» → Claude Desktop), выберите хранилище — и готово. Терминал и Node.js не требуются.


Вклад и разработка

Вклад приветствуется. См. CONTRIBUTING.md с правилами или переходите сразу к делу:

npm install                                          # install all workspace deps
npm test                                             # run all tests
npm run lint                                         # biome check
npm run build -w seekstone                           # tsup → dist/
npm run build:mcpb                                   # build seekstone.mcpb bundle

npx vitest run packages/server/src/tools/search.test.ts  # single test file
npx vitest run -t 'parses a typical frontmatter'         # single test by name
npx tsc -p packages/server/tsconfig.json --noEmit        # typecheck

Структура репозитория

Пакет

Назначение

packages/core

Общие примитивы хранилища — walk, парсер frontmatter, извлекательсвязей/тегов, outline, percentiles, pmap и эмбеддер Model2Vec. Встраивается в сборку сервера.

packages/server

Публикуемый MCP-сервер seekstone (19 инструментов, stdio, индекс MiniSearch, наблюдатели на chokidar).

packages/harness

Профилировщик + бенчмарк + стенд проверки безопасности записи (REST против файловой системы), давший приведённые выше числа под нагрузкой. Только для разработки; не публикуется.

У сервер есть полноценная сборка (tsup → dist/), и он публикуется в npm. Харнес запускается из исходников через tsx. Релизы автоматизированы — см. docs/RELEASING.md.

Измерительный стенд

Стенд существует, чтобы воспроизводить показатели бенчмарков, которые привели к дизайну с прямой работой с файловой системой. Стандартный путь воспроизведения (бэкенды fs/seekstone с зафиксированными синтетическим хранилищем из репозитория) не требует ничего дополнительного; только бэкенды на REST (rest, mcp-obsidian, obsidian-mcp-server) требуют запущенного Obsidian с плагином Local REST API.

export SEEKSTONE_VAULT="/absolute/path/to/your/vault"

npx tsx packages/harness/src/cli.ts profile --vault "$SEEKSTONE_VAULT"
npx tsx packages/harness/src/cli.ts bench \
  --queries packages/harness/queries/default.json \
  --stats reports/vault-stats.json
npx tsx packages/harness/src/cli.ts safety --vault "$SEEKSTONE_VAULT"

Переменные окружения стенда: SEEKSTONE_REST_API_KEY (из плагина Local REST API) и SEEKSTONE_REST_URL (по умолчанию https://127.0.0.1:27124).


Поддержка

Seekstone бесплатен и открыт. Если он экономит вам контекст (и деньги), вы можете купить мне кофе.


Лицензия

MIT © Shaq Mughal

Available Tools

25 tools
append_noteA

Append text to a note body without touching the frontmatter. Safe for meeting notes, daily logs, and append-only workflows.

NameRequiredDescriptionDefault
pathYesVault-relative path to the note.
contentYesText to append.
prevHashNoOptional compare-and-swap guard: the contentHash from a prior read. Fails with hash_conflict if the note changed since.

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate it's a write operation (readOnlyHint=false) and non-destructive (destructiveHint=false). The description adds valuable behavioral detail: it preserves frontmatter and is safe for 'append-only workflows,' which provides context beyond the annotations. No contradiction exists.

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 two concise sentences with no filler. The core purpose is stated first, and the additional safety/use-case context is provided in a second sentence. Every phrase adds value, making it appropriately sized and front-loaded.

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 simple append operation with three parameters, the description covers the key points: it appends, preserves frontmatter, and indicates safe workflows. However, it does not mention error behaviors (e.g., what happens if the path doesn't exist) or whether it creates a note if missing. Given the low complexity and existing annotations, this is a minor gap.

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%, with each parameter (path, content, prevHash) already documented in the schema. The description does not add any additional parameter-specific semantics, so it remains at the baseline score of 3 given the complete schema.

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 clearly states the tool's function: 'Append text to a note body without touching the frontmatter.' This is a specific verb (append) and resource (note body), and it explicitly distinguishes itself from other mutation tools by mentioning the frontmatter preservation, which differentiates it from patch_note or replace_in_note.

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 provides context on when the tool is appropriate ('Safe for meeting notes, daily logs, and append-only workflows'), but does not explicitly mention when NOT to use it or point to alternative tools. It implies usage scenarios but lacks explicit exclusions or sibling comparisons, leaving the agent to infer the boundary.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

append_periodic_noteA

Append text to a periodic note (daily, weekly, monthly, quarterly, or yearly). Preserves existing frontmatter exactly. Creates the note first (from template if configured) when createIfMissing is true (default).

NameRequiredDescriptionDefault
dateNoISO date string (YYYY-MM-DD). Defaults to today when omitted.
periodNoPeriod type. Default: daily.
contentYesText to append to the note body.
prevHashNoOptional compare-and-swap guard: the contentHash from a prior read. Fails with hash_conflict if the note changed since.
createIfMissingNoCreate the note if it does not exist before appending. Default true.

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With all annotations false, the description carries the full behavioral burden. It adds genuinely useful guarantees ('Preserves existing frontmatter exactly') and creation-flow detail ('from template if configured'), which go beyond the raw annotations. However, it omits the most salient risk of an append operation — non-idempotency (duplicate calls duplicate content) — even though the prevHash parameter hints at concurrency concerns.

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?

Three sentences, zero filler. The primary action leads, the scoping list follows, and the creation behavior closes. Every clause serves a distinct purpose with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a moderate-complexity tool with 5 simple params and no output schema, the description covers the essentials well. Gaps remain: no mention of timezone handling for date-boundary behavior (critical for 'today' defaults), no duplicate-append warning, and no interaction with prevHash conflict recovery. These are real but not fatal omissions for an append operation.

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 description coverage is 100%, establishing a baseline of 3. The description adds value by clarifying the createIfMissing parameter's effect ('Creates the note first (from template if configured)') and confirming its default, which is not fully obvious from the schema text alone. This is a small but genuine increment over baseline.

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 leads with a specific verb+resource: 'Append text to a periodic note' and immediately scopes it to '(daily, weekly, monthly, quarterly, or yearly)'. This clearly differentiates it from sibling 'append_note' (regular notes) and 'get_periodic_note' (read path) without needing to inspect either schema.

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 'periodic note' qualifier implies the tool's niche, and the description notes the conditional creation behavior when createIfMissing is true. However, it never explicitly points to an alternative (e.g., 'use append_note for regular notes') or states when not to use this tool, despite siblings like append_note and patch_note existing. Usage context is implied rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

context_packA
Read-only

Assemble everything needed to ANSWER a natural-language question in one call, under a strict byte budget (default 2048): ranked excerpts, linked neighbor notes (backlinks/outlinks) with one-line summaries, and follow-up source paths. Retrieval is lexical by default: for a question phrased in words the note itself may not use, pass mode "hybrid" or "semantic", and scope with folder/tag exactly as in search. Use search to locate notes and query_notes for metadata filters; use context_pack when you want answer-ready context without multiple round-trips. Empty excerpts with confidence "none" or "low" means the vault lacks coverage — do not infer content; with folder or tag set, "none" can also mean the filter excluded every match, which totalMatches distinguishes.

NameRequiredDescriptionDefault
tagNoRestrict to notes with this tag. # optional, case-insensitive; nested child tags match ("project" matches project/alpha).
modeNolexical = keyword search (default). semantic = meaning-based over local embeddings (needs SEEKSTONE_SEMANTIC=1 and a fetched model). hybrid = exact-title lookups go lexical, everything else semantic.
queryYesNatural-language question or topic.
folderNoRestrict to a vault-relative folder prefix.
budgetBytesNoHard cap on response JSON bytes (256–16384, default 2048).

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint=false, and the description adds substantial behavior beyond them: a hard byte budget with default, lexical-by-default retrieval, backlink/outlink expansion, and the important failure semantics (empty excerpts with confidence 'none'/'low' means no vault coverage; with folder/tag set, 'none' can mean the filter excluded everything, distinguishable via totalMatches). That is exactly the kind of edge-case disclosure annotations cannot carry.

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?

Content is front-loaded — the core purpose leads, routing guidance follows, and failure semantics come last. The sentences are long and information-dense, bordering on run-on, but nearly every clause carries distinct operational value rather than repetition.

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?

With no output schema, the description carries the return-value burden and discharges it, describing the shape of results and the confidence/totalMatches signals that disambiguate empty responses. For a read-only, five-parameter retrieval tool this is complete enough to call correctly without opening the schema.

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 3, but the description adds real value beyond the schema: it explains the motivation for choosing hybrid/semantic mode and clarifies that folder/tag scoping works 'exactly as in search'. It does not, however, add syntax or precedence detail for budgetBytes or folder beyond what the schema states.

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 precise verb and resource ('Assemble everything needed to ANSWER a natural-language question in one call') and enumerates the concrete outputs (ranked excerpts, neighbor notes with summaries, follow-up source paths). It is immediately distinguishable from search and query_notes, which are named explicitly.

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?

It gives explicit routing: 'Use search to locate notes and query_notes for metadata filters; use context_pack when you want answer-ready context without multiple round-trips.' It also tells the agent when to switch modes ('for a question phrased in words the note itself may not use, pass mode hybrid or semantic'), covering both when-to-use and when-to-use-an-alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_noteA
Destructive

Create a new note at a vault-relative path. Optionally sets frontmatter and body content. Parent directories are created automatically. Fails if the note already exists unless overwrite is true (prevHash may guard the overwrite).

NameRequiredDescriptionDefault
pathYesVault-relative path, e.g. "Daily Notes/2026-06-01.md".
contentNoBody content for the note.
prevHashNoOptional compare-and-swap guard: the contentHash from a prior read. Fails with hash_conflict if the note changed since.
overwriteNoOverwrite an existing note. Defaults to false.
frontmatterNoFrontmatter key-value pairs.

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the destructiveHint:true annotation, the description discloses three concrete behaviors: automatic parent-directory creation, the fail-on-existing-note rule, and the prevHash compare-and-swap guard that can gate the overwrite. These are non-obvious side effects and failure modes the annotations alone do not convey. The description is consistent with readOnlyHint:false and destructiveHint:true.

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?

Three sentences, each earning its place: the core action first, then the optional parameters, then the critical existence-failure and CAS-guard behavior. No filler and no repetition of schema content.

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 5-parameter destructive write with no output schema, the description covers creation, optional fields, directory auto-creation, the existence failure mode, and the overwrite/CAS guard. The one notable gap is the return contract on success — the CAS workflow implied by prevHash would benefit from knowing whether the note's contentHash is returned — but the invocation semantics are fully specified.

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 every parameter (path, content, prevHash, overwrite, frontmatter) is already documented in the input schema. The description's only added semantic is the coupling between prevHash and overwrite ('prevHash may guard the overwrite'), a small increment over the schema's per-parameter text.

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 opening sentence 'Create a new note at a vault-relative path' names a specific verb, resource, and scope qualifier. This cleanly distinguishes it from sibling mutators like append_note, patch_note, replace_in_note, and move_note, which all act on existing notes, and from delete_note.

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 fail-if-exists clause ('Fails if the note already exists unless overwrite is true') gives the agent a clear condition for choosing the overwrite path. However, it does not explicitly route to alternatives — e.g., checking existence with list_notes first or selecting patch_note/append_note for modifying an existing note — so cross-tool selection is left implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_noteA
Destructive

Delete a note. By default it is moved to the vault .trash/ folder (recoverable by moving it back); pass permanent: true to remove it outright.

NameRequiredDescriptionDefault
pathYesVault-relative path of the note to delete.
prevHashNoOptional compare-and-swap guard: the contentHash from a prior read. Fails with hash_conflict if the note changed since — so you never delete content you have not seen.
permanentNoPermanently remove instead of moving to .trash/. Defaults to false.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the destructiveHint annotation, the description reveals critical behavior: the default action is non-permanent (trash) and reversible, and only permanent deletion requires an explicit flag. It also discloses recoverability. This transparency is essential for an agent deciding whether to call this tool and mitigates risk, going well beyond what the annotation already provides.

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 compact at two sentences, with the action verb first and the most important behavioral nuance immediately following. Every word contributes value, and the sentence structure flows from the core action to the key conditional. No fluff or repetition.

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 tool with three parameters and one required field, the description covers the essential behavior (delete, default trash, permanent override) and confirms reversibility. It does not mention error handling for missing paths or concurrency, but given the schema and annotations, the definition is complete for an agent to call it correctly. 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?

The schema already documents all three parameters with 100% coverage, so the description needn't add parameter details. The description's mention of 'pass permanent: true' restates the schema without adding new meaning. This meets the baseline of 3 but does not elevate it further.

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 clearly states 'Delete a note', which is a specific verb and resource, and immediately clarifies the default trash behavior and the permanent deletion option. This distinguishes it from siblings like move_note or patch_note, which are about modifying instead of removing. The tool's purpose is unambiguous and immediately scoped.

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?

The description provides clear context on how deletion works by default (to trash) and how to override it, which implicitly tells the agent when this tool is appropriate. However, it does not explicitly mention alternatives like move_note or state when NOT to use it (e.g., for reorganization). This is a slight gap in otherwise clear guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_periodic_noteA

Get the path and existence status of a periodic note (daily, weekly, monthly, quarterly, or yearly) for a given date. Reads folder/format config from .obsidian/daily-notes.json (daily) or the periodic-notes plugin data.json. Optionally creates the note from the configured template if it is missing.

NameRequiredDescriptionDefault
dateNoISO date string (YYYY-MM-DD). Defaults to today when omitted.
periodNoPeriod type. Default: daily.
createIfMissingNoCreate the note from the configured template if it does not exist. Default false.

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=false and destructiveHint=false, so the description correctly adds that the tool may create a note when createIfMissing is true – a behavioral detail beyond the annotations. It also discloses the config file locations (.obsidian/daily-notes.json and plugin data.json). No contradictions. However, it does not describe the exact return shape or failure modes, which are minor gaps given the side‑effect disclosure.

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 primary purpose ('Get the path and existence status') is front‑loaded, followed by config sources and the optional creation behavior. Every sentence 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?

Since there is no output schema, the description conveys that the return includes 'path and existence status', and it explains the config‑reading logic and optional creation. This is sufficient for an agent to call correctly. It lacks explicit error cases or what happens after creation (e.g., returns path or just status), but the core information is present.

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?

Parameter schema coverage is 100% – all three parameters (date, period, createIfMissing) already have descriptions in the schema, including defaults. The description adds no new semantic meaning beyond restating the defaults ('Defaults to today', 'Default: daily', 'Default false') which are already present. Baseline 3 applies because the schema carries the weight.

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 opens with a specific verb and resource: 'Get the path and existence status of a periodic note' and enumerates the period types (daily, weekly, monthly, quarterly, yearly). This clearly distinguishes it from sibling tools like create_note or append_periodic_note, even though it never names them. The purpose is unambiguous.

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 explains what the tool does and mentions the optional creation side‑effect, but never explicitly states when to use this tool versus a sibling like create_note or append_periodic_note. It gives context (reads config from specific files) but no when‑to‑use or when‑not‑to‑use guidance, leaving the agent to infer suitability.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_notesC
Read-only

List notes, optionally filtered by folder prefix or tag.

NameRequiredDescriptionDefault
tagNoFilter by tag. # optional, case-insensitive; nested child tags match ("project" matches project/alpha).
limitNoMax results (1–500, default 100).
folderNoVault-relative folder prefix.

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=false, covering the safety profile. The description adds nothing beyond that – no ordering, return format, or pagination behavior – so it contributes no behavioral value.

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?

A single efficient sentence with the primary action front-loaded and no waste. It is appropriately sized, though its brevity leaves the gaps noted above unfilled.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only list tool with no output schema and fully documented parameters, the description covers the essentials. It is adequate but should do more to distinguish this listing tool from its query/search siblings.

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 tag, limit (default 100, range 1–500), and folder are all documented in the schema. The description only gestures at folder/tag filtering and omits limit, adding no syntax or format detail. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

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

States a specific verb and resource ("List notes") plus its filter scope, so an agent knows what it does. However, it does not differentiate from overlapping siblings like search, query_notes, or read_notes, so it falls short of the top band.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase "optionally filtered by folder prefix or tag" hints at usage but gives no when-to-use, when-not, or named alternatives. An agent choosing between this and query_notes/search gets no routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_tagsA
Read-only

List all tags in the vault with usage counts. Supports substring filtering, minimum count threshold, and sort order. Nested tags (e.g. area/work) include a parent field.

NameRequiredDescriptionDefault
sortNoSort by usage count descending (default) or alphabetically.
patternNoSubstring filter on tag name. Example: "work" matches "work" and "area/work".
minCountNoOnly return tags used in at least this many notes.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint annotation already signals a safe read operation. The description adds useful behavioral details—that all tags are returned, filtering behaviors, and that nested tags include a parent field—which goes beyond the annotation's minimal information.

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?

Three concise sentences deliver the purpose, options, and a notable output feature with zero redundancy. Front-loaded with the primary action and immediately informative.

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 read-only list tool with no output schema, the description covers the return contents (usage counts, parent field for nested tags) and behavioral parameters fully. No gaps are apparent for an agent to invoke 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?

The schema covers all parameters with descriptions (100% coverage), so the description adds no significant new meaning about inputs. It merely reiterates what the schema already specifies, meeting the baseline but not exceeding 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?

Describes a specific action ('List all tags in the vault') with clear scope and distinguishes itself from siblings by focusing solely on tags. The mention of usage counts and nested tags further specifies the tool's unique function.

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?

While it doesn't explicitly contrast with alternatives, there is no other tag-listing tool among siblings, making the purpose self-evident. It provides clear context but omits explicit exclusions or when-to-use guidance beyond its self-description.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_tasksA
Read-only

List Markdown checkbox tasks as compact structured rows (path, line, state, text, nearest heading) — vault-wide or scoped by note, folder, tag, or modified time. Defaults to open tasks. Custom markers like "/" are single-char states. Rows feed straight into update_task; use this instead of searching for "- [ ]" or reading whole notes.

NameRequiredDescriptionDefault
tagNoRestrict to notes with this tag. # optional, case-insensitive; nested child tags match ("project" matches project/alpha).
pathNoVault-relative path to a single note. Omit to search the whole vault.
limitNoMax tasks (1–500, default 100).
stateNoWhich tasks to return. Default: open.
folderNoRestrict to a vault-relative folder prefix.
modifiedAfterNoOnly tasks in notes modified at or after this ISO 8601 date/time.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds non-obvious behavior: the default filter is open tasks only, custom markers are treated as single-character states, and each row carries a nearest-heading field. It stops short of describing ordering or how large vaults are paginated beyond the limit param, so not a 5.

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?

Three tight sentences, zero filler, with the output shape and default scope front-loaded before the sibling routing. Every clause carries information an agent needs.

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 6-parameter read tool with no output schema, the description compensates by enumerating the returned row fields and stating the default filter. Combined with full schema coverage and readOnly annotations, nothing needed to call it correctly 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?

Schema coverage is 100%, so every parameter is already documented with examples and semantics (tag nesting, ISO dates, limit range). The description only summarizes the scoping axes already present in the schema, plus a small clarification that custom markers like "/" are single-char states, which slightly aids the anyOf branch. Baseline 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 (List) and resource (Markdown checkbox tasks), then specifies the exact row shape returned (path, line, state, text, nearest heading). It explicitly distinguishes itself from the sibling 'search' and from read_note, so an agent can select it without opening a schema.

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?

Names the alternatives and rules them out: 'use this instead of searching for "- [ ]" or reading whole notes.' It also states the default scope behavior ('Defaults to open tasks') and hands off downstream to update_task, giving an explicit when-to-use path.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_writesA
Read-only

List recent writes from the journal — every write tool records the pre-image of each file it touches, so any of them can be reverted with undo_write. Returns compact metadata rows (seq, timestamp, tool, paths, undoable), never note content.

NameRequiredDescriptionDefault
pathNoOnly entries that touched this vault-relative path.
limitNoMax entries to return, newest first (1–200, default 20).

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark this as read-only, and the description reinforces that by promising metadata rows and explicitly stating 'never note content.' It adds value beyond the annotation by disclosing the exact fields returned (seq, timestamp, tool, paths, undoable) and explaining the pre-image journaling mechanism that makes undo_write possible.

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 tight sentences front-load the main purpose, then add the key behavioral constraint and output shape. Every sentence earns its place, and there is no redundant repetition of the tool name or schema details.

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?

Despite having no output schema, the description explicitly lists the returned fields and their nature, so an agent knows what response to expect. Combined with full schema coverage for optional parameters, this is complete enough for a low-complexity list tool.

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 coverage is 100%, with both path and limit already described in the input schema. The tool description does not need to repeat parameter details; it adds context about the journal concept but no additional parameter-level semantics. Baseline 3 is appropriate because the schema carries the parameter documentation burden.

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 clearly states the action ('List recent writes') and the resource ('the journal'), making the tool's purpose immediately obvious. It also distinguishes this from content-focused tools by explicitly noting it returns metadata and never note content, which separates it from siblings like list_notes.

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?

The description provides clear context: this tool is for reviewing write operations and identifying entries that can be reverted with undo_write. It does not explicitly say 'use this instead of list_notes' or list exclusions, but the connection to undo_write and the metadata-rows framing gives enough context for an agent to choose it appropriately.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

move_noteA
Destructive

Move or rename a note to a new vault-relative path, rewriting wikilinks and markdown links in other notes that point at it so nothing breaks (links inside fenced code blocks are left alone). Parent directories at the destination are created automatically. Fails if the destination already exists unless overwrite is true.

NameRequiredDescriptionDefault
toYesVault-relative destination path.
fromYesVault-relative source path.
prevHashNoOptional compare-and-swap guard on the source note: the contentHash from a prior read. Fails with hash_conflict if the note changed since.
overwriteNoOverwrite destination if it exists. Defaults to false.
rewriteLinksNoRewrite references in other notes to follow the move. Defaults to true; pass false to move the file only.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the destructiveHint annotation, the description discloses concrete behavioral traits: it rewrites wikilinks and markdown links in other notes while leaving fenced code blocks untouched, auto-creates parent directories, and fails if the destination exists unless overwrite is true. This is rich, actionable context that goes well beyond the annotation and helps an agent anticipate side 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?

Three concise sentences, front-loaded with the primary purpose, followed by critical behaviors (link rewriting, directory creation, overwrite failure). No filler — every sentence 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 mutation tool with 5 parameters and no output schema, the description covers the main side effects (link rewriting, directory creation, failure conditions) and explains the overwrite and rewriteLinks parameters behaviorally. The prevHash guard is documented in the schema but not in the description; however, the agent can infer it from the parameter description. Given the complexity, this is complete enough for correct invocation.

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 meaning. The description adds context around rewriteLinks (rewriting links in other notes) and overwrite (failure behavior) but does not add new information for from, to, or prevHash beyond the schema. It sits at the baseline of 3 because the schema carries the parameter explanation.

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 opens with 'Move or rename a note to a new vault-relative path' — a clear verb, resource, and target location. It explicitly describes the link-rewriting side effect, distinguishing it from destructive delete_note and heading-renaming rename_heading.

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?

The description clearly conveys when to use the tool (moving/renaming notes) and details the overwrite and link-rewriting behavior. It does not explicitly name alternative tools, but the purpose is unambiguous given the sibling list; this falls short of a perfect 5 that requires explicit when-not/alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outline_noteA
Read-only

Return a note's structure — heading tree with offsets, block-reference anchors, and frontmatter key list — without returning any prose. Use this before section reads or patches to discover what sections exist at a fraction of the cost of reading the full note.

NameRequiredDescriptionDefault
pathYesVault-relative path to the note.
includeSizesNoInclude per-section character length in each heading entry. Default false.
includeBlocksNoInclude block-reference anchors (^id). Default true.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, and the description adds meaningful behavioral context: it returns only structural data (headings, offsets, anchors, frontmatter keys) and explicitly excludes prose. It also signals a performance advantage ('fraction of the cost'), which is not in the annotations. No contradiction.

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 zero wasted words. The most critical information (what it returns and what it excludes) is front-loaded, and the usage guidance is packed efficiently into the second sentence.

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?

The description fully covers the return value (heading tree, offsets, anchors, frontmatter keys), the exclusions (no prose), and the usage context (before reads/patches). With only 3 well-documented parameters and read-only annotations, nothing essential is missing for an agent 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 the baseline is 3. The description doesn't add extra semantics to the parameters beyond what the schema already states, but it does clarify the overall output context (e.g., 'frontmatter key list' implies what includeFrontmatter might do). No compensation needed.

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 verb ('Return') with a precise resource ('a note's structure') and enumerates the components (heading tree, offsets, block-reference anchors, frontmatter key list). It clearly distinguishes from siblings like read_note by explicitly saying 'without returning any prose,' so an agent knows exactly what it gets.

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?

The description provides explicit when-to-use guidance: 'Use this before section reads or patches to discover what sections exist at a fraction of the cost of reading the full note.' This tells the agent the ideal scenario and why it's preferable to full reads, effectively excluding alternatives like read_note.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

patch_frontmatterA
DestructiveIdempotent

Set, update, or delete frontmatter keys without reordering existing keys or changing quote style. Pass null as a value to delete a key.

NameRequiredDescriptionDefault
pathYesVault-relative path to the note.
patchYesKey-value pairs to set. Null value removes the key.
prevHashNoOptional compare-and-swap guard: the contentHash from a prior read. Fails with hash_conflict if the note changed since.

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses important behavioral traits: it preserves key ordering and quote style, and explicitly explains that null values delete keys. These details go beyond the annotations (readOnlyHint=false, destructiveHint=true), which only indicate mutation and destructiveness. It adds useful context without contradiction.

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 a single, front-loaded sentence that states the core action, key guarantees, and deletion semantics. No filler or repetition; every clause adds value.

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?

The description covers the essential behavior, deletion semantics, and safety guarantees. It does not mention error cases like hash_conflict, but those are captured in the schema. It also omits prerequisites (e.g., note must exist), but given the simple tool and existing schema, the description is near-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 coverage is 100%, so the schema already documents all three parameters. The description repeats the null-deletion behavior for the patch parameter, which is also stated in the schema, and adds no new semantic information beyond what is structured. Thus baseline 3 applies.

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 clearly states the tool's purpose: setting, updating, and deleting frontmatter keys. It specifies the resource (frontmatter keys) and includes a concrete behavioral guarantee (preserving key order and quote style), which distinguishes it from sibling tools like patch_note that modify note content.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives such as patch_note or replace_in_note. The description gives no context on selection criteria, exclusions, or comparative advantages beyond the formatting guarantee.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

patch_noteA
Destructive

Surgically edit a section of a note — targeted by heading or block reference — without rewriting the whole file. Operations: append (add after section), prepend (add after heading line), replace (swap section content). Frontmatter is never touched.

NameRequiredDescriptionDefault
pathYesVault-relative path to the note.
targetYesExactly one of: { heading: "Section Title" } or { block: "block-id" } (without the ^ prefix).
contentYesContent to insert or replace with.
prevHashNoOptional compare-and-swap guard: the contentHash from a prior read. Fails with hash_conflict if the note changed since.
operationYesappend: insert after section content. prepend: insert after heading line. replace: swap section content.
createIfMissingNoIf the heading target is not found, append a new heading (level 2) + content. Only valid for heading targets. Default false.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, so the mutation nature is known. The description adds valuable behavioral context beyond annotations: edits are surgical and localized ('without rewriting the whole file'), and frontmatter is never touched. This meaningfully clarifies the blast radius of a destructive operation.

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 two sentences with no filler. It front-loads the core purpose and operation model, then adds a key safety guarantee. Every sentence 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 mutating tool with rich schema coverage and annotations, the description covers the essential behavior: targeted section editing, operation types, and frontmatter safety. It could mention failure behavior for missing targets, but the schema already covers createIfMissing and prevHash behavior.

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 input schema already documents all six parameters thoroughly. The description restates operation semantics in prose but does not add meaning beyond the schema, 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?

The description states a specific verb ('Surgically edit'), a resource ('a section of a note'), and a precise targeting mechanism ('targeted by heading or block reference'). It also distinguishes itself from sibling tools by noting 'without rewriting the whole file' and 'Frontmatter is never touched'.

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?

The description gives clear context for when this tool is appropriate: surgical section edits with append, prepend, or replace operations, and explicitly excludes frontmatter. It does not name sibling alternatives like patch_frontmatter or append_note, but the scope and exclusion are enough to guide selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

query_notesA
Read-only

Structured metadata query — filter notes by frontmatter key/value predicates, tag, folder, modified time, and size. Returns compact rows (path + title by default; opt into more via select), not note content. Use this instead of search when filtering by properties rather than text.

NameRequiredDescriptionDefault
tagNoRestrict to notes with this tag. # optional, case-insensitive; nested child tags match ("project" matches project/alpha).
sortNoSort field (default path).
limitNoMax results (1–500, default 100).
orderNoSort order (default asc).
whereNoFrontmatter predicates — all must match (AND).
folderNoRestrict to a vault-relative folder prefix.
selectNoExtra fields per hit: frontmatter keys, or "mtime", "size", "tags". Default returns only path + title.
maxSizeBytesNoOnly notes at most this many bytes.
minSizeBytesNoOnly notes at least this many bytes.
modifiedAfterNoOnly notes modified at or after this ISO 8601 date/time.
modifiedBeforeNoOnly notes modified before this ISO 8601 date/time.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=true and openWorldHint=false, so safety is already covered. The description adds real context beyond them: the return shape (compact rows, path + title by default, more only via select) and the negative statement that note content is not returned. It does not discuss pagination or result-count limits beyond what the schema's limit already says.

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?

Three sentences, zero padding, front-loaded with what it queries and immediately followed by what it returns and when to prefer it. Every clause 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?

No output schema exists, so the description must explain return values, and it does precisely: compact path+title rows by default, expanded via select, no note content. Combined with 100% schema coverage and read-only annotations, nothing needed to call this correctly 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?

Schema description coverage is 100%, with per-parameter docs including operator semantics and tag nesting, so the schema carries the load and the baseline is 3. The description only restates the filter categories and hints at select, adding no format or syntax detail beyond the schema.

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 (structured metadata query over notes) and enumerates the filter axes: frontmatter predicates, tag, folder, modified time, size. It also names the sibling it is not (search) and the axis that separates them, so an agent can disambiguate without opening either schema.

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 says "Use this instead of search when filtering by properties rather than text," naming both the alternative and the selecting condition. That is exactly the when-to-use/when-not guidance a routing decision needs.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

read_noteA
Read-only

Read a note or a span of it — by heading section, block reference, or line range. Returns structured JSON with the content, bytes returned, total note size, and a contentHash to pass as prevHash to edit tools for compare-and-swap. Use search or outline_note first to find the right path and section names.

NameRequiredDescriptionDefault
pathYesVault-relative path, e.g. "Daily Notes/2026-05-29.md".
blockNoReturn only the line anchored by this block id (^ prefix optional).
linesNoReturn only this line range (1-indexed, inclusive).
sectionNoReturn only this heading section (heading text, # prefix optional). First match wins.
includeFrontmatterNoPrepend frontmatter to section/block span results. Default false for spans.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint annotation, the description discloses the exact JSON return shape (content, bytes returned, total note size, contentHash) and the hash's purpose for compare-and-swap with edit tools. This behavioral context is not captured in annotations and is valuable for the agent.

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?

Three sentences: first states the operation and modes, second the return value, third the usage context. It is front-loaded with the core purpose and contains zero wasted words, making it efficiently structured.

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?

Given 5 parameters, a nested object, and no output schema, the description covers the return structure, the purpose of contentHash, and the prerequisite discovery steps. An agent has everything needed to call the tool correctly and understand its output without ambiguity.

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?

The schema fully describes all five parameters (100% coverage), so the description adds no extra parameter meaning. The mention of block reference and line range merely echoes schema descriptions; no new semantics are introduced, so the baseline of 3 applies.

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 (read) and resource (note or span), enumerates three selection modes (heading section, block reference, line range), and distinguishes it from siblings like outline_note and search by its read-only content-return focus. The purpose is unambiguous and the description clearly differentiates the tool.

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 tells the agent to use search or outline_note first to find the path and section names, and explains the contentHash is to pass as prevHash to edit tools for compare-and-swap. This provides clear when-to-use guidance and ordering, effectively routing the agent to the correct prerequisite tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

read_notesA
Read-only

Read up to 20 notes (or spans of them) in one call instead of repeated read_note calls, e.g. the top hits from search, query_notes, list_notes, or get_backlinks. Each item takes the same options as read_note and returns the same fields, in request order. budgetBytes (default 16384) caps the total note text: when the notes exceed it, each is cut to a fair share, marked truncated: true, and keeps noteBytes, so read the rest with read_note. A failing item (missing path, unknown section) returns its own error without failing the batch. contentHash is always the whole file's hash, usable as prevHash.

NameRequiredDescriptionDefault
itemsYesNotes to read, 1–20. Same options as read_note.
budgetBytesNoCap on total note text returned across all items, in UTF-8 bytes (256–65536, default 16384).

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the readOnlyHint/openWorldHint annotations: it discloses budgetBytes truncation semantics (fair-share cut, truncated: true, noteBytes retained for continuation), per-item error isolation ('a failing item returns its own error without failing the batch'), and that contentHash is always the whole-file hash usable as prevHash. These are non-obvious behaviors an agent could not derive from 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?

Front-loaded with purpose, then batching rationale, then budget/truncation behavior, then error isolation and contentHash. Four dense sentences with no filler; each one carries information an agent needs.

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?

No output schema exists, yet the description compensates by describing the return contract (same fields as read_note, in request order, truncated flag, noteBytes, contentHash). Combined with rich budget/error semantics, an agent has everything needed to call it correctly and handle partial results.

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 3, but the description adds real meaning: the default value and unit of budgetBytes, its truncation behavior, and the cross-item semantics ('each item takes the same options as read_note'). It does not restate the per-field span options, which the schema already handles well.

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+resource with explicit batch scope: 'Read up to 20 notes (or spans of them) in one call instead of repeated read_note calls.' This immediately distinguishes it from the sibling read_note by cardinality and by naming the upstream tools whose output feeds it (search, query_notes, list_notes, get_backlinks).

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 names when to use it (bulk-fetching top hits from search/query_notes/list_notes/get_backlinks) and routes the agent to the alternative for follow-up ('read the rest with read_note'). Both the when and the fallback path are stated, not inferred.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

rename_headingA
Destructive

Rename a heading in a note and rewrite every [[note#heading]] wikilink and embed across the vault so references keep working — aliases preserved, fenced code blocks left alone. Served from the warm backlink index, no vault scan. Heading matching is case-insensitive; with duplicate headings the first match wins, mirroring Obsidian link resolution.

NameRequiredDescriptionDefault
pathYesVault-relative path of the note containing the heading.
prevHashNoOptional compare-and-swap guard: the contentHash from a prior read. Fails with hash_conflict if the note changed since.
newHeadingYesNew heading text, without # markers. Must not contain newlines, "[", "]", "|", or "#".
oldHeadingYesCurrent heading text, without # markers. Case-insensitive; first match wins.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Despite having annotations, it adds valuable context about case-insensitivity, first-match-wins on duplicates, and skipping code blocks. It doesn't contradict the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two dense sentences pack a lot of precise information: what it does, how it works (warm backlink index), and key edge-case behaviors. 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 rename operation, it covers the mutation, the link rewriting, the index source, and important resolution semantics. It could elaborate on return values, but the description is comprehensive for typical usage.

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?

With 100% schema coverage, the schema already documents each parameter. The description adds value by explaining the exact behavior of heading matching and what happens with the prevHash guard.

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 clearly states it renames a heading and rewrites links and embeds across the vault, which distinguishes it from simple rename or edit tools. It mentions specific behavioral nuances like alias preservation and ignoring fenced code blocks.

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 implies this tool is for renaming headings specifically, not for other edits, and mentions how it handles duplicate headings. It doesn't explicitly mention alternative tools, but the context is clear for when to use this over a generic edit tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

replace_in_noteA
Destructive

Find and replace text within a note body. Supports literal and regex search, case sensitivity, whole-word matching, and a replacement limit. Frontmatter is never touched. Use dryRun to preview matches before writing.

NameRequiredDescriptionDefault
findYesText or pattern to find.
pathYesVault-relative path to the note.
limitNoMaximum number of replacements. Omit to replace all.
regexNoTreat find as a regular expression. Default false.
dryRunNoIf true, report matches without writing. Default false.
replaceYesReplacement text. Supports $1, $2, … backreferences in regex mode.
prevHashNoOptional compare-and-swap guard: the contentHash from a prior read. Fails with hash_conflict if the note changed since.
wholeWordNoMatch whole words only (\b boundary). Default false.
caseSensitiveNoCase-sensitive matching. Default false.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructiveHint=true and readOnlyHint=false, so the write nature is known. The description adds valuable behavioral context beyond that: it clarifies that frontmatter is never affected (scope of mutation) and recommends dryRun for previewing. It does not discuss failure modes like hash_conflict, but the schema documents that, and the bar is lower given the annotation coverage.

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 two sentences with no fluff. The core purpose is front-loaded, and the supporting details (feature list, frontmatter exclusion, dryRun tip) follow in a logical order. Every sentence earns its place, and nothing is redundant with the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 9 parameters and no output schema, the description could do more to explain return values or error conditions. It does not mention what the tool returns on success (e.g., count of replacements, updated content) or how it reports failures like hash_conflict or note-not-found. The schema and annotations cover some aspects, but the lack of output guidance leaves a gap for a mutation tool of this 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 all 9 parameters are individually documented. The description adds only a high-level summary of capabilities ('Supports literal and regex search, case sensitivity, whole-word matching, and a replacement limit') and a tip about dryRun, but this does not meaningfully augment the schema, which already explains each parameter's semantics. Thus, baseline 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?

The description clearly states the resource and action: 'Find and replace text within a note body.' It goes beyond a simple verb by listing supported features (literal/regex, case sensitivity, whole-word, limit) and explicitly excludes frontmatter, which distinguishes it from sibling tools like patch_frontmatter or append_note. An agent can immediately understand what it does without needing to inspect the schema.

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?

The description provides clear context: it is for body text replacement, and explicitly states 'Frontmatter is never touched,' which serves as a when-not-to-use boundary. It also advises using dryRun to preview before writing, which is a concrete usage tip. However, it does not name any alternative sibling tools, so it stops short of a full 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

resolve_noteA
Read-only

Resolve a note reference — a wikilink target, bare note name, path without extension, or frontmatter alias — to canonical vault-relative path(s). Each match carries provenance (path | basename | relpath | alias); matches[0] is exactly what a wikilink with that target resolves to, and ambiguous: true means more than one note matched. Empty matches means the reference resolves to nothing (didYouMean then lists close names). Returns paths only — resolve first, then read_notes. Pure index lookup.

NameRequiredDescriptionDefault
referenceYesReference to resolve: a vault-relative path ("Projects/Core.md"), a path without extension, a bare note name ("Core"), or a frontmatter alias.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=false, and the description goes well beyond that: it defines the provenance field, guarantees matches[0] equals actual wikilink resolution, explains ambiguous: true, and specifies empty-match behavior with didYouMean. That is exactly the return-shape and ambiguity semantics an agent needs to interpret results.

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?

Front-loaded with the core action and accepted input forms, then the result contract, then the routing hint. Every sentence adds a distinct fact (provenance, matches[0] guarantee, ambiguity flag, empty case, paths-only) with no filler.

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?

There is no output schema, so the description carries the full burden of describing return values — and it does: paths, provenance, ordering, ambiguity, and the empty-result hint. For a one-parameter read-only index lookup, nothing necessary 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?

With a single parameter at 100% schema description coverage, the schema already documents the accepted reference forms. The description adds only marginal framing ('wikilink target') beyond the schema's enumeration, so the baseline 3 applies.

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?

Specific verb + resource: resolves a note reference (wikilink target, bare name, extensionless path, alias) to canonical vault-relative paths. It explicitly separates itself from content-reading siblings by stating 'Returns paths only — resolve first, then read_notes.', so an agent can distinguish it from read_note/read_notes/search 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 Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear usage context and an explicit next step ('resolve first, then read_notes') and frames itself as a pure index lookup rather than a content fetch. It stops short of saying when to prefer it over search or query_notes for lookup-shaped questions, so the alternative routing is present but not exhaustive.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

undo_writeA
Destructive

Revert a journaled write: restores every file it touched to its byte-identical pre-write state (a multi-file move or heading rename is restored whole; a delete is restored even if it was permanent). Defaults to the most recent undoable write. Refuses with undo_conflict if a file changed since that write, unless force: true. The undo is itself journaled — undo it to redo.

NameRequiredDescriptionDefault
seqNoJournal entry to revert (from list_writes). Defaults to the most recent undoable write.
forceNoRestore even if a file changed after the journaled write; the clobbered state is journaled first so nothing is lost. Defaults to false.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and readOnlyHint=false, and the description adds substantial behavioral detail beyond that: byte-identical restoration, whole-operation restoration for multi-file changes, handling of permanent deletes, the undo_conflict guard, the effect of force, and the fact that the undo is itself journaled and can be undone to redo. This is exemplary disclosure of side effects and edge cases.

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?

Every sentence carries necessary information, and key facts are front-loaded: what the tool does, how it handles tricky cases, then defaults and conflict behavior. Despite covering complex semantics, the description remains compact and well-ordered with no filler.

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?

Given that there is no output schema, the description still tells the agent everything needed to invoke the tool correctly: default target, failure mode, force escape hatch, permanent-delete restoration, and redo possibility. The reference to list_writes in the schema completes the workflow context.

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 coverage is 100%, so the baseline is 3. The description reinforces the schema's default behavior for seq and explains the force semantics, but it does not add significantly new parameter-level information beyond what the input schema already provides. The description's added value is mostly behavioral, not parameter-specific.

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 opens with a specific verb and resource: 'Revert a journaled write' and precisely defines the effect ('restores every file it touched to its byte-identical pre-write state'). It also distinguishes the tool's scope by giving concrete examples like multi-file moves, heading renames, and permanent deletes, leaving no ambiguity about what the tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear operational guidance: it defaults to the most recent undoable write, explains the undo_conflict refusal condition, and clarifies how force:true changes the behavior. While it does not explicitly state 'use list_writes to find a seq,' the schema parameter references list_writes, and there is no competing sibling tool for undo operations, so the context is clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_taskA
DestructiveIdempotent

Set the state of one Markdown checkbox identified by path + line (from list_tasks), rewriting exactly one character — the rest of the file, frontmatter included, stays byte-identical. Pass expectText to guard against the line having changed, and prevHash for full compare-and-swap. Setting the current state again is a success no-op.

NameRequiredDescriptionDefault
lineYes1-based line number of the task, as returned by list_tasks.
pathYesVault-relative path to the note.
stateYesNew marker character: "x" (done), " " (open), or a custom marker like "/".
prevHashNoOptional compare-and-swap guard: the contentHash from a prior read. Fails with hash_conflict if the note changed since.
expectTextNoOptional guard: the task text list_tasks returned. Fails with task_text_mismatch if the line’s text changed since.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well past the annotations by disclosing the exact write footprint (single character, frontmatter and rest of file untouched), the repeat-set-is-a-no-op behavior that explains idempotency, and the concrete failure modes hash_conflict and task_text_mismatch tied to the guard parameters. Nothing here contradicts destructiveHint=true; it clarifies how minimal the mutation actually is.

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?

Three compact sentences, front-loaded with the operation and its write footprint, then the optional guards, then the no-op edge case. Every sentence carries distinct information with no filler.

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?

Covers the mutation's blast radius, concurrency guards, and edge-case semantics, which is what an agent needs to call it safely. With no output schema, it does not say what the call returns (e.g. new hash or status), leaving a minor gap.

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 3, but the description adds real meaning: it ties path + line to list_tasks as their source and explains the distinct roles of expectText (line-text guard) versus prevHash (whole-note compare-and-swap). Only the state parameter's accepted values are left entirely to the schema.

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 ('Set the state of one Markdown checkbox identified by path + line') and pins the scope precisely: exactly one character is rewritten, everything else stays byte-identical. That distinguishes it cleanly from siblings like replace_in_note or patch_note, which edit larger regions.

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?

Directs the agent to obtain path + line 'from list_tasks' and explains when to pass expectText (line changed) versus prevHash (full compare-and-swap). It gives clear positive usage context but never names exclusions or alternatives, e.g. when to prefer replace_in_note or patch_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. 3 tool updatesv0.3.27
    • Addedlist_tasks
    • Addedresolve_note
    • Addedupdate_task
  2. 5 tool updatesv0.3.26
    • Changedcontext_pack1 field changed
      • changedInput schema / properties / tag / description
        Previous value: -"Restrict to notes with this tag."New value: +"Restrict to notes with this tag. # optional, case-insensitive; nested child tags match (\"project\" matches project/alpha)."
    • Changedlist_notes1 field changed
      • changedInput schema / properties / tag / description
        Previous value: -"Filter by tag (# prefix optional)."New value: +"Filter by tag. # optional, case-insensitive; nested child tags match (\"project\" matches project/alpha)."
    • Changedquery_notes1 field changed
      • changedInput schema / properties / tag / description
        Previous value: -"Restrict to notes with this tag (# optional)."New value: +"Restrict to notes with this tag. # optional, case-insensitive; nested child tags match (\"project\" matches project/alpha)."
    • Addedread_notes
    • Changedsearch1 field changed
      • changedInput schema / properties / tag / description
        Previous value: -"Restrict to notes with this tag."New value: +"Restrict to notes with this tag. # optional, case-insensitive; nested child tags match (\"project\" matches project/alpha)."
  3. 3 tool updatesv0.3.25
    • Changedcontext_pack3 fields changed
      • addedInput schema / properties / folder
        Added value: +{
        +  "description": "Restrict to a vault-relative folder prefix.",
        +  "type": "string"
        +}
      • addedInput schema / properties / mode
        Added value: +{
        +  "description": "lexical = keyword search (default). semantic = meaning-based over local embeddings (needs SEEKSTONE_SEMANTIC=1 and a fetched model). hybrid = exact-title lookups go lexical, everything else semantic.",
        +  "enum": [
        +    "lexical",
        +    "semantic",
        +    "hybrid"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / tag
        Added value: +{
        +  "description": "Restrict to notes with this tag.",
        +  "type": "string"
        +}
    • Changedpatch_note2 fields changed
      • addedInput schema / properties / target / anyOf
        Added value: +[
        +  {
        +    "properties": {
        +      "heading": {
        +        "description": "Heading text (without # markers).",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "heading"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "properties": {
        +      "block": {
        +        "description": "Block reference ID (without the ^ prefix).",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "block"
        +    ],
        +    "type": "object"
        +  }
        +]
      • removedInput schema / properties / target / type
        Removed value: -"object"
    • Changedquery_notes1 field changed
      • addedInput schema / properties / where / items / properties / value / type
        Added value: +[
        +  "string",
        +  "number",
        +  "boolean"
        +]
  4. 2 tool updatesv0.3.22
    • Addedlist_writes
    • Addedundo_write
  5. 1 tool updatev0.3.19
    • Changedsearch1 field changed
      • addedInput schema / properties / excerptLength
        Added value: +{
        +  "description": "Max characters of match context per hit (20–2000, default 120).",
        +  "type": "number"
        +}
  6. 3 tool updatesv0.3.18
    • Changeddelete_note1 field changed
      • addedInput schema / properties / prevHash
        Added value: +{
        +  "description": "Optional compare-and-swap guard: the contentHash from a prior read. Fails with hash_conflict if the note changed since — so you never delete content you have not seen.",
        +  "type": "string"
        +}
    • Changedmove_note1 field changed
      • addedInput schema / properties / prevHash
        Added value: +{
        +  "description": "Optional compare-and-swap guard on the source note: the contentHash from a prior read. Fails with hash_conflict if the note changed since.",
        +  "type": "string"
        +}
    • Changedsearch1 field changed
      • addedInput schema / properties / mode
        Added value: +{
        +  "description": "lexical = keyword search (default). semantic = meaning-based search (requires SEEKSTONE_SEMANTIC=1). hybrid = exact-title lookups go lexical, everything else semantic.",
        +  "enum": [
        +    "lexical",
        +    "semantic",
        +    "hybrid"
        +  ],
        +  "type": "string"
        +}
  7. 2 tool updatesv0.3.17
    • Addedcontext_pack
    • Addedrename_heading
  8. 7 tool updatesv0.3.16
    • Changedappend_note1 field changed
      • addedInput schema / properties / prevHash
        Added value: +{
        +  "description": "Optional compare-and-swap guard: the contentHash from a prior read. Fails with hash_conflict if the note changed since.",
        +  "type": "string"
        +}
    • Changedappend_periodic_note1 field changed
      • addedInput schema / properties / prevHash
        Added value: +{
        +  "description": "Optional compare-and-swap guard: the contentHash from a prior read. Fails with hash_conflict if the note changed since.",
        +  "type": "string"
        +}
    • Changedcreate_note1 field changed
      • addedInput schema / properties / prevHash
        Added value: +{
        +  "description": "Optional compare-and-swap guard: the contentHash from a prior read. Fails with hash_conflict if the note changed since.",
        +  "type": "string"
        +}
    • Changeddelete_note1 field changed
      • addedInput schema / properties / permanent
        Added value: +{
        +  "description": "Permanently remove instead of moving to .trash/. Defaults to false.",
        +  "type": "boolean"
        +}
    • Changedpatch_frontmatter1 field changed
      • addedInput schema / properties / prevHash
        Added value: +{
        +  "description": "Optional compare-and-swap guard: the contentHash from a prior read. Fails with hash_conflict if the note changed since.",
        +  "type": "string"
        +}
    • Changedpatch_note1 field changed
      • addedInput schema / properties / prevHash
        Added value: +{
        +  "description": "Optional compare-and-swap guard: the contentHash from a prior read. Fails with hash_conflict if the note changed since.",
        +  "type": "string"
        +}
    • Changedreplace_in_note1 field changed
      • addedInput schema / properties / prevHash
        Added value: +{
        +  "description": "Optional compare-and-swap guard: the contentHash from a prior read. Fails with hash_conflict if the note changed since.",
        +  "type": "string"
        +}
  9. 1 tool updatev0.3.15
    • Changedmove_note1 field changed
      • addedInput schema / properties / rewriteLinks
        Added value: +{
        +  "description": "Rewrite references in other notes to follow the move. Defaults to true; pass false to move the file only.",
        +  "type": "boolean"
        +}
  10. 1 tool updatev0.3.13
    • Addedquery_notes

TDQS

A3.8/5.0

Scored across 25 tools

Disambiguation4/5

Most tools have crisply distinct purposes, and descriptions actively steer selection (query_notes 'use this instead of search when filtering by properties', context_pack 'use search to locate notes'). The residual overlaps — read_note vs read_notes, append_note vs patch_note's append op vs append_periodic_note, search vs query_notes vs context_pack — are explained but still require reading the descriptions to pick correctly.

Naming Consistency5/5

Uniform snake_case with a verb-first pattern (list_*, get_*, read_*, create_*, move_*, update_*, patch_*, append_*, delete_*, rename_*) used consistently across notes, tasks, links, periodic notes, and the write journal. The only bare-verb tools (search, undo_write) are self-explanatory and don't break the pattern.

Tool Count3/5

25 tools sits at the heavy end of the range for an Obsidian vault server. Several are convenience variants of one another (read_note/read_notes, search/query_notes/context_pack, append_note/patch_note/append_periodic_note, get_periodic_note), so the surface is broader than strictly necessary even though each tool maps to a real workflow.

Completeness4/5

Strong lifecycle coverage: read/create/append/move/delete, section and frontmatter patching, full-text and metadata search, task listing/state changes, backlinks/outlinks, periodic notes, and a journaled undo system that covers reverts of every write. Minor gaps remain — no folder-level operations (create/move/delete folders, listing folder structure), no batch multi-note edits, and no template listing despite template-based creation.

Maintenance

ActivityActive
ResponsivenessWithin a week

Related MCP Connectors

Related MCP Servers