seekstone
Seekstone | obsidian-mcp-server (#1 по загрузкам) | REST-прокси-серверы | |
Плагин Local REST API | Не нужен | Обязателен | Обязателен |
Запущенное приложение Obsidian | Не нужно — работает при закрытом Obsidian | Обязательно | Обязательно |
Объём ответа поиска @ 10k заметок | 2.0 КБ | 47 КБ | до 95 МБ |
Задержка тёплого v9 | 6.2 мс | 732 мс (~118 проектка) | до 1 550 мс |
Структурированные запросы по frontmatter | Встроен ( | 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 |
прямой доступ к полетовой системе, субпроцесс | 1.7 KB | 1.9 KB | 2.2 KB | |
прямой доступ к ФС, сканирование в каждом запросе | 10.2 KB | 10.8 KB | 11.2 KB | |
SQLite-платформа | 4.2 KB | 6.8 KB | 7.2 KB | |
REST API | 55 KB | 145 KB | 232 KB | |
прямой доступ к ФС, субпроцесс | 25 KB | 84 KB | 114 KB | |
прямой доступ к ФС, субпроцесс | 18 KB | 105 KB | 201 KB | |
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, терминал не нужен)
Скачайте
seekstone.mcpbиз GitHub ReleasesОткройте его в Claude Desktop — двойной клик в Finder или правая кнопка → Открыть с помощью → Claude Desktop
Выберите папку вашего хранилища 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_backlinksandget_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 | Описание |
| Полноетекстовый поиск. Возвращает ранжированные фрагменты (по умолчанию ~120 символов, настраивается через |
| Структурированный запрос по метаданнымго. Фильтры по предикатам «ключ-значение» во frontmatter ( |
| Готовый кейс для ответа на вопрос на естественном языке одним запросом, жёсть ограниченным бюджетом байт (по умолчанию ~2 КБ): ранжированные фрагменты, связанные соседние заметки с однострочным пересказом, а также пути к следующим источникам — заменяет цикл search → read → get_backlinks. |
| Читать полное содержимое заметки по относительному пути в хранилище. Допускает возврат отдельной секции, блока или диапазона строк. |
| Список заметок, опционально отфильтрованных по префиксу папки или тегу. |
| Список всех тегов в хранилище, отсортированных по частоте использования (или по алфавиту). |
| Возвращает структуру заголовков и блоков заметки без её полного содержимого — дешёвая навигация перед целевым чтением. |
| Находит все заметки, которые ссылаются на данную заметку. |
| Перечисляет все статически заданные wikilinks markdown-ссылки из заметки. |
| Читает сегодняшнюю — или за любую дату — дневник ведущий, еженедельную, ежемесячную, квартальную или годовую заметку — путь извлекается из конфигурации хранилища, Obsidian не требуется. |
Запись
Tool | Description |
| Создаёт заметку (опционольный frontmatter + тело); родительские каталоги создаются автоматически. |
| Перемещается заметку в папку |
| Перемещат или преименовывает заметку — вики-ссылки и markdown-ссылки в других заметках, указывающие на неё, переписываются, чтобы ничене не сломало;с ( |
| Переименовывает заголоок в заметке — каждая вики-ссылка |
| Добавляет текст в тело заметки, не затрагив фронтматтер. |
| Append text to a note body ... Let's correct: original row |
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.## Конфигурация
Переменная | Обязательная | Описание |
| Да | Абсолютный путь к вашему хранилищу Obsidian. |
| Нет |
|
| Нет | Абсолютный путь; при установке JSON-строки логов добавляются в него (с ротацией по размеру). |
| Нет | Порог ротации лога для |
| Нет | Установите |
| Нет | Установите |
| Нет | Разделяемые запятыми glob-шаблоны относительно хранилища (например, |
| Нет | Установите |
| Нет | Каталог, содержащий модель эмбедингов Model2Vec (по умолчанию: туда, куда |
| Нет | Корневой каталог кэша для скачанной модели и покэшевых эмбедингов каждого хранилища (по умолчанию |
Файловое содержимое
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Структура репозитория
Пакет | Назначение |
| Общие примитивы хранилища — walk, парсер frontmatter, извлекательсвязей/тегов, outline, percentiles, pmap и эмбеддер Model2Vec. Встраивается в сборку сервера. |
| Публикуемый MCP-сервер |
| Профилировщик + бенчмарк + стенд проверки безопасности записи (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 toolsappend_noteA
Append text to a note body without touching the frontmatter. Safe for meeting notes, daily logs, and append-only workflows.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Vault-relative path to the note. | |
| content | Yes | Text to append. | |
| prevHash | No | Optional compare-and-swap guard: the contentHash from a prior read. Fails with hash_conflict if the note changed since. |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | ISO date string (YYYY-MM-DD). Defaults to today when omitted. | |
| period | No | Period type. Default: daily. | |
| content | Yes | Text to append to the note body. | |
| prevHash | No | Optional compare-and-swap guard: the contentHash from a prior read. Fails with hash_conflict if the note changed since. | |
| createIfMissing | No | Create the note if it does not exist before appending. Default true. |
TDQS
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.
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.
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.
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.
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.
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_packARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | Restrict to notes with this tag. # optional, case-insensitive; nested child tags match ("project" matches project/alpha). | |
| mode | No | 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. | |
| query | Yes | Natural-language question or topic. | |
| folder | No | Restrict to a vault-relative folder prefix. | |
| budgetBytes | No | Hard cap on response JSON bytes (256–16384, default 2048). |
TDQS
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.
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.
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.
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.
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.
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_noteADestructive
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).
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Vault-relative path, e.g. "Daily Notes/2026-06-01.md". | |
| content | No | Body content for the note. | |
| prevHash | No | Optional compare-and-swap guard: the contentHash from a prior read. Fails with hash_conflict if the note changed since. | |
| overwrite | No | Overwrite an existing note. Defaults to false. | |
| frontmatter | No | Frontmatter key-value pairs. |
TDQS
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.
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.
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.
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.
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.
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_noteADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Vault-relative path of the note to delete. | |
| prevHash | No | 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. | |
| permanent | No | Permanently remove instead of moving to .trash/. Defaults to false. |
TDQS
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.
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.
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.
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.
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.
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_backlinksARead-only
Return every note that links to the target note, with the source line and an optional excerpt. Results come from the pre-built reverse-link index so this is a fast, pure index lookup. Sort order: source path ascending.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Vault-relative path to the target note. | |
| limit | No | Max backlinks to return (1–500). Default 50. | |
| includeContext | No | Include a short excerpt (~200 chars) from the linking line. Default true. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is known. The description adds the performance characteristic ('fast, pure index lookup') and the sort order. It does not describe pagination behavior, ownership, or failure modes. With annotations covering the read-only nature, a 3 is fair – it adds a bit but not extensive behavioral depth.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: purpose, performance characteristic, and sort order. Front-loaded with the core function. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read operation with fully documented parameters (schema coverage 100%) and a clear description, the agent has everything needed to invoke it. Missing an explicit output structure, but no output schema exists impossible to know exactly, but the description mentions source line and optional excerpt, which is adequate. Could mention pagination but not critical. Score 4 because it covers the essentials.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, with each parameter described. The description adds context on the 'excerpt' (optional, ~200 chars) and the sort order, which enriches understanding of 'limit' and 'includeExcerpt'. It goes slightly beyond pure schema repetition, earning a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Return'), a precise resource ('every note that links to the target note'), and the result shape (source line, optional excerpt). It implicitly distinguishes itself from sibling tools like get_links (which likely returns outgoing links) and search, making the operation unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives contextual signals for when to use this tool: it is a reverse-link lookup backed by a pre-built index, implying it is the fast, intended path for finding inbound references. It does not explicitly name alternatives or exclusions, but the 'pure index lookup' phrasing signals it is not for full-text search or outgoing links. Slight gap: no explicit 'use X instead' guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_linksARead-only
Return all outgoing wikilinks and embeds from a note. Each link is marked resolved (with target path) or unresolved. Duplicate targets are de-duplicated; results sorted by line number.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Vault-relative path to the note. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint true)Skip, the description adds behavioral details: marks links as resolved/unresolved, de-duplicates targets, sorts by line number. This goes beyond the annotation's safety hint, providing useful output behavior. 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, two sentences, with key behaviors front-loaded (outgoing links) and additional details succinctly stated. No fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only tool with a single required parameter and no output schema, the description covers what it returns and its behavior. It lacks explicit error cases or whether the note must exist, but given simplicity and annotations, it is largely complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter 'path' is fully covered by the schema (100% coverage), so the description does not need to add much. It does not describe format or errors, but the schema requirement is clear. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it returns outgoing wikilinks and embeds from a note, which is specific and distinct from get_backlinks (incoming links). It mentions resolution, de-duplication, and sorting, but does not explicitly contrast with siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies it is used to inspect outgoing links from a note, but provides no explicit when-to-use or when-not-to-use guidance. Given the sibling get_backlinks, a note on when each is appropriate would be helpful. The description does not mention the note must exist or prerequisites.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | ISO date string (YYYY-MM-DD). Defaults to today when omitted. | |
| period | No | Period type. Default: daily. | |
| createIfMissing | No | Create the note from the configured template if it does not exist. Default false. |
TDQS
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.
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.
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.
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.
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.
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_notesCRead-only
List notes, optionally filtered by folder prefix or tag.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | Filter by tag. # optional, case-insensitive; nested child tags match ("project" matches project/alpha). | |
| limit | No | Max results (1–500, default 100). | |
| folder | No | Vault-relative folder prefix. |
TDQS
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.
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.
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.
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.
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.
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_tagsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Sort by usage count descending (default) or alphabetically. | |
| pattern | No | Substring filter on tag name. Example: "work" matches "work" and "area/work". | |
| minCount | No | Only return tags used in at least this many notes. |
TDQS
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.
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.
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.
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.
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.
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_tasksARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | Restrict to notes with this tag. # optional, case-insensitive; nested child tags match ("project" matches project/alpha). | |
| path | No | Vault-relative path to a single note. Omit to search the whole vault. | |
| limit | No | Max tasks (1–500, default 100). | |
| state | No | Which tasks to return. Default: open. | |
| folder | No | Restrict to a vault-relative folder prefix. | |
| modifiedAfter | No | Only tasks in notes modified at or after this ISO 8601 date/time. |
TDQS
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.
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.
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.
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.
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.
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_writesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | Only entries that touched this vault-relative path. | |
| limit | No | Max entries to return, newest first (1–200, default 20). |
TDQS
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.
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.
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.
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.
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.
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_noteADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Vault-relative destination path. | |
| from | Yes | Vault-relative source path. | |
| prevHash | No | Optional compare-and-swap guard on the source note: the contentHash from a prior read. Fails with hash_conflict if the note changed since. | |
| overwrite | No | Overwrite destination if it exists. Defaults to false. | |
| rewriteLinks | No | Rewrite references in other notes to follow the move. Defaults to true; pass false to move the file only. |
TDQS
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.
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.
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.
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.
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.
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_noteARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Vault-relative path to the note. | |
| includeSizes | No | Include per-section character length in each heading entry. Default false. | |
| includeBlocks | No | Include block-reference anchors (^id). Default true. |
TDQS
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.
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.
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.
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.
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.
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_frontmatterADestructiveIdempotent
Set, update, or delete frontmatter keys without reordering existing keys or changing quote style. Pass null as a value to delete a key.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Vault-relative path to the note. | |
| patch | Yes | Key-value pairs to set. Null value removes the key. | |
| prevHash | No | Optional compare-and-swap guard: the contentHash from a prior read. Fails with hash_conflict if the note changed since. |
TDQS
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.
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.
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.
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.
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.
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_noteADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Vault-relative path to the note. | |
| target | Yes | Exactly one of: { heading: "Section Title" } or { block: "block-id" } (without the ^ prefix). | |
| content | Yes | Content to insert or replace with. | |
| prevHash | No | Optional compare-and-swap guard: the contentHash from a prior read. Fails with hash_conflict if the note changed since. | |
| operation | Yes | append: insert after section content. prepend: insert after heading line. replace: swap section content. | |
| createIfMissing | No | If the heading target is not found, append a new heading (level 2) + content. Only valid for heading targets. Default false. |
TDQS
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.
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.
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.
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.
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.
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_notesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | Restrict to notes with this tag. # optional, case-insensitive; nested child tags match ("project" matches project/alpha). | |
| sort | No | Sort field (default path). | |
| limit | No | Max results (1–500, default 100). | |
| order | No | Sort order (default asc). | |
| where | No | Frontmatter predicates — all must match (AND). | |
| folder | No | Restrict to a vault-relative folder prefix. | |
| select | No | Extra fields per hit: frontmatter keys, or "mtime", "size", "tags". Default returns only path + title. | |
| maxSizeBytes | No | Only notes at most this many bytes. | |
| minSizeBytes | No | Only notes at least this many bytes. | |
| modifiedAfter | No | Only notes modified at or after this ISO 8601 date/time. | |
| modifiedBefore | No | Only notes modified before this ISO 8601 date/time. |
TDQS
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.
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.
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.
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.
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.
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_noteARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Vault-relative path, e.g. "Daily Notes/2026-05-29.md". | |
| block | No | Return only the line anchored by this block id (^ prefix optional). | |
| lines | No | Return only this line range (1-indexed, inclusive). | |
| section | No | Return only this heading section (heading text, # prefix optional). First match wins. | |
| includeFrontmatter | No | Prepend frontmatter to section/block span results. Default false for spans. |
TDQS
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.
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.
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.
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.
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.
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_notesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| items | Yes | Notes to read, 1–20. Same options as read_note. | |
| budgetBytes | No | Cap on total note text returned across all items, in UTF-8 bytes (256–65536, default 16384). |
TDQS
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.
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.
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.
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.
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.
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_headingADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Vault-relative path of the note containing the heading. | |
| prevHash | No | Optional compare-and-swap guard: the contentHash from a prior read. Fails with hash_conflict if the note changed since. | |
| newHeading | Yes | New heading text, without # markers. Must not contain newlines, "[", "]", "|", or "#". | |
| oldHeading | Yes | Current heading text, without # markers. Case-insensitive; first match wins. |
TDQS
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.
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.
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.
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.
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.
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_noteADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| find | Yes | Text or pattern to find. | |
| path | Yes | Vault-relative path to the note. | |
| limit | No | Maximum number of replacements. Omit to replace all. | |
| regex | No | Treat find as a regular expression. Default false. | |
| dryRun | No | If true, report matches without writing. Default false. | |
| replace | Yes | Replacement text. Supports $1, $2, … backreferences in regex mode. | |
| prevHash | No | Optional compare-and-swap guard: the contentHash from a prior read. Fails with hash_conflict if the note changed since. | |
| wholeWord | No | Match whole words only (\b boundary). Default false. | |
| caseSensitive | No | Case-sensitive matching. Default false. |
TDQS
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.
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.
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.
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.
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.
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_noteARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| reference | Yes | Reference to resolve: a vault-relative path ("Projects/Core.md"), a path without extension, a bare note name ("Core"), or a frontmatter alias. |
TDQS
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.
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.
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.
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.
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.
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.
searchARead-only
Full-text search across the vault. Returns ranked excerpts (~120 chars, tunable) — not full notes — to minimise context usage. Supports fuzzy matching and prefix search; with SEEKSTONE_SEMANTIC=1, mode "semantic"/"hybrid" searches by meaning via a local embedding model.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | Restrict to notes with this tag. # optional, case-insensitive; nested child tags match ("project" matches project/alpha). | |
| mode | No | lexical = keyword search (default). semantic = meaning-based search (requires SEEKSTONE_SEMANTIC=1). hybrid = exact-title lookups go lexical, everything else semantic. | |
| limit | No | Max results (1–50, default 10). | |
| query | Yes | Search query. | |
| folder | No | Restrict to a vault-relative folder prefix. | |
| excerptLength | No | Max characters of match context per hit (20–2000, default 120). |
TDQS
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 real behavioral context beyond them — excerpt size (~120 chars, tunable), fuzzy and prefix matching, and the environment-variable gate on semantic mode. It stops short of describing ranking behavior or whether results are paginated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences, front-loaded with the core verb and result shape, then the matching capabilities, then the conditional semantic mode. No filler and nothing repeated from the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does so well (ranked excerpts, approximate length, tunability), and it covers all six parameters indirectly. Minor gaps remain around result ordering/ranking guarantees, but an agent has enough to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning the schema does not: excerptLength is framed as the tunable knob that controls context cost, and semantic/hybrid mode is tied to a required environment flag. These are genuine additions rather than restatements.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Full-text search across the vault') and immediately characterizes the result type ('ranked excerpts — not full notes'), which distinguishes it from content-returning siblings like read_notes, read_note and query_notes without opening their schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'not full notes — to minimise context usage' framing implies when to prefer this over read_notes, and the semantic/hybrid modes come with an explicit precondition (SEEKSTONE_SEMANTIC=1). However, no sibling tool is named directly and no explicit when-not guidance is given, so the agent must infer the routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
undo_writeADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| seq | No | Journal entry to revert (from list_writes). Defaults to the most recent undoable write. | |
| force | No | Restore even if a file changed after the journaled write; the clobbered state is journaled first so nothing is lost. Defaults to false. |
TDQS
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.
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.
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.
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.
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.
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_taskADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| line | Yes | 1-based line number of the task, as returned by list_tasks. | |
| path | Yes | Vault-relative path to the note. | |
| state | Yes | New marker character: "x" (done), " " (open), or a custom marker like "/". | |
| prevHash | No | Optional compare-and-swap guard: the contentHash from a prior read. Fails with hash_conflict if the note changed since. | |
| expectText | No | Optional guard: the task text list_tasks returned. Fails with task_text_mismatch if the line’s text changed since. |
TDQS
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.
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.
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.
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.
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.
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.
3 tool updates
v0.3.27- Added
list_tasks - Added
resolve_note - Added
update_task
5 tool updates
v0.3.26- Changed
context_pack1 field changed- changed
Input schema / properties / tag / descriptionPrevious 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)."
- Changed
list_notes1 field changed- changed
Input schema / properties / tag / descriptionPrevious value: -"Filter by tag (# prefix optional)."New value: +"Filter by tag. # optional, case-insensitive; nested child tags match (\"project\" matches project/alpha)."
- Changed
query_notes1 field changed- changed
Input schema / properties / tag / descriptionPrevious 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)."
- Added
read_notes - Changed
search1 field changed- changed
Input schema / properties / tag / descriptionPrevious 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 tool updates
v0.3.25- Changed
context_pack3 fields changed- added
Input schema / properties / folderAdded value: +{ + "description": "Restrict to a vault-relative folder prefix.", + "type": "string" +} - added
Input schema / properties / modeAdded 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" +} - added
Input schema / properties / tagAdded value: +{ + "description": "Restrict to notes with this tag.", + "type": "string" +}
- Changed
patch_note2 fields changed- added
Input schema / properties / target / anyOfAdded 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" + } +] - removed
Input schema / properties / target / typeRemoved value: -"object"
- Changed
query_notes1 field changed- added
Input schema / properties / where / items / properties / value / typeAdded value: +[ + "string", + "number", + "boolean" +]
2 tool updates
v0.3.22- Added
list_writes - Added
undo_write
1 tool update
v0.3.19- Changed
search1 field changed- added
Input schema / properties / excerptLengthAdded value: +{ + "description": "Max characters of match context per hit (20–2000, default 120).", + "type": "number" +}
3 tool updates
v0.3.18- Changed
delete_note1 field changed- added
Input schema / properties / prevHashAdded 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" +}
- Changed
move_note1 field changed- added
Input schema / properties / prevHashAdded 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" +}
- Changed
search1 field changed- added
Input schema / properties / modeAdded 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" +}
2 tool updates
v0.3.17- Added
context_pack - Added
rename_heading
7 tool updates
v0.3.16- Changed
append_note1 field changed- added
Input schema / properties / prevHashAdded value: +{ + "description": "Optional compare-and-swap guard: the contentHash from a prior read. Fails with hash_conflict if the note changed since.", + "type": "string" +}
- Changed
append_periodic_note1 field changed- added
Input schema / properties / prevHashAdded value: +{ + "description": "Optional compare-and-swap guard: the contentHash from a prior read. Fails with hash_conflict if the note changed since.", + "type": "string" +}
- Changed
create_note1 field changed- added
Input schema / properties / prevHashAdded value: +{ + "description": "Optional compare-and-swap guard: the contentHash from a prior read. Fails with hash_conflict if the note changed since.", + "type": "string" +}
- Changed
delete_note1 field changed- added
Input schema / properties / permanentAdded value: +{ + "description": "Permanently remove instead of moving to .trash/. Defaults to false.", + "type": "boolean" +}
- Changed
patch_frontmatter1 field changed- added
Input schema / properties / prevHashAdded value: +{ + "description": "Optional compare-and-swap guard: the contentHash from a prior read. Fails with hash_conflict if the note changed since.", + "type": "string" +}
- Changed
patch_note1 field changed- added
Input schema / properties / prevHashAdded value: +{ + "description": "Optional compare-and-swap guard: the contentHash from a prior read. Fails with hash_conflict if the note changed since.", + "type": "string" +}
- Changed
replace_in_note1 field changed- added
Input schema / properties / prevHashAdded value: +{ + "description": "Optional compare-and-swap guard: the contentHash from a prior read. Fails with hash_conflict if the note changed since.", + "type": "string" +}
1 tool update
v0.3.15- Changed
move_note1 field changed- added
Input schema / properties / rewriteLinksAdded value: +{ + "description": "Rewrite references in other notes to follow the move. Defaults to true; pass false to move the file only.", + "type": "boolean" +}
1 tool update
v0.3.13- Added
query_notes
TDQS
Scored across 25 tools
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.
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.
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.
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
Related MCP Connectors
An MCP server for deep research or task groups
Related MCP Servers
- AlicenseAqualityDmaintenanceMCP server to interact with Obsidian via the Local REST API community plugin.2134,490MIT
- AlicenseNot gradedqualityCmaintenanceMCP server providing tools to interact with Obsidian via the Local REST API community plugin.5MIT
- AlicenseNot gradedqualityBmaintenanceThe fastest Obsidian MCP server for Claude.1MIT
- AlicenseNot gradedqualityDmaintenanceAn Obsidian plugin that runs an embedded MCP server inside Obsidian, exposing vault operations and optional GitHub integration to any MCP client.7,382 npmGPL 3.0