Skip to main content
Glama
bezata

kObsidian MCP

by bezata

kObsidian MCP

Filesystem-first MCP server for Obsidian vaults — with an LLM-Wiki layer on top.

Inspired by Andrej Karpathy's LLM Wiki idea. You curate the sources; the LLM does the bookkeeping.

npm version npm downloads GitHub release license Release CI

MCP Bun TypeScript Tools Resources Prompts Smithery MCP Registry VirusTotal

Install · Quick start · Architecture · LLM Wiki · Tools · Docs

Docs: 简体中文 / 日本語 / 한국어

kObsidian MCP server


🧰 The only Obsidian MCP with workspaces. vault.list / vault.select let an LLM discover and switch between your Obsidian vaults in-session — no restart, no config edit, no per-tool path threading. Backwards compatible with OBSIDIAN_VAULT_PATH. Added in v0.3.0. See docs/WORKSPACES.md.


Why kObsidian

  • Filesystem-first. Operates on your vault directly. Obsidian doesn't need to be running for 55+ of the 66 tools.

  • 66 typed MCP tools across vaults, notes, links, tags, tasks, Dataview, Canvas, Kanban, fenced blocks, Marp, Templates — every one Zod-validated with structuredContent output and the full 4-hint MCP annotation set (readOnlyHint, destructiveHint, idempotentHint, openWorldHint).

  • Multi-vault vault.* (v0.3.0). The LLM can vault.list your known Obsidian vaults (discovered from Obsidian's own registry or OBSIDIAN_VAULT_<NAME> env vars) and vault.select between them for the session. Fully backwards compatible: OBSIDIAN_VAULT_PATH stays the default and per-call vaultPath arguments always win.

  • LLM-Wiki orchestration — a wiki.* namespace that turns your vault into a compounding knowledge base: ingest sources, auto-update an index + greppable log, lint for orphans / broken links / stale pages. Agent applies cross-refs via a proposedEdits contract so every write is visible in the transcript.

  • Both transports. Classic stdio for local MCP clients and Streamable HTTP (Hono) for remote, with CORS preflight, MCP-Protocol-Version handling, origin 403, and optional bearer auth — all per the 2025-11-25 spec.

  • Ships everywhere. npm (npx -y kobsidian-mcp), cross-platform .mcpb bundles for Claude Desktop drag-and-drop, a smithery.yaml for Smithery, and a server.json for the MCP Registry. Each .mcpb release asset is VirusTotal-scanned with links appended to the release body.


Related MCP server: obsidian-mcp

Install

Pick your client below. Every client supports the full hybrid mode — filesystem-first tools (80+ of them) run against the vault path alone, and the same config can simultaneously carry the Local REST API key to unlock workspace.*, commands.*, and live DQL via dataview.query*. Set the whole env block once per client and every tool namespace lights up; leave the REST key blank and the filesystem-first tools keep working.

Env var

Needed for

OBSIDIAN_VAULT_PATH

Required everywhere. Absolute path to the vault.

OBSIDIAN_API_URL

Base URL of the Local REST API plugin. Default https://127.0.0.1:27124.

OBSIDIAN_API_VERIFY_TLS

Optional. Defaults to false (the REST API plugin uses a self-signed cert on 127.0.0.1). Set true only after trusting the cert in your OS keychain.

OBSIDIAN_REST_API_KEY

Local REST API plugin bearer key — only for workspace.* / commands.* / live dataview.query*.

Full list in docs/ENVIRONMENT.md. Swap npx for bunx anywhere if you want ≈10 ms cold-start instead of ≈200 ms.

claude mcp add kobsidian -s user \
  --env OBSIDIAN_VAULT_PATH=/absolute/path/to/vault \
  --env OBSIDIAN_API_URL=https://127.0.0.1:27124 \
  --env OBSIDIAN_REST_API_KEY=only-if-you-use-workspace-or-commands-tools \
  -- npx -y kobsidian-mcp

On Windows, wrap the command in cmd /c: -- cmd /c npx -y kobsidian-mcp.

Download kobsidian-<platform>.mcpb from the latest release and drag it into Claude Desktop. The installer prompts for vault path + optional API URL / key. Every release asset is VirusTotal-scanned — the links are in the release body.

Build one locally:

bun install
bun run build:compile   # → dist/kobsidian (or .exe on Windows)
bun run bundle:mcpb     # → kobsidian.mcpb
codex mcp add kobsidian \
  --env OBSIDIAN_VAULT_PATH=/absolute/path/to/vault \
  --env OBSIDIAN_API_URL=https://127.0.0.1:27124 \
  --env OBSIDIAN_REST_API_KEY=only-if-you-use-workspace-or-commands-tools \
  -- npx -y kobsidian-mcp

Edit ~/.cursor/mcp.json (or the per-project .cursor/mcp.json):

{
  "mcpServers": {
    "kobsidian": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "kobsidian-mcp"],
      "env": {
        "OBSIDIAN_VAULT_PATH": "/absolute/path/to/vault",
        "OBSIDIAN_API_URL": "https://127.0.0.1:27124",
        "OBSIDIAN_REST_API_KEY": "only-if-you-use-workspace-or-commands-tools"
      }
    }
  }
}

Or hand a one-click deeplink to your users: cursor://anysphere.cursor-deeplink/mcp/install?name=kobsidian&config=<base64-encoded-config>.

code --add-mcp '{"name":"kobsidian","command":"npx","args":["-y","kobsidian-mcp"],"env":{"OBSIDIAN_VAULT_PATH":"/absolute/path/to/vault","OBSIDIAN_API_URL":"https://127.0.0.1:27124","OBSIDIAN_REST_API_KEY":"only-if-you-use-workspace-or-commands-tools"}}'

Or create .vscode/mcp.json in your workspace with the same shape under a top-level servers key.

gemini mcp add kobsidian \
  --env OBSIDIAN_VAULT_PATH=/absolute/path/to/vault \
  --env OBSIDIAN_API_URL=https://127.0.0.1:27124 \
  --env OBSIDIAN_REST_API_KEY=only-if-you-use-workspace-or-commands-tools \
  -- npx -y kobsidian-mcp

Or hand-edit ~/.gemini/settings.json under mcpServers.

Edit ~/.gemini/antigravity/mcp_config.json (Windows: %USERPROFILE%\.gemini\antigravity\mcp_config.json):

{
  "mcpServers": {
    "kobsidian": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "kobsidian-mcp"],
      "env": {
        "OBSIDIAN_VAULT_PATH": "/absolute/path/to/vault",
        "OBSIDIAN_API_URL": "https://127.0.0.1:27124",
        "OBSIDIAN_REST_API_KEY": "only-if-you-use-workspace-or-commands-tools"
      }
    }
  }
}

In ~/.config/zed/settings.json:

{
  "context_servers": {
    "kobsidian": {
      "source": "custom",
      "command": "npx",
      "args": ["-y", "kobsidian-mcp"],
      "env": {
        "OBSIDIAN_VAULT_PATH": "/absolute/path/to/vault",
        "OBSIDIAN_API_URL": "https://127.0.0.1:27124",
        "OBSIDIAN_REST_API_KEY": "only-if-you-use-workspace-or-commands-tools"
      }
    }
  }
}
{
  "mcp": {
    "kobsidian": {
      "type": "local",
      "command": ["npx", "-y", "kobsidian-mcp"],
      "environment": {
        "OBSIDIAN_VAULT_PATH": "/absolute/path/to/vault",
        "OBSIDIAN_API_URL": "https://127.0.0.1:27124",
        "OBSIDIAN_REST_API_KEY": "only-if-you-use-workspace-or-commands-tools"
      }
    }
  }
}
droid mcp add kobsidian "npx -y kobsidian-mcp" \
  --env OBSIDIAN_VAULT_PATH=/absolute/path/to/vault \
  --env OBSIDIAN_API_URL=https://127.0.0.1:27124 \
  --env OBSIDIAN_REST_API_KEY=only-if-you-use-workspace-or-commands-tools

Any MCP client that reads a standard mcpServers object will accept:

{
  "mcpServers": {
    "kobsidian": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "kobsidian-mcp"],
      "env": {
        "OBSIDIAN_VAULT_PATH": "/absolute/path/to/vault",
        "OBSIDIAN_API_URL": "https://127.0.0.1:27124",
        "OBSIDIAN_REST_API_KEY": "only-if-you-use-workspace-or-commands-tools"
      }
    }
  }
}

"type": "stdio" is optional on clients that infer transport from command (Claude Code), but required by Claude Desktop, Cursor, VSCode, and Antigravity — include it for maximum portability.

Smithery

smithery.ai renders an install UI straight from smithery.yaml and collects the four env vars for you — vault path plus the optional Local REST API URL / TLS / bearer key trio, so hybrid mode works out of the box.

From source (contributing / hacking)

git clone https://github.com/bezata/kObsidian
cd kObsidian
bun install
bun run dev:stdio    # or dev:http

Obsidian plugins

kObsidian is filesystem-first — 55+ of the 66 tools work against a bare vault directory with no Obsidian plugins installed. The plugins below only matter if you want the specific tool namespaces that depend on them.

Enabling community plugins (one-time, if not already on)

Obsidian ships with community plugins disabled by default. Enable them once per vault:

  1. Open your vault in Obsidian.

  2. Settings (⚙️, bottom-left) → Community plugins.

  3. Click Turn on community plugins.

  4. Browse → search → InstallEnable.

Required for the REST-bridged tools

Obsidian Local REST API (by Adam Coddington) — needed for:

  • workspace.* (activeFile, openFile, navigate, closeActiveFile, toggleEditMode)

  • commands.* (execute, list)

  • dataview.query / dataview.listByTag / dataview.listByFolder / dataview.table (runtime DQL — the offline dataview.fields.* / dataview.index / blocks.* tools work without it)

  • templates.use with engine: "templater"

Setup after install:

  1. Enable the plugin.

  2. Open its settings — scroll to API key → click Copy (or Reset first if you want a fresh one).

  3. Paste that key as OBSIDIAN_REST_API_KEY in your MCP client config's env: block. The OBSIDIAN_API_URL default (https://127.0.0.1:27124) works out of the box.

Leave the plugin running while you use the REST-bridged tools — the endpoint is local-only (127.0.0.1) so nothing leaves your machine.

Enhances (but not required for) specific tool namespaces

Plugin

Link

What it unlocks

Dataview

id=dataview

All dataview.* tools still work on the raw markdown; Dataview plugin is what makes DQL queries in dataview.query* actually execute. Also renders your fields + queries visually inside Obsidian.

Templater

id=templater-obsidian

Runtime template rendering via the REST API (templates.use with engine:"templater"). The offline filesystem engine (templates.use with engine:"filesystem") and templates.list work without it.

Marp

id=marp-slides

Marp marp.* tools parse + edit Marp-front-matter markdown even without the plugin; the plugin is what renders slides / exports to PDF inside Obsidian.

Kanban

id=obsidian-kanban

kanban.* tools read/write the plain markdown board format regardless of plugin; the plugin is what renders the board as draggable columns inside Obsidian.

Tasks

id=obsidian-tasks-plugin

tasks.* tools understand the Tasks-plugin emoji syntax (📅 ⏳ 🛫 ✅ 🔼 🔁) regardless of plugin; the plugin is what provides filtering / querying / toggling inside Obsidian.

The obsidian://show-plugin?id=… links jump straight to the plugin in Obsidian's in-app browser — click one with Obsidian open and it deep-links to the install screen.

TLDR

You want to …

Minimum you need

Use notes.* / tags.* / links.* / stats.vault / tasks.* / wiki.* / kanban.* / blocks.* / marp.* / canvas.* / templates.list + templates.use (engine:"filesystem") / offline dataview.*

Just a vault path. No plugins required.

Use workspace.* / commands.*

+ Local REST API plugin + API key env var

Run live DQL queries (dataview.query / dataview.listBy* / dataview.table)

+ Local REST API + Dataview

Run Templater templates at runtime

+ Local REST API + Templater

No combination of plugins makes kObsidian depend on Obsidian being running — the REST-bridged tools just return a clear error if the plugin isn't reachable, and the filesystem-first tools keep working.


Quick start

Before the first session — kObsidian works on a bare Obsidian vault, but enabling a few Obsidian plugins unlocks the full tool surface. See Obsidian plugins below for the 5-minute setup (Local REST API, Dataview, Templater, Marp, Kanban, Tasks). Skip it if you only need the 80+ filesystem-first tools.

Once installed, a typical session opens with three natural-language prompts. The wiki.* tools + the .claude skills handle the rest.

You:  "Set up a wiki in this vault."
LLM:  wiki.init  →  wiki/{Sources,Concepts,Entities}/ + index.md + log.md + wiki-schema.md

You:  "Ingest this: https://… (paper on Memex)"
LLM:  wiki.ingest  →  creates wiki/Sources/as-we-may-think.md + log entry
      returns proposedEdits:
        - insertAfterHeading  index.md#Sources
        - createStub          Concepts/memex.md
        - createStub          Entities/vannevar-bush.md
      LLM applies each via notes.*  (you see every write in the transcript)

You:  "What does the wiki say about memex vs hypertext?"
LLM:  wiki.query memex  →  top-ranked pages
      notes.read on each  →  cited synthesis
      offers to file the synthesis back via wiki.summaryMerge

You:  "Audit the wiki."
LLM:  wiki.lint  →  {orphans, brokenLinks, stale, missingPages, tagSingletons, indexMismatch}
      proposes concrete fixes; applies after you confirm

Full loop, frontmatter contracts, and the proposedEdits design in docs/wiki.md.


Example use cases

The same primitives cover several real-world flavors of knowledge base. Three worked examples below; longer walkthroughs in docs/examples.md.

A. Personal research wiki

You: "Ingest this paper on in-context learning: <url or pasted markdown>"
LLM:  wiki.ingest title="In-Context Learning — A Survey" sourceType=paper
        tags=[icl, prompting] relatedConcepts=[In-Context Learning, Few-Shot Prompting]
        relatedEntities=[Brown 2020]
      → wiki/Sources/in-context-learning-a-survey.md
      → proposedEdits:
          • createStub  wiki/Concepts/in-context-learning.md
          • createStub  wiki/Concepts/few-shot-prompting.md
          • createStub  wiki/Entities/brown-2020.md
          • insertAfterHeading  wiki/index.md#Sources
      LLM applies each via notes.create / notes.edit (mode: "after-heading").

B. Architecture Decision Records (ADRs) for a codebase

Model each ADR as a Source, architectural patterns as Concepts, and services / teams / libraries as Entities. The wiki becomes your ADR archive with cross-links you never have to maintain by hand.

You: "Record ADR-004: we're switching internal service comms from REST
      to gRPC. Context: <paste>"
LLM:  wiki.ingest title="ADR-004 — gRPC for internal service comms"
        sourceType=note tags=[adr, architecture, rpc]
        relatedConcepts=[gRPC, Service Mesh, Internal RPC]
        relatedEntities=[order-service, payment-service, inventory-service]
      → wiki/Sources/adr-004-grpc-for-internal-service-comms.md
      → proposedEdits:
          • createStub   wiki/Concepts/grpc.md
          • createStub   wiki/Concepts/service-mesh.md
          • insertAfterHeading  wiki/Entities/order-service.md#Notable Facts
          • insertAfterHeading  wiki/Entities/payment-service.md#Notable Facts
          • …

Three weeks later —
You: "Why did we pick gRPC for internal comms?"
LLM:  wiki.query "grpc internal comms"
      notes.read top matches
      → "Per [[wiki/Sources/adr-004-grpc-for-internal-service-comms.md|ADR-004]],
         chosen over REST because of native streaming + typed schemas; tradeoff
         accepted: browser clients still use REST via an edge gateway
         ([[wiki/Concepts/service-mesh.md]])."

C. Codebase wiki (design docs + post-mortems + RFCs)

Engineering teams abandon wikis because nobody updates them. Let the LLM do it. Ingest design docs, RFCs, and post-mortems as Sources; architectural patterns become Concepts; services and teams become Entities.

You: "We had an incident today — payment-service timeouts cascaded
      into order-service. Here's the post-mortem: <paste>"
LLM:  wiki.ingest title="Postmortem 2026-04-10 — Payment timeouts cascade"
        sourceType=other tags=[postmortem, incident, reliability]
        relatedConcepts=[Circuit Breaker, Cascade Failure, Timeout Budget]
        relatedEntities=[payment-service, order-service]
      → wiki/Sources/postmortem-2026-04-10-payment-timeouts-cascade.md
      → proposedEdits:
          • createStub  wiki/Concepts/circuit-breaker.md
          • createStub  wiki/Concepts/cascade-failure.md
          • insertAfterHeading  wiki/Entities/payment-service.md#Notable Facts
          • insertAfterHeading  wiki/Entities/order-service.md#Notable Facts

Periodic housekeeping —
You: "Audit the codebase wiki."
LLM:  wiki.lint
      → 3 orphan RFCs (unlinked from any Concept; link or archive?)
      → 1 broken link: [[wiki/Entities/legacy-auth-service.md]]
        (deprecated in Q1; remove the link from
         [[wiki/Sources/adr-002-session-migration.md]]?)
      → 4 post-mortems past the 180-day stale threshold — tag with
        "needs-review" or re-ingest with updated lessons-learned?
      → 2 tag singletons: `retry-logic` (merge into `retry-policy`?),
        `observability` (first use; keep).

Why this works for engineering teams

  • The proposedEdits contract means every cross-reference write is visible in the transcript — no silent vault corruption from an LLM hallucination about which services a decision affects.

  • The greppable log format (## [YYYY-MM-DD] ingest | ADR-004 …) makes grep '^## \[' wiki/log.md | tail -20 a valid "what did the team decide recently" query.

  • wiki.lint surfaces broken links to services that were deprecated months ago — the bookkeeping humans never get around to.


Architecture

┌──────────────────────────────────────────────────────────────────────┐
│                           MCP Clients                                │
│   Claude Code · Claude Desktop · Cursor · VSCode · Antigravity · Zed │
│   JetBrains AI · Cline · Continue · ChatGPT · Smithery · …           │
└────────────────────────────┬─────────────────────────────────────────┘
                             │ JSON-RPC 2.0 · MCP 2025-11-25
         ┌───────────────────┴──────────────────────┐
         ▼                                          ▼
┌──────────────────┐                   ┌─────────────────────────┐
│ stdio transport  │                   │ Streamable HTTP (Hono)  │
│                  │                   │ + OPTIONS / CORS        │
│                  │                   │ + MCP-Protocol-Version  │
│                  │                   │ + Origin 403 / bearer   │
└────────┬─────────┘                   └────────┬────────────────┘
         │                                      │
         └──────────────────┬───────────────────┘
                            ▼
          ┌──────────────────────────────────┐
          │          McpServer               │
          │  ┌────────────┐ ┌─────────────┐  │
          │  │  90 Tools  │ │ 4 Resources │  │
          │  └────────────┘ └─────────────┘  │
          │  ┌────────────┐ ┌─────────────┐  │
          │  │ 3 Prompts  │ │ structured  │  │
          │  │            │ │   content   │  │
          │  └────────────┘ └─────────────┘  │
          └────────────┬─────────────────────┘
                       │
                       ▼
          ┌──────────────────────────────────┐
          │      Domain layer (pure)         │
          │  notes · links · tags · tasks    │
          │  dataview · canvas · kanban      │
          │  blocks · marp · templates       │
          │  wiki/ orchestration             │
          └──────┬─────────────────┬─────────┘
                 │                 │
                 ▼                 ▼
         ┌──────────────┐   ┌──────────────────────┐
         │  vault/ (FS) │   │ Obsidian Local REST  │
         │ authoritative│   │ API plugin (optional)│
         └──────────────┘   └──────────────────────┘

Full module map in docs/architecture.md.


LLM Wiki (60 seconds)

The tedious part of maintaining a knowledge base is not the reading or the thinking — it's the bookkeeping. Humans abandon wikis because the maintenance burden grows faster than the value. LLMs don't get bored.

kObsidian implements the LLM Wiki pattern from Andrej Karpathy's gist: a persistent, compounding knowledge base the LLM maintains. The vault becomes a private, curated Memex (Vannevar Bush, 1945) where cross-references, log-keeping, and lint are the LLM's job while you focus on curating sources and asking questions.

"Instead of just retrieving from raw documents at query time, the LLM incrementally builds and maintains a persistent wiki — a structured, interlinked collection of markdown files that sits between you and the raw sources." — Andrej Karpathy

              User drops a source
                      │
                      ▼
            ┌──────────────────────┐    proposedEdits
            │     wiki.ingest      │ ─────────────────────┐
            └──────────┬───────────┘                      │
                       │ creates 1 file                   ▼
                       │              ┌──────────────────────────────┐
                       ▼              │ LLM applies edits via        │
              wiki/Sources/           │  notes.edit (after-heading)  │
              <slug>.md               │  notes.edit (replace)        │
                       │              │  notes.create                │
                       │ appends      └──────────────────────────────┘
                       ▼
                 wiki/log.md

   Anytime: wiki.query   → top pages → notes.read → cited synthesis
   Periodic: wiki.lint   → orphans · broken · stale · missing · tag-drift
   Curate:   wiki.summaryMerge — add cited section to concept/entity page

Default layout under the vault:

wiki/
├── Sources/           per-source summary pages
├── Concepts/          topic / idea pages (LLM-maintained)
├── Entities/          people / places / orgs / works
├── index.md           categorized catalog (wiki.indexRebuild)
├── log.md             greppable chronological log
└── wiki-schema.md     vault-local copy of the contract

The key design decision is that wiki.ingest never rewrites cross-references blindly. It creates exactly one file (the Sources page), appends one file (log.md), and returns a proposedEdits array the agent applies with existing notes.* tools. Every write is visible in the transcript — so LLM hallucinations show up as reviewable edits rather than silent vault corruption.

Full contract in docs/wiki.md.

Claude Code skills

Four skills at skills/ trigger on natural language: wiki-bootstrap, wiki-ingest, wiki-query, wiki-lint. Copy or symlink them into ~/.claude/skills/ — see skills/README.md.


Tool surface

66 MCP tools across 16 namespaces (v0.2.5 consolidated from ~90 to 62; v0.3.0 added the vault.* namespace for multi-vault support — see CHANGELOG for the full history). Always-current inventory at docs/tool-inventory.json.

Namespace

Count

Highlights

vault.*

4

list · current · select · reset — multi-vault discovery and session switching (v0.3.0)

notes.*

8

read (content/metadata/stats via include) · create (note or folder) · edit (replace/append/prepend/after-heading/after-block) · frontmatter · delete · move · list · search

tags.*

4

modify (add/remove/replace/merge) · search · analyze · list

links.*

8

Backlinks · outgoing · broken · orphans · hubs · graph · health · connections

stats.*

1

stats.vault (per-note stats moved into notes.read)

tasks.*

5

Tasks-plugin format (📅 ⏳ 🛫 ✅ 🔼 🔁) — search · create · toggle · updateMetadata · stats

dataview.*

7

query + sugar wrappers (listByTag/listByFolder/table) · index · fields.read · fields.write

blocks.*

3

Unified fenced-block API (list/read/update) across dataview, dataviewjs, mermaid

marp.*

2

read (deck/slides/slide) · update (slide/frontmatter)

kanban.*

3

parse · stats · card (add/move/toggle)

canvas.*

4

create · parse · connections · edit (add-node/add-edge/remove-node)

templates.*

2

list · use (engine × action)

workspace.*

5

Live Obsidian UI bridge (requires Local REST API plugin)

commands.*

2

list (with optional query) · execute

wiki.*

7

init · ingest · log · indexRebuild · query · lint · summaryMerge

system.*

1

version

Client-safety annotations (MCP 2025-11-25):

Hint

Tools

readOnlyHint: true (clients can auto-approve)

47

destructiveHint: true (clients prompt more firmly)

6

idempotentHint: true (safe to retry)

12

openWorldHint: true (reaches outside the vault)

16

MCP resources (URI-addressable; any client can browse without tool calls):

kobsidian://wiki/index              wiki/index.md
kobsidian://wiki/log                wiki/log.md
kobsidian://wiki/schema             wiki/wiki-schema.md
kobsidian://wiki/page/{+path}       any Sources/Concepts/Entities page

MCP prompts (for clients that don't consume the skills/ files): ingest-source, answer-from-wiki, health-check-wiki.

Details in docs/tools.md.


Configuration

Env var

Default

Purpose

OBSIDIAN_VAULT_PATH

Required. Absolute path to the vault.

OBSIDIAN_API_URL

https://127.0.0.1:27124

Obsidian Local REST API base; only for workspace.* / commands.* / dataview.query*.

OBSIDIAN_API_VERIFY_TLS

false

Set true if you've trusted the REST API's self-signed cert.

OBSIDIAN_REST_API_KEY

Bearer key for the REST API plugin (if used).

KOBSIDIAN_HTTP_HOST

127.0.0.1

Bind host for dev:http.

KOBSIDIAN_HTTP_PORT

3000

Bind port for dev:http.

KOBSIDIAN_HTTP_BEARER_TOKEN

Optional bearer for the Streamable HTTP transport.

KOBSIDIAN_ALLOWED_ORIGINS

http://localhost,http://127.0.0.1

Comma-separated CORS allowlist.

KOBSIDIAN_WIKI_ROOT

wiki

Wiki directory under the vault.

KOBSIDIAN_WIKI_SOURCES_DIR

Sources

Per-source summary pages.

KOBSIDIAN_WIKI_CONCEPTS_DIR

Concepts

Topic / idea pages.

KOBSIDIAN_WIKI_ENTITIES_DIR

Entities

People / places / orgs / works.

KOBSIDIAN_WIKI_INDEX_FILE

index.md

Wiki catalog filename.

KOBSIDIAN_WIKI_LOG_FILE

log.md

Wiki log filename.

KOBSIDIAN_WIKI_SCHEMA_FILE

wiki-schema.md

Seed schema filename.

KOBSIDIAN_WIKI_STALE_DAYS

180

wiki.lint stale-page threshold.

KOBSIDIAN_WIKI_INDEX_SOURCES_HEADING

Sources

index.md section that lists sources; wiki.ingest files new entries under it.

KOBSIDIAN_WIKI_INDEX_CONCEPTS_HEADING

Concepts

index.md section that lists concepts.

KOBSIDIAN_WIKI_INDEX_ENTITIES_HEADING

Entities

index.md section that lists entities.

KOBSIDIAN_WIKI_CONCEPT_PAGE_HEADING

Discussion

Concept-page heading that receives wiki.ingest citations / wiki.summaryMerge sections.

KOBSIDIAN_WIKI_ENTITY_PAGE_HEADING

Notable Facts

Entity-page heading that receives wiki.ingest citations / wiki.summaryMerge sections.

KOBSIDIAN_VAULT_CONFIG_FILE

.kobsidian.json

Vault-relative path of the per-vault config file (below).

Every wiki tool also accepts a per-call wikiRoot override, and wiki.ingest accepts per-call indexHeading / conceptHeading / entityHeading overrides for vaults whose pages use localized headings (e.g. ## Fontes). When a target heading is missing from a page, the proposal degrades to append so it can still be applied via notes.edit.

Per-vault config file

Settings that belong to one vault rather than to the server — folder names, filenames, and section headings of a localized wiki — go in a .kobsidian.json at the vault root. Every key is optional and beats the matching env var; a per-call tool argument beats both (per-call → .kobsidian.json → env → default).

{
  "$schema": "https://raw.githubusercontent.com/bezata/kObsidian/main/docs/kobsidian.config.schema.json",
  "wiki": {
    "root": "wiki",
    "sourcesDir": "Fontes",
    "staleDays": 90,
    "headings": {
      "indexSources": "Fontes",
      "indexConcepts": "Conceitos",
      "indexEntities": "Entidades",
      "conceptPage": "Discussão",
      "entityPage": "Fatos Notáveis"
    }
  }
}

Unknown keys and malformed JSON are rejected with the file path in the error so typos surface immediately; vault.current returns the effective configuration under config (or the error).


Docs

Localized docs are available in 简体中文, 日本語, and 한국어.

architecture.md

Stack, module map, layering rules

wiki.md

LLM-Wiki contract, loop, frontmatter, lint categories

examples.md

Personal research wiki · engineering ADRs · codebase wiki — end-to-end

tools.md

Namespace table, annotations, resources, prompts

SECURITY.md

Origin/CORS, VirusTotal scans, env hygiene

TESTING.md

bun run … commands + coverage

ENVIRONMENT.md

Every env var with defaults

MIGRATION.md

Upgrade notes


Roadmap

The next two milestones are tracked in TODO.md:

  • v0.4 — Obsidian LiveSync bridge. Free, end-to-end-encrypted vault access via the community Self-Hosted LiveSync plugin (CouchDB / S3 / R2 / WebRTC peer) — so an MCP client can reach the same Obsidian vault from any machine the user owns, without Obsidian itself being live.

  • v0.5 — Cross-semantic vault verification. A wiki.crossCheck tool that reconciles two or more LiveSync-paired vaults at the wiki layer, gated by a new schema_version frontmatter field that uses the project's semver discipline as the compatibility contract.

TODO.md carries the motivation, the per-milestone task breakdown, and the rules for how items move from there into the CHANGELOG.


Development

bun install
bun run typecheck
bun run lint
bun run test          # 56 tests across 14 files
bun run build         # node-target stdio.js + bun-target http.js
bun run inventory     # regenerate docs/tool-inventory.json

Project conventions in AGENTS.md.


Security & supply chain

  • Every .mcpb release asset is VirusTotal-scanned. The Release workflow uploads each kobsidian-<platform>.mcpb bundle to VirusTotal via crazy-max/ghaction-virustotal@v4 right after the release is published, then appends the analysis links to the release body. Any user installing from a GitHub release can click through to the public VirusTotal report for their platform's bundle before they run it — no trust in the maintainer required.

  • Transport hardening. Streamable HTTP validates Origin against an allowlist (403 on mismatch), implements CORS preflight (OPTIONS /mcp → 204 + Access-Control-*), requires or defaults MCP-Protocol-Version, and supports optional bearer auth via KOBSIDIAN_HTTP_BEARER_TOKEN. stdio has no network surface.

  • Pinned SDK floor. @modelcontextprotocol/sdk@^1.26.0 — mitigates GHSA-345p-7cg4-v4c7 (cross-client response leak) and CVE-2026-0621 (UriTemplate ReDoS). This repo pins 1.30.0.

  • npm Trusted Publishing. No long-lived NPM_TOKEN is stored in the repo. GitHub Actions mints a short-lived OIDC token on every tag push and the npm CLI exchanges it for a one-time publish token scoped to this exact workflow file (.github/workflows/release.yml on the bezata/kObsidian repo). Provenance attestations are automatic — every published version has a cryptographically-linked build statement pointing at the exact Actions run that produced it. Forks, other branches, or modified workflow files cannot publish — the OIDC audience claim won't match.

Full notes in docs/SECURITY.md.


Compatibility notes

  • Protocol version2025-11-25 (current MCP spec). HTTP clients without MCP-Protocol-Version fall back to 2025-03-26 per spec; explicit-but-unsupported versions return 400.

  • Dataview split — offline tools index frontmatter / inline / list / task / fenced dataview / fenced dataviewjs blocks. Runtime DQL is delegated to Obsidian + Dataview through the Local REST API. DataviewJS is source-preserving but not executed inside this server.

  • Mermaid + Marp — source-preserving parse/edit only; rendering is the client's job.

  • SDK floor@modelcontextprotocol/sdk@^1.26.0 (mitigates GHSA-345p-7cg4-v4c7 cross-client response leak + CVE-2026-0621 UriTemplate ReDoS). This repo pins 1.30.0.


Credits

License

MIT — see LICENSE. Contributions welcome; open an issue first for anything non-trivial.

Available Tools

66 tools
blocks.listList Fenced BlocksA
Read-onlyIdempotent

List fenced code blocks of the supported knowledge-base languages (dataview, dataviewjs, mermaid) in a single note or across the vault. Use this to discover what DQL, DataviewJS, or Mermaid blocks exist before reading or updating them. Omit language to list blocks of all three types in one call. Vault-wide scanning is only supported for Mermaid; for Dataview languages a filePath is required. Returns {total, items} where each item carries at minimum {filePath, language, index, id?}. Read-only.

Operates on the session-active vault (see vault.current — selectable via vault.select) unless an explicit vaultPath argument is passed, which always wins.

ParametersJSON Schema
NameRequiredDescriptionDefault
filePathNoScope the listing to a single note. Omit to scan the whole vault (slower; useful for discovery).
languageNoFilter to one language. Omit to list blocks of all supported languages.
vaultPathNoOverride the ambient OBSIDIAN_VAULT_PATH for this call. Rarely needed.

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsYesThe listed blocks.
totalYesNumber of blocks returned.
filePathNoEchoed from the input when a single-file scope was used.

TDQS

A5/5.0
Behavior5/5

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

Even though annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, the description goes well beyond that. It reveals the return shape (`{total, items}` with item fields), the session-vault behavior with the `vaultPath` override rule, and the language-specific scanning restrictions. None of this is available in the annotations, and it contradicts nothing.

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

Conciseness5/5

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

The description is efficiently structured across two paragraphs, front-loading the purpose and usage in the first sentence. Every sentence adds distinct value—scope, usage trigger, parameter behavior, return format, and vault context—with no filler. It is long but information-dense, and the structure makes it easy to scan.

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

Completeness5/5

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

For a list tool with three optional parameters, the description is comprehensive. It covers scoping (single note vs vault), language filtering, vault selection, return shape (though the output schema presumably details it further), and language-specific requirements. There is no missing information that would prevent a correct call, and the output schema handles return-field specifics.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and each parameter has a description, but the explanation text adds critical interplay semantics not present in the schema: omitting `language` lists all three types in one call, vault-wide scanning is only for Mermaid, and `filePath` is mandatory for Dataview languages. It also clarifies that `vaultPath` always overrides the ambient vault. This is exactly the kind of cross-parameter behavior an agent needs.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'List fenced code blocks' of three named languages, scoped to a single note or the entire vault. It explicitly differentiates itself from the sibling tools blocks.read and blocks.update by stating it is for discovery 'before reading or updating them.' No ambiguity remains about what this tool does.

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

Usage Guidelines5/5

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

The description tells the agent exactly when to use it: 'Use this to discover what DQL, DataviewJS, or Mermaid blocks exist before reading or updating them.' It also gives concrete usage constraints: omitting `language` lists all three types, vault-wide scanning works only for Mermaid, and a `filePath` is required for Dataview languages. This is explicit, actionable guidance with no need for inference.

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

blocks.readRead Fenced BlockA
Read-onlyIdempotent

Read one fenced block's source and language-specific metadata. Locate the block by blockId (preferred, stable) or index (0-based within the language group in the file; defaults to 0). language is required so the tool can dispatch to the correct parser and return the right metadata (Mermaid directives, Dataview DQL parts, etc.). Fails with not_found when no block matches the locator. Read-only.

Operates on the session-active vault (see vault.current — selectable via vault.select) unless an explicit vaultPath argument is passed, which always wins.

ParametersJSON Schema
NameRequiredDescriptionDefault
indexNo0-based position of the block within its language group in the file. Use when no blockId is available. Defaults to 0 (the first block).
blockIdNoStable block identifier (e.g. `^abc123`). Takes precedence over `index` when both are given.
filePathYesPath of the note containing the block.
languageYesLanguage of the block to read (required so `blocks.read` can dispatch to the correct parser).
vaultPathNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
sourceYesThe block's body source (without fences).
filePathYes
languageYesFenced-code-block language. `dataview` = raw DQL query block; `dataviewjs` = inline JavaScript block; `mermaid` = diagram block.

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the readOnly and idempotent annotations, the description discloses key behaviors: blockId takes precedence over index, index defaults to 0 within the language group, failure returns not_found, and vault resolution prefers vaultPath over the session-active vault. This is substantial behavioral context that cannot be inferred from annotations alone.

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

Conciseness5/5

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

The description is front-loaded with the core action and then adds only high-value details: locator rules, language requirement, failure behavior, and vault scoping. Every sentence contributes operational guidance, and the examples for metadata (Mermaid directives, Dataview DQL parts) clarify the abstraction.

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

Completeness5/5

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

Given an output schema exists and annotations cover safety, the description needs only to explain selection, error behavior, and vault scoping — all of which it does. Nothing required for a correct call is missing; the parameter semantics, failure mode, and vault override are all explicit.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although schema coverage is already 80%, the description adds meaningful semantics: blockId is 'stable' and 'takes precedence,' index is '0-based within the language group' with a default of 0, language is required for parser dispatch, and vaultPath 'always wins.' It fully compensates for the undocumented vaultPath parameter and enriches the schema descriptions.

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

Purpose5/5

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

The description opens with 'Read one fenced block's source and language-specific metadata,' which is a specific verb+resource statement. It clearly differentiates this from sibling tools like blocks.list (reads one vs. lists) and blocks.update (read vs. modify), so an agent can identify the right operation without inspecting other schemas.

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

Usage Guidelines4/5

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

The description provides clear usage context: locate by blockId (preferred) or index, language is required, and vaultPath overrides the active vault. It does not explicitly name alternatives like blocks.list for finding blocks or blocks.update for modifying them, so it stops short of full when/when-not guidance.

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

blocks.updateUpdate Fenced BlockA
DestructiveIdempotent

Replace one fenced block's body source-preservingly — the surrounding fences, language tag, and neighbouring content are untouched. Locate the block by blockId or index. language acts as a guard: if the located block is not of the declared language, the update fails. source is the replacement body WITHOUT the surrounding ``` fences. Idempotent — re-running with identical inputs is a no-op on the file contents. Destructive — overwrites the previous block body in place.

Operates on the session-active vault (see vault.current — selectable via vault.select) unless an explicit vaultPath argument is passed, which always wins.

Examples:

Example 1 — Replace the first Mermaid diagram in a note:

{
  "filePath": "Diagrams/system-overview.md",
  "language": "mermaid",
  "index": 0,
  "source": "flowchart TD\n  A --> B"
}

Example 2 — Update a DQL query block by stable id:

{
  "filePath": "Dashboards/Inbox.md",
  "language": "dataview",
  "blockId": "inbox-open",
  "source": "TASK\nFROM #inbox\nWHERE !completed"
}
ParametersJSON Schema
NameRequiredDescriptionDefault
indexNo0-based position of the block within its language group in the file. Use when no blockId is available. Defaults to 0 (the first block).
sourceYesReplacement source for the block body, WITHOUT the surrounding ``` fences. Surrounding newlines and indentation are preserved by the tool.
blockIdNoStable block identifier (e.g. `^abc123`). Takes precedence over `index` when both are given.
filePathYesPath of the note containing the block.
languageYesLanguage of the block being updated. Acts as a guard: update fails if the targeted block's real language does not match.
vaultPathNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
targetYesThe path or identifier the tool acted on.
changedYesTrue if the tool altered vault state on this call; false if it was a no-op.
summaryYesShort human-readable summary of what happened.

TDQS

A4.7/5.0
Behavior5/5

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

The description goes well beyond the annotations: it explains the source-preserving behavior, language-mismatch failure, fence exclusion, idempotent no-op effect, in-place destructive overwrite, and vault selection semantics. These details align with the idempotentHint and destructiveHint annotations without contradicting them.

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

Conciseness5/5

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

The description is efficiently organized: core behavior and constraints first, then vault targeting, then concrete examples. Every sentence earns its place, and the examples are compact yet informative.

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

Completeness5/5

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

Given the tool's six parameters and the existence of an output schema, the description covers all essential calling context: block selection, language guard, source format, vault resolution, idempotency, destructiveness, and failure behavior. An agent has enough information to invoke this tool correctly without additional documentation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 83%, so the schema already documents most parameters. The description adds value by clarifying that source must exclude fences, that language is a guard, that blockId takes precedence over index, and especially by documenting the vaultPath override semantics that the schema leaves bare. The examples further disambiguate realistic usage.

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

Purpose5/5

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

The description names a specific verb and resource: replace one fenced block's body, with explicit scope boundaries (fences, language tag, and neighboring content untouched). This clearly differentiates it from read-oriented siblings like blocks.list/blocks.read and whole-note tools like notes.edit.

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

Usage Guidelines4/5

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

The description gives clear operational context: how to locate the block via blockId or index, that language acts as a guard, and that the tool operates on the session-active vault unless vaultPath is supplied. It does not explicitly name alternatives or say when not to use this tool, but the context is strong enough for an agent to apply it correctly.

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

canvas.connectionsCanvas Node ConnectionsA
Read-onlyIdempotent

Return the incoming and outgoing edges of a single canvas node. Use this to walk the canvas graph one node at a time without loading the full document. Read-only. For full-graph parsing, use canvas.parse.

Operates on the session-active vault (see vault.current — selectable via vault.select) unless an explicit vaultPath argument is passed, which always wins.

ParametersJSON Schema
NameRequiredDescriptionDefault
nodeIdYesId of the node whose edges to return.
filePathYesVault-relative path to an Obsidian `.canvas` file.
vaultPathNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
nodeIdYes
filePathYes
incomingYes
outgoingYes

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already state readOnlyHint, idempotentHint, and destructiveHint, so the description's 'Read-only' is redundant but not harmful. It adds valuable behavioral context about session-active vault resolution and the precedence of an explicit vaultPath, which is not derivable from annotations.

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

Conciseness5/5

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

Three tight sentences: operation, use case with alternative, and vault behavior. No filler, and the most important information is front-loaded.

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

Completeness5/5

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

Given the output schema exists and annotations cover safety, the description provides the essential context: graph-walking use case, full-graph alternative, and vault resolution rules. Nothing critical is missing for an agent to select and invoke this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema covers nodeId and filePath with good descriptions, and the description fills the gap for vaultPath by explaining it overrides the session-active vault. This is meaningful added meaning beyond the schema for the undocumented parameter.

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

Purpose5/5

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

The description states a precise verb and resource: 'Return the incoming and outgoing edges of a single canvas node.' It clearly differentiates from canvas.parse, which handles full-graph parsing, and from links.connections, which likely deals with note links rather than canvas edges.

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

Usage Guidelines5/5

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

Explicitly says when to use this tool ('to walk the canvas graph one node at a time without loading the full document') and names the alternative for full-graph parsing ('use canvas.parse'). It also clarifies the vault selection behavior with vaultPath taking precedence.

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

canvas.createCreate CanvasA

Create a new empty Obsidian canvas (.canvas) file at the given path. Fails if the path already exists unless overwrite: true is passed. Canvas files are JSON documents that Obsidian renders as an infinite spatial whiteboard of nodes and edges. Use canvas.edit to add nodes/edges once the file exists.

Operates on the session-active vault (see vault.current — selectable via vault.select) unless an explicit vaultPath argument is passed, which always wins.

ParametersJSON Schema
NameRequiredDescriptionDefault
filePathYesPath for the new canvas (must end in `.canvas`).
overwriteNoWhen true, overwrite an existing canvas at the path. Defaults to false.
vaultPathNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
targetYesThe path or identifier the tool acted on.
changedYesTrue if the tool altered vault state on this call; false if it was a no-op.
summaryYesShort human-readable summary of what happened.

TDQS

A4.1/5.0
Behavior1/5

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

The description is transparent about failure behavior and overwrite semantics, but annotations declare destructiveHint:false while the description states that overwrite:true overwrites an existing file. That is a contradiction on a safety-critical behavioral trait, so this dimension must be scored down despite the otherwise strong disclosure.

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

Conciseness5/5

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

The description is front-loaded with the core action, then adds only necessary details: failure behavior, file format relevance, next-step sibling, and vault targeting. Every sentence earns its place and there is no filler.

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

Completeness5/5

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

For a create operation with an output schema, the description covers the essential invocation context: target path, overwrite behavior, vault resolution, file type, and follow-up editing tool. An agent has enough information to call it correctly in most scenarios.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema documents filePath and overwrite, but vaultPath has no schema description. The tool description compensates by explaining vaultPath precedence over the session-active vault, which is exactly the missing semantic context an agent needs. It also reinforces the overwrite behavior with the fail-if-exists default.

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

Purpose5/5

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

The description states a specific action ('Create'), a precise resource ('new empty Obsidian canvas (.canvas) file'), and path-based placement. It also distinguishes itself from the sibling canvas.edit by making clear that canvas.edit is for adding nodes/edges after the file exists.

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

Usage Guidelines5/5

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

It explicitly says to use this tool first and then canvas.edit for nodes/edges, providing a clear workflow. It also explains the overwrite condition and the session-active vault resolution, including the vault.select/vault.current relationship, which helps an agent decide how to target the right vault.

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

canvas.editEdit CanvasA

Mutate a canvas: add a node, add an edge, or remove a node. The op field selects the mutation. add-node needs nodeType (text for inline markdown or file for an embedded note), content, x, y (plus optional width/height). add-edge needs fromNode and toNode ids (plus optional label). remove-node needs nodeId — removing a node also removes every edge incident to it (destructive). Returns a standard mutation envelope.

Operates on the session-active vault (see vault.current — selectable via vault.select) unless an explicit vaultPath argument is passed, which always wins.

Examples:

Example 1 — Add a text node to a canvas:

{
  "op": "add-node",
  "filePath": "Boards/map.canvas",
  "nodeType": "text",
  "content": "Research question",
  "x": 0,
  "y": 0,
  "width": 280,
  "height": 80
}

Example 2 — Connect two existing nodes with a labelled edge:

{
  "op": "add-edge",
  "filePath": "Boards/map.canvas",
  "fromNode": "n1",
  "toNode": "n2",
  "label": "depends on"
}

Example 3 — Remove a node and all its edges:

{
  "op": "remove-node",
  "filePath": "Boards/map.canvas",
  "nodeId": "n3"
}
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
targetYesThe path or identifier the tool acted on.
changedYesTrue if the tool altered vault state on this call; false if it was a no-op.
summaryYesShort human-readable summary of what happened.

TDQS

A3.9/5.0
Behavior1/5

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

The description transparently discloses that remove-node is destructive and cascades to incident edges, and explains vaultPath precedence. However, the annotations declare destructiveHint=false, which directly contradicts the description's explicit 'destructive' warning. Per the scoring rule, this contradiction forces a score of 1.

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

Conciseness5/5

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

The description is well-structured: a purpose sentence, operation-specific parameter requirements, vault behavior, and three concrete JSON examples. Despite its length, every sentence earns its place, and the examples dramatically reduce ambiguity for op-specific payloads.

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

Completeness5/5

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

The description covers all three op variants with required and optional parameters, the destructive side effect, vault resolution rules, and the standard mutation envelope return. With a full input schema and an output schema present, nothing needed for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds value beyond the schema by grouping required parameters per op, explaining the content semantics for nodeType text vs file, and stating that vaultPath always wins over the active vault — details that help an agent assemble valid calls.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Mutate a canvas' followed by the three exact mutations (add node, add edge, remove node). This clearly distinguishes the tool from siblings like canvas.create and canvas.parse, and the op-specific breakdown leaves no ambiguity about what the tool does.

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

Usage Guidelines4/5

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

The description provides clear context for when to use the tool: any mutation of an Obsidian canvas, with explicit detail on which op needs which parameters. It also clarifies vault resolution (session-active vault vs explicit vaultPath), but it does not explicitly name sibling alternatives or list exclusion conditions, so it falls just short of a 5.

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

canvas.parseParse CanvasA
Read-onlyIdempotent

Parse an Obsidian canvas file and return its full structure: every node (text, file, link, group) and every edge. Use this when you need the complete graph; for just the neighbours of a specific node, call canvas.connections instead. Read-only.

Operates on the session-active vault (see vault.current — selectable via vault.select) unless an explicit vaultPath argument is passed, which always wins.

ParametersJSON Schema
NameRequiredDescriptionDefault
filePathYesVault-relative path to an Obsidian `.canvas` file.
vaultPathNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
edgesYes
nodesYes
filePathYes

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds valuable behavioral context beyond annotations: it explains the session-active vault resolution and that an explicit vaultPath always wins, which is important for correct invocation.

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

Conciseness5/5

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

The description is compact and front-loaded: the purpose, output, and primary alternative appear in the first two sentences. The vault-targeting note is the only additional context and is directly relevant to usage. No sentence is wasted.

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

Completeness4/5

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

With an output schema present, return-value details are handled structurally. The description covers the tool's purpose, when to use it, the alternative tool, and the vault resolution rule. It is complete for a read-only parsing tool, though it does not mention error behavior for invalid canvas files, which is a minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 50%: filePath is documented but vaultPath has no schema description. The description compensates by explaining vaultPath's role and precedence over the active vault, giving the agent enough semantics to use it correctly. It does not detail vaultPath's format, but the core meaning is clear.

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

Purpose5/5

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

The description states a specific verb ('Parse'), a specific resource ('Obsidian canvas file'), and the exact output scope ('full structure: every node ... every edge'). It also explicitly contrasts itself with canvas.connections, so an agent can distinguish it from its closest sibling without opening schemas.

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

Usage Guidelines5/5

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

The description gives an explicit usage rule: use this tool for the complete graph, and use canvas.connections for neighbours of a specific node. It also clarifies the vault-targeting behavior and references vault.current and vault.select, providing clear context for when this tool applies.

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

commands.executeExecute Obsidian CommandA
Destructive

Execute an Obsidian command by its internal id (as returned by commands.list). args is an optional argument map passed to the command (most built-in commands take no arguments). Requires the Local REST API plugin. Destructive — the effect depends entirely on what the command does, so verify the command id before calling.

Targets the vault the live Obsidian process has open via the Local REST API. Not affected by vault.select — that only changes filesystem-tool routing.

ParametersJSON Schema
NameRequiredDescriptionDefault
argsNoOptional map of command arguments. Most commands accept none.
commandIdYesCommand identifier, e.g. `editor:save-file` or `command-palette:open`.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false. The description reinforces this by stating 'Destructive — the effect depends entirely on what the command does' and adds a verification warning. It also discloses the plugin requirement, the targeting of the live Obsidian vault, and that routing is unaffected by `vault.select`. This adds significant context beyond the annotations with 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.

Conciseness4/5

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

The description is two short paragraphs that are front-loaded with the core purpose and then add relevant contextual warnings. It avoids redundancy with the schema and each sentence contributes either a prerequisite, a caution, or a routing clarification. It could be slightly tighter (e.g., merging the two paragraphs), but it is appropriately sized for a potentially dangerous tool.

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

Completeness5/5

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

Given the tool's high risk (executes arbitrary commands) and the presence of a full schema and output schema, the description covers all critical aspects: how to identify a command, optional arguments, required plugin, destructiveness warning, target scope, and routing behavior. It does not describe error handling, but that is not essential when the description already meets the safety and usage needs for an agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so both parameters are already well-documented. The description enhances this by clarifying that `args` is an optional argument map and that most built-in commands take no arguments (matching the schema's note). More importantly, it tells the agent where to obtain a valid `commandId` (via `commands.list`), which is not in the schema. This added guidance slightly exceeds the baseline for full coverage.

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

Purpose5/5

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

The description states a specific verb ('Execute') and a clear resource ('an Obsidian command by its internal id'), and references `commands.list` as the source of ids. It also explicitly notes that `vault.select` does not affect this tool, distinguishing it from filesystem-routing tools. This is a precise, unambiguous purpose statement.

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

Usage Guidelines4/5

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

It mentions a clear prerequisite (Requires the Local REST API plugin) and gives a caution to verify the command id before calling, which guides safe usage. It does not explicitly state when to use this tool over alternatives, but the reference to `commands.list` implies a natural sequence and the `vault.select` note clarifies when it is not affected. Lacks an explicit when-not-to-use, so a 4 is appropriate.

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

commands.listList Or Search Obsidian CommandsA
Read-onlyIdempotent

List Obsidian commands. With no query, returns every registered command (both built-in and plugin-provided). With a query string, returns commands whose id or display name matches — substring match, case-insensitive. Read-only. Use this to discover command ids before calling commands.execute. Requires the Local REST API plugin.

Targets the vault the live Obsidian process has open via the Local REST API. Not affected by vault.select — that only changes filesystem-tool routing.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryNoSubstring to match against command id or name. Omit to list all commands.

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsYesList of result items; per-item shape depends on the tool.
totalYesNumber of items in `items`.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already carry readOnlyHint, idempotentHint, and destructiveHint=false. The description adds valuable behavioral context beyond annotations: it requires the Local REST API plugin, targets the currently open vault, and is unaffected by vault.select. These are non-obvious traits an agent needs to know and are not present in the annotations.

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

Conciseness5/5

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

The description is two tight paragraphs. The first sentence delivers the core action, then each subsequent sentence adds necessary behavior, usage, or routing context. There is no redundant filler, and the most important facts (purpose, query behavior, read-only, usage) are front-loaded.

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

Completeness5/5

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

For a simple listing tool with one optional parameter and an output schema, the description is complete. It covers purpose, query semantics, read-only safety, plugin dependency, vault targeting, and routing independence. Nothing essential for an agent 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.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema fully covers the query parameter (100% coverage), so the baseline is 3. The description adds specific detail: case-insensitive substring matching and that it returns both built-in and plugin-provided commands, which enriches meaning beyond the schema's minimal description.

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

Purpose5/5

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

The description clearly states the verb 'List' and the resource 'Obsidian commands', and explains behavior with and without the query parameter. It distinguishes itself from siblings like commands.execute by explicitly stating it is for discovering command ids before executing, making its purpose unmistakable.

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

Usage Guidelines5/5

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

It explicitly says 'Use this to discover command ids before calling commands.execute', giving a clear when-to-use scenario and differentiating from the primary sibling. It also notes it is read-only and not affected by vault.select, which helps an agent decide when to invoke it.

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

dataview.fields.readRead Dataview FieldsA
Read-onlyIdempotent

Read Dataview fields from the vault. op:'extract' returns every field declared in a single note (page, list-item, and task-line fields combined). op:'search' scans the whole vault for notes whose fields match a key (and optionally a value coerced by valueType); use scope to restrict which field kinds are considered. Read-only. For mutating fields, use dataview.fields.write.

Operates on the session-active vault (see vault.current — selectable via vault.select) unless an explicit vaultPath argument is passed, which always wins.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true and idempotentHint=true, but the description adds meaningful behavior beyond that: the exact semantics of `extract` (combining page, list-item, and task-line fields) and `search` (coercion via `valueType`, scope restrictions). It also discloses the vault selection rule (`vaultPath` always wins), which is not derivable from the schema alone.

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

Conciseness5/5

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

The description is information-dense but logically structured: it opens with the core purpose, then details each operation, then addresses read-only status and vault selection. Every sentence earns its place—no filler or redundancy.

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

Completeness5/5

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

Given the tool's moderate complexity (two operation modes, optional parameters), the description covers all necessary invocation details: the meaning of both ops, the role of `scope`, the vault selection mechanism, and the pointer to the write counterpart. An output schema exists, so return-value documentation is not needed here. Nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the schema itself provides descriptions for `key`, `scope`, and `valueType`, so the parameters are well-documented. The description adds value by explaining how parameters interact across the two `op` variants (e.g., `extract` requires `filePath`, `search` requires `key` and optional `value`/`valueType`). This goes beyond the schema's per-field descriptions.

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

Purpose5/5

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

The description clearly states the resource (Dataview fields) and the two distinct operations (`extract` and `search`) with precise scoping. It differentiates from the sibling `dataview.fields.write` by explicitly labeling itself read-only, so an agent can immediately tell which tool handles mutation.

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

Usage Guidelines5/5

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

The description gives a direct pointer to the alternative (`For mutating fields, use dataview.fields.write`) and explains when to use each operation: `extract` for a single note, `search` for whole-vault matching. It also clarifies the `vaultPath` precedence rule, which is essential for correct invocation in multi-vault sessions.

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

dataview.fields.writeWrite Dataview FieldsA
Idempotent

Insert or remove a Dataview field in a single note. op:'add' inserts a key:: value field; syntaxType picks the rendering (full-line = own line; bracket = [key:: value]; paren = (key:: value)); insertAt chooses placement (start, end, afterFrontmatter) unless lineNumber is given for precise control. op:'remove' deletes every occurrence of key (optionally restricted to a single lineNumber or a Dataview scope). Idempotent — re-running with the same args converges on the same document state.

Operates on the session-active vault (see vault.current — selectable via vault.select) unless an explicit vaultPath argument is passed, which always wins.

Examples:

Example 1 — Add a full-line priority field after the frontmatter:

{
  "op": "add",
  "filePath": "Projects/Alpha.md",
  "key": "priority",
  "value": "high",
  "syntaxType": "full-line",
  "insertAt": "afterFrontmatter"
}

Example 2 — Remove every occurrence of the status field from a note:

{
  "op": "remove",
  "filePath": "Projects/Alpha.md",
  "key": "status",
  "scope": "all"
}
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
targetYesThe path or identifier the tool acted on.
changedYesTrue if the tool altered vault state on this call; false if it was a no-op.
summaryYesShort human-readable summary of what happened.

TDQS

A4.8/5.0
Behavior5/5

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

The description goes beyond the annotations by explaining exactly what each op does, including that remove 'deletes every occurrence' of a key, and explicitly discloses idempotence and vault selection behavior. No contradiction with annotations is apparent: idempotentHint matches, and the scoped field-write semantics are compatible with destructiveHint=false.

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

Conciseness5/5

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

The description is front-loaded with the core purpose, followed by compact parameter semantics, one behavioral caveat (idempotence/vault), and two worked examples. No sentence is filler; the length is justified by the two-branch op and several interacting options.

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

Completeness5/5

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

For a tool with a discriminated union, multiple enums, and optional interactions, the description plus schema is complete enough to call it correctly: it covers both ops, placement, syntax, scope, vault selection, and default behavior for insertAt. The output schema exists, so return values are not the description's burden.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Even with 100% schema coverage, the description adds substantial meaning: it defines how syntaxType renders the field, how insertAt and lineNumber interact, how scope restricts removal, and that vaultPath overrides the active vault. The two JSON examples tie the parameters together into valid call patterns.

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

Purpose5/5

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

The description opens with a precise verb+resource: 'Insert or remove a Dataview field in a single note.' It then explains the two op modes and rendering options, making the tool's function unmistakable and distinct from read-only siblings like dataview.fields.read.

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

Usage Guidelines4/5

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

It clearly establishes when the tool is appropriate: whenever a single note's Dataview field needs to be added or removed, and it explains vault targeting (session-active vault versus explicit vaultPath). It does not explicitly name sibling alternatives or state when not to use it, so it falls just short of full routing guidance.

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

dataview.indexRead Dataview IndexA
Read-onlyIdempotent

Parse a single note and return everything Dataview would index from it: page-level metadata (title, aliases, tags, frontmatter fields), list-item fields, task-line fields, and both DQL and DataviewJS block locations. Read-only, runs locally (does NOT require the Local REST API). Use this to understand what Dataview sees in a note without running a query.

Operates on the session-active vault (see vault.current — selectable via vault.select) unless an explicit vaultPath argument is passed, which always wins.

ParametersJSON Schema
NameRequiredDescriptionDefault
filePathYes
vaultPathNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, and idempotentHint=true. The description adds behavioral context beyond these by stating 'Read-only, runs locally (does NOT require the Local REST API)' and explaining that vaultPath overrides the active vault. This is useful extra information about execution environment and precedence, though it does not detail error handling or output structure (covered by output schema). No contradiction with annotations.

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

Conciseness5/5

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

Two paragraphs: the first front-loads the main purpose and output scope in a compact sentence; the second addresses vault selection. No redundancy, no filler. Every clause adds information. Highly efficient for the information conveyed.

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

Completeness4/5

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

The tool is moderately complex with an output schema. The description covers the key aspects: what data is returned, the read-only guarantee, local execution (no REST API), vault selection logic, and the intended use case. It does not discuss potential errors (e.g., file not found) but given the output schema and annotations, this is sufficient. Sibling tools are numerous, but the description positions it well.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It does clarify that vaultPath 'always wins' over the session-active vault, giving meaning to that optional parameter. For filePath, it only implies 'a single note' but does not specify path format or resolution rules. Given two parameters, the description provides some value but not comprehensive compensation for the missing schema descriptions.

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

Purpose5/5

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

The description states a specific verb ('Parse a single note') and a resource with explicit detail about what is returned: page-level metadata, list-item fields, task-line fields, and DQL/DataviewJS block locations. It clearly distinguishes from siblings like dataview.query (runs queries) and notes.read (raw content) by positioning itself as 'what Dataview would index'.

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

Usage Guidelines4/5

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

The description explicitly states the intended use case: 'Use this to understand what Dataview sees in a note without running a query.' It also gives context on vault selection (active vault vs explicit vaultPath). It does not explicitly name alternatives for when to run a query, but the phrase 'without running a query' implies the distinction. Clear enough for an agent to decide appropriately.

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

dataview.listByFolderList Notes By FolderA
Read-onlyIdempotent

Convenience wrapper that runs LIST FROM "folder" (optionally with WHERE, SORT, and LIMIT clauses). Useful when you want every note under a vault folder. Requires the Dataview and Local REST API plugins.

Operates on the session-active vault (see vault.current — selectable via vault.select) unless an explicit vaultPath argument is passed, which always wins.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoOptional `LIMIT` n clause.
folderYesVault-relative folder to filter by.
sortByNoOptional DQL `SORT` clause body (without the `SORT` keyword). Example: `file.ctime desc`.
whereClauseNoOptional DQL `WHERE` clause body (without the `WHERE` keyword).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior2/5

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

The description references an explicit `vaultPath` argument that does not exist in the input schema. This is misleading and could cause an agent to pass an invalid parameter. While annotations already cover readOnly/idempotent/destructive hints, the description adds inaccurate behavioral context rather than useful information, and the vault-selection behavior is described in a way that conflicts with the actual parameter list.

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

Conciseness5/5

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

The description is two short paragraphs. The first paragraph states purpose and plugin requirements; the second clarifies vault selection. Information is front-loaded, and every sentence serves a purpose. There is no fluff or repetition of schema details.

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

Completeness2/5

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

While the description covers plugin requirements and vault behavior, the major inconsistency of referencing a `vaultPath` parameter not present in the schema creates a significant gap. An agent relying on this description might try to pass `vaultPath` and fail. The output schema exists, so that part is not an issue, but the misleading information makes the description incomplete and potentially harmful.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so every parameter already has a clear explanation. The description adds an example for `sortBy` ('file.ctime desc') and clarifies the DQL mapping for where/sort/limit, but this is marginal. It does not significantly enhance understanding beyond what the schema provides, and the misleading `vaultPath` mention negatively impacts clarity.

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

Purpose5/5

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

The description clearly states it is a convenience wrapper around `LIST FROM "folder"` with optional DQL clauses. It explains the exact use case ('every note under a vault folder') and naturally distinguishes it from siblings like dataview.query (general DQL) and dataview.listByTag (by tag). The verb and resource are specific and unambiguous.

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

Usage Guidelines4/5

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

The description says it is 'useful when you want every note under a vault folder,' which is a clear usage context. It also mentions the Dataview and Local REST API plugin requirement. However, it does not explicitly name alternatives like dataview.query or state when not to use this tool, relying instead on implication from the term 'convenience wrapper.'

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

dataview.listByTagList Notes By TagA
Read-onlyIdempotent

Convenience wrapper that runs LIST FROM #tag (optionally with WHERE, SORT, and LIMIT clauses). Returns the same shape as dataview.query. Requires the Dataview and Local REST API plugins. Use this instead of authoring raw DQL when filtering by a single tag.

Operates on the session-active vault (see vault.current — selectable via vault.select) unless an explicit vaultPath argument is passed, which always wins.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagYesTag to filter by. With or without leading `#`.
limitNoOptional `LIMIT` n clause.
sortByNoOptional DQL `SORT` clause body (without the `SORT` keyword). Example: `file.ctime desc`.
whereClauseNoOptional DQL `WHERE` clause body (without the `WHERE` keyword).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already mark it as read-only and idempotent, but the description goes further: it discloses that the tool is a convenience wrapper, returns the same shape as dataview.query, requires specific plugins, and operates on the session-active vault unless vaultPath is provided. These are significant behavioral details not encoded in annotations.

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

Conciseness5/5

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

The description is compact and front-loaded: it states the core action, then usage guidance, then vault behavior. Every sentence adds value, no filler or repetition.

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

Completeness5/5

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

Given the tool's moderate complexity, the full schema coverage, the presence of an output schema, and rich annotations, the description covers all necessary aspects: purpose, usage, requirements, vault selection, and expected return shape. Nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already has 100% coverage with clear descriptions for all four parameters (e.g., tag accepts leading `#`, sortBy is a DQL clause body). The description does not add further parameter-specific detail; it only restates the optional clauses in prose, so a baseline 3 is appropriate.

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

Purpose5/5

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

The description clearly states it is a wrapper around `LIST FROM #tag` and explicitly contrasts it with raw DQL ('Use this instead of authoring raw DQL when filtering by a single tag'), making its purpose and differentiation from sibling tools like dataview.query unambiguous.

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

Usage Guidelines5/5

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

Provides explicit when-to-use guidance ('when filtering by a single tag') and names the alternative (raw DQL). It also adds prerequisites (Dataview and Local REST API plugins) and explains vault selection behavior, leaving no ambiguity about when to call it.

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

dataview.queryRun Dataview QueryA
Read-onlyIdempotent

Execute an arbitrary Dataview Query Language (DQL) query through the Obsidian Local REST API. The query string is raw DQL — e.g. LIST FROM #inbox, TASK WHERE !completed, TABLE file.mtime FROM "Journal". Requires the Dataview plugin to be enabled in Obsidian and the Local REST API plugin to be configured (OBSIDIAN_API_URL/OBSIDIAN_REST_API_KEY). For common patterns (list-by-tag, list-by-folder, table) the sugar tools dataview.listByTag/listByFolder/table are easier to use — prefer those when applicable and fall back to dataview.query for custom DQL.

Operates on the session-active vault (see vault.current — selectable via vault.select) unless an explicit vaultPath argument is passed, which always wins.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesA Dataview Query Language (DQL) string. Examples: `LIST FROM #inbox`, `TASK FROM "Journal" WHERE !completed`, `TABLE file.ctime, priority FROM #projects`.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior3/5

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

The description adds meaningful context beyond the readOnlyHint/idempotentHint annotations by disclosing plugin requirements, authentication configuration, and vault-scoping behavior. However, the statement about a 'vaultPath' argument that overrides vault selection is factually inconsistent with the schema, which undermines trust in the behavioral description. It provides some value but also introduces a false behavioral claim.

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

Conciseness4/5

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

The description is front-loaded with a clear purpose statement, followed by examples, alternatives, prerequisites, and vault behavior. It is somewhat long but each sentence adds value. The only structural issue is that the vaultPath mention is placed as a final aside, slightly muddling the otherwise clean flow.

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

Completeness3/5

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

The description covers the essential prerequisites, alternative tools, and vault behavior, and an output schema exists so return values are not required. However, the incorrect vaultPath reference is a significant completeness gap: an agent following the description may attempt to pass an invalid parameter. Additionally, the description does not mention error handling or query syntax validation, which would be useful for a raw DQL tool, though not strictly necessary given the output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already covers the 'query' parameter well (100% coverage), so the baseline is 3. The description adds useful clarification that the query is 'raw DQL' and gives examples, which helps. But it also references a 'vaultPath' parameter that does not exist in the schema (additionalProperties: false). This is actively misleading and could cause an agent to include an invalid parameter, so the score is dropped below baseline.

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

Purpose5/5

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

The description explicitly states the tool's action: 'Execute an arbitrary Dataview Query Language (DQL) query.' It provides concrete examples (LIST FROM #inbox, TASK WHERE !completed) and distinguishes itself from sibling sugar tools like dataview.listByTag by positioning this as the escape hatch for custom DQL. The verb+resource is specific and unambiguous.

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

Usage Guidelines4/5

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

The description clearly says to prefer dataview.listByTag/listByFolder/table for common patterns and fall back to dataview.query for custom DQL, which is excellent when-to-use guidance. It also lists prerequisites (Dataview plugin, Local REST API config) and explains vault selection behavior. However, the claim that an explicit 'vaultPath' argument can be passed is misleading because the input schema does not include such a parameter (additionalProperties: false), creating confusion for the agent.

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

dataview.tableRun Dataview Table QueryA
Read-onlyIdempotent

Convenience wrapper that runs TABLE field1, field2, … FROM … with optional WHERE, SORT, and LIMIT clauses. Use this when you need structured columnar output. Requires the Dataview and Local REST API plugins.

Operates on the session-active vault (see vault.current — selectable via vault.select) unless an explicit vaultPath argument is passed, which always wins.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoOptional `LIMIT` n clause.
fieldsYesField expressions to project as table columns (e.g. `file.name`, `priority`).
sortByNoOptional DQL `SORT` clause body (without the `SORT` keyword). Example: `file.ctime desc`.
fromClauseNoOptional DQL `FROM` clause body. Example: `#projects AND -#archive`.
whereClauseNoOptional DQL `WHERE` clause body (without the `WHERE` keyword).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior2/5

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

Annotations already cover readOnly, idempotent, openWorld, and non-destructive behavior, so the description adds value by mentioning plugin prerequisites and vault resolution semantics. However, it claims an explicit `vaultPath` argument 'always wins,' but that parameter is absent from the input schema and additionalProperties is false. This is a misleading behavioral claim that an agent cannot actually act on, which undermines transparency.

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

Conciseness4/5

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

The description is appropriately short and front-loaded: the first sentence defines the operation, the second gives the use case, the third gives prerequisites, and the final paragraph explains vault behavior. The vaultPath sentence is somewhat misleading and the vault.current/vault.select references add a small distraction, but overall the structure is compact and readable.

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

Completeness3/5

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

The description covers the core purpose, prerequisites, vault resolution, and structured output, and the output schema plus annotations handle return values and safety. However, it leaves the vaultPath mismatch unresolved and does not clarify what happens when `fromClause` is omitted, which is relevant for correct invocation. These gaps prevent it from being fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all real parameters; the description only restates that WHERE, SORT, and LIMIT are optional, adding no new meaning. Worse, it introduces a phantom `vaultPath` parameter not present in the schema, actively confusing parameter expectations. This is a net negative beyond the baseline.

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

Purpose5/5

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

The description uses a specific verb ('runs') and names the exact DQL TABLE form it wraps. It also explicitly says 'structured columnar output,' which differentiates this tool from list-oriented siblings like dataview.listByTag and dataview.listByFolder. This is a clear, distinguishing statement of purpose.

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

Usage Guidelines4/5

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

It gives an explicit usage trigger: 'Use this when you need structured columnar output.' It also notes a prerequisite (Dataview and Local REST API plugins), which is useful for pre-call checks. However, it never names alternatives or explains when to prefer dataview.query or listByTag, so exclusions are left 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.

kanban.cardModify Kanban CardA

Add, move, or toggle a card on a Kanban board. The op field selects the mutation and determines which other fields are required: add needs columnName and cardText (plus optional status, dueDate, position); move needs cardText, fromColumn, toColumn (plus optional position); toggle needs cardText (plus optional columnName to scope the search). Missing destination columns are created automatically. Returns a {changed, target, summary, ...} mutation envelope.

Operates on the session-active vault (see vault.current — selectable via vault.select) unless an explicit vaultPath argument is passed, which always wins.

Examples:

Example 1 — Add a new card to the Todo column with a due date:

{
  "op": "add",
  "filePath": "Boards/Project.md",
  "columnName": "Todo",
  "cardText": "Write migration doc",
  "dueDate": "2026-05-01",
  "position": "end"
}

Example 2 — Move a card from In Progress to Done:

{
  "op": "move",
  "filePath": "Boards/Project.md",
  "cardText": "Write migration doc",
  "fromColumn": "In Progress",
  "toColumn": "Done"
}

Example 3 — Toggle a card's completion in any column:

{
  "op": "toggle",
  "filePath": "Boards/Project.md",
  "cardText": "Write migration doc"
}
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
targetYesThe path or identifier the tool acted on.
changedYesTrue if the tool altered vault state on this call; false if it was a no-op.
summaryYesShort human-readable summary of what happened.

TDQS

A4.7/5.0
Behavior5/5

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

It discloses important behaviors beyond the annotations: missing destination columns are created automatically, card matching for move/toggle is verbatim after checkbox, the result is a {changed, target, summary, ...} mutation envelope, and the tool operates on the session-active vault unless vaultPath is supplied. This adds substantial context that the annotations alone do not convey.

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

Conciseness5/5

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

The description is longer than average, but every part earns its place: a clear op matrix, side-effect disclosure, vault routing rule, and concrete examples for each op variant. It is front-loaded with the core purpose and avoids filler.

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

Completeness5/5

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

The description is complete for a complex oneOf-based mutation tool. It covers op selection, required versus optional fields, automatic column creation, vault selection, and the return envelope shape. Since an output schema exists, not repeating full return details is acceptable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already documents all parameters with high coverage, so the baseline is 3. The description adds value by grouping required parameters by op, explaining positional behavior with 'start'/'end', noting automatic column creation, and providing realistic examples that make the discriminated union much easier to invoke correctly.

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

Purpose5/5

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

The description uses a specific action set ('Add, move, or toggle') and names the resource ('a card on a Kanban board'), then explains what each op does. This clearly distinguishes the mutation tool from read-only siblings like kanban.parse and kanban.stats, even though the tool's title is somewhat generic.

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

Usage Guidelines4/5

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

The description gives explicit per-op usage rules: add requires columnName/cardText, move requires fromColumn/toColumn, and toggle uses optional columnName to scope the search. It also clarifies vault routing and the precedence of vaultPath. It does not explicitly name alternative sibling tools to avoid for read-only operations, so it stops short of a 5.

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

kanban.parseParse Kanban BoardA
Read-onlyIdempotent

Parse a markdown Kanban board file into its column/card structure. Use this when you need the full board content — each column's name and its cards with their completion state. Works with the obsidian-kanban plugin's markdown format. Read-only. For completion counts and ratios instead of the full card list, use kanban.stats.

Operates on the session-active vault (see vault.current — selectable via vault.select) unless an explicit vaultPath argument is passed, which always wins.

ParametersJSON Schema
NameRequiredDescriptionDefault
filePathYesPath of the Kanban board note (`.md`).
vaultPathNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
columnsYes
filePathYes

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and idempotentHint, so the description's 'Read-only' adds no new safety info. However, it adds valuable behavioral context beyond annotations: compatibility with the obsidian-kanban plugin format and the session-active vault behavior with vaultPath override. This improves the agent's understanding of execution context.

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

Conciseness5/5

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

The description is tight and front-loaded. The first sentence states the core purpose; the next sentences provide usage guidance, an explicit alternative, and the vault behavior. Every sentence earns its place with no redundant or vague phrasing.

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

Completeness5/5

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

Given the output schema exists and annotations cover safety, the description is complete. It explains what the tool does, when to use it, which format is supported, and how vault selection works. No missing critical context 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.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 50%: filePath is documented in the schema, vaultPath is not. The description compensates for vaultPath by explaining it overrides the session-active vault, giving that parameter meaningful semantics beyond its bare type. It could be stronger with path format details, but the description adds real value.

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

Purpose5/5

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

The description uses a specific verb and resource: 'Parse a markdown Kanban board file into its column/card structure.' It clearly distinguishes itself from kanban.stats by explaining that this tool provides the full board content, not just counts.

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

Usage Guidelines5/5

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

Explicitly states when to use the tool: 'Use this when you need the full board content.' It also names the alternative for different needs: 'For completion counts and ratios instead of the full card list, use kanban.stats.' This leaves no ambiguity about tool selection.

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

kanban.statsKanban Board StatisticsA
Read-onlyIdempotent

Summarise a Kanban board: total cards, completed count, incomplete count, completion rate, and per-column breakdown. Use this for dashboards or progress checks where you don't need each card's full text. Read-only. Use kanban.parse when you need the actual card content.

Operates on the session-active vault (see vault.current — selectable via vault.select) unless an explicit vaultPath argument is passed, which always wins.

ParametersJSON Schema
NameRequiredDescriptionDefault
filePathYesPath of the Kanban board note (`.md`).
vaultPathNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
totalYes
byColumnYes
filePathYes
completedYes
incompleteYes
completionRateYesRatio 0..1 of completed to total cards.

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds a meaningful behavioral detail: operation on the session-active vault unless vaultPath is passed, and that vaultPath always wins. This goes beyond the annotations and clarifies routing behavior. No contradiction, though it could also mention error conditions or performance implications.

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

Conciseness5/5

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

Two terse paragraphs, no fluff. The purpose and metrics are front-loaded, and the vault behavior is placed in a separate sentence. Every sentence adds novel information; nothing is redundant with the schema.

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

Completeness5/5

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

An output schema exists, so return format is provided. The description covers purpose, usage context, alternatives, and vault routing. With only two parameters and rich annotations for safety, this is fully complete for agent decision-making.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 50% — filePath has a description but vaultPath does not. The description compensates by explaining vaultPath's role and precedence ('unless an explicit vaultPath argument is passed, which always wins'). It does not add format details, but the essential semantics are covered.

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

Purpose5/5

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

The description states a specific verb ('Summarise') and resource (Kanban board), and enumerates the exact metrics (total cards, completed, incomplete, completion rate, per-column breakdown). It also distinguishes from kanban.parse by specifying it does not give card content, so the purpose is unambiguous.

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

Usage Guidelines5/5

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

Explicit guidance: 'Use this for dashboards or progress checks where you don't need each card's full text' and 'Use kanban.parse when you need the actual card content.' Also clarifies the active-vault vs vaultPath precedence, leaving no ambiguity about when to call this vs alternatives.

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

links.brokenFind Broken LinksA
Read-onlyIdempotent

Find every link in the vault (or a directory subtree) whose target does not resolve to an existing note. Each result carries the source file, line number, link text, and unresolved target. Read-only. Pair with notes.move (with updateLinks:true) to fix them after moves.

Operates on the session-active vault (see vault.current — selectable via vault.select) unless an explicit vaultPath argument is passed, which always wins.

ParametersJSON Schema
NameRequiredDescriptionDefault
directoryNoOptional folder to scope the scan. Omit to scan the whole vault.
vaultPathNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsYesList of result items; per-item shape depends on the tool.
totalYesNumber of items in `items`.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already provide readOnlyHint=true, idempotentHint=true, and destructiveHint=false, and the description reinforces 'Read-only.' It adds useful behavioral context: the scan operates on the session-active vault unless vaultPath is supplied, and vaultPath always wins. It also discloses the per-result fields, which helps set expectations beyond the schema.

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

Conciseness5/5

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

The description is compact and front-loaded: the core function, scope options, result contents, read-only nature, and repair workflow all appear in a few sentences. Every sentence adds value, and the vault-selection nuance is placed after the main purpose without bloating the definition.

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

Completeness5/5

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

With an output schema present, the description need not fully specify return values, and it still gives a helpful preview (source file, line number, link text, unresolved target). Together with annotations and the vaultPath/directory semantics, an agent has enough context to select and invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 50%: directory has a schema description, but vaultPath does not. The description compensates for vaultPath by explaining it overrides the session-active vault, and it clarifies that directory scopes the scan to a subtree. It does not give vaultPath format examples, but the added precedence semantics go beyond the schema.

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

Purpose5/5

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

The description states a specific verb and resource: 'Find every link in the vault (or a directory subtree) whose target does not resolve to an existing note.' This clearly distinguishes the tool from sibling link tools like links.outgoing or links.graph by focusing on broken/unresolved targets. The expected result fields further clarify what the tool does.

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

Usage Guidelines4/5

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

The description gives clear context: use it to find broken links, and explicitly pairs it with notes.move (updateLinks:true) to fix them after moves. It also clarifies the session-active vault and vaultPath precedence. It does not explicitly list alternatives or when-not-to-use scenarios, but the context is strong.

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

links.connectionsExplore Note ConnectionsA
Read-onlyIdempotent

Explore the graph neighbourhood around a seed note — direct and multi-hop connections up to depth hops (default 2). Returns the set of reachable notes plus the paths that reach them. Higher depth values blow up result size quickly; keep it ≤3 unless you know the graph is sparse. Read-only.

Operates on the session-active vault (see vault.current — selectable via vault.select) unless an explicit vaultPath argument is passed, which always wins.

ParametersJSON Schema
NameRequiredDescriptionDefault
depthNoTraversal depth (hops). Default 2. Higher values quickly blow up result size.
noteNameYesName or path of the starting note. Basename match is fine.
vaultPathNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already cover read-only, idempotent, non-destructive behavior. The description adds valuable behavioral context beyond annotations, including the cost explosion with higher depth values and the precedence rule for vaultPath over the active vault.

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

Conciseness4/5

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

Well-structured and front-loaded: the core behaviour and output come first, followed by cost warning and vault semantics. Slight redundancy exists because 'read-only' and 'result size blow-up' repeat annotation/schema information, but overall every sentence earns its place.

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

Completeness4/5

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

Comprehensive given the annotations, schema, and output schema: it explains scope, output shape, depth risk, and vault resolution. It does not discuss failure modes or when to choose a sibling tool, but the provided context is enough for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema covers noteName and depth reasonably well, but leaves vaultPath undocumented. The description compensates by explaining that vaultPath overrides the active vault, and reinforces depth semantics with a concrete limit recommendation.

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

Purpose5/5

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

States a specific verb and resource: explores the graph neighbourhood around a seed note with direct and multi-hop connections. Clearly distinguishes itself from sibling direct-link tools like links.outgoing and links.backlinks by describing traversal depth and returning reachable notes plus paths.

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

Usage Guidelines4/5

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

Provides clear operational context: the active vault is used by default, vaultPath overrides it, and depth should generally stay ≤3 to avoid result blow-up. It does not explicitly name alternatives or say when to prefer this over a sibling tool, but the guidance is sufficient for practical use.

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

links.graphGet Link GraphA
Read-onlyIdempotent

Build a full vault link graph: every note becomes a node, every outbound link becomes a directed edge. Return shape is {nodes, edges, stats} where nodes carry basic metadata (path, title) and edges carry source/target and link kind. Expensive for large vaults — prefer links.backlinks, links.outgoing, or links.connections for targeted queries. Read-only.

Operates on the session-active vault (see vault.current — selectable via vault.select) unless an explicit vaultPath argument is passed, which always wins.

ParametersJSON Schema
NameRequiredDescriptionDefault
vaultPathNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, and the description adds meaningful behavioral context beyond those: performance cost, return shape, and vault-scoping semantics. The 'Read-only' statement is consistent with the annotations, so there is no contradiction.

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

Conciseness5/5

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

The description is compact and every sentence earns its place: graph definition, return shape, performance guidance, read-only confirmation, and vault selection. The most important scoping and routing information is front-loaded.

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

Completeness5/5

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

The description provides enough information for an agent to call the tool correctly: what the output contains, when to avoid it, how vault context is resolved, and how vaultPath affects behavior. An output schema exists, so detailed return typing is not the description's burden.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The only parameter, vaultPath, has no schema description (0% coverage), but the description compensates by explaining when it applies and that it overrides the session-active vault. It does not specify path format or expected values, leaving a small gap, but the core meaning is communicated.

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

Purpose5/5

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

The description states a specific verb and resource ('Build a full vault link graph'), defines the exact graph model (nodes for notes, directed edges for outbound links), and clearly differentiates itself from targeted siblings like links.backlinks and links.outgoing. An agent can immediately understand what this tool does and how it differs.

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

Usage Guidelines5/5

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

The description explicitly warns that the tool is expensive for large vaults and recommends alternatives ('prefer links.backlinks, links.outgoing, or links.connections for targeted queries'). It also clarifies the active-vault behavior and that an explicit vaultPath overrides it, giving clear selection and invocation guidance.

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

links.healthAnalyze Link HealthA
Read-onlyIdempotent

Summarise link health for the whole vault: total link count, broken-link count and ratio, orphan-note count, average outbound/inbound link density, and a list of the top hub notes. Read-only. Use this as a dashboard check; call links.broken/links.orphaned/links.hubs for the full per-item lists.

Operates on the session-active vault (see vault.current — selectable via vault.select) unless an explicit vaultPath argument is passed, which always wins.

ParametersJSON Schema
NameRequiredDescriptionDefault
vaultPathNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the description's 'Read-only' is consistent. The description adds useful behavioral context beyond annotations: it aggregates across the whole vault, computes ratios and densities, and respects the session-active vault unless vaultPath is supplied. This is meaningful but not exhaustive; the output schema covers return details.

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

Conciseness5/5

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

The description is compact and front-loaded, with the core purpose and output metrics in the first sentence. The second sentence gives routing guidance, and the third handles vault scoping. Every sentence adds distinct value with no redundancy or filler.

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

Completeness5/5

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

Given the tool's simple optional-parameter shape and the presence of an output schema, the description covers everything needed: what it returns, when to use it, sibling alternatives, read-only behavior, and vault targeting. No critical operational detail is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must carry the burden for the single optional vaultPath parameter. It does: vaultPath is explained as an explicit override that 'always wins' over the session-active vault. It doesn't specify path format, but the parameter name and contextual explanation make the semantics clear enough for correct use.

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

Purpose5/5

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

The description uses a specific verb ('Summarise') and resource ('link health for the whole vault'), then enumerates the exact metrics returned. It also distinguishes itself from the sibling tools links.broken, links.orphaned, and links.hubs by explicitly framing this as an aggregate dashboard check rather than per-item listing.

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

Usage Guidelines5/5

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

The description explicitly says when to use it ('as a dashboard check') and names the alternatives for full per-item lists. It also clarifies vault selection semantics, including how vaultPath overrides the session-active vault, leaving no ambiguity about which vault is targeted.

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

links.hubsFind Hub NotesA
Read-onlyIdempotent

Return notes with at least minOutlinks outgoing links (default 10), sorted by outbound count descending — the vault's connective tissue / MOCs / curated indexes. Each result carries {path, title, outbound, inbound}. Read-only. Use this to find pages that already act as navigational anchors (good seeds for links.connections); use links.health for a single rolled-up score across the whole vault, and links.graph when you need the full raw edge list rather than just the dense nodes.

Operates on the session-active vault (see vault.current — selectable via vault.select) unless an explicit vaultPath argument is passed, which always wins.

ParametersJSON Schema
NameRequiredDescriptionDefault
vaultPathNo
minOutlinksNoMinimum outgoing-link count for a note to qualify as a hub. Default 10.

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsYesList of result items; per-item shape depends on the tool.
totalYesNumber of items in `items`.

TDQS

A5/5.0
Behavior5/5

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

Annotations already declare readOnly, idempotent, and non-destructive behavior, so the bar for added value is lower. The description still adds meaningful behavior: minimum threshold with default 10, descending sort by outbound count, result shape `{path, title, outbound, inbound}`, and vaultPath precedence over the session-active vault. No contradiction with annotations.

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

Conciseness5/5

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

The description is tightly packed: core behavior, default, sorting, result fields, read-only note, usage guidance, alternatives, and vault-selection semantics are all covered in two focused paragraphs. No filler or redundancy.

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

Completeness5/5

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

Given the output schema exists, the description need not re-explain return values, but it still provides the threshold, ordering, vault behavior, and sibling routing. Everything an agent needs to decide when and how to invoke this tool is present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema only documents `minOutlinks`; the description compensates for `vaultPath` by explaining that it overrides the session-active vault. It also restates the default for `minOutlinks` and clarifies that the count refers to outgoing links, making both parameters actionable.

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

Purpose5/5

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

The description uses a specific verb and resource: 'Return notes with at least `minOutlinks` outgoing links', then adds sorting criteria and conceptual framing ('connective tissue / MOCs / curated indexes'). It clearly distinguishes this hub-finding operation from sibling tools like `links.outgoing`, `links.graph`, and `links.health`.

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

Usage Guidelines5/5

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

The description explicitly states when to use this tool — to find navigational anchors and seeds for `links.connections` — and names the alternatives: `links.health` for a single vault-wide score and `links.graph` for the full raw edge list. It also clarifies vault-targeting behavior via `vault.current` and `vaultPath`.

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

links.orphanedFind Orphaned NotesA
Read-onlyIdempotent

Return every note with zero incoming AND zero outgoing links — i.e., notes that are disconnected from the rest of the vault graph. Useful for cleanup passes. Read-only. Often paired with links.hubs and links.broken in a weekly vault-health routine.

Operates on the session-active vault (see vault.current — selectable via vault.select) unless an explicit vaultPath argument is passed, which always wins.

ParametersJSON Schema
NameRequiredDescriptionDefault
vaultPathNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsYesList of result items; per-item shape depends on the tool.
totalYesNumber of items in `items`.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already indicate read-only, idempotent, and non-destructive behavior. The description adds non-obvious behavioral context: it operates on the session-active vault unless an explicit vaultPath argument overrides it, with the override always winning. This is valuable information beyond the annotations. It doesn't describe return format, but an output schema exists to cover that.

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

Conciseness5/5

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

The description is compact and well-structured. The first sentence states the core definition, followed by usage context, then the important vault-selection behavior. No unnecessary filler; every sentence contributes to understanding. The structure is logical and front-loaded with the primary purpose.

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

Completeness5/5

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

For a simple, read-only tool with one optional parameter and an output schema, the description covers everything an agent needs: the exact condition, usage context, and vault selection behavior. It doesn't explain the output structure, but the output schema handles that. The description is complete for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 0% coverage for parameter descriptions, so the description is the only explanation. It clearly explains the optional vaultPath parameter: it overrides the session-active vault and always wins. This gives semantic meaning beyond the raw schema, though it doesn't specify the format (e.g., path syntax), which is a minor gap given there's only one parameter.

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

Purpose5/5

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

The description precisely defines the tool's action: 'Return every note with zero incoming AND zero outgoing links' and explains what that means ('disconnected from the rest of the vault graph'). It clearly distinguishes from sibling tools like links.broken and links.hubs by specifying the dual-direction condition, making the purpose unambiguous.

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

Usage Guidelines4/5

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

It provides clear usage contexts: 'useful for cleanup passes' and 'often paired with links.hubs and links.broken in a weekly vault-health routine.' This gives an agent a good sense of when to invoke it. It doesn't explicitly state when not to use it, but the defined scope and pairing guidance are sufficient for typical scenarios.

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

links.outgoingGet Outgoing LinksA
Read-onlyIdempotent

Extract every link FROM a note (outbound references) — wiki-style [[…]] and markdown-style […](…). When checkValidity:true, each entry carries a valid flag indicating whether the target path resolves in the vault. Read-only. For inbound references (what points AT the note), use links.backlinks.

Operates on the session-active vault (see vault.current — selectable via vault.select) unless an explicit vaultPath argument is passed, which always wins.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
vaultPathNo
checkValidityNoWhen true, each outgoing link is flagged `valid` or broken.

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsYesList of result items; per-item shape depends on the tool.
totalYesNumber of items in `items`.

TDQS

A4.9/5.0
Behavior5/5

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

Descriptions adds meaningful behavioral context beyond the annotations: it discloses that both wiki-style and markdown-style links are extracted, that checkValidity adds a valid flag based on path resolution in the vault, and that vaultPath overrides the session-active vault. It also confirms the read-only nature, consistent with readOnlyHint and idempotentHint. No contradiction with annotations.

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

Conciseness5/5

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

The description is compact and well-structured. Every sentence serves a purpose: purpose, validity flag behavior, read-only confirmation, sibling alternative, and vault scoping. It front-loads the main function and keeps supporting details concise.

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

Completeness5/5

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

The description is complete for a tool with an output schema that already explains return values. It details the link extraction scope, validity flag semantics, vault behavior, and explicit alternative. The references to vault.current and vault.select provide useful context without being excessive.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 33% (only checkValidity has a description). The description compensates by explaining vaultPath (overrides session vault) and checkValidity (adds valid flag). The path parameter is not explicitly described, but it's implied as the note from which links are extracted. The added semantics cover two of three parameters well, though path could have been more explicit.

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

Purpose5/5

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

The description clearly states the verb 'Extract' and the resource 'links FROM a note', specifying both wiki-style and markdown-style link formats. It explicitly distinguishes itself from the sibling 'links.backlinks' by naming the alternative and its purpose, so an agent can readily tell them apart.

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

Usage Guidelines5/5

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

The description gives explicit usage guidance: 'For inbound references (what points AT the note), use links.backlinks.' It also explains the vault scoping rule (session-active vault vs explicit vaultPath) and which argument wins. This leaves no ambiguity about when to use this tool versus alternatives.

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

marp.readRead Marp DeckA
Read-onlyIdempotent

Read some or all of a Marp presentation deck (a markdown file with marp: true frontmatter and --- slide separators). The part field selects what to return: deck returns the whole deck (frontmatter, all slides, directives); slides returns a list of slide summaries (separator and directive metadata, no body); slide returns one slide's full source, located by slideId or 0-based index. Output shape varies by part — see the description of each variant. Read-only. Use marp.update to mutate.

Operates on the session-active vault (see vault.current — selectable via vault.select) unless an explicit vaultPath argument is passed, which always wins.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, and the description reinforces this with 'Read-only.' The description adds value by detailing output variability per part and the precedence of 'slideId' over 'index', which informs expected behavior beyond the static annotations. It also clarifies vault resolution, which is behavioral context not covered by annotations.

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

Conciseness5/5

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

The description is concise and well-organized: it leads with the action and purpose, then details the three part variants in a compact way, and ends with vault resolution. Every sentence contributes to understanding the tool; there is no filler or redundancy. The structure front-loads the most critical discriminators.

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

Completeness4/5

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

Given the tool's complexity (three variants, multiple parameters, output variations), the description is thorough in explaining the input selection and vault behavior. It does not detail the exact return format, but the presence of an output schema (indicated in context) mitigates this. The only minor gap is lack of error-handling or edge-case notes, but for a read-only tool this is acceptable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already covers parameter descriptions heavily (100% coverage per context), but the description enriches this by explaining the semantic differences between 'part' values, the meaning of 'slideId' versus 'index', and the override behavior of 'vaultPath'. This is more than schema repetition; it provides decision-relevant semantics for the agent's invocation.

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

Purpose5/5

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

The description states a specific action ('Read') on a specific resource ('Marp presentation deck') and enumerates three distinct variants via the 'part' field. It also differentiates from the sibling 'marp.update' by explicitly noting it is read-only and that mutation goes through the update tool. This is a clear, unambiguous purpose.

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

Usage Guidelines4/5

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

The description provides clear usage context: it explains when to use the read tool versus the update tool, and clarifies that it operates on the session-active vault unless an explicit 'vaultPath' is provided. It also explains how to select a slide via 'slideId' or 'index', which are key usage decisions. However, it does not compare against other read tools (e.g., notes.read) for scenarios where a non-Marp markdown is involved, so it lacks full alternative routing.

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

marp.updateUpdate Marp DeckA
DestructiveIdempotent

Mutate a Marp deck in place. part:'slide' replaces one slide's body (located by slideId or index) without touching neighbouring slides. part:'frontmatter' merges fields into the deck's frontmatter — unspecified fields are preserved; pass null to a field to unset it. Idempotent — re-running with identical inputs is a no-op on the file contents. Destructive — overwrites in place.

Operates on the session-active vault (see vault.current — selectable via vault.select) unless an explicit vaultPath argument is passed, which always wins.

Examples:

Example 1 — Replace the second slide's body:

{
  "part": "slide",
  "filePath": "Decks/launch.md",
  "index": 1,
  "source": "# New headline\n\nUpdated body"
}

Example 2 — Change the deck's theme and set a new title:

{
  "part": "frontmatter",
  "filePath": "Decks/launch.md",
  "fields": {
    "theme": "gaia",
    "title": "Launch plan"
  }
}
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
targetYesThe path or identifier the tool acted on.
changedYesTrue if the tool altered vault state on this call; false if it was a no-op.
summaryYesShort human-readable summary of what happened.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare destructive and idempotent behavior, and the description adds valuable context: slides are replaced without touching neighbors, unspecified frontmatter fields are preserved, `null` unsets a field, and identical re-runs are a no-op on file contents. This goes beyond the annotation flags and gives an agent a precise side-effect model.

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

Conciseness5/5

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

The description is front-loaded with the core behavior, then gives branch-specific semantics and closes with two illustrative examples. Despite its length, every sentence earns its place, and the detail is justified by the oneOf/two-mode design.

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

Completeness5/5

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

For a mutating tool with two distinct modes and an output schema, the description covers selection, side effects, vault routing, and example payloads. Nothing required to select or invoke the correct branch is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema documents `source`, `fields`, and `part`, but the description adds meaning not present in the schema: slide lookup by `slideId` or `index`, the precedence behavior of `vaultPath`, and the merge/unset semantics for frontmatter. The examples provide concrete payload shapes for both branches, making invocation unambiguous.

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

Purpose5/5

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

Opens with a specific verb ('Mutate') and resource ('a Marp deck in place'), then distinguishes the two `part` modes: slide-body replacement and frontmatter merge. The tool is clearly separable from its read sibling and from general note-editing tools by the Marp deck scope and the named mutation targets.

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

Usage Guidelines4/5

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

The description clearly explains when to use the `slide` branch versus the `frontmatter` branch, and how vault targeting is resolved, including the rule that an explicit `vaultPath` overrides the active vault. It does not explicitly state when to use an alternative like `notes.edit` or `marp.read` instead, so it stops short of full exclusion guidance.

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

notes.createCreate Note Or FolderA

Create a new note or folder in the vault. kind:'note' creates a markdown note at path with the given content; ifExists controls collision behavior (error = fail, default; replace = overwrite; skip = no-op). kind:'folder' creates a directory at path (intermediate folders are created automatically; idempotent — re-creating an existing folder is a no-op). Returns the standard mutation envelope.

Operates on the session-active vault (see vault.current — selectable via vault.select) unless an explicit vaultPath argument is passed, which always wins.

Examples:

Example 1 — Create a new note, failing if it exists:

{
  "kind": "note",
  "path": "Journal/2026-04-24.md",
  "content": "# Today\n"
}

Example 2 — Ensure a folder exists (idempotent):

{
  "kind": "folder",
  "path": "Projects/Alpha/Reports"
}
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
targetYesThe path or identifier the tool acted on.
changedYesTrue if the tool altered vault state on this call; false if it was a no-op.
summaryYesShort human-readable summary of what happened.

TDQS

A4.8/5.0
Behavior5/5

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

The description richly discloses behavior beyond the annotations: `ifExists` semantics (`error`, `replace`, `skip`), idempotent folder creation, automatic creation of intermediate folders, and explicit precedence of `vaultPath` over the session-active vault. It also notes the return is a standard mutation envelope, which is useful given the annotations do not describe side effects.

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

Conciseness5/5

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

The description is efficiently organized: a lead sentence with the core operation, then mode-specific behavior, then operational context, then examples. Every section adds information, and the examples are compact and illustrative without padding.

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

Completeness5/5

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

For a discriminated-union mutation tool, the description covers all necessary decision points: note vs. folder, collision handling, path behavior, vault selection, and idempotency. The output schema exists, so the vague 'standard mutation envelope' reference is acceptable and does not leave a critical gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although the schema already documents parameters well, the description adds meaningful cross-parameter semantics: how `kind` switches the object shape, how `ifExists` interacts with existing notes, how folder creation behaves idempotently, and how `vaultPath` overrides the active vault. The two concrete JSON examples further clarify expected usage.

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

Purpose5/5

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

The description states a specific action — 'Create a new note or folder in the vault' — and clearly distinguishes the two modes via `kind:'note'` and `kind:'folder'`. It also differentiates from siblings like `notes.edit`, `notes.move`, and `notes.delete` by naming creation as the operation and specifying the resulting artifacts (markdown files or directories).

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

Usage Guidelines4/5

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

The description gives clear operational context: it explains that the tool operates on the session-active vault unless `vaultPath` is passed, and the schema-level note says to use `kind:'folder'` when the target should be a directory rather than a file. It does not explicitly contrast this tool with sibling creation-like tools (e.g., `tasks.create`, `templates.use`), so it stops short of full alternative routing.

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

notes.deleteDelete NoteA
Destructive

Delete a note from the vault. Destructive — the file is removed from disk. Fails with not_found when the path does not exist. There is no undo; use with care. For folders, call notes.move to an archive location instead (folder deletion is not exposed as a tool to avoid accidental cascading deletes).

Operates on the session-active vault (see vault.current — selectable via vault.select) unless an explicit vaultPath argument is passed, which always wins.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
vaultPathNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
targetYesThe path or identifier the tool acted on.
changedYesTrue if the tool altered vault state on this call; false if it was a no-op.
summaryYesShort human-readable summary of what happened.

TDQS

A4.6/5.0
Behavior5/5

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

Adds significant context beyond the destructiveHint=true annotation: states the file is removed from disk, fails with not_found, and has no undo. It also explains the rationale for not exposing folder deletion to avoid cascading deletes. No contradiction with annotations.

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

Conciseness4/5

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

Two concise paragraphs: first covers deletion behavior and alternatives, second covers vault context. Information is front-loaded with the core action and no sentences are wasted, though it is slightly longer than strictly necessary.

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

Completeness5/5

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

Covers failure modes, destructive nature, vault selection, and alternative for folders. Output schema presumably handles return values, so nothing critical is missing for an agent to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description compensates by explaining vaultPath always wins over the session vault and that path refers to the note path. However, path format details and vaultPath structure are not elaborated, leaving some ambiguity for the agent.

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

Purpose5/5

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

The description states the tool deletes a note from the vault, a specific verb and resource. It distinguishes itself from siblings like notes.move (for folders) and other note operations, making it clear what this tool does and does not do.

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

Usage Guidelines5/5

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

Explicitly directs folder deletions to notes.move instead, and explains the vault selection mechanism (vault.current/select) with vaultPath override. This provides clear when-to-use and when-not-to-use guidance, including a concrete alternative.

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

notes.editEdit NoteA

Mutate the body of an existing note. The mode field selects how content is applied: replace overwrites the whole note; append adds to the end; prepend adds after the frontmatter (or at the top if none); after-heading inserts after the first heading whose text matches anchor (no leading #); after-block inserts after the block reference ^anchor. Fails if the note does not exist — use notes.create first. replace mode is idempotent-destructive; the others are additive.

Operates on the session-active vault (see vault.current — selectable via vault.select) unless an explicit vaultPath argument is passed, which always wins.

Examples:

Example 1 — Append a new journal entry to the end of today's note:

{
  "mode": "append",
  "path": "Journal/2026-04-24.md",
  "content": "\n## Afternoon\n\nFinished the tool consolidation."
}

Example 2 — Insert content after a specific heading:

{
  "mode": "after-heading",
  "path": "Projects/Alpha.md",
  "anchor": "Open questions",
  "content": "- Do we need to bump the Zod major?\n"
}

Example 3 — Insert after a block reference:

{
  "mode": "after-block",
  "path": "Notes/idea.md",
  "anchor": "idea-1",
  "content": "Follow-up thought …"
}
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
targetYesThe path or identifier the tool acted on.
changedYesTrue if the tool altered vault state on this call; false if it was a no-op.
summaryYesShort human-readable summary of what happened.

TDQS

A4.8/5.0
Behavior5/5

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

Beyond annotations (readOnlyHint=false, destructiveHint=false, idempotentHint=false), the description adds crucial behavioral detail: 'replace mode is idempotent-destructive; the others are additive,' plus failure conditions and vault precedence rules. This is rich context that annotations don't provide.

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

Conciseness5/5

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

The description is long but every sentence earns its place: purpose, mode semantics, failure condition, vault behavior, and three illustrative examples. It's front-loaded with the core action, and the structured examples make the modes unambiguous. No fluff.

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

Completeness5/5

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

The tool is complex (five modes, two anchor types, vault selection), and the description fully covers all required knowledge: mode differences, anchor syntax, default vault behavior, and error scenarios. With an output schema present, return values need no explanation. Nothing an agent needs is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Despite 100% schema description coverage, the description supplements the schema with examples illustrating the exact format for anchor (no leading '#' for headings, no '^' for blocks), clarifies placement for prepend ('after frontmatter'), and demonstrates real-world usage. This goes beyond what the schema's oneOf branches state.

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

Purpose5/5

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

The description uses a specific verb ('mutate') with a clear resource ('existing note') and enumerates the distinct modes, which immediately differentiates it from notes.create, notes.delete, and other note-related siblings. It's specific enough for an agent to know exactly what this tool does.

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

Usage Guidelines4/5

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

Explicitly states when NOT to use it ('Fails if the note does not exist — use notes.create first') and clarifies vault selection ('Operates on the session-active vault... unless explicit vaultPath'). It doesn't contrast this with blocks.update or blocks.read, which might be plausible alternatives for fine-grained edits, but the guidance given is clear and actionable.

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

notes.frontmatterEdit FrontmatterA
Idempotent

Set or unset fields in a note's YAML frontmatter. set is a map of {field: value} pairs to write; unset is a list of field names to delete. strategy:'merge' (default) leaves unspecified fields untouched; strategy:'replace' overwrites the entire frontmatter block with set (any field not in set is dropped). At least one of set or unset is required. Idempotent — re-running with the same arguments converges on the same frontmatter state.

Operates on the session-active vault (see vault.current — selectable via vault.select) unless an explicit vaultPath argument is passed, which always wins.

Examples:

Example 1 — Set two fields, merging with existing frontmatter:

{
  "path": "Projects/Alpha.md",
  "set": {
    "status": "in-progress",
    "owner": "behzat"
  }
}

Example 2 — Remove a field:

{
  "path": "Projects/Alpha.md",
  "unset": [
    "draft"
  ]
}
ParametersJSON Schema
NameRequiredDescriptionDefault
setNoMap of frontmatter fields to set. Values overwrite any existing entry.
pathYes
unsetNoField names to delete from the frontmatter.
strategyNo`merge` (default) = combine with existing frontmatter; `replace` = overwrite the whole frontmatter block with `set` (ignores existing unspecified fields).merge
vaultPathNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
targetYesThe path or identifier the tool acted on.
changedYesTrue if the tool altered vault state on this call; false if it was a no-op.
summaryYesShort human-readable summary of what happened.

TDQS

A4.2/5.0
Behavior4/5

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

The description adds substantial behavioral context beyond the annotations: it explains the merge vs replace strategies, the requirement for at least one of set/unset, and the vault selection precedence. It also confirms idempotency, aligning with the idempotentHint annotation. 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.

Conciseness4/5

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

The description is well-organized: it starts with the core operation, then covers strategy, requirements, idempotency, vault behavior, and provides two clear examples. It is thorough without being bloated, though slightly longer than strictly necessary.

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

Completeness5/5

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

For a tool with 5 parameters and nuanced merge/replace behavior, the description covers all key aspects: set/unset semantics, strategy selection, the requirement, idempotency, vault path precedence, and examples. Since an output schema exists, return-value details are handled there, so nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 60%, and while the schema already describes set, unset, and strategy, the description clarifies the semantics further: it explains what 'merge' and 'replace' do to unspecified fields, and it details the requirement that at least one of set/unset be present. It also adds meaning to vaultPath by explaining its precedence over the session-active vault.

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

Purpose5/5

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

The description clearly states the verb (set/unset) and resource (YAML frontmatter of a note), and precisely distinguishes between the two operations. It also differentiates from sibling tools like notes.edit or dataview.fields.write by focusing specifically on frontmatter manipulation.

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

Usage Guidelines3/5

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

The description implies when to use the tool (when you need to edit frontmatter fields) but does not explicitly mention alternatives or when not to use it. There is no reference to sibling tools like dataview.fields.read or notes.edit, so the selection guidance is implicit rather than explicit.

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

notes.listList Notes And FoldersA
Read-onlyIdempotent

List notes and/or folders in the vault, optionally scoped to a folder and filtered by creation/modification date. include selects what to return (notes, folders, or both). recursive:true descends into subfolders. since/until (ISO dates) combined with dateField (created or modified, default modified) narrow the result by date. Read-only.

Operates on the session-active vault (see vault.current — selectable via vault.select) unless an explicit vaultPath argument is passed, which always wins.

ParametersJSON Schema
NameRequiredDescriptionDefault
sinceNoOnly include items dated on or after this ISO date.
untilNoOnly include items dated on or before this ISO date.
folderNoOptional folder to scope the listing.
includeNoWhat to list — markdown notes, folders, or both (returns items tagged by kind).notes
dateFieldNoWhich date the `since`/`until` filter applies to. Defaults to `modified`.
recursiveNoRecurse into subfolders. Default false.
vaultPathNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsYesList of result items; per-item shape depends on the tool.
totalYesNumber of items in `items`.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is known. The description adds valuable behavior not in annotations: parameter semantics (include, recursive, dateField interplay), the default modified date, and the vault scoping override. It does not contradict annotations and reinforces the read-only nature. It stops short of describing the exact output structure (e.g., which fields are returned per item), but the output schema covers that. With annotations covering safety, the description adds meaningful context, earning a 4.

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

Conciseness5/5

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

The description is two succinct paragraphs. The first states the action and key parameters; the second addresses vault scoping. Every sentence contributes new information—no filler or redundancy. It is front-loaded with the core purpose and parameter semantics, making it easy to scan. This is appropriately sized for a tool with 7 parameters and no required args.

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

Completeness5/5

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

Given the tool's complexity (7 params, 0 required) and the presence of an output schema, the description covers all essential aspects: purpose, parameter behavior, default values, recursion, and the vault selection precedence. It also references sibling tools (vault.current, vault.select) for context. Nothing critical is missing for an agent to call it correctly. The read-only nature is reinforced, and the output format is left to the schema. This is complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 86%, so most parameters already have meaning in the schema. The description adds relational value beyond that: it ties since/until to dateField, explains recursive behavior, clarifies include options as notes, folders, or both (tagged by kind), and spells out the vaultPath precedence. This goes beyond individual parameter descriptions, helping an agent understand how parameters combine. Since coverage is high, the baseline is 3, but the description elevates it to 4.

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

Purpose5/5

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

The description opens with a specific verb (list) and resource (notes/folders), and clarifies optional scoping and filtering. It distinguishes itself from siblings like notes.read (read a single note), notes.search (search), and vault.list (list vaults) by clearly stating what it enumerates in the session-active vault. The purpose is unambiguous and easy to differentiate at a glance.

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

Usage Guidelines4/5

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

The description gives clear context: list notes/folders, optionally scoped to a folder and date range. It mentions read-only behavior and explains vault selection precedence (vaultPath wins), which is critical for correct invocation. It does not explicitly name alternatives for when not to use it (e.g., 'for full-text search use notes.search'), but the scope is self-evident and enough for an agent to decide appropriately. A small deduction for not enumerating exclusions.

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

notes.moveMove Note Or FolderA
DestructiveIdempotent

Move a note or folder to a new path. kind:'note' moves a single .md file; kind:'folder' moves a directory and every note beneath it. When updateLinks:true (the default), wiki and markdown links elsewhere in the vault that reference the moved path are rewritten to point at the new location. Destructive — overwrites or replaces existing content at the destination. Fails when the source does not exist.

Operates on the session-active vault (see vault.current — selectable via vault.select) unless an explicit vaultPath argument is passed, which always wins.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
targetYesThe path or identifier the tool acted on.
changedYesTrue if the tool altered vault state on this call; false if it was a no-op.
summaryYesShort human-readable summary of what happened.

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the annotations (destructiveHint=true, idempotentHint=true), the description discloses critical behaviors: it overwrites/replaces existing content at the destination, fails when the source does not exist, and rewrites wiki/markdown links vault-wide when updateLinks is true. It also explains the vaultPath override semantics. This adds substantial operational detail that annotations alone do not convey.

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

Conciseness5/5

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

The description is tight and front-loaded: the first sentence states the core purpose, then details about kind, updateLinks, destructiveness, failure condition, and vault selection follow. Every sentence adds value with no fluff or repetition. It is well-structured for an agent to quickly grasp the essential information.

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

Completeness5/5

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

Given the tool's complexity (moving files/folders with link rewriting and destructive behavior) and the presence of an output schema, the description covers all necessary aspects: what it moves, how it handles links, destructive consequences, failure conditions, and vault selection. 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.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% (each parameter has a description), so the baseline is 3. The description goes further by explaining the default behavior of updateLinks (true) and how vaultPath overrides the session-active vault, which is not fully captured in the schema. This added context justifies a 4.

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

Purpose5/5

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

The description clearly states the verb ('Move') and resource ('a note or folder to a new path'), and immediately distinguishes the two kinds ('note' vs 'folder' with 'moves every note beneath it'). It also explains link rewriting, making it distinct from sibling tools like notes.delete or notes.create. No tautology; the description adds specificity beyond the title.

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

Usage Guidelines4/5

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

The description provides clear context: it operates on the session-active vault unless vaultPath is passed, and it is destructive. However, it does not explicitly name alternative tools or state conditions like 'use notes.move instead of notes.delete when you need to relocate', so the 'when not to use' is only implied. The vault selection guidance is helpful, but the lack of explicit exclusions prevents a 5.

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

notes.readRead NoteA
Read-onlyIdempotent

Read a note and return any combination of its body, parsed frontmatter metadata, and lightweight statistics. include selects which sections to return — default is ['content', 'metadata']. Ask for ['stats'] alone when you only need word/character/heading/link/task counts and want to skip loading the full body. Read-only. Fails with not_found when path does not exist.

Operates on the session-active vault (see vault.current — selectable via vault.select) unless an explicit vaultPath argument is passed, which always wins.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesVault-relative note path.
includeNoWhich sections to return. `content` = full body; `metadata` = parsed frontmatter and basic info; `stats` = word count, character count, heading count, link count, task count. Omit to get content + metadata.
vaultPathNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
pathYes
statsNo
contentNo
metadataNo

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the readOnlyHint and idempotentHint annotations, the description discloses the `not_found` error on missing paths and explains the vault selection behavior (session-active vault vs. explicit vaultPath). This adds meaningful operational context that the annotations do not cover.

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

Conciseness5/5

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

The description is compact and well-organized. The first sentence states the purpose and options; the second gives practical usage guidance; the third clarifies vault context. Every sentence earns its place without redundant information.

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

Completeness5/5

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

For a read tool with an output schema, the description covers the essential aspects: return sections, error behavior, vault selection, and parameter semantics. No critical information for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description enriches the `include` parameter with explanation of what each value returns and the default, and clarifies `vaultPath` precedence. Since schema coverage is 67%, the description compensates for the undocumented `vaultPath` and adds nuance beyond the schema's enum for `include`.

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

Purpose5/5

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

The description clearly states the tool reads a note and returns selected sections (body, metadata, stats). It specifies the resource (note) and action (read), and the mention of the `include` parameter distinguishes it from listing/searching tools. This is specific and unambiguous.

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

Usage Guidelines4/5

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

It gives clear context for when to use this tool (reading a specific note by path) and even provides guidance on using `include` to request stats only. However, it does not explicitly name alternative sibling tools or state when not to use it, so it falls short of the 'explicit when/when-not/alternatives' criterion.

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

notes.searchSearch NotesA
Read-onlyIdempotent

Full-text search across every note in the vault. The query supports plain text and lightweight prefix filters: tag:foo restricts to notes carrying #foo, and path:Journal/ restricts to notes under a folder. contextLength controls how many characters of surrounding context are returned per match (default 80). Read-only. For pure tag or date filtering, tags.search and notes.list are faster.

Operates on the session-active vault (see vault.current — selectable via vault.select) unless an explicit vaultPath argument is passed, which always wins.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesFree-text search query. Supports lightweight `tag:foo` and `path:Journal/` filters in the query string.
vaultPathNo
contextLengthNoCharacters of context to return around each match. Defaults to 80.

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsYesList of result items; per-item shape depends on the tool.
totalYesNumber of items in `items`.

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, and the description restates read-only, which is redundant. It adds meaningful behavior beyond annotations: query filter syntax, default context length, and the session-active vault precedence rule.

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

Conciseness5/5

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

Front-loaded with the main purpose, then a compact set of filter semantics, a default, and a routing pointer. The repeated 'Read-only' is minor given annotations, but the definition is appropriately sized and all remaining sentences add information.

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

Completeness5/5

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

With an output schema present, the description doesn't need to explain return shape. It covers the active-vault behavior, filter forms, default context length, and sibling alternatives, making the tool callable correctly in context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema covers `query` and `contextLength` but leaves `vaultPath` undocumented; the description fills that gap by explaining that it selects a vault and always wins over the active vault. It also adds concrete syntax for `tag:` and `path:` filters and the default context length, adding meaning beyond the schema.

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

Purpose5/5

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

States a specific verb and resource: 'Full-text search across every note in the vault.' It also singles out `tags.search` and `notes.list` as alternatives, so an agent can distinguish it from sibling search/list tools.

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

Usage Guidelines5/5

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

Gives explicit routing guidance: for pure tag or date filtering, `tags.search` and `notes.list` are faster, implying notes.search is for full-text search. It also specifies that it operates on the session-active vault and that `vaultPath` overrides the active vault.

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

stats.vaultVault StatisticsA
Read-onlyIdempotent

Return aggregate statistics for the whole vault: total note count, total word count, total character count, total task count (open and completed), tag usage summary, and file size footprint. Read-only, scans every .md file. For per-note statistics use notes.read with include: ['stats'].

Operates on the session-active vault (see vault.current — selectable via vault.select) unless an explicit vaultPath argument is passed, which always wins.

ParametersJSON Schema
NameRequiredDescriptionDefault
vaultPathNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already establish read-only, idempotent, non-destructive behavior. The description adds value beyond those by disclosing that the tool scans every .md file and by explaining how the target vault is resolved. This is meaningful behavioral context that structured annotations do not convey.

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

Conciseness5/5

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

Three sentences carry exactly the necessary information: what the tool returns, a pointer to the per-note alternative, and how the vault target is resolved. The most important content is front-loaded and there is no filler.

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

Completeness5/5

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

With an output schema present to document return structure, the description fully covers purpose, scope, alternatives, and parameter behavior. The combination of annotations, output schema, and description leaves no critical gap for an agent deciding whether and how to invoke this tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description compensates by explaining that the optional vaultPath is an explicit override that 'always wins' over the session-active vault. This gives the single parameter clear operational meaning, though it could be improved with path format details.

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

Purpose5/5

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

The description uses a specific verb ('Return') and a clearly bounded resource ('aggregate statistics for the whole vault'), then enumerates the exact metrics returned. It also explicitly contrasts itself with per-note statistics via notes.read, making its scope unambiguous relative to sibling tools.

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

Usage Guidelines5/5

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

The description gives an explicit when-to-use alternative: 'For per-note statistics use notes.read with include: ['stats']'. It also clarifies operational context by explaining the session-active vault behavior and that an explicit vaultPath overrides it, referencing vault.current and vault.select for selection.

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

system.versionServer VersionA
Read-onlyIdempotent

Return the running kObsidian server's package name, semver version, host runtime (bun or node), and runtime version. Use this as a health-check or to confirm which server build a client is talking to. Read-only; zero side effects.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameYesnpm package name of the running server.
runtimeYesWhich runtime is executing the server.
summaryYesHuman-readable one-liner combining the fields above.
versionYesSemver version.
runtimeVersionYesVersion of the runtime (bun or node).

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, and the description confirms 'Read-only; zero side effects.' It adds value beyond annotations by specifying exactly which runtime details are returned, which is useful behavioral context.

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

Conciseness5/5

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

Two short, information-dense sentences. The first states what is returned; the second gives usage guidance. No redundant phrasing; every word earns its place.

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

Completeness5/5

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

For a zero-parameter, read-only health-check tool with an output schema, the description covers everything an agent needs: the exact data returned, the use case, and the safety profile. Nothing is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are zero parameters, so the baseline is 4. The description doesn't need to explain any parameters, and the empty schema is fully covered. No additional parameter semantics are necessary.

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

Purpose5/5

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

The description states a specific verb ('Return'), a precise resource ('the running kObsidian server's package name, semver version, host runtime, and runtime version'), and distinguishes itself from all siblings. There is no ambiguity about what the tool does.

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

Usage Guidelines5/5

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

Explicitly states when to use the tool: 'Use this as a health-check or to confirm which server build a client is talking to.' This provides clear context and intent, leaving no inference required.

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

tags.analyzeAnalyze Note TagsA
Read-onlyIdempotent

Return the tags present in a single note, split into frontmatterTags, inlineTags, and their de-duplicated union allTags. Use this when you have one note and want to know what tags it carries — contrast with tags.search, which scans the whole vault for one specific tag. Read-only.

Operates on the session-active vault (see vault.current — selectable via vault.select) unless an explicit vaultPath argument is passed, which always wins.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesVault-relative note path to analyze.
vaultPathNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
pathYes
allTagsYesUnion of frontmatter and inline tags, de-duplicated.
inlineTagsYes
frontmatterTagsYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and idempotentHint, and the description reinforces 'Read-only.' It adds context about the session-active vault and how `vaultPath` overrides it, which is valuable beyond the annotations. It does not detail the output format, but the presence of an output schema covers that.

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

Conciseness5/5

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

Two sentences that are front-loaded with the core purpose, then immediately disambiguate from the sibling. No filler or repetition—every sentence adds value.

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

Completeness4/5

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

Given the output schema exists and the description clearly explains the tool's scope, usage context, and vault-selection nuances, an agent has enough to call it correctly. The only minor gap is the lack of detail on `vaultPath` formatting, but that's handled by the schema and the explicit 'always wins' note.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 50% — `vaultPath` has no description in the schema. The description partially compensates by stating that `vaultPath` overrides the active vault, but it doesn't explain its format or default behavior in depth. This is adequate but not fully compensating for the low coverage.

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

Purpose5/5

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

The description states a specific verb (return), resource (tags in a single note), and the structure of the output (frontmatterTags, inlineTags, allTags). It explicitly contrasts with tags.search, making it unmistakably distinct from the closest sibling.

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

Usage Guidelines5/5

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

Explicitly says 'Use this when you have one note and want to know what tags it carries' and names the alternative `tags.search` for whole-vault scans. Also explains the vault selection behavior and precedence of the `vaultPath` argument, leaving no ambiguity about when to call it.

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

tags.listList All TagsA
Read-onlyIdempotent

List every unique tag used across the vault (frontmatter and inline combined). With includeCounts: true, each item includes how many notes carry the tag; sortBy lets you sort by name or count (the latter requires counts). Read-only. For finding notes carrying a specific tag, use tags.search.

Operates on the session-active vault (see vault.current — selectable via vault.select) unless an explicit vaultPath argument is passed, which always wins.

ParametersJSON Schema
NameRequiredDescriptionDefault
sortByNoSort order for returned tags. `count` requires `includeCounts: true`.
vaultPathNo
includeCountsNoWhen true, each entry carries `{tag, count}`; otherwise just `tag`.

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsYes
totalYes

TDQS

A4.8/5.0
Behavior5/5

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

Although annotations already declare readOnly/idempotent/non-destructive, the description adds behavioral nuance: tags from frontmatter and inline are combined, includeCounts changes the returned item shape, sortBy=count requires includeCounts, and vaultPath overrides session-active vault. This goes well beyond the structured annotations.

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

Conciseness4/5

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

The description is front-loaded and compact, with options and routing in the first paragraph and vault behavior in the second. The standalone 'Read-only' sentence is redundant with annotations, but it does not undermine clarity.

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

Completeness5/5

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

With an output schema present and annotations covering safety, the description supplies the remaining needed context: parameter dependencies, vault scoping behavior, and the sibling for a different use case. Nothing essential for calling the tool correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema covers sortBy and includeCounts well, but vaultPath is undocumented in the schema. The description compensates by explaining that vaultPath always overrides the session-active vault. Minor gap remains on the exact expected vaultPath format.

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

Purpose5/5

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

Description starts with a specific action and object: 'List every unique tag used across the vault (frontmatter and inline combined).' It clearly defines scope and uniqueness, and explicitly contrasts with tags.search, so an agent can distinguish this tool from its closest sibling.

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

Usage Guidelines5/5

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

The description gives an explicit routing rule: for finding notes carrying a specific tag, use tags.search. It also clarifies the active-vault context and the vaultPath override, so when to invoke this tool vs alternatives is unambiguous.

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

tags.modifyModify TagsA
Idempotent

Mutate the frontmatter tags list of a single note. Four ops are supported: add unions the incoming tags with the existing list (duplicates dropped); remove drops any incoming tag currently present; replace overwrites the list entirely; merge is an alias for add. Leading # on incoming tags is stripped automatically. This tool only touches the frontmatter block — inline #tag occurrences in the body are left untouched. Idempotent: repeated calls with the same op and tags converge on the same result. Returns {changed, target, summary, op, tagsAfter}.

Operates on the session-active vault (see vault.current — selectable via vault.select) unless an explicit vaultPath argument is passed, which always wins.

Examples:

Example 1 — Add two tags to a note (idempotent):

{
  "path": "Projects/Alpha.md",
  "op": "add",
  "tags": [
    "in-progress",
    "priority/high"
  ]
}

Example 2 — Replace a note's entire tag set:

{
  "path": "Inbox/today.md",
  "op": "replace",
  "tags": [
    "processed"
  ]
}
ParametersJSON Schema
NameRequiredDescriptionDefault
opYesThe mutation to apply to the note's frontmatter `tags` field: - `add` — union existing + incoming (duplicates dropped). - `remove` — drop any incoming tag that currently exists. - `replace` — overwrite the tag list entirely with `tags`. - `merge` — alias for `add` (kept for naming clarity; behaves identically).
pathYesVault-relative note path to mutate.
tagsYesTags to add/remove/replace with. Leading `#` is stripped automatically. Max 50 per call.
vaultPathNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
opYesThe mutation to apply to the note's frontmatter `tags` field: - `add` — union existing + incoming (duplicates dropped). - `remove` — drop any incoming tag that currently exists. - `replace` — overwrite the tag list entirely with `tags`. - `merge` — alias for `add` (kept for naming clarity; behaves identically).
targetYes
changedYes
summaryYes
tagsAfterYesThe full tag list after the mutation.
tagsBeforeNo

TDQS

A4.7/5.0
Behavior5/5

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

The description goes well beyond the annotations: it confirms and elaborates idempotency ('repeated calls with the same op and tags converge'), discloses that leading '#' is stripped, specifies that only the frontmatter block is modified (leaving inline tags untouched), and details the exact behavior of each operation. It also states the return object format. All of this adds behavioral context that annotations alone do not provide.

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

Conciseness5/5

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

The description is well-structured and front-loaded with the core purpose, followed by operation semantics, vault behavior, and concrete examples. It is detailed but every sentence earns its place—there is no filler or redundancy. The examples are minimal and directly illustrate the key operations.

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

Completeness5/5

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

For a tool with four parameters, multiple operations, and vault-selection logic, the description is remarkably complete. It covers the return value, examples for typical use cases, idempotency, and scope limitations. Nothing an agent needs to call the tool correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already documents `op`, `path`, and `tags` with detailed descriptions, and the schema coverage is 75%. The description adds meaning to the undocumented `vaultPath` parameter by clarifying that it overrides the session active vault, and it reinforces the behavior of `merge` as an alias for `add`. The examples further illustrate parameter usage, so the description compensates for the missing schema coverage on `vaultPath`.

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

Purpose5/5

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

The description opens with a precise statement of purpose: 'Mutate the frontmatter `tags` list of a single note.' This gives a clear verb (mutate), resource (frontmatter tags), and scope (single note), and it immediately distinguishes this from read-only sibling tools like `tags.search` and `tags.list`. The supported operations (add, remove, replace, merge) are explicitly enumerated, leaving no ambiguity about what the tool does.

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

Usage Guidelines4/5

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

The description explains how vault selection works ('Operates on the session-active vault ... unless an explicit `vaultPath` is passed') and that it only touches frontmatter, implying that inline tag editing would require a different tool. However, it does not explicitly name alternative tools for those cases, and it does not state when to use this over other tag-related tools like `tags.search`. The guidance is present but implicit rather than explicit.

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

tags.searchSearch Notes By TagA
Read-onlyIdempotent

Find every note in the vault that contains a given tag, either in frontmatter tags or as an inline #tag in the body. Leading # on the query is stripped. For each hit, the result carries {file, absolutePath, tagLocations: {frontmatter, inline}} so callers can distinguish where the tag came from. Read-only. For analyzing tags of ONE specific note (not a vault-wide search), use tags.analyze instead.

Operates on the session-active vault (see vault.current — selectable via vault.select) unless an explicit vaultPath argument is passed, which always wins.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagYesTag to find. Leading `#` is stripped.
vaultPathNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
tagYesThe normalized tag that was searched (leading `#` stripped).
itemsYes
totalYes

TDQS

A4.7/5.0
Behavior4/5

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

While annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, the description adds valuable behavioral detail beyond those: it states 'Read-only.' (redundant but harmless), discloses the output structure `{file, absolutePath, tagLocations: {frontmatter, inline}}` so callers know how to interpret results, and details the leading-# stripping behavior and vault selection precedence. No contradiction with annotations.

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

Conciseness5/5

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

The description is two short paragraphs with front-loaded purpose, followed by the sibling alternative and vault-context behavior. Every sentence contributes: purpose, output shape, read-only note, alternative, and vault selection. No fluff or repetition beyond the harmless 'Read-only' echo of the annotation.

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

Completeness5/5

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

Given the tool has an output schema (confirmed by context signals), the description need not detail the full return type, but it still summarizes the result fields. It covers functional scope, usage boundaries, parameter semantics, and operational context (vault selection). An agent has everything needed to invoke it correctly without consulting additional sources.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 50%: `tag` parameter is described in the schema, but `vaultPath` has no description. The description compensates by clarifying that `vaultPath` overrides the session-active vault setup. For `tag`, the description mirrors the schema's stripping note but adds no new semantics; still, the compensation for `vaultPath` brings the effective clarity above baseline.

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

Purpose5/5

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

The description clearly states the verb 'Find' and the resource 'every note in the vault that contains a given tag' including both frontmatter and inline locations. It explicitly differentiates from the sibling `tags.analyze` by naming it as the alternative for single-note tag analysis, leaving no ambiguity about scope.

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

Usage Guidelines5/5

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

It provides explicit when-to-use guidance: vault-wide tag search. It also gives a direct exclusion and alternative: 'For analyzing tags of ONE specific note (not a vault-wide search), use `tags.analyze` instead.' Additionally, it explains the vault selection behavior (session-active vault or explicit `vaultPath`), which is essential context for correct invocation.

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

tasks.createCreate TaskA

Append a new task line to a note. The task is written in Tasks-plugin format: - [ ] <content> {metadata emojis}. Optional metadata (priority, dueDate, scheduledDate, startDate, doneDate, createdDate, recurrence) is encoded as the plugin's convention emojis (🔺⏫📅⏳🛫✅➕🔁). Returns the standard mutation envelope with the 1-based lineNumber where the task was inserted.

Operates on the session-active vault (see vault.current — selectable via vault.select) unless an explicit vaultPath argument is passed, which always wins.

Examples:

Example 1 — Append a simple task with a due date:

{
  "filePath": "Tasks.md",
  "content": "Write the v0.3.0 migration doc",
  "dueDate": "2026-05-01"
}

Example 2 — Append a high-priority weekly recurring task:

{
  "filePath": "Tasks.md",
  "content": "Weekly review",
  "priority": "high",
  "recurrence": "every week on Sunday"
}
ParametersJSON Schema
NameRequiredDescriptionDefault
statusNoInitial checkbox state. Default `incomplete`.
contentYesTask body text (without the `- [ ]` checkbox).
dueDateNo
doneDateNo
filePathYesNote to append the task to.
priorityNoTasks-plugin priority level.
startDateNo
vaultPathNo
recurrenceNoTasks-plugin recurrence expression, e.g. `every day`, `every week on Monday`, `every 2 weeks`.
createdDateNo
scheduledDateNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
targetYesThe path or identifier the tool acted on.
changedYesTrue if the tool altered vault state on this call; false if it was a no-op.
summaryYesShort human-readable summary of what happened.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already signal mutation (readOnlyHint=false) and non-destructiveness, and the description adds meaningful behavior: it writes Tasks-plugin emoji metadata, returns the 1-based lineNumber, and respects the active vault unless vaultPath is provided. It doesn't cover edge cases like missing files, but the disclosed behavior is solid.

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

Conciseness5/5

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

The description is front-loaded with the core action and format, then moves to return value and vault behavior, and closes with two compact examples. Every sentence and example earns its place; no filler or repetition of schema details.

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

Completeness5/5

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

For an 11-parameter creation tool, the description covers the write format, optional metadata, return envelope, vault-selection behavior, and the vaultPath override, and the examples show realistic JSON payloads. The schema and output schema provide the remaining structured details, so nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With only 45% schema description coverage, the description compensates by listing the optional metadata fields, explaining that they become emoji suffixes, giving examples for dueDate and recurrence, and clarifying that content excludes the checkbox. It doesn't deeply define each date field's semantics, but adds meaning beyond the schema.

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

Purpose5/5

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

The description states a specific verb ('Append') and resource ('a new task line to a note'), and further specifies the exact Tasks-plugin format. This distinguishes it from sibling tools like tasks.toggle or tasks.updateMetadata, which modify existing tasks rather than creating new ones.

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

Usage Guidelines4/5

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

The opening sentence gives clear context: use this tool to append a new task line to a note, which implies creation rather than toggling or updating existing tasks. It does not explicitly name alternatives or state when not to use it, so it stops short of a 5.

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

tasks.searchSearch TasksA
Read-onlyIdempotent

Scan the vault for Tasks-plugin-style markdown task lines (- [ ] / - [x]) and filter by status, priority, due date range, recurrence, or tag. Result items include the task text, source file, line number, status, and parsed metadata — enough to locate and further manipulate each task via tasks.toggle or tasks.updateMetadata. sortBy controls ordering; limit caps the result count. Read-only. For vault-wide counts without per-task detail, use tasks.stats.

Operates on the session-active vault (see vault.current — selectable via vault.select) unless an explicit vaultPath argument is passed, which always wins.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagNoOnly tasks that carry this tag (leading `#` stripped).
limitNoCap the number of results. Default: 500.
sortByNoResult ordering. Default: file then lineNumber.
statusNo`incomplete` = open tasks `[ ]`; `completed` = done `[x]`; `all` = both.
dueAfterNoOnly tasks due strictly after this ISO date.
priorityNoTasks-plugin priority level.
dueBeforeNoOnly tasks due strictly before this ISO date.
vaultPathNo
dueWithinDaysNoOnly tasks due within N days of today (inclusive).
hasRecurrenceNoFilter to recurring (or non-recurring) tasks.

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsYesList of result items; per-item shape depends on the tool.
totalYesNumber of items in `items`.

TDQS

A4.6/5.0
Behavior5/5

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

The description independently discloses key behavioral traits: that it is read-only, returns per-task detail (text, source file, line number, status, parsed metadata), and that vaultPath overrides the session-active vault. These go beyond the annotations (readOnlyHint, destructiveHint, idempotentHint) by explaining the vault-selection precedence and the utility of results. No contradiction with annotations; in fact, it reinforces them.

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

Conciseness4/5

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

The description is well-structured and front-loaded with the core action, then result content, then parameters, then context. It is a bit longer than minimal, but each sentence contributes: the read-only note, the alternative, and the vault scope are all useful. It avoids redundancy with the schema and stays focused. Slightly verbose but not wasteful.

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

Completeness5/5

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

For a tool with 10 parameters and no required ones, the description covers everything needed to call correctly: what it returns, how to filter, how to limit and order, and the vault selection behavior. It references the output schema implicitly by listing result fields, and points to related tools for further action. Without the output schema shown, the description still conveys the essential information. No missing context that would hinder an agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 90%, so most parameters are already documented. The description adds marginal value by explaining the vaultPath override and noting that sortBy controls ordering and limit caps result count, but those are already in the schema. It does not introduce new syntax or semantics for the filter parameters beyond what the schema provides. Given high coverage, a baseline of 3 is appropriate; the description provides a slight increment.

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

Purpose5/5

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

States a specific verb (scan), resource (vault for Tasks-plugin-style markdown task lines), and filtering criteria (status, priority, due date range, recurrence, or tag). It distinguishes itself from siblings like tasks.stats by noting the difference in result granularity, and it references tasks.toggle/updateMetadata for further manipulation. The purpose is unambiguous and specific.

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

Usage Guidelines5/5

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

Explicitly names an alternative (tasks.stats) and the condition for choosing it ('For vault-wide counts without per-task detail'). It also clarifies the vault scope behavior (session-active vault unless vaultPath is passed, which always wins), giving clear context for when this tool is appropriate. No misleading guidance; the exclusions are clear.

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

tasks.statsTask StatisticsA
Read-onlyIdempotent

Return aggregate task statistics for the whole vault: total tasks, incomplete count, completed count, overdue count (due date passed and still incomplete), upcoming counts by horizon (today/this-week/next-week), and per-priority breakdown. Read-only. Use tasks.search to get the individual task records.

Operates on the session-active vault (see vault.current — selectable via vault.select) unless an explicit vaultPath argument is passed, which always wins.

ParametersJSON Schema
NameRequiredDescriptionDefault
vaultPathNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already carry readOnlyHint, idempotentHint, and destructiveHint; the description adds value by stating 'Read-only' and, more importantly, disclosing the vault-scoping behavior — the tool operates on the session-active vault unless vaultPath is passed, and vaultPath always takes precedence. This precedence rule is real behavioral context not derivable from the annotations.

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

Conciseness5/5

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

Two dense paragraphs with no filler. The first sentence front-loads the full metric enumeration and defines overdue; the next sentence handles sibling routing; the second paragraph explains vault selection. Every sentence earns its place, with outputs first, alternatives second, and scoping semantics last.

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

Completeness4/5

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

With an output schema present and safety traits covered by annotations, the description covers the remaining essentials: exact return-metric groups, sibling routing, and vault-resolution preconditions. Minor gaps — the precise scope of the 'per-priority breakdown' and the reference date for the horizons — are small enough not to prevent correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries the burden. It compensates by explaining what vaultPath does (overrides the session-active vault) and its precedence. It stops short of describing the expected path format, but for a single optional string parameter, the core semantics are clear.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Return aggregate task statistics for the whole vault' and enumerates the exact metric groups returned (total, incomplete, completed, overdue, upcoming-by-horizon, per-priority). It also defines 'overdue' inline ('due date passed and still incomplete') and differentiates from tasks.search, so an agent can distinguish it from its closest sibling without opening any schema.

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

Usage Guidelines5/5

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

The description explicitly routes to the alternative: 'Use tasks.search to get the individual task records', which tells the agent when this aggregate tool is not the right choice. It also provides operational context for vault resolution (session-active vault, vaultPath override with 'always wins' precedence). No when-not guidance is left to inference.

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

tasks.toggleToggle Task StatusA

Flip a task line between [ ] and [x] in place, identified by sourceFile and 1-based lineNumber. When marking a task done, a ✅ YYYY-MM-DD date is stamped into the line (default today; override with doneDate). Fails if the target line is not a task checkbox. Use tasks.search to find the right sourceFile/lineNumber pair.

Operates on the session-active vault (see vault.current — selectable via vault.select) unless an explicit vaultPath argument is passed, which always wins.

ParametersJSON Schema
NameRequiredDescriptionDefault
doneDateNoWhen marking a task done, stamp this date into the `✅ YYYY-MM-DD` metadata. Defaults to today.
vaultPathNo
lineNumberYes1-based line number of the task line.
sourceFileYesNote containing the task.

Output Schema

ParametersJSON Schema
NameRequiredDescription
targetYesThe path or identifier the tool acted on.
changedYesTrue if the tool altered vault state on this call; false if it was a no-op.
summaryYesShort human-readable summary of what happened.

TDQS

A4.4/5.0
Behavior4/5

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

Beyond annotations (destructiveHint=false, readOnlyHint=false), the description discloses key behaviors: in-place editing, the date-stamping side effect with default and override, and the failure condition when the line is not a task. No contradiction with annotations.

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

Conciseness5/5

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

The description is compact, front-loaded with the core action, and every sentence adds value: main operation, date stamp detail, failure condition, and vault selection rule. No waste.

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

Completeness4/5

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

Covers essential operation, failure mode, vault handling, and how to obtain inputs. Since an output schema exists (though not provided), return values are likely covered there. The description is sufficiently complete for an agent to call correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema covers 75% of parameters with descriptions. The description adds meaning to doneDate (default today, override) and clarifies vaultPath's precedence. It complements the schema adequately, leaving only vaultPath's format undefined but its role clear.

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

Purpose5/5

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

The description states a specific verb ('Flip'), a resource (task line), and precise identifying parameters (sourceFile and 1-based lineNumber). It clearly distinguishes from siblings like tasks.search (find) and tasks.create (make new), and the phrase 'in place' clarifies mutation vs. creation.

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

Usage Guidelines4/5

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

Explicitly directs agents to use tasks.search to find the right sourceFile/lineNumber pair, which is actionable guidance for correct invocation. It also explains the vault selection rule (active vault vs explicit vaultPath). It does not explicitly state when NOT to use the tool, but the search pointer serves as an effective alternative.

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

tasks.updateMetadataUpdate Task MetadataA
Idempotent

Update a task's dates, priority, or recurrence expression in place without touching the task body text. Identified by sourceFile + 1-based lineNumber. Pass only the fields you want to change. Idempotent — re-running with identical inputs converges on the same line. Fails if the target line is not a task.

Operates on the session-active vault (see vault.current — selectable via vault.select) unless an explicit vaultPath argument is passed, which always wins.

ParametersJSON Schema
NameRequiredDescriptionDefault
dueDateNo
priorityNoTasks-plugin priority level.
startDateNo
vaultPathNo
lineNumberYes1-based line number of the task line to update.
recurrenceNo
sourceFileYes
scheduledDateNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
targetYesThe path or identifier the tool acted on.
changedYesTrue if the tool altered vault state on this call; false if it was a no-op.
summaryYesShort human-readable summary of what happened.

TDQS

A4.1/5.0
Behavior4/5

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

Description discloses idempotency (consistent with the idempotentHint annotation) and adds meaningful context: 're-running with identical inputs converges on the same line' and 'Fails if the target line is not a task.' It also explains vault selection precedence. These details go beyond the annotations, which only flag idempotentHint, enriching the behavioral picture without contradiction.

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

Conciseness5/5

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

Two short, front-loaded paragraphs. The first paragraph states the core action and identity; the second covers idempotency, failure mode, and vault selection. Every sentence adds essential information, with no redundancy or filler.

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

Completeness4/5

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

For a mutation tool with an output schema and well-patterned date fields, the description covers identity, failure mode, idempotency, and vault selection. The only gap is explicit guidance for less obvious parameters (recurrence format, vaultPath semantics), but the schema patterns and existing schema descriptions partially fill that gap. Overall, sufficient for correct usage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 25% (priority and lineNumber have descriptions). The description compensates partially by explaining the identity mechanism and partial-update behavior, but it does not clarify the semantics of dueDate, startDate, scheduledDate, recurrence, or vaultPath. With low coverage, the description must carry more parameter detail than it does.

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

Purpose5/5

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

States a specific verb ('update'), resource ('task metadata'), and scope (dates, priority, recurrence) with the crucial qualifier 'without touching the task body text.' It also specifies the identity mechanism (sourceFile + lineNumber), which clearly differentiates it from sibling tools like tasks.create and tasks.toggle.

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

Usage Guidelines4/5

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

Provides clear contextual guidance: it operates on the session-active vault, with vaultPath as an override, and instructs to 'pass only the fields you want to change.' However, it does not explicitly name alternatives (e.g., tasks.edit for body text) or state conditions for when not to use this tool, so it stops short of full exclusion guidance.

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

templates.listList TemplatesA
Read-onlyIdempotent

List markdown templates in the vault's templates folder (or a folder of your choosing via templateFolder). Use this to discover what templates are available before calling templates.use. Read-only. Only returns markdown (.md) files.

Operates on the session-active vault (see vault.current — selectable via vault.select) unless an explicit vaultPath argument is passed, which always wins.

ParametersJSON Schema
NameRequiredDescriptionDefault
vaultPathNo
templateFolderNoFolder to scan for templates. Defaults to the vault's configured Templates folder.

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsYes
totalYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is covered. The description adds behavioral detail beyond annotations: it filters to markdown files only and defines the precedence rule for vaultPath over the active vault. This gives an agent useful execution semantics not inferable from annotations alone.

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

Conciseness5/5

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

Four sentences, each carrying distinct information: core purpose, usage guidance, return-type restriction, and vault resolution behavior. No redundant prose or schema repetition beyond the necessary 'read-only' confirmation. It is front-loaded and appropriately compact.

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

Completeness5/5

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

With an output schema present, the description does not need to enumerate return fields. It covers the default folder, folder override, vault resolution, and file-type restriction, which are the key facts an agent needs before invoking. The explicit tie to templates.use completes the operational context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 50% because vaultPath lacks a schema description. The description compensates by explaining vaultPath as the explicit path that 'always wins' over the active vault, and clarifies templateFolder as a folder override defaulting to the vault's configured templates folder. This adds meaning beyond the raw schema for both parameters.

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

Purpose5/5

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

The description opens with a specific verb and resource: lists markdown templates in the vault's configured templates folder or a caller-specified folder. It explicitly scopes the return set to .md files and references templates.use as the follow-up, which distinguishes this tool from other list and search siblings. This fully identifies the tool's purpose.

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

Usage Guidelines4/5

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

The description explicitly instructs to use this tool 'to discover what templates are available before calling templates.use,' giving a clear when-to-use condition and naming the related alternative. It also explains that the tool operates on the session-active vault unless vaultPath is supplied, providing context for correct invocation. It lacks an explicit 'when not to use' for non-template listing, but the named templates.use relationship is strong.

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

templates.useUse TemplateA

Render or apply a template using one of two engines. The engine field selects the engine and the action field selects the operation:

  • engine:'filesystem' — kObsidian's built-in {{variable}} substitution; no Obsidian plugin required. Actions: render (return the expanded text) or create-note (write a new note from the template).

  • engine:'templater' — delegate to the Templater Obsidian plugin via the Local REST API. Requires OBSIDIAN_API_URL and OBSIDIAN_REST_API_KEY. Actions: render (execute the template and return output), create-note (execute and write to targetFile), or insert-active (insert into the currently active note in Obsidian).

The filesystem engine is pure text substitution — it does NOT evaluate Templater's <% … %> scripts. Use engine:'templater' when you need dynamic evaluation.

Operates on the session-active vault (see vault.current — selectable via vault.select) unless an explicit vaultPath argument is passed, which always wins.

Examples:

Example 1 — Render a filesystem template to text (no file written):

{
  "engine": "filesystem",
  "action": "render",
  "templatePath": "Templates/daily.md",
  "variables": {
    "date": "2026-04-24",
    "topic": "kObsidian release planning"
  }
}

Example 2 — Create a new note from a filesystem template:

{
  "engine": "filesystem",
  "action": "create-note",
  "templatePath": "Templates/daily.md",
  "targetPath": "Journal/2026-04-24.md",
  "variables": {
    "date": "2026-04-24"
  }
}

Example 3 — Use Templater to create a note via the Obsidian plugin:

{
  "engine": "templater",
  "action": "create-note",
  "templateFile": "Templates/meeting.md",
  "targetFile": "Meetings/Kickoff.md",
  "openFile": true
}
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A5/5.0
Behavior5/5

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

Annotations provide no safety or readOnly hints, so the description carries the full burden of behavioral disclosure. It discloses all relevant behaviors: filesystem is pure text substitution without script evaluation, templater requires Obsidian API credentials, different actions have different effects (render vs create-note vs insert-active), and it explains vault path resolution. This is thorough and goes beyond what annotations offer.

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

Conciseness5/5

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

Despite being detailed, the description is well-organized with sections for each engine, bullet points for actions, and three comprehensive examples. It front-loads the core purpose and then methodically elaborates. Every sentence adds value, and the structure aids comprehension without verbosity.

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

Completeness5/5

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

Given the complexity of a dual-engine tool with multiple actions and parameter combinations, the description is remarkably complete. It covers all engines, all actions, required environment variables, vault path resolution, and provides examples for each major use case. The presence of an output schema means return values need not be described, and the description fills all other gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already describes parameters with 100% coverage, but the description adds substantial meaning: it explains what engine and action mean, how variables map to placeholders, and provides concrete examples that demonstrate parameter usage. For instance, it clearly illustrates how to set variables and which parameters are required for each combination.

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

Purpose5/5

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

The description clearly states the tool's purpose: 'Render or apply a template using one of two engines.' It specifies the verb (render/apply), the resource (template), and distinguishes between the filesystem and templater engines, making it unambiguous and distinct from sibling tools like templates.list.

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

Usage Guidelines5/5

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

The description explicitly states when to use which engine, e.g., 'Use engine:'templater' when you need dynamic evaluation' and clarifies that the filesystem engine does NOT evaluate Templater scripts. It also explains the vault selection behavior and when vaultPath takes precedence, providing clear usage context.

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

vault.currentCurrent Active VaultA
Read-onlyIdempotent

Return the vault that filesystem tools (notes., tags., dataview., blocks., canvas., kanban., marp., templates., tasks., links., wiki., stats.vault) would resolve to right now, plus the full precedence chain so the LLM can explain to the user why that vault was picked. reason is session-selected (vault.select was called), env-default (fell back to OBSIDIAN_VAULT_PATH), or none (nothing configured — tools will fail until vault.select or an env var is set). When OBSIDIAN_API_URL is configured, the response also carries an obsidianLiveInstance note reminding the caller that workspace. and commands.* tools target whichever vault the live Obsidian process has open, NOT the filesystem vault selected here. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
activeYesThe vault filesystem tools would resolve to right now. Null only when neither a session selection nor OBSIDIAN_VAULT_PATH is set.
reasonYesWhy `active` resolved this way: `session-selected` = set by vault.select; `env-default` = fell back to OBSIDIAN_VAULT_PATH; `none` = nothing is configured.
envDefaultYesThe OBSIDIAN_VAULT_PATH value at server startup, if any.
obsidianLiveInstanceNoPresent when OBSIDIAN_API_URL is configured. Explains that workspace.* and commands.* tools target the vault the live Obsidian process has open, independent of the filesystem vault selected here.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare readOnlyHint and idempotentHint, and the description reinforces this with 'Read-only.' It adds real value beyond annotations: enumerates the reason values (session-selected/env-default/none), discloses the failure condition ('tools will fail until vault.select or an env var is set'), and explains the obsidianLiveInstance note. Consistent with 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.

Conciseness4/5

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

The description is dense, not terse, but every sentence earns its place: scope, reason semantics, failure mode, and workspace distinction are all load-bearing for correct use. Slightly heavy for a zero-param introspection call, but not padded.

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

Completeness5/5

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

Completely adequate for a zero-parameter read-only tool. The description covers what is returned, the meaning of each reason value, the failure condition when nothing is configured, and the live-process caveat. Nothing an agent needs 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.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and the schema is empty with 100% coverage, so the baseline is 4. The description compensates by documenting the return semantics (reason field values and obsidianLiveInstance note), which is more useful than parameter documentation for this introspection tool.

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

Purpose5/5

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

States a specific verb and resource: 'Return the vault that filesystem tools would resolve to right now, plus the full precedence chain.' The enumerated filesystem tool families (notes.*, tags.*, dataview.*) and the explicit contrast with vault.list/vault.select/vault.reset make its role unambiguous among siblings.

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

Usage Guidelines4/5

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

Explains when the tool matters (to explain why a vault was picked) and clarifies the boundary with workspace.*/commands.* tools, which target the live process vault instead. It doesn't name an explicit alternative for when-not-to-use, but the live-vs-filesystem distinction is clear guidance.

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

vault.listList Known VaultsA
Read-onlyIdempotent

List every Obsidian vault kObsidian knows about, merged and deduplicated across three sources: the operator's OBSIDIAN_VAULT_PATH (the default — always included), any OBSIDIAN_VAULT_=path env vars (explicit named vaults), and — when KOBSIDIAN_VAULT_DISCOVERY is on (the default) — the user's local Obsidian application registry at obsidian.json. Each item reports its source, isDefault, isActive, and exists so the LLM can flag stale or missing vaults. Pass refresh: true to force a fresh scan instead of using the 30s cache. Read-only. NOTE: the obsidian-app source is EXPERIMENTAL — it parses Obsidian's undocumented obsidian.json registry (stable since 1.0 but internal to Obsidian) and may silently stop returning results if Obsidian changes the format; the env-var sources are the documented, stable path.

Examples:

Example 1 — List vaults using the 30-second cache:

{}

Example 2 — Force a rescan (obsidian.json changed, new env vars added):

{
  "refresh": true
}
ParametersJSON Schema
NameRequiredDescriptionDefault
refreshNoWhen true, force a fresh scan of the filesystem and obsidian.json even if the cache is warm. Default false.

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsYes
totalYes
activeVaultIdYesId of the currently session-selected vault, or null when using the env default.
obsidianConfigPathYesPath to the obsidian.json file kObsidian successfully parsed, or null when no config file was found or discovery is disabled.
obsidianConfigErrorNoPresent only when obsidian.json was located but could not be parsed. The string names the failure reason for debuggability.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare readOnly, idempotent, and non-destructive, but the description adds substantial behavior: the merged/deduplicated source logic, default env var, discovery flag, 30s cache, refresh behavior, and the experimental obsidian-app caveat. It even names the item fields (source, isDefault, isActive, exists) so an agent understands the output shape despite the output schema existing separately.

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

Conciseness4/5

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

The description is information-dense but not bloated—it front-loads the core purpose, then details sources, cache, and the experimental note, ending with two concrete examples. Every sentence earns its place; the structure is slightly long but effective given the nuance required.

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

Completeness5/5

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

For a listing tool with a single optional parameter, the description fully covers behavior: source enumeration, merging rules, cache, refresh, and even a warning about the experimental source. With an output schema present and a code‑example that shows usage, an agent has everything needed to call it correctly. No gaps remain.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema covers the sole `refresh` parameter at 100%, describing its type and default. The description goes further by explaining why you'd set it to true (force a fresh scan when obsidian.json changed or new env vars added), connecting it to the cache behavior. This adds meaningful context beyond the raw schema.

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

Purpose5/5

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

The description clearly states the verb (List) and resource (every Obsidian vault kObsidian knows about), then gives concrete detail on three sources, merging, and deduplication. It is easily distinguishable from sibling vault tools (vault.current, vault.select, vault.reset) because it explicitly enumerates all known vaults rather than acting on a single one.

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

Usage Guidelines4/5

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

The description implies a clear use case—listing vaults for the LLM to flag stale or missing ones—and explains the refresh flag for rescanning. It doesn't explicitly say 'use vault.current when you need the active vault' but the context makes that obvious from the sibling names and the phrase 'every vault'.

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

vault.resetReset Active Vault SelectionA
Idempotent

Clear the session-selected vault so the precedence chain falls back to OBSIDIAN_VAULT_PATH. Use this to signal 'I'm done with the scratch vault, go back to the default'. Idempotent — running on an already-cleared session is a no-op that reports changed: false. Does not change per-call vaultPath behaviour.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
targetYes
changedYes
summaryYes
previousYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare idempotentHint=true and destructiveHint=false, and the description adds concrete meaning: running on an already-cleared session is a no-op that reports changed:false. It also explains the precedence-chain fallback and clarifies that per-call vaultPath behavior is unaffected. These details go beyond the structured annotations and provide non-obvious operational context.

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

Conciseness5/5

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

Three sentences, each earning its place: the core action, the motivating use case, and the idempotency/scope caveats. The primary effect is front-loaded, and there is no redundant restatement of schema or annotation fields. This is appropriately concise for the complexity of the tool.

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

Completeness5/5

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

For a zero-parameter reset operation with an output schema and robust annotations, the description fully covers behavior, idempotency, side-effect scope, and the precedence-chain impact. It states what changes (session selection) and what does not (per-call vaultPath). Nothing needed for safe invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, schema coverage is 100%, and the schema description is '(none).' There is no parameter documentation burden for the description to carry. The description implicitly confirms the tool takes no arguments by describing a session-level reset rather than a parameterized operation.

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

Purpose5/5

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

The description opens with a concrete verb and resource: 'Clear the session-selected vault.' It further clarifies the effect on the precedence chain and explicitly distinguishes itself from per-call vaultPath behavior, which disambiguates it from selection tools like vault.select. This is specific, actionable, and not a tautology.

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

Usage Guidelines4/5

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

The description gives a direct intended-use scenario: 'Use this to signal I'm done with the scratch vault, go back to the default.' It does not explicitly name sibling alternatives such as vault.select, but the use-case framing and the note about per-call vaultPath provide enough context for an agent to decide when to invoke it. A more explicit 'when not to use' statement would earn a 5.

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

vault.selectSelect Active VaultA

Set the session-active vault for subsequent filesystem tool calls. Identify the target by EXACTLY ONE of id (stable id from vault.list), name (case-insensitive match), or path (absolute directory path — need not appear in vault.list; lets the LLM point at a fresh/empty vault to initialise). Precedence chain becomes: per-call vaultPath argument (highest) → this session selection → OBSIDIAN_VAULT_PATH → error. Explicit vaultPath arguments on individual tool calls always override this selection. Respects KOBSIDIAN_VAULT_ALLOW / KOBSIDIAN_VAULT_DENY operator gating (though OBSIDIAN_VAULT_PATH is never filtered). Does NOT change which vault the live Obsidian process has open — workspace.* and commands.* tools remain tied to OBSIDIAN_API_URL. HTTP deployments: this server shares the selection across HTTP clients, so concurrent multi-client HTTP setups should pass vaultPath per call instead.

Examples:

Example 1 — Switch to the vault named 'Work':

{
  "name": "Work"
}

Example 2 — Select by id from vault.list:

{
  "id": "58f115bd2c2febd2"
}

Example 3 — Point at an ad-hoc path (e.g. a fresh vault to initialise):

{
  "path": "/Users/alice/FreshVault"
}
ParametersJSON Schema
NameRequiredDescriptionDefault
idNoVault id returned by `vault.list`. Mutually exclusive with `name` and `path`.
nameNoCase-insensitive vault name match against `vault.list`. Mutually exclusive with `id` and `path`.
pathNoAbsolute vault directory path. Need not appear in `vault.list` — accepting an ad-hoc path lets the LLM point at a fresh vault. Must exist and be a directory. Mutually exclusive with `id` and `name`.

Output Schema

ParametersJSON Schema
NameRequiredDescription
activeYesA single vault entry returned by `vault.list` and `vault.current.active`.
targetYes
changedYes
summaryYes
previousYesThe previously-selected vault, or null if none was selected.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations are minimal (all false), so the description carries the full burden and delivers richly. It discloses the state-mutating nature (sets session selection), the precedence chain behavior, that OBSIDIAN_VAULT_PATH is never filtered by KOBSIDIAN_VAULT_ALLOW/DENY gating, the non-effect on the live Obsidian process, and the shared-selection caveat for HTTP deployments. No contradiction with annotations — readOnlyHint=false aligns with this being a state-setter.

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

Conciseness4/5

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

Purpose is front-loaded in the first sentence, then scoping and behavioral notes follow, then examples. The description is long but information-dense — the precedence, gating, workspace-scope, and HTTP notes each earn their sentences. The three concrete JSON examples add real clarity. Slightly verbose for a simple setter, but nothing is wasted.

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

Completeness5/5

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

Complete coverage for a targeting/selection tool: purpose, identifier selection rules, precedence, env-var interaction, operator-gating behavior, scope exclusions, HTTP deployment caveat, and worked examples. Combined with the output schema, an agent has everything needed to invoke this correctly without further lookup.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and each parameter is already documented with mutual-exclusivity. The description adds genuine value beyond the schema: name matching is case-insensitive, path need not appear in vault.list (enabling fresh-vault initialization), and the interaction of each identifier with the precedence chain. It enriches but doesn't merely duplicate the schema.

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

Purpose5/5

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

The description opens with a specific verb+resource: 'Set the session-active vault for subsequent filesystem tool calls.' It clearly differentiates from sibling vault tools (vault.list, vault.current, vault.reset) by explaining the selection mechanism with three distinct identifiers. The sibling distinction is precisely stated.

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

Usage Guidelines5/5

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

Explicit guidance on when to use each parameter: `id` for stable lookups, `name` for case-insensitive matching, `path` for ad-hoc/fresh vaults to initialize. The precedence chain is fully documented (per-call vaultPath > session selection > OBSIDIAN_VAULT_PATH), and it specifies exclusions — workspace.*/commands.* tools remain tied to OBSIDIAN_API_URL, and HTTP deployments should pass vaultPath per call. Nothing is left to inference.

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

wiki.indexRebuildRebuild Wiki IndexA
DestructiveIdempotent

Regenerate wiki/index.md from a fresh scan of Sources/, Concepts/, and Entities/. Pages are grouped by category and sorted alphabetically; pass includeCounts:true to render counts on the section headings (e.g. ## Sources (12)). Idempotent and destructive — the existing index.md body is replaced wholesale, so any hand-edits there are lost. Use after bulk-creating pages outside the wiki tools, or as the cleanup step after wiki.lint reports indexMismatch. For incremental upkeep on a single source, prefer the proposedEdits returned by wiki.ingest instead.

Operates on the session-active vault (see vault.current — selectable via vault.select) unless an explicit vaultPath argument is passed, which always wins.

Examples:

Example 1 — Plain rebuild.:

{}

Example 2 — Rebuild with counts on each section heading.:

{
  "includeCounts": true
}
ParametersJSON Schema
NameRequiredDescriptionDefault
wikiRootNoPer-call wiki directory override.
vaultPathNoPer-call vault override.
includeCountsNoWhen true, append per-category counts (e.g. `Sources (12)`) to each section heading. Defaults to false.

Output Schema

ParametersJSON Schema
NameRequiredDescription
targetYesThe path or identifier the tool acted on.
changedYesTrue if the tool altered vault state on this call; false if it was a no-op.
summaryYesShort human-readable summary of what happened.

TDQS

A4.9/5.0
Behavior5/5

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

Description discloses that the operation is destructive, replacing the existing `index.md` body wholesale and losing hand-edits, which complements the destructiveHint and idempotentHint annotations. It also adds useful behavioral context about grouping, sorting, and vault resolution beyond the annotations.

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

Conciseness5/5

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

Well-structured with purpose first, then side effects, usage guidance, vault behavior, and minimal examples. Every section earns its place without unnecessary filler.

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

Completeness5/5

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

For a destructive rebuild tool, this covers all essential operational context: target file, scan sources, side effects, when to use, alternatives, and vault selection. The output schema is present, so return-value details are not needed in the description.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema already covers all three parameters with descriptions, so the baseline is 3. The description adds value by explaining that `vaultPath` always wins over the active vault and by demonstrating `includeCounts` behavior with concrete examples.

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

Purpose5/5

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

States a specific verb and resource: Regenerate `wiki/index.md` from a fresh scan of `Sources/`, `Concepts/`, and `Entities/`. It clearly distinguishes this full rebuild from incremental tools like `wiki.ingest` and from linting with `wiki.lint`. No ambiguity about what the tool does.

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

Usage Guidelines5/5

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

Explicitly says when to use: after bulk-creating pages outside the wiki tools, or as the cleanup step after `wiki.lint` reports `indexMismatch`. It also names the preferred alternative for incremental upkeep (`wiki.ingest`) and clarifies the vault selection behavior with `vaultPath` precedence.

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

wiki.ingestIngest SourceA

File one new source into the wiki: writes Sources/<slug>.md with canonical frontmatter, appends an ingest entry to log.md, and returns a proposedEdits array the agent applies via existing notes.* tools (createStubnotes.create; insertAfterHeading / appendnotes.edit with the matching mode). Cross-reference writes are deliberately NOT applied here so every edit shows up in the transcript. Provide either sourcePath (existing vault note) OR content (inline markdown) — never both. Use wiki.summaryMerge instead when you want to file a follow-up section into an EXISTING concept/entity page; use wiki.query to look something up without writing.

Operates on the session-active vault (see vault.current — selectable via vault.select) unless an explicit vaultPath argument is passed, which always wins.

Examples:

Example 1 — Ingest a paper from inline markdown with two related concepts and one entity.:

{
  "title": "In-Context Learning — A Survey",
  "content": "# In-Context Learning\n\nA survey of …",
  "sourceType": "paper",
  "url": "https://arxiv.org/abs/2301.00234",
  "tags": [
    "icl",
    "prompting"
  ],
  "relatedConcepts": [
    "In-Context Learning",
    "Few-Shot Prompting"
  ],
  "relatedEntities": [
    "Brown 2020"
  ]
}

Example 2 — Ingest an existing vault note as a 'note' source.:

{
  "title": "ADR-004 — gRPC for internal service comms",
  "sourcePath": "drafts/adr-004.md",
  "sourceType": "note",
  "tags": [
    "adr",
    "architecture"
  ]
}
ParametersJSON Schema
NameRequiredDescriptionDefault
urlNoCanonical URL of the source, if any. Stored in frontmatter.
slugNoOverride the auto-derived slug used as the Sources/<slug>.md filename.
tagsNoTag list (without leading '#') stored on the Sources page.
titleYesHuman-readable title of the source. Used for the page H1, the index entry, and the log entry.
authorNoSource author for frontmatter.
contentNoInline markdown body for the source. Use when you do not already have a note in the vault. Provide this OR `sourcePath`.
summaryNoShort prose summary written to frontmatter. Auto-generated from the body if omitted.
wikiRootNoPer-call wiki directory override (defaults to KOBSIDIAN_WIKI_ROOT or 'wiki').
vaultPathNoPer-call vault override; wins over session and env.
confidenceNoSubjective confidence in the source: low | medium | high.
ingestedAtNoYYYY-MM-DD override for the ingestion date. Defaults to today.
sourcePathNoVault-relative path of an existing note to ingest as the source body. Provide this OR `content`, not both.
sourceTypeNoSource kind written to frontmatter: article | paper | note | transcript | other.article
relatedConceptsNoConcept page names to cross-reference. Each becomes a `createStub` proposed edit if the concept page does not exist yet.
relatedEntitiesNoEntity page names (people / places / orgs / works) to cross-reference. Same proposedEdits behavior as relatedConcepts.

Output Schema

ParametersJSON Schema
NameRequiredDescription
targetYesThe path or identifier the tool acted on.
changedYesTrue if the tool altered vault state on this call; false if it was a no-op.
summaryYesShort human-readable summary of what happened.

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does well: it discloses writes, appends, returns a proposedEdits array, and intentionally does not apply cross-reference writes so edits appear in the transcript. It does not mention overwrite behavior if the slug already exists, but the major behavioral traits are clearly covered.

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

Conciseness4/5

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

The description is longer than average, but for a 15-parameter write tool the added detail—side effects, routing instructions, override behavior, and two examples—is earned. It is well-organized and front-loads the core mechanism before optional context.

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

Completeness4/5

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

Given the tool's complexity, the description covers the main write path, vault-scoping behavior, alternative-tool routing, and the follow-up workflow via `notes.*` tools. It does not specify overwrite/idempotency semantics, but the output schema and examples make the tool callable with confidence.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents each parameter; the description adds workflow-level meaning by connecting `relatedConcepts`/`relatedEntities` to proposedEdits, reinforcing the `sourcePath`/`content` exclusivity, and explaining that `vaultPath` always wins. The two examples also show realistic parameter combinations.

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

Purpose5/5

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

Description states a precise action: 'File one new source into the wiki' and specifies concrete side effects: writes `Sources/<slug>.md`, appends to `log.md`, and returns `proposedEdits`. It clearly differentiates from siblings like `wiki.summaryMerge` and `wiki.query` by naming them as alternatives for different goals.

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

Usage Guidelines5/5

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

Explicitly says when to use this tool vs alternatives: use `wiki.summaryMerge` for follow-up sections on existing pages, and `wiki.query` for lookups without writing. Also gives direct exclusion guidance for `sourcePath` vs `content` and explains vault selection precedence.

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

wiki.initInitialize WikiA
Idempotent

Scaffold the LLM-Wiki layout under the vault: creates Sources/, Concepts/, Entities/ folders and seeds index.md, log.md, and wiki-schema.md (the schema reference the agent reads back later). Use this once per vault before calling any other wiki.* tool. Idempotent by default — existing files are preserved; pass force:true to re-seed index.md/log.md/wiki-schema.md (folders are never deleted). Returns { created: string[], skipped: string[] } so the agent can confirm what changed. Resolves the wiki location from wikiRoot arg → KOBSIDIAN_WIKI_ROOT env → wiki/.

Operates on the session-active vault (see vault.current — selectable via vault.select) unless an explicit vaultPath argument is passed, which always wins.

Examples:

Example 1 — First-time scaffold in the active vault.:

{}

Example 2 — Re-seed schema/index/log files in a custom wiki directory.:

{
  "wikiRoot": "knowledge",
  "force": true
}
ParametersJSON Schema
NameRequiredDescriptionDefault
forceNoRe-seed index.md, log.md, and wiki-schema.md even if they already exist. Folders are never deleted. Defaults to false (idempotent).
wikiRootNoPer-call override for the wiki directory under the vault. Defaults to KOBSIDIAN_WIKI_ROOT (env), then 'wiki'.
vaultPathNoPer-call vault override. Wins over the session-active vault and OBSIDIAN_VAULT_PATH for this call only.

Output Schema

ParametersJSON Schema
NameRequiredDescription
targetYesThe path or identifier the tool acted on.
changedYesTrue if the tool altered vault state on this call; false if it was a no-op.
summaryYesShort human-readable summary of what happened.

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the idempotentHint annotation, the description details exactly what happens: existing files are preserved, folders are never deleted, and force:true re-seeds specific files. It discloses the return shape ({ created, skipped }) and the resolution order for the wiki location. This is rich behavioral context that goes well beyond the annotations.

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

Conciseness5/5

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

The description is well-structured: purpose, idempotency, return value, resolution order, vault selection, and examples. It is detailed but every sentence contributes useful information. The two examples cover the main use cases (first-time scaffold and forced re-seed) without being repetitive.

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

Completeness5/5

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

Given the tool has 3 optional parameters, no required input, and an idempotent, non-destructive behavior, the description covers everything an agent needs: what gets created, what force does, what is returned, how the target vault is determined, and that it should be run before other wiki.* tools. No critical information is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so all parameters are documented in the schema. The description adds extra meaning by explaining the precedence order (wikiRoot arg → KOBSIDIAN_WIKI_ROOT env → wiki/) and that vaultPath always wins over the session-active vault. This synergy between parameters is not in the schema, adding genuine value.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Scaffold the LLM-Wiki layout under the vault: creates Sources/, Concepts/, Entities/ folders and seeds index.md, log.md, and wiki-schema.md'. This clearly states what the tool does. It also distinguishes itself from siblings by noting 'Use this once per vault before calling any other wiki.* tool', making its unique role unmistakable.

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

Usage Guidelines5/5

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

The description gives explicit usage context: 'Use this once per vault before calling any other wiki.* tool.' It also explains the idempotent default and when to pass force:true, and clarifies vault selection rules ('Operates on the session-active vault... unless an explicit vaultPath argument is passed, which always wins'). This is full guidance on when and how to use it.

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

wiki.lintLint WikiA
Read-onlyIdempotent

Read-only health check across the wiki. Returns grouped findings under fixed keys: orphans (pages with zero in/out wiki-links), brokenLinks (links whose target does not resolve), staleSources and stalePages (older than staleDays, default 180 / KOBSIDIAN_WIKI_STALE_DAYS), missingPages (concept/entity names referenced from Sources but with no page), tagSingletons (tags used by exactly one page — likely typos), and indexMismatch (entries in index.md that no longer match disk). Each group includes a count plus per-finding details. Never writes. Use periodically; pair the result with notes.move/notes.edit/wiki.indexRebuild to apply fixes.

Operates on the session-active vault (see vault.current — selectable via vault.select) unless an explicit vaultPath argument is passed, which always wins.

Examples:

Example 1 — Default audit.:

{}

Example 2 — Stricter staleness threshold (90 days) for an active codebase wiki.:

{
  "staleDays": 90
}
ParametersJSON Schema
NameRequiredDescriptionDefault
wikiRootNoPer-call wiki directory override.
staleDaysNoThreshold in days for the 'stale' finding category (Sources whose `ingested_at` is older than this; Concepts/Entities whose `updated` is older). Defaults to KOBSIDIAN_WIKI_STALE_DAYS or 180.
vaultPathNoPer-call vault override.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior5/5

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

The description reinforces and extends the annotations: it states 'Never writes', explains vault selection behavior, and explicitly notes that vaultPath always wins. It also discloses the exact grouped output keys and their meanings, adding substantial context beyond what readOnlyHint and idempotentHint already convey.

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

Conciseness4/5

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

The description is well-structured and front-loaded with the core purpose, followed by output details, usage guidance, and examples. It is somewhat long and mildly repetitive with the schema's staleDays documentation, but every major section earns its place and the examples are useful.

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

Completeness5/5

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

For a read-only tool with optional parameters, an output schema, and strong annotations, the description is complete: it covers purpose, return shape, defaults, vault selection, workflow, and examples. No critical calling information appears to be missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema coverage is 100%, so the baseline is 3. The description adds meaningful extra semantics by clarifying that vaultPath takes precedence over the active vault and by giving concrete examples for default usage and staleDays. This goes slightly beyond the schema's own descriptions, though it does not add detail for wikiRoot.

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

Purpose4/5

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

The description clearly identifies a specific operation: a read-only health check across the wiki, with named finding categories such as orphans, brokenLinks, and missingPages. It is sufficiently concrete to distinguish itself from general utilities, though it does not explicitly contrast itself with sibling tools like links.broken or links.orphaned.

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

Usage Guidelines4/5

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

It gives practical usage context: 'Use periodically' and pairs the tool with notes.move/notes.edit/wiki.indexRebuild for fixes. It does not explicitly state when not to use it or name alternative sibling tools for narrower checks, but the periodicity and follow-up workflow are clear.

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

wiki.logAppendAppend Wiki Log EntryA

Append one typed entry to wiki/log.md in the canonical format ## [YYYY-MM-DD] <op> | <title>, optionally followed by a body and a Refs: list. The format is chosen so grep '^## \[' log.md | tail -20 is a valid 'recent activity' query. Use this when the agent makes a wiki-meaningful action that no other wiki.* tool already logs (e.g. a decision or note); ingest and merge log themselves. Auto-runs wiki.init if the wiki has not been scaffolded yet. Idempotent only in the trivial sense — every call appends a new entry.

Operates on the session-active vault (see vault.current — selectable via vault.select) unless an explicit vaultPath argument is passed, which always wins.

Examples:

Example 1 — Log an architectural decision with two refs.:

{
  "op": "decision",
  "title": "Adopt gRPC for internal RPC",
  "body": "Streaming + typed schemas outweigh the browser-edge tax.",
  "refs": [
    "wiki/Sources/adr-004.md",
    "wiki/Concepts/grpc.md"
  ]
}

Example 2 — Quick freeform note dated today.:

{
  "op": "note",
  "title": "Reviewed orphan pages from last sprint"
}
ParametersJSON Schema
NameRequiredDescriptionDefault
opYesLog entry kind: ingest | query | lint | note | decision | merge. Becomes the `<op>` token in `## [YYYY-MM-DD] <op> | <title>`.
bodyNoOptional markdown body written under the heading. Omit for a heading-only entry.
dateNoYYYY-MM-DD override for the entry date. Defaults to today.
refsNoOptional list of vault-relative paths or wiki-link targets rendered as a `Refs:` list under the entry.
titleYesOne-line title for the entry. Becomes the `<title>` token in the heading.
wikiRootNoPer-call wiki directory override.
vaultPathNoPer-call vault override.

Output Schema

ParametersJSON Schema
NameRequiredDescription
targetYesThe path or identifier the tool acted on.
changedYesTrue if the tool altered vault state on this call; false if it was a no-op.
summaryYesShort human-readable summary of what happened.

TDQS

A5/5.0
Behavior5/5

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

No annotations are provided, so the description carries the full behavioral disclosure burden. It explicitly states that every call appends a new entry, that the tool may auto-run `wiki.init` if the wiki is not scaffolded, and how the active vault is resolved. These are meaningful side effects an agent needs to know before invoking.

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

Conciseness5/5

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

The description is front-loaded with the core action and format, followed by usage guidance, side effects, and examples. Every sentence earns its place, and the examples are placed at the end where they complement rather than obscure the operational guidance.

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

Completeness5/5

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

Given 7 parameters, sibling logging tools, and no annotations, the description covers the critical context: purpose, exact file format, when to use it, side effects, vault resolution, and concrete examples. The presence of an output schema means the response shape does not need to be spelled out in the description.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, but the description adds real value beyond the schema: it explains how `op` and `title` map into the heading, how `refs` render, that `date` defaults to today, and that `vaultPath` overrides the session-active vault. The two JSON examples clarify realistic usage for multiple parameters at once.

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

Purpose5/5

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

The description names the exact resource (`wiki/log.md`), the verb (`Append`), and the canonical heading format, making the tool's function immediately clear. It also differentiates itself from sibling tools by noting that `ingest` and `merge` log themselves, so an agent can tell which actions belong here.

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

Usage Guidelines5/5

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

The description gives an explicit trigger: 'Use this when the agent makes a wiki-meaningful action that no other `wiki.*` tool already logs', with concrete examples like `decision` and `note`. It also names exclusions (`ingest` and `merge` log themselves) and explains the vault-selection precedence with `vaultPath`.

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

wiki.queryQuery WikiA
Read-onlyIdempotent

Rank wiki pages by relevance to a free-text topic, scanning Sources/Concepts/Entities pages. Hits are weighted in this order: filename match > frontmatter aliases > frontmatter tags > frontmatter summary > body. Returns up to limit pages (default 10, max 50) as {path, type, score, hitFields} so the agent can drill into the strongest candidates with notes.read. Read-only; never writes. Use this for 'what does the wiki know about X?' lookups; use wiki.lint instead for whole-vault health audits, and notes.search for raw full-text search outside the wiki layout.

Operates on the session-active vault (see vault.current — selectable via vault.select) unless an explicit vaultPath argument is passed, which always wins.

Examples:

Example 1 — Top 10 pages relevant to 'memex vs hypertext'.:

{
  "topic": "memex vs hypertext"
}

Example 2 — Top 25 pages on a narrow topic, custom wiki dir.:

{
  "topic": "circuit breaker pattern",
  "limit": 25,
  "wikiRoot": "knowledge"
}
ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax ranked pages to return. Default 10, hard cap 50.
topicYesFree-text topic. Tokenized and matched against page filename, frontmatter aliases, frontmatter tags, summary, and body — in that order, with descending weight.
wikiRootNoPer-call wiki directory override.
vaultPathNoPer-call vault override.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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

While annotations already declare readOnlyHint=true and destructiveHint=false, the description adds substantial behavioral context: the weighting order (filename > aliases > tags > summary > body), the return shape (`{path, type, score, hitFields}`), and the dynamic vault resolution logic. It explicitly states 'Read-only; never writes,' consistent with annotations and goes beyond them by disclosing internal ranking mechanics.

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

Conciseness5/5

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

The description is well-structured with a clear lead sentence, explicit usage guidance, a dedicated paragraph on vault behavior, and two illustrative JSON examples. Every sentence serves a purpose, and the information density is high without being verbose. The front-loaded purpose allows quick scanning.

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

Completeness5/5

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

Given the tool's complexity (4 parameters, output schema present, dynamic vault context), the description covers all necessary aspects: operational scope, ranking logic, return format, vault selection, and alternatives. It also includes concrete examples that demonstrate typical usage. An agent can invoke this tool correctly after reading the description alone.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema documentation already covers all four parameters at 100% coverage, which establishes a baseline of 3. The description adds marginal value by clarifying the default limit, hard cap, and the per-call override semantics for `wikiRoot` and `vaultPath`. The examples further reinforce parameter usage. This slightly exceeds baseline without being redundant.

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

Purpose5/5

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

The description opens with a specific verb ('Rank'), a clear resource ('wiki pages'), and a precise scope ('Sources/Concepts/Entities pages'). It immediately distinguishes itself from siblings by naming the alternatives (`wiki.lint`, `notes.search`) and their different purposes, making selection unambiguous.

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

Usage Guidelines5/5

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

Explicitly states when to use ('what does the wiki know about X?'), what to use instead (`wiki.lint` for whole-vault audits, `notes.search` for raw full-text search), and explains vault selection behavior. This covers both use cases and exclusions, leaving no room for misinterpretation.

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

wiki.summaryMergeMerge Summary Into Concept Or Entity PageA

Add a cited section to an EXISTING Concepts/ or Entities/ page, or create the page with canonical frontmatter if targetPath does not exist. The new section is rendered under heading (default: Update YYYY-MM-DD); citationSource adds a [[wiki-link]] to the source and pushes it onto the page's sources: frontmatter list, and citationQuote renders as a blockquote under the citation. On existing pages, updated: frontmatter is bumped to today. Use this when filing a follow-up onto a known page; use wiki.ingest instead when bringing in a NEW source (which auto-creates Sources/<slug>.md). When creating a new entity page, entityKind is required.

Operates on the session-active vault (see vault.current — selectable via vault.select) unless an explicit vaultPath argument is passed, which always wins.

Examples:

Example 1 — Append a 'Notable Facts' section to an existing concept page, citing one source with a quote.:

{
  "targetPath": "wiki/Concepts/circuit-breaker.md",
  "heading": "Notable Facts",
  "newSection": "Adopted by payment-service after the 2026-04-10 cascade incident.",
  "citationSource": "wiki/Sources/postmortem-2026-04-10-payment-timeouts-cascade.md",
  "citationQuote": "Timeouts in payment-service propagated to order-service within 14s."
}

Example 2 — Create a new entity page for an organization on first reference.:

{
  "targetPath": "wiki/Entities/anthropic.md",
  "pageType": "entity",
  "entityKind": "org",
  "newSection": "AI safety lab; publisher of the Model Context Protocol.",
  "summary": "AI safety company behind Claude and MCP."
}
ParametersJSON Schema
NameRequiredDescriptionDefault
aliasesNoSet or replace the page's frontmatter `aliases` list.
headingNoH2 heading text for the new section (e.g. 'Notable Facts'). Defaults to a timestamped 'Update YYYY-MM-DD' heading.
summaryNoSet or replace the page's frontmatter `summary` field.
pageTypeNoPage type used when creating a missing target page. Picks the matching frontmatter schema.concept
wikiRootNoPer-call wiki directory override.
vaultPathNoPer-call vault override.
entityKindNoRequired only when creating a missing entity page. One of person | place | org | work | other.
newSectionYesMarkdown body of the new section to insert. Will be wrapped under `heading` (or appended after the existing one).
targetPathYesVault-relative path of the concept or entity page to merge into. Created with canonical frontmatter if it does not exist.
citationQuoteNoOptional pull-quote from the source rendered as a blockquote under the citation.
citationSourceNoVault-relative path to a Sources/<slug>.md page. Rendered as a `[[wiki-link]]` citation under the new section and added to the page's `sources:` frontmatter list.

Output Schema

ParametersJSON Schema
NameRequiredDescription
targetYesThe path or identifier the tool acted on.
changedYesTrue if the tool altered vault state on this call; false if it was a no-op.
summaryYesShort human-readable summary of what happened.

TDQS

A4.8/5.0
Behavior5/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure. It details what happens on both existing pages (section insertion, sources list update, `updated:` frontmatter bumped to today, summary/aliases set) and new pages (canonical frontmatter, entityKind requirement). It also explains the vault override hierarchy and the rendering of citations and quotes. Nothing is left opaque.

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

Conciseness4/5

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

The description is longer than minimal but every sentence carries information: purpose, conditional behavior, sibling distinction, vault handling, and two illustrative examples. It is front-loaded with the core action and usage guidance. Slightly verbose relative to the high-calibration example, but appropriate for an 11-parameter tool with nuanced merge semantics.

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

Completeness5/5

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

For a tool of this complexity, the description covers the full decision space: when to use vs. alternatives, required/optional parameters, defaults, side effects on frontmatter, vault overrides, and entityKind constraints. The examples make the expected JSON shape concrete. Nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds meaningful semantics beyond the schema: it explains that `citationSource` pushes onto the page's `sources:` frontmatter list, that `heading` defaults to a timestamped value, and how `vaultPath` overrides the session-active vault. The two examples also illustrate realistic parameter combinations, adding practical nuance.

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

Purpose5/5

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

The description opens with a precise action verb ('Add a cited section') and names the exact resources (`Concepts/` or `Entities/` pages) plus the conditional create behavior. It distinguishes itself from the sibling `wiki.ingest` by stating that this tool targets existing pages, whereas ingest handles new sources. That makes selection unambiguous.

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

Usage Guidelines5/5

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

Explicit when-to-use guidance is present: 'Use this when filing a follow-up onto a known page; use `wiki.ingest` instead when bringing in a NEW source'. It also describes the vault selection behavior and notes when `entityKind` is required. This is more than adequate routing.

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

workspace.activeFileGet Active FileA
Read-onlyIdempotent

Return information about the file currently open and focused in Obsidian — its path, modification time, and whether it's in edit or preview mode. Read-only. Requires the Local REST API plugin (OBSIDIAN_API_URL/OBSIDIAN_REST_API_KEY). Use this to orient the agent before issuing other workspace-level mutations.

Targets the vault the live Obsidian process has open via the Local REST API. Not affected by vault.select — that only changes filesystem-tool routing.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already provide readOnlyHint and idempotentHint, but the description adds valuable behavioral context: the Local REST API plugin requirement, the needed environment variables, and the fact that it targets the live Obsidian vault process. This goes beyond the structured annotations without contradicting them.

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

Conciseness5/5

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

The description is compact and front-loaded with the core behavior. Each sentence adds a distinct fact: what it returns, that it is read-only, the plugin prerequisite, the intended usage, and the vault.select caveat. The only small redundancy is repeating 'read-only,' but it is minimal and reinforces a key safety signal.

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

Completeness5/5

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

For a zero-parameter tool with full annotation coverage and an output schema, the description is complete: it covers prerequisites, return fields, usage intent, and the routing caveat. Nothing an agent needs to decide whether or how to call this tool is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and the input schema is fully descriptive with additionalProperties false, so the baseline for this dimension is 4. There is no parameter detail needed, and the description appropriately does not invent any.

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

Purpose5/5

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

The description starts with a specific verb ('Return information') and names the exact resource: the file currently open and focused in Obsidian. It enumerates the returned fields (path, modification time, edit/preview mode) and the read-only nature clearly separates it from mutation siblings like workspace.openFile and workspace.closeActiveFile.

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

Usage Guidelines5/5

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

It gives explicit usage context: use this to orient the agent before other workspace-level mutations. It also clarifies a potential routing confusion with vault.select, stating that vault.select does not affect this tool and only changes filesystem-tool routing, which serves as a clear when-not/alternative guideline.

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

workspace.closeActiveFileClose Active FileA

Close whatever file is currently active in the Obsidian UI. UI-only — does not delete, save, or modify file contents. No-op when no file is active. Returns { ok: true } on success; errors when the Local REST API plugin is unreachable. Use after workspace.openFile when you want to dismiss a temporarily-revealed note. Pair with workspace.activeFile first if you need to know what was closed.

Targets the vault the live Obsidian process has open via the Local REST API. Not affected by vault.select — that only changes filesystem-tool routing.

Examples:

Example 1 — Dismiss the currently active pane.:

{}
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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

The annotations declare destructiveHint=false, but the description adds rich behavioral context beyond that: it documents the no-op behavior when no file is active, the return shape ('Returns { ok: true }'), the error condition (Local REST API plugin unreachable), and the vault targeting nuance. It also clarifies the operation is UI-only and does not persist changes. No contradiction with annotations.

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

Conciseness5/5

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

Every sentence carries real information: purpose, negative scope, no-op behavior, return/error contract, usage pairing, vault routing, and an example. The core statement is front-loaded, and the content is fully justified given the behavioral nuance of this UI-only mutation tool.

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

Completeness5/5

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

An output schema exists to cover return values, and the description covers everything an agent needs: what it does, when to use it, what it doesn't do, the no-op case, error conditions, and vault targeting. For a zero-parameter tool this is complete with no gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

This tool has zero parameters, so the baseline is 4. The schema is empty at 100% coverage, and the example shows an empty JSON invocation. Nothing more is needed since there are no parameters to document.

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

Purpose5/5

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

The description states the specific verb (close), resource (active file), and scope (in the Obsidian UI). It explicitly enumerates what it does NOT do ('does not delete, save, or modify file contents'), which cleanly distinguishes it from siblings like notes.delete and notes.edit. An agent can immediately tell this apart from the close-related and edit-related tools.

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

Usage Guidelines5/5

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

Gives explicit when-to-use guidance: 'Use after workspace.openFile when you want to dismiss a temporarily-revealed note.' Also names the companion tool ('Pair with workspace.activeFile first if you need to know what was closed'), and clarifies it is not affected by vault.select. This is model guidance that routes the agent correctly.

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

workspace.navigateNavigate Obsidian HistoryA

Navigate the Obsidian back/forward file history, like the arrow buttons in the top-left. direction:'back' = back one step; direction:'forward' = forward one step. No-op when the stack is empty in the given direction. Requires the Local REST API plugin.

Targets the vault the live Obsidian process has open via the Local REST API. Not affected by vault.select — that only changes filesystem-tool routing.

ParametersJSON Schema
NameRequiredDescriptionDefault
directionYesWhich way to step in the Obsidian file-history stack.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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

Beyond annotations (readOnlyHint=false, destructiveHint=false), the description discloses three behavioral traits: the no-op behavior on an empty stack, the hard dependency on the Local REST API plugin, and the fact that the tool always targets the currently open vault rather than any vault selected via vault.select. This usefully enriches the annotation data.

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

Conciseness5/5

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

The description is compact (~65 words), front-loads the core purpose and analogy, then packs direction semantics, no-op behavior, plugin requirement, and the vault.select caveat into two tight paragraphs. No sentence is redundant.

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

Completeness5/5

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

For a single-parameter tool with an output schema and annotations, the description covers the critical execution context: plugin requirement, target vault, stack-empty behavior, and independence from vault.select. An agent has everything needed to invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although the schema already documents `direction` with an enum and 100% coverage, the description adds precise semantics for each enum value ('back' = back one step, 'forward' = forward one step) and clarifies the no-op edge case, going beyond the schema's terse description.

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

Purpose5/5

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

Description uses a specific verb ('Navigate') and resource ('Obsidian back/forward file history') and anchors it to an everyday UI analogy ('like the arrow buttons in the top-left'). It is clearly distinct from sibling workspace tools like workspace.openFile and vault.select, leaving no ambiguity about scope.

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

Usage Guidelines4/5

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

The description states the exact invocation semantics (`direction:'back'` = back one step; `direction:'forward'` = forward one step) and the no-op condition when the stack is empty. It explicitly cautions that vault.select does not affect this tool, which prevents a likely misuse, though it doesn't enumerate broader alternative tools.

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

workspace.openFileOpen File In ObsidianA

Open a vault-relative note filePath in the live Obsidian UI. newPane:true opens it in a new split; default reuses the active pane. UI-only — does not create, modify, or read file contents (use notes.read for content). Returns { ok: true } on success; errors when the file does not exist or the Local REST API plugin (OBSIDIAN_API_URL / OBSIDIAN_REST_API_KEY) is unreachable. The opened file targets the live Obsidian process's vault, which may differ from the filesystem session vault — see vault.current.

Targets the vault the live Obsidian process has open via the Local REST API. Not affected by vault.select — that only changes filesystem-tool routing.

Examples:

Example 1 — Reveal a daily note in the current pane.:

{
  "filePath": "Daily/2026-04-25.md"
}

Example 2 — Open a reference note in a side split.:

{
  "filePath": "wiki/Concepts/grpc.md",
  "newPane": true
}
ParametersJSON Schema
NameRequiredDescriptionDefault
newPaneNoOpen in a new split pane instead of reusing the active one. Defaults to false.
filePathYesVault-relative path of the note to open (e.g. `Daily/2026-04-25.md`).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior5/5

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

The description goes well beyond the annotations: it discloses that the tool is UI-only, does not create/modify/read file contents, returns { ok: true }, fails when the file is missing or the REST API plugin is unreachable, and may target a different vault than the filesystem session. It also notes the newPane behavior. None of this contradicts the annotations; the non-readOnlyHint is consistent with the UI state change it performs.

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

Conciseness4/5

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

The description is longer than the minimal case, but each block earns its place: the core behavior, the UI-only caveat, the failure modes, the vault-targeting caveat, and examples. There is minor redundancy in mentioning the Local REST API twice, but overall it is well-organized and front-loaded with the action and key parameter.

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

Completeness5/5

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

For a two-parameter tool with rich annotations and an output schema, this description is complete. It covers return values, error conditions, relationship to notes.read, interaction with vault.select, and provides examples. An agent has everything needed to invoke it correctly without consulting additional tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already explains both parameters. The description adds some value by clarifying the default newPane behavior ('default reuses the active pane') and providing two concrete examples, but it largely restates the schema's semantic content rather than adding substantial new meaning.

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

Purpose5/5

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

The description opens with a precise verb-resource pairing — 'Open a vault-relative note filePath in the live Obsidian UI' — and clarifies the UI scope. It explicitly distinguishes itself from notes.read by saying it does not read file contents. This is enough to separate it from siblings like notes.read and workspace.navigate.

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

Usage Guidelines4/5

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

It gives a clear when-to-use signal: when you need to reveal a note in the live Obsidian UI. It also provides an explicit alternative by saying 'use notes.read for content,' and explains that vault.select does not affect this tool. It does not enumerate all sibling alternatives exhaustively, but it gives sufficient routing context for the common confusion cases.

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

workspace.toggleEditModeToggle Edit ModeA

Flip the active file in Obsidian between edit (source) mode and preview (reading) mode. Takes no arguments — always toggles whichever mode is currently active. UI-only: does not modify file contents. No-op when no file is active. Returns { ok: true, mode: 'edit' | 'preview' } reflecting the new mode; errors when the Local REST API plugin is unreachable. Useful when an agent has finished a multi-step edit and wants the user to see the rendered result.

Targets the vault the live Obsidian process has open via the Local REST API. Not affected by vault.select — that only changes filesystem-tool routing.

Examples:

Example 1 — Flip the active note from edit to preview (or vice versa).:

{}
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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

Adds essential behavioral details beyond annotations: 'UI-only: does not modify file contents', 'No-op when no file is active', and 'errors when the Local REST API plugin is unreachable'. It also specifies the exact return shape { ok: true, mode: 'edit' | 'preview' }. These details go well beyond the minimal readOnlyHint false, openWorldHint true in annotations.

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

Conciseness5/5

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

The description is front-loaded with the core action and then efficiently adds caveats (UI-only, no-op, error), a use case, and the vault.select clarification. Every sentence adds value, and the example is minimal. It is concise yet comprehensive for a tool of this simplicity.

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

Completeness5/5

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

The description covers no-op behavior, error conditions, UI-only nature, target vault (via Local REST API), and the return structure. The output schema is present but the description already explains the return. The only minor omission is whether it works on non-markdown files, but that's likely implicit in Obsidian's context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are zero parameters, and the schema coverage is 100% (empty properties). The description confirms 'Takes no arguments' and explains that it always toggles the current mode. Since there are no parameters to describe, the baseline for 0 params is 4, and the description adequately covers this.

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

Purpose5/5

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

The description clearly states 'Flip the active file in Obsidian between edit (source) mode and preview (reading) mode.' It specifies the action, target, and scope. It also distinguishes itself from vault-related tools by explicitly noting it is not affected by vault.select, which prevents confusion among siblings.

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

Usage Guidelines4/5

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

Provides a concrete use case: 'Useful when an agent has finished a multi-step edit and wants the user to see the rendered result.' It also indicates when it's a no-op (no active file) and warns about plugin unavailability. While it doesn't list alternative tools, the context is clear enough for an agent to decide when to invoke it.

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. Dates show when Glama detected each change.

  1. 66 tool updatesv0.3.5
    • Changedblocks.list2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Addedblocks.read
    • Changedblocks.update2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedcanvas.connections2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedcanvas.create2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Addedcanvas.edit
    • Changedcanvas.parse2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedcommands.execute2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Addedcommands.list
    • Addeddataview.fields.read
    • Changeddataview.fields.write5 fields changed
      • addedInput schema / $schema
        Added value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / description
        Added value: +"Discriminated union on `op`. `add` inserts a Dataview field; `remove` deletes every occurrence of a key (optionally scoped by line or Dataview scope)."
      • addedInput schema / oneOf
        Added value: +[
        +  {
        +    "properties": {
        +      "filePath": {
        +        "maxLength": 255,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "insertAt": {
        +        "description": "Where to place the field in the note body. Defaults to `afterFrontmatter`. Ignored when `lineNumber` is given.",
        +        "enum": [
        +          "start",
        +          "end",
        +          "afterFrontmatter"
        +        ],
        +        "type": "string"
        +      },
        +      "key": {
        +        "description": "Dataview field key to insert.",
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "lineNumber": {
        +        "description": "Explicit 1-based line number to insert at. Overrides `insertAt`.",
        +        "maximum": 9007199254740991,
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "op": {
        +        "const": "add",
        +        "type": "string"
        +      },
        +      "scope": {
        +        "enum": [
        +          "page",
        +          "list",
        +          "task"
        +        ],
        +        "type": "string"
        +      },
        +      "syntaxType": {
        +        "description": "How to render the field: `full-line` = field on its own line (`key:: value`); `bracket` = `[key:: value]` inline; `paren` = `(key:: value)` inline.",
        +        "enum": [
        +          "full-line",
        +          "bracket",
        +          "paren"
        +        ],
        +        "type": "string"
        +      },
        +      "value": {
        +        "description": "Field value. Strings, numbers, booleans, dates, and lists are all valid."
        +      },
        +      "vaultPath": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "op",
        +      "filePath",
        +      "key",
        +      "value"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "properties": {
        +      "filePath": {
        +        "maxLength": 255,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "key": {
        +        "description": "Field key to remove.",
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "lineNumber": {
        +        "description": "Restrict removal to a single line. Omit to remove every occurrence of the key within `scope`.",
        +        "maximum": 9007199254740991,
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "op": {
        +        "const": "remove",
        +        "type": "string"
        +      },
        +      "scope": {
        +        "enum": [
        +          "page",
        +          "list",
        +          "task",
        +          "all"
        +        ],
        +        "type": "string"
        +      },
        +      "vaultPath": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "op",
        +      "filePath",
        +      "key"
        +    ],
        +    "type": "object"
        +  }
        +]
      • removedInput schema / properties
        Removed value: -{}
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Addeddataview.index
    • Addeddataview.listByFolder
    • Addeddataview.listByTag
    • Changeddataview.query2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Addeddataview.table
    • Changedkanban.card5 fields changed
      • addedInput schema / $schema
        Added value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / description
        Added value: +"Discriminated union on `op` — add, move, or toggle a card. Each op has its own required fields."
      • addedInput schema / oneOf
        Added value: +[
        +  {
        +    "properties": {
        +      "cardText": {
        +        "description": "The card's text (markdown allowed, single line).",
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "columnName": {
        +        "description": "Target column name. Created if it does not exist.",
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "dueDate": {
        +        "description": "ISO date (YYYY-MM-DD) appended as `@{date}`.",
        +        "format": "date",
        +        "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
        +        "type": "string"
        +      },
        +      "filePath": {
        +        "description": "Path of the Kanban board note (`.md`).",
        +        "maxLength": 255,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "op": {
        +        "const": "add",
        +        "type": "string"
        +      },
        +      "position": {
        +        "description": "Where to place the card within its destination column. Defaults to `end`.",
        +        "enum": [
        +          "start",
        +          "end"
        +        ],
        +        "type": "string"
        +      },
        +      "status": {
        +        "description": "Initial checkbox state. Defaults to `incomplete`.",
        +        "enum": [
        +          "incomplete",
        +          "completed"
        +        ],
        +        "type": "string"
        +      },
        +      "vaultPath": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "op",
        +      "filePath",
        +      "columnName",
        +      "cardText"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "properties": {
        +      "cardText": {
        +        "description": "Card text to locate (matched verbatim after checkbox).",
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "filePath": {
        +        "description": "Path of the Kanban board note (`.md`).",
        +        "maxLength": 255,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "fromColumn": {
        +        "description": "Source column the card currently lives in.",
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "op": {
        +        "const": "move",
        +        "type": "string"
        +      },
        +      "position": {
        +        "description": "Where to place the card within its destination column. Defaults to `end`.",
        +        "enum": [
        +          "start",
        +          "end"
        +        ],
        +        "type": "string"
        +      },
        +      "toColumn": {
        +        "description": "Destination column (created if missing).",
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "vaultPath": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "op",
        +      "filePath",
        +      "cardText",
        +      "fromColumn",
        +      "toColumn"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "properties": {
        +      "cardText": {
        +        "description": "Card text to locate.",
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "columnName": {
        +        "description": "Restrict search to this column. Omit to toggle the first matching card in any column.",
        +        "type": "string"
        +      },
        +      "filePath": {
        +        "description": "Path of the Kanban board note (`.md`).",
        +        "maxLength": 255,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "op": {
        +        "const": "toggle",
        +        "type": "string"
        +      },
        +      "vaultPath": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "op",
        +      "filePath",
        +      "cardText"
        +    ],
        +    "type": "object"
        +  }
        +]
      • removedInput schema / properties
        Removed value: -{}
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Addedkanban.parse
    • Addedkanban.stats
    • Changedlinks.backlinks2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedlinks.broken2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedlinks.connections2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Addedlinks.graph
    • Addedlinks.health
    • Changedlinks.hubs2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedlinks.orphaned2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedlinks.outgoing2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedmarp.read5 fields changed
      • addedInput schema / $schema
        Added value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / description
        Added value: +"Discriminated union on `part`: `deck` = full deck with frontmatter + slides + directives; `slides` = list of slide summaries (separator and directive metadata); `slide` = one slide's full source (locate via `slideId` or `index`)."
      • addedInput schema / oneOf
        Added value: +[
        +  {
        +    "properties": {
        +      "filePath": {
        +        "maxLength": 255,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "part": {
        +        "const": "deck",
        +        "type": "string"
        +      },
        +      "vaultPath": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "part",
        +      "filePath"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "properties": {
        +      "filePath": {
        +        "maxLength": 255,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "part": {
        +        "const": "slides",
        +        "type": "string"
        +      },
        +      "vaultPath": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "part",
        +      "filePath"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "properties": {
        +      "filePath": {
        +        "maxLength": 255,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "index": {
        +        "description": "0-based slide index. Defaults to 0.",
        +        "maximum": 9007199254740991,
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "part": {
        +        "const": "slide",
        +        "type": "string"
        +      },
        +      "slideId": {
        +        "description": "Stable slide id if the deck uses them. Takes precedence over `index`.",
        +        "type": "string"
        +      },
        +      "vaultPath": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "part",
        +      "filePath"
        +    ],
        +    "type": "object"
        +  }
        +]
      • removedInput schema / properties
        Removed value: -{}
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Addedmarp.update
    • Changednotes.create5 fields changed
      • addedInput schema / $schema
        Added value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / description
        Added value: +"Discriminated union on `kind`. `note` creates a markdown note (`.md`); `folder` creates a directory. Use `kind:'folder'` when the target should be a directory, not a file."
      • addedInput schema / oneOf
        Added value: +[
        +  {
        +    "properties": {
        +      "content": {
        +        "description": "Initial body. Use an empty string for a blank note.",
        +        "type": "string"
        +      },
        +      "ifExists": {
        +        "description": "`error` (default) = fail if the note already exists; `replace` = overwrite; `skip` = no-op when the note exists.",
        +        "enum": [
        +          "error",
        +          "replace",
        +          "skip"
        +        ],
        +        "type": "string"
        +      },
        +      "kind": {
        +        "const": "note",
        +        "type": "string"
        +      },
        +      "path": {
        +        "maxLength": 255,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "vaultPath": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "kind",
        +      "path",
        +      "content"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "properties": {
        +      "kind": {
        +        "const": "folder",
        +        "type": "string"
        +      },
        +      "path": {
        +        "description": "Vault-relative folder path. Intermediate folders are created as needed.",
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "vaultPath": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "kind",
        +      "path"
        +    ],
        +    "type": "object"
        +  }
        +]
      • removedInput schema / properties
        Removed value: -{}
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changednotes.delete2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changednotes.edit5 fields changed
      • addedInput schema / $schema
        Added value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / description
        Added value: +"Discriminated union on `mode`. `replace` overwrites the whole note body; `append` adds to the end; `prepend` adds to the start (after frontmatter); `after-heading` inserts after a heading (anchor = heading text, no `#`); `after-block` inserts after a block reference (anchor = block id, no `^`)."
      • addedInput schema / oneOf
        Added value: +[
        +  {
        +    "properties": {
        +      "content": {
        +        "description": "Replacement body for the entire note.",
        +        "type": "string"
        +      },
        +      "mode": {
        +        "const": "replace",
        +        "type": "string"
        +      },
        +      "path": {
        +        "maxLength": 255,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "vaultPath": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "mode",
        +      "path",
        +      "content"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "properties": {
        +      "content": {
        +        "type": "string"
        +      },
        +      "mode": {
        +        "const": "append",
        +        "type": "string"
        +      },
        +      "path": {
        +        "maxLength": 255,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "vaultPath": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "mode",
        +      "path",
        +      "content"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "properties": {
        +      "content": {
        +        "type": "string"
        +      },
        +      "mode": {
        +        "const": "prepend",
        +        "type": "string"
        +      },
        +      "path": {
        +        "maxLength": 255,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "vaultPath": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "mode",
        +      "path",
        +      "content"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "properties": {
        +      "anchor": {
        +        "description": "Heading text (without the leading `#`s) to insert after. Matches the first heading in the note that has this exact text.",
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "content": {
        +        "type": "string"
        +      },
        +      "mode": {
        +        "const": "after-heading",
        +        "type": "string"
        +      },
        +      "path": {
        +        "maxLength": 255,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "vaultPath": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "mode",
        +      "path",
        +      "content",
        +      "anchor"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "properties": {
        +      "anchor": {
        +        "description": "Block id (without the `^` prefix) to insert after. Obsidian block refs only.",
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "content": {
        +        "type": "string"
        +      },
        +      "mode": {
        +        "const": "after-block",
        +        "type": "string"
        +      },
        +      "path": {
        +        "maxLength": 255,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "vaultPath": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "mode",
        +      "path",
        +      "content",
        +      "anchor"
        +    ],
        +    "type": "object"
        +  }
        +]
      • removedInput schema / properties
        Removed value: -{}
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changednotes.frontmatter2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Addednotes.list
    • Addednotes.move
    • Changednotes.read2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changednotes.search2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedstats.vault2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedsystem.version2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedtags.analyze2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Addedtags.list
    • Changedtags.modify2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedtags.search2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Addedtasks.create
    • Changedtasks.search2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Addedtasks.stats
    • Changedtasks.toggle2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Addedtasks.updateMetadata
    • Changedtemplates.list2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedtemplates.use5 fields changed
      • addedInput schema / $schema
        Added value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / description
        Added value: +"Discriminated union on `engine`. The `action` field then selects the operation within that engine. `filesystem` supports `render` and `create-note`; `templater` supports `render`, `create-note`, and `insert-active`."
      • addedInput schema / oneOf
        Added value: +[
        +  {
        +    "properties": {
        +      "action": {
        +        "const": "render",
        +        "type": "string"
        +      },
        +      "engine": {
        +        "const": "filesystem",
        +        "type": "string"
        +      },
        +      "filename": {
        +        "description": "Optional filename hint that can be referenced in the template as `{{filename}}`.",
        +        "type": "string"
        +      },
        +      "templatePath": {
        +        "description": "Vault-relative path of the template markdown file.",
        +        "maxLength": 255,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "variables": {
        +        "additionalProperties": {
        +          "type": "string"
        +        },
        +        "description": "Map of `{{var}}` placeholders to replacement strings.",
        +        "propertyNames": {
        +          "type": "string"
        +        },
        +        "type": "object"
        +      },
        +      "vaultPath": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "engine",
        +      "action",
        +      "templatePath"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "properties": {
        +      "action": {
        +        "const": "create-note",
        +        "type": "string"
        +      },
        +      "engine": {
        +        "const": "filesystem",
        +        "type": "string"
        +      },
        +      "targetPath": {
        +        "description": "Path where the new note should be written.",
        +        "maxLength": 255,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "templatePath": {
        +        "maxLength": 255,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "variables": {
        +        "additionalProperties": {
        +          "type": "string"
        +        },
        +        "propertyNames": {
        +          "type": "string"
        +        },
        +        "type": "object"
        +      },
        +      "vaultPath": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "engine",
        +      "action",
        +      "templatePath",
        +      "targetPath"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "properties": {
        +      "action": {
        +        "const": "render",
        +        "type": "string"
        +      },
        +      "engine": {
        +        "const": "templater",
        +        "type": "string"
        +      },
        +      "targetFile": {
        +        "description": "Where the rendered output should land; omit for a dry render.",
        +        "type": "string"
        +      },
        +      "templateFile": {
        +        "description": "Path of the Templater template file.",
        +        "minLength": 1,
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "engine",
        +      "action",
        +      "templateFile"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "properties": {
        +      "action": {
        +        "const": "create-note",
        +        "type": "string"
        +      },
        +      "engine": {
        +        "const": "templater",
        +        "type": "string"
        +      },
        +      "openFile": {
        +        "description": "Open the newly-created note in Obsidian.",
        +        "type": "boolean"
        +      },
        +      "targetFile": {
        +        "description": "Path of the note to create from the Templater template.",
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "templateFile": {
        +        "minLength": 1,
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "engine",
        +      "action",
        +      "templateFile",
        +      "targetFile"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "properties": {
        +      "action": {
        +        "const": "insert-active",
        +        "type": "string"
        +      },
        +      "activeFile": {
        +        "description": "When true, requires an active file in Obsidian (default true).",
        +        "type": "boolean"
        +      },
        +      "engine": {
        +        "const": "templater",
        +        "type": "string"
        +      },
        +      "templateFile": {
        +        "minLength": 1,
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "engine",
        +      "action",
        +      "templateFile"
        +    ],
        +    "type": "object"
        +  }
        +]
      • removedInput schema / properties
        Removed value: -{}
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedvault.current2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Addedvault.list
    • Addedvault.reset
    • Changedvault.select2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedwiki.indexRebuild2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedwiki.ingest2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedwiki.init2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedwiki.lint2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedwiki.logAppend2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Addedwiki.query
    • Changedwiki.summaryMerge2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Addedworkspace.activeFile
    • Addedworkspace.closeActiveFile
    • Changedworkspace.navigate2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedworkspace.openFile2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedworkspace.toggleEditMode2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
  2. 24 tool updatesv0.3.4
    • Removedblocks.read
    • Removedcanvas.edit
    • Removedcommands.list
    • Removeddataview.fields.read
    • Removeddataview.index
    • Removeddataview.listByFolder
    • Removeddataview.listByTag
    • Removeddataview.table
    • Removedkanban.parse
    • Removedkanban.stats
    • Removedlinks.graph
    • Removedlinks.health
    • Removedmarp.update
    • Removednotes.list
    • Removednotes.move
    • Removedtags.list
    • Removedtasks.create
    • Removedtasks.stats
    • Removedtasks.updateMetadata
    • Removedvault.list
    • Removedvault.reset
    • Removedwiki.query
    • Removedworkspace.activeFile
    • Removedworkspace.closeActiveFile
  3. 8 tool updatesv0.3.2
    • Changedwiki.indexRebuild3 fields changed
      • addedInput schema / properties / includeCounts / description
        Added value: +"When true, append per-category counts (e.g. `Sources (12)`) to each section heading. Defaults to false."
      • addedInput schema / properties / vaultPath / description
        Added value: +"Per-call vault override."
      • addedInput schema / properties / wikiRoot / description
        Added value: +"Per-call wiki directory override."
    • Changedwiki.ingest15 fields changed
      • addedInput schema / properties / author / description
        Added value: +"Source author for frontmatter."
      • addedInput schema / properties / confidence / description
        Added value: +"Subjective confidence in the source: low | medium | high."
      • addedInput schema / properties / content / description
        Added value: +"Inline markdown body for the source. Use when you do not already have a note in the vault. Provide this OR `sourcePath`."
      • addedInput schema / properties / ingestedAt / description
        Added value: +"YYYY-MM-DD override for the ingestion date. Defaults to today."
      • addedInput schema / properties / relatedConcepts / description
        Added value: +"Concept page names to cross-reference. Each becomes a `createStub` proposed edit if the concept page does not exist yet."
      • addedInput schema / properties / relatedEntities / description
        Added value: +"Entity page names (people / places / orgs / works) to cross-reference. Same proposedEdits behavior as relatedConcepts."
      • addedInput schema / properties / slug / description
        Added value: +"Override the auto-derived slug used as the Sources/<slug>.md filename."
      • addedInput schema / properties / sourcePath / description
        Added value: +"Vault-relative path of an existing note to ingest as the source body. Provide this OR `content`, not both."
      • addedInput schema / properties / sourceType / description
        Added value: +"Source kind written to frontmatter: article | paper | note | transcript | other."
      • addedInput schema / properties / summary / description
        Added value: +"Short prose summary written to frontmatter. Auto-generated from the body if omitted."
      • addedInput schema / properties / tags / description
        Added value: +"Tag list (without leading '#') stored on the Sources page."
      • addedInput schema / properties / title / description
        Added value: +"Human-readable title of the source. Used for the page H1, the index entry, and the log entry."
      • addedInput schema / properties / url / description
        Added value: +"Canonical URL of the source, if any. Stored in frontmatter."
      • addedInput schema / properties / vaultPath / description
        Added value: +"Per-call vault override; wins over session and env."
      • addedInput schema / properties / wikiRoot / description
        Added value: +"Per-call wiki directory override (defaults to KOBSIDIAN_WIKI_ROOT or 'wiki')."
    • Changedwiki.init3 fields changed
      • addedInput schema / properties / force / description
        Added value: +"Re-seed index.md, log.md, and wiki-schema.md even if they already exist. Folders are never deleted. Defaults to false (idempotent)."
      • addedInput schema / properties / vaultPath / description
        Added value: +"Per-call vault override. Wins over the session-active vault and OBSIDIAN_VAULT_PATH for this call only."
      • addedInput schema / properties / wikiRoot / description
        Added value: +"Per-call override for the wiki directory under the vault. Defaults to KOBSIDIAN_WIKI_ROOT (env), then 'wiki'."
    • Changedwiki.lint3 fields changed
      • addedInput schema / properties / staleDays / description
        Added value: +"Threshold in days for the 'stale' finding category (Sources whose `ingested_at` is older than this; Concepts/Entities whose `updated` is older). Defaults to KOBSIDIAN_WIKI_STALE_DAYS or 180."
      • addedInput schema / properties / vaultPath / description
        Added value: +"Per-call vault override."
      • addedInput schema / properties / wikiRoot / description
        Added value: +"Per-call wiki directory override."
    • Changedwiki.logAppend7 fields changed
      • addedInput schema / properties / body / description
        Added value: +"Optional markdown body written under the heading. Omit for a heading-only entry."
      • addedInput schema / properties / date / description
        Added value: +"YYYY-MM-DD override for the entry date. Defaults to today."
      • addedInput schema / properties / op / description
        Added value: +"Log entry kind: ingest | query | lint | note | decision | merge. Becomes the `<op>` token in `## [YYYY-MM-DD] <op> | <title>`."
      • addedInput schema / properties / refs / description
        Added value: +"Optional list of vault-relative paths or wiki-link targets rendered as a `Refs:` list under the entry."
      • addedInput schema / properties / title / description
        Added value: +"One-line title for the entry. Becomes the `<title>` token in the heading."
      • addedInput schema / properties / vaultPath / description
        Added value: +"Per-call vault override."
      • addedInput schema / properties / wikiRoot / description
        Added value: +"Per-call wiki directory override."
    • Changedwiki.query4 fields changed
      • addedInput schema / properties / limit / description
        Added value: +"Max ranked pages to return. Default 10, hard cap 50."
      • addedInput schema / properties / topic / description
        Added value: +"Free-text topic. Tokenized and matched against page filename, frontmatter aliases, frontmatter tags, summary, and body — in that order, with descending weight."
      • addedInput schema / properties / vaultPath / description
        Added value: +"Per-call vault override."
      • addedInput schema / properties / wikiRoot / description
        Added value: +"Per-call wiki directory override."
    • Changedwiki.summaryMerge11 fields changed
      • addedInput schema / properties / aliases / description
        Added value: +"Set or replace the page's frontmatter `aliases` list."
      • addedInput schema / properties / citationQuote / description
        Added value: +"Optional pull-quote from the source rendered as a blockquote under the citation."
      • addedInput schema / properties / citationSource / description
        Added value: +"Vault-relative path to a Sources/<slug>.md page. Rendered as a `[[wiki-link]]` citation under the new section and added to the page's `sources:` frontmatter list."
      • addedInput schema / properties / entityKind / description
        Added value: +"Required only when creating a missing entity page. One of person | place | org | work | other."
      • addedInput schema / properties / heading / description
        Added value: +"H2 heading text for the new section (e.g. 'Notable Facts'). Defaults to a timestamped 'Update YYYY-MM-DD' heading."
      • addedInput schema / properties / newSection / description
        Added value: +"Markdown body of the new section to insert. Will be wrapped under `heading` (or appended after the existing one)."
      • addedInput schema / properties / pageType / description
        Added value: +"Page type used when creating a missing target page. Picks the matching frontmatter schema."
      • addedInput schema / properties / summary / description
        Added value: +"Set or replace the page's frontmatter `summary` field."
      • addedInput schema / properties / targetPath / description
        Added value: +"Vault-relative path of the concept or entity page to merge into. Created with canonical frontmatter if it does not exist."
      • addedInput schema / properties / vaultPath / description
        Added value: +"Per-call vault override."
      • addedInput schema / properties / wikiRoot / description
        Added value: +"Per-call wiki directory override."
    • Changedworkspace.openFile2 fields changed
      • changedInput schema / properties / filePath / description
        Previous value: -"Vault-relative path of the note to open."New value: +"Vault-relative path of the note to open (e.g. `Daily/2026-04-25.md`)."
      • changedInput schema / properties / newPane / description
        Previous value: -"Open in a new split pane instead of the current one. Defaults to false."New value: +"Open in a new split pane instead of reusing the active one. Defaults to false."
  4. 111 tool updatesv0.1.2
    • Addedblocks.list
    • Addedblocks.read
    • Addedblocks.update
    • Removedcanvas.addEdge
    • Removedcanvas.addNode
    • Changedcanvas.connections8 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / filePath / description
        Added value: +"Vault-relative path to an Obsidian `.canvas` file."
      • addedInput schema / properties / nodeId / description
        Added value: +"Id of the node whose edges to return."
      • addedOutput schema / properties / filePath
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / incoming
        Added value: +{
        +  "items": {
        +    "additionalProperties": {},
        +    "propertyNames": {
        +      "type": "string"
        +    },
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / nodeId
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / outgoing
        Added value: +{
        +  "items": {
        +    "additionalProperties": {},
        +    "propertyNames": {
        +      "type": "string"
        +    },
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / required
        Added value: +[
        +  "filePath",
        +  "nodeId",
        +  "incoming",
        +  "outgoing"
        +]
    • Changedcanvas.create7 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / filePath / description
        Added value: +"Path for the new canvas (must end in `.canvas`)."
      • addedInput schema / properties / overwrite / description
        Added value: +"When true, overwrite an existing canvas at the path. Defaults to false."
      • addedOutput schema / description
        Added value: +"Standard mutation envelope. Individual tools may attach additional fields (e.g. `created`, `appended`, `before`/`after` counts) — those are documented in the tool description."
      • addedOutput schema / properties / changed / description
        Added value: +"True if the tool altered vault state on this call; false if it was a no-op."
      • addedOutput schema / properties / summary / description
        Added value: +"Short human-readable summary of what happened."
      • addedOutput schema / properties / target / description
        Added value: +"The path or identifier the tool acted on."
    • Addedcanvas.edit
    • Changedcanvas.parse6 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / filePath / description
        Added value: +"Vault-relative path to an Obsidian `.canvas` file."
      • addedOutput schema / properties / edges
        Added value: +{
        +  "items": {
        +    "additionalProperties": {},
        +    "propertyNames": {
        +      "type": "string"
        +    },
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / filePath
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / nodes
        Added value: +{
        +  "items": {
        +    "additionalProperties": {},
        +    "propertyNames": {
        +      "type": "string"
        +    },
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / required
        Added value: +[
        +  "filePath",
        +  "nodes",
        +  "edges"
        +]
    • Removedcanvas.removeNode
    • Changedcommands.execute4 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / args / description
        Added value: +"Optional map of command arguments. Most commands accept none."
      • addedInput schema / properties / commandId / description
        Added value: +"Command identifier, e.g. `editor:save-file` or `command-palette:open`."
      • addedOutput schema / description
        Added value: +"Freeform object. The specific shape depends on the tool; see the tool description."
    • Changedcommands.list6 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / query
        Added value: +{
        +  "description": "Substring to match against command id or name. Omit to list all commands.",
        +  "type": "string"
        +}
      • addedOutput schema / description
        Added value: +"Standard list envelope used by list/search tools."
      • addedOutput schema / properties / items / description
        Added value: +"List of result items; per-item shape depends on the tool."
      • addedOutput schema / properties / items / items / description
        Added value: +"Freeform object. The specific shape depends on the tool; see the tool description."
      • addedOutput schema / properties / total / description
        Added value: +"Number of items in `items`."
    • Removedcommands.search
    • Removeddataview.fields.add
    • Removeddataview.fields.extract
    • Addeddataview.fields.read
    • Removeddataview.fields.remove
    • Removeddataview.fields.search
    • Addeddataview.fields.write
    • Addeddataview.index
    • Removeddataview.index.read
    • Removeddataview.js.read
    • Removeddataview.js.update
    • Changeddataview.listByFolder7 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / description
        Added value: +"Sugar wrapper around `LIST FROM \"folder\"`."
      • addedInput schema / properties / folder / description
        Added value: +"Vault-relative folder to filter by."
      • addedInput schema / properties / limit / description
        Added value: +"Optional `LIMIT` n clause."
      • addedInput schema / properties / sortBy / description
        Added value: +"Optional DQL `SORT` clause body (without the `SORT` keyword). Example: `file.ctime desc`."
      • addedInput schema / properties / whereClause / description
        Added value: +"Optional DQL `WHERE` clause body (without the `WHERE` keyword)."
      • addedOutput schema / description
        Added value: +"Freeform object. The specific shape depends on the tool; see the tool description."
    • Changeddataview.listByTag7 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / description
        Added value: +"Sugar wrapper around `LIST FROM #tag`."
      • addedInput schema / properties / limit / description
        Added value: +"Optional `LIMIT` n clause."
      • addedInput schema / properties / sortBy / description
        Added value: +"Optional DQL `SORT` clause body (without the `SORT` keyword). Example: `file.ctime desc`."
      • addedInput schema / properties / tag / description
        Added value: +"Tag to filter by. With or without leading `#`."
      • addedInput schema / properties / whereClause / description
        Added value: +"Optional DQL `WHERE` clause body (without the `WHERE` keyword)."
      • addedOutput schema / description
        Added value: +"Freeform object. The specific shape depends on the tool; see the tool description."
    • Changeddataview.query3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / query / description
        Added value: +"A Dataview Query Language (DQL) string. Examples: `LIST FROM #inbox`, `TASK FROM \"Journal\" WHERE !completed`, `TABLE file.ctime, priority FROM #projects`."
      • addedOutput schema / description
        Added value: +"Freeform object. The specific shape depends on the tool; see the tool description."
    • Removeddataview.query.read
    • Removeddataview.query.update
    • Changeddataview.table8 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / description
        Added value: +"Sugar wrapper around `TABLE … FROM …`."
      • addedInput schema / properties / fields / description
        Added value: +"Field expressions to project as table columns (e.g. `file.name`, `priority`)."
      • addedInput schema / properties / fromClause / description
        Added value: +"Optional DQL `FROM` clause body. Example: `#projects AND -#archive`."
      • addedInput schema / properties / limit / description
        Added value: +"Optional `LIMIT` n clause."
      • addedInput schema / properties / sortBy / description
        Added value: +"Optional DQL `SORT` clause body (without the `SORT` keyword). Example: `file.ctime desc`."
      • addedInput schema / properties / whereClause / description
        Added value: +"Optional DQL `WHERE` clause body (without the `WHERE` keyword)."
      • addedOutput schema / description
        Added value: +"Freeform object. The specific shape depends on the tool; see the tool description."
    • Removedkanban.addCard
    • Addedkanban.card
    • Removedkanban.moveCard
    • Changedkanban.parse6 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / description
        Added value: +"Arguments for `kanban.parse`."
      • addedInput schema / properties / filePath / description
        Added value: +"Path of the Kanban board note (`.md`)."
      • addedOutput schema / properties / columns
        Added value: +{
        +  "items": {
        +    "additionalProperties": {},
        +    "properties": {
        +      "cards": {
        +        "items": {
        +          "additionalProperties": {},
        +          "properties": {
        +            "completed": {
        +              "type": "boolean"
        +            },
        +            "text": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "text",
        +            "completed"
        +          ],
        +          "type": "object"
        +        },
        +        "type": "array"
        +      },
        +      "name": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "name",
        +      "cards"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / filePath
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / required
        Added value: +[
        +  "filePath",
        +  "columns"
        +]
    • Changedkanban.stats10 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / description
        Added value: +"Arguments for `kanban.stats`."
      • addedInput schema / properties / filePath / description
        Added value: +"Path of the Kanban board note (`.md`)."
      • addedOutput schema / properties / byColumn
        Added value: +{
        +  "additionalProperties": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "completed": {
        +        "type": "number"
        +      },
        +      "total": {
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "total",
        +      "completed"
        +    ],
        +    "type": "object"
        +  },
        +  "propertyNames": {
        +    "type": "string"
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / completed
        Added value: +{
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / completionRate
        Added value: +{
        +  "description": "Ratio 0..1 of completed to total cards.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / filePath
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / incomplete
        Added value: +{
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / total
        Added value: +{
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedOutput schema / required
        Added value: +[
        +  "filePath",
        +  "total",
        +  "completed",
        +  "incomplete",
        +  "completionRate",
        +  "byColumn"
        +]
    • Removedkanban.toggleCard
    • Changedlinks.backlinks8 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / contextLength / description
        Added value: +"Characters of context per hit. Default 80."
      • addedInput schema / properties / includeContext / description
        Added value: +"When true, each result carries a snippet of surrounding text for each backlink."
      • addedInput schema / properties / path / description
        Added value: +"Vault-relative path of the note whose inbound links we want."
      • addedOutput schema / description
        Added value: +"Standard list envelope used by list/search tools."
      • addedOutput schema / properties / items / description
        Added value: +"List of result items; per-item shape depends on the tool."
      • addedOutput schema / properties / items / items / description
        Added value: +"Freeform object. The specific shape depends on the tool; see the tool description."
      • addedOutput schema / properties / total / description
        Added value: +"Number of items in `items`."
    • Changedlinks.broken6 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / directory / description
        Added value: +"Optional folder to scope the scan. Omit to scan the whole vault."
      • addedOutput schema / description
        Added value: +"Standard list envelope used by list/search tools."
      • addedOutput schema / properties / items / description
        Added value: +"List of result items; per-item shape depends on the tool."
      • addedOutput schema / properties / items / items / description
        Added value: +"Freeform object. The specific shape depends on the tool; see the tool description."
      • addedOutput schema / properties / total / description
        Added value: +"Number of items in `items`."
    • Changedlinks.connections4 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / depth / description
        Added value: +"Traversal depth (hops). Default 2. Higher values quickly blow up result size."
      • addedInput schema / properties / noteName / description
        Added value: +"Name or path of the starting note. Basename match is fine."
      • addedOutput schema / description
        Added value: +"Freeform object. The specific shape depends on the tool; see the tool description."
    • Changedlinks.graph2 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedOutput schema / description
        Added value: +"Freeform object. The specific shape depends on the tool; see the tool description."
    • Changedlinks.health2 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedOutput schema / description
        Added value: +"Freeform object. The specific shape depends on the tool; see the tool description."
    • Changedlinks.hubs6 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / minOutlinks / description
        Added value: +"Minimum outgoing-link count for a note to qualify as a hub. Default 10."
      • addedOutput schema / description
        Added value: +"Standard list envelope used by list/search tools."
      • addedOutput schema / properties / items / description
        Added value: +"List of result items; per-item shape depends on the tool."
      • addedOutput schema / properties / items / items / description
        Added value: +"Freeform object. The specific shape depends on the tool; see the tool description."
      • addedOutput schema / properties / total / description
        Added value: +"Number of items in `items`."
    • Changedlinks.orphaned5 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedOutput schema / description
        Added value: +"Standard list envelope used by list/search tools."
      • addedOutput schema / properties / items / description
        Added value: +"List of result items; per-item shape depends on the tool."
      • addedOutput schema / properties / items / items / description
        Added value: +"Freeform object. The specific shape depends on the tool; see the tool description."
      • addedOutput schema / properties / total / description
        Added value: +"Number of items in `items`."
    • Changedlinks.outgoing6 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / checkValidity / description
        Added value: +"When true, each outgoing link is flagged `valid` or broken."
      • addedOutput schema / description
        Added value: +"Standard list envelope used by list/search tools."
      • addedOutput schema / properties / items / description
        Added value: +"List of result items; per-item shape depends on the tool."
      • addedOutput schema / properties / items / items / description
        Added value: +"Freeform object. The specific shape depends on the tool; see the tool description."
      • addedOutput schema / properties / total / description
        Added value: +"Number of items in `items`."
    • Removedmarp.deck.read
    • Removedmarp.frontmatter.update
    • Addedmarp.read
    • Removedmarp.slides.list
    • Removedmarp.slides.read
    • Removedmarp.slides.update
    • Addedmarp.update
    • Removedmermaid.blocks.list
    • Removedmermaid.blocks.read
    • Removedmermaid.blocks.update
    • Removednotes.append
    • Changednotes.create10 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedInput schema / properties / content
        Removed value: -{
        -  "type": "string"
        -}
      • removedInput schema / properties / overwrite
        Removed value: -{
        -  "type": "boolean"
        -}
      • removedInput schema / properties / path
        Removed value: -{
        -  "maxLength": 255,
        -  "minLength": 1,
        -  "type": "string"
        -}
      • removedInput schema / properties / vaultPath
        Removed value: -{
        -  "type": "string"
        -}
      • removedInput schema / required
        Removed value: -[
        -  "path",
        -  "content"
        -]
      • addedOutput schema / description
        Added value: +"Standard mutation envelope. Individual tools may attach additional fields (e.g. `created`, `appended`, `before`/`after` counts) — those are documented in the tool description."
      • addedOutput schema / properties / changed / description
        Added value: +"True if the tool altered vault state on this call; false if it was a no-op."
      • addedOutput schema / properties / summary / description
        Added value: +"Short human-readable summary of what happened."
      • addedOutput schema / properties / target / description
        Added value: +"The path or identifier the tool acted on."
    • Removednotes.createFolder
    • Changednotes.delete5 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedOutput schema / description
        Added value: +"Standard mutation envelope. Individual tools may attach additional fields (e.g. `created`, `appended`, `before`/`after` counts) — those are documented in the tool description."
      • addedOutput schema / properties / changed / description
        Added value: +"True if the tool altered vault state on this call; false if it was a no-op."
      • addedOutput schema / properties / summary / description
        Added value: +"Short human-readable summary of what happened."
      • addedOutput schema / properties / target / description
        Added value: +"The path or identifier the tool acted on."
    • Addednotes.edit
    • Addednotes.frontmatter
    • Removednotes.info
    • Removednotes.insertAfterBlock
    • Removednotes.insertAfterHeading
    • Changednotes.list12 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / dateField
        Added value: +{
        +  "description": "Which date the `since`/`until` filter applies to. Defaults to `modified`.",
        +  "enum": [
        +    "created",
        +    "modified"
        +  ],
        +  "type": "string"
        +}
      • removedInput schema / properties / directory
        Removed value: -{
        -  "maxLength": 255,
        -  "minLength": 1,
        -  "type": "string"
        -}
      • addedInput schema / properties / folder
        Added value: +{
        +  "description": "Optional folder to scope the listing.",
        +  "maxLength": 255,
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / include
        Added value: +{
        +  "default": "notes",
        +  "description": "What to list — markdown notes, folders, or both (returns items tagged by kind).",
        +  "enum": [
        +    "notes",
        +    "folders",
        +    "both"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / recursive / description
        Added value: +"Recurse into subfolders. Default false."
      • addedInput schema / properties / since
        Added value: +{
        +  "description": "Only include items dated on or after this ISO date.",
        +  "format": "date",
        +  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
        +  "type": "string"
        +}
      • addedInput schema / properties / until
        Added value: +{
        +  "description": "Only include items dated on or before this ISO date.",
        +  "format": "date",
        +  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
        +  "type": "string"
        +}
      • addedOutput schema / description
        Added value: +"Standard list envelope used by list/search tools."
      • addedOutput schema / properties / items / description
        Added value: +"List of result items; per-item shape depends on the tool."
      • addedOutput schema / properties / items / items / description
        Added value: +"Freeform object. The specific shape depends on the tool; see the tool description."
      • addedOutput schema / properties / total / description
        Added value: +"Number of items in `items`."
    • Removednotes.listFolders
    • Changednotes.move10 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedInput schema / properties / destinationPath
        Removed value: -{
        -  "maxLength": 255,
        -  "minLength": 1,
        -  "type": "string"
        -}
      • removedInput schema / properties / sourcePath
        Removed value: -{
        -  "maxLength": 255,
        -  "minLength": 1,
        -  "type": "string"
        -}
      • removedInput schema / properties / updateLinks
        Removed value: -{
        -  "type": "boolean"
        -}
      • removedInput schema / properties / vaultPath
        Removed value: -{
        -  "type": "string"
        -}
      • removedInput schema / required
        Removed value: -[
        -  "sourcePath",
        -  "destinationPath"
        -]
      • addedOutput schema / description
        Added value: +"Standard mutation envelope. Individual tools may attach additional fields (e.g. `created`, `appended`, `before`/`after` counts) — those are documented in the tool description."
      • addedOutput schema / properties / changed / description
        Added value: +"True if the tool altered vault state on this call; false if it was a no-op."
      • addedOutput schema / properties / summary / description
        Added value: +"Short human-readable summary of what happened."
      • addedOutput schema / properties / target / description
        Added value: +"The path or identifier the tool acted on."
    • Removednotes.moveFolder
    • Changednotes.read8 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / include
        Added value: +{
        +  "default": [
        +    "content",
        +    "metadata"
        +  ],
        +  "description": "Which sections to return. `content` = full body; `metadata` = parsed frontmatter and basic info; `stats` = word count, character count, heading count, link count, task count. Omit to get content + metadata.",
        +  "items": {
        +    "enum": [
        +      "content",
        +      "metadata",
        +      "stats"
        +    ],
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedInput schema / properties / path / description
        Added value: +"Vault-relative note path."
      • addedOutput schema / properties / content
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / metadata
        Added value: +{
        +  "additionalProperties": {},
        +  "propertyNames": {
        +    "type": "string"
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / path
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / stats
        Added value: +{
        +  "additionalProperties": {},
        +  "properties": {
        +    "characters": {
        +      "maximum": 9007199254740991,
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "headings": {
        +      "maximum": 9007199254740991,
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "links": {
        +      "maximum": 9007199254740991,
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "tasks": {
        +      "maximum": 9007199254740991,
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "words": {
        +      "maximum": 9007199254740991,
        +      "minimum": 0,
        +      "type": "integer"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / required
        Added value: +[
        +  "path"
        +]
    • Changednotes.search7 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / contextLength / description
        Added value: +"Characters of context to return around each match. Defaults to 80."
      • addedInput schema / properties / query / description
        Added value: +"Free-text search query. Supports lightweight `tag:foo` and `path:Journal/` filters in the query string."
      • addedOutput schema / description
        Added value: +"Standard list envelope used by list/search tools."
      • addedOutput schema / properties / items / description
        Added value: +"List of result items; per-item shape depends on the tool."
      • addedOutput schema / properties / items / items / description
        Added value: +"Freeform object. The specific shape depends on the tool; see the tool description."
      • addedOutput schema / properties / total / description
        Added value: +"Number of items in `items`."
    • Removednotes.searchByDate
    • Removednotes.update
    • Removednotes.updateFrontmatter
    • Removedstats.note
    • Changedstats.vault2 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedOutput schema / description
        Added value: +"Freeform object. The specific shape depends on the tool; see the tool description."
    • Changedsystem.version7 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedOutput schema / description
        Added value: +"Return shape for `system.version`."
      • addedOutput schema / properties / name / description
        Added value: +"npm package name of the running server."
      • addedOutput schema / properties / runtime / description
        Added value: +"Which runtime is executing the server."
      • addedOutput schema / properties / runtimeVersion / description
        Added value: +"Version of the runtime (bun or node)."
      • addedOutput schema / properties / summary / description
        Added value: +"Human-readable one-liner combining the fields above."
      • addedOutput schema / properties / version / description
        Added value: +"Semver version."
    • Removedtags.add
    • Changedtags.analyze8 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / description
        Added value: +"Arguments for `tags.analyze`."
      • addedInput schema / properties / path / description
        Added value: +"Vault-relative note path to analyze."
      • addedOutput schema / properties / allTags
        Added value: +{
        +  "description": "Union of frontmatter and inline tags, de-duplicated.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / frontmatterTags
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / inlineTags
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / path
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / required
        Added value: +[
        +  "path",
        +  "frontmatterTags",
        +  "inlineTags",
        +  "allTags"
        +]
    • Changedtags.list7 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / description
        Added value: +"Arguments for `tags.list`."
      • addedInput schema / properties / includeCounts / description
        Added value: +"When true, each entry carries `{tag, count}`; otherwise just `tag`."
      • addedInput schema / properties / sortBy / description
        Added value: +"Sort order for returned tags. `count` requires `includeCounts: true`."
      • addedOutput schema / properties / items / items / properties / count
        Added value: +{
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / items / items / properties / tag
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / items / items / required
        Added value: +[
        +  "tag"
        +]
    • Addedtags.modify
    • Removedtags.remove
    • Changedtags.search9 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / description
        Added value: +"Arguments for `tags.search`."
      • addedInput schema / properties / tag / description
        Added value: +"Tag to find. Leading `#` is stripped."
      • addedOutput schema / properties / items / items / properties / absolutePath
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / items / items / properties / file
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / items / items / properties / tagLocations
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "frontmatter": {
        +      "description": "True if the tag appears in the note's frontmatter `tags` list.",
        +      "type": "boolean"
        +    },
        +    "inline": {
        +      "description": "True if the tag appears as an inline `#tag` in the body.",
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "frontmatter",
        +    "inline"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / items / items / required
        Added value: +[
        +  "file",
        +  "absolutePath",
        +  "tagLocations"
        +]
      • addedOutput schema / properties / tag
        Added value: +{
        +  "description": "The normalized tag that was searched (leading `#` stripped).",
        +  "type": "string"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "total",
        -  "items"
        -]New value: +[
        +  "tag",
        +  "total",
        +  "items"
        +]
    • Removedtags.update
    • Changedtasks.create10 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / content / description
        Added value: +"Task body text (without the `- [ ]` checkbox)."
      • addedInput schema / properties / filePath / description
        Added value: +"Note to append the task to."
      • addedInput schema / properties / priority / description
        Added value: +"Tasks-plugin priority level."
      • addedInput schema / properties / recurrence / description
        Added value: +"Tasks-plugin recurrence expression, e.g. `every day`, `every week on Monday`, `every 2 weeks`."
      • addedInput schema / properties / status / description
        Added value: +"Initial checkbox state. Default `incomplete`."
      • addedOutput schema / description
        Added value: +"Standard mutation envelope. Individual tools may attach additional fields (e.g. `created`, `appended`, `before`/`after` counts) — those are documented in the tool description."
      • addedOutput schema / properties / changed / description
        Added value: +"True if the tool altered vault state on this call; false if it was a no-op."
      • addedOutput schema / properties / summary / description
        Added value: +"Short human-readable summary of what happened."
      • addedOutput schema / properties / target / description
        Added value: +"The path or identifier the tool acted on."
    • Changedtasks.search14 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / dueAfter / description
        Added value: +"Only tasks due strictly after this ISO date."
      • addedInput schema / properties / dueBefore / description
        Added value: +"Only tasks due strictly before this ISO date."
      • addedInput schema / properties / dueWithinDays / description
        Added value: +"Only tasks due within N days of today (inclusive)."
      • addedInput schema / properties / hasRecurrence / description
        Added value: +"Filter to recurring (or non-recurring) tasks."
      • addedInput schema / properties / limit / description
        Added value: +"Cap the number of results. Default: 500."
      • addedInput schema / properties / priority / description
        Added value: +"Tasks-plugin priority level."
      • addedInput schema / properties / sortBy / description
        Added value: +"Result ordering. Default: file then lineNumber."
      • addedInput schema / properties / status / description
        Added value: +"`incomplete` = open tasks `[ ]`; `completed` = done `[x]`; `all` = both."
      • addedInput schema / properties / tag / description
        Added value: +"Only tasks that carry this tag (leading `#` stripped)."
      • addedOutput schema / description
        Added value: +"Standard list envelope used by list/search tools."
      • addedOutput schema / properties / items / description
        Added value: +"List of result items; per-item shape depends on the tool."
      • addedOutput schema / properties / items / items / description
        Added value: +"Freeform object. The specific shape depends on the tool; see the tool description."
      • addedOutput schema / properties / total / description
        Added value: +"Number of items in `items`."
    • Changedtasks.stats2 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedOutput schema / description
        Added value: +"Freeform object. The specific shape depends on the tool; see the tool description."
    • Changedtasks.toggle8 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / doneDate / description
        Added value: +"When marking a task done, stamp this date into the `✅ YYYY-MM-DD` metadata. Defaults to today."
      • addedInput schema / properties / lineNumber / description
        Added value: +"1-based line number of the task line."
      • addedInput schema / properties / sourceFile / description
        Added value: +"Note containing the task."
      • addedOutput schema / description
        Added value: +"Standard mutation envelope. Individual tools may attach additional fields (e.g. `created`, `appended`, `before`/`after` counts) — those are documented in the tool description."
      • addedOutput schema / properties / changed / description
        Added value: +"True if the tool altered vault state on this call; false if it was a no-op."
      • addedOutput schema / properties / summary / description
        Added value: +"Short human-readable summary of what happened."
      • addedOutput schema / properties / target / description
        Added value: +"The path or identifier the tool acted on."
    • Changedtasks.updateMetadata7 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / lineNumber / description
        Added value: +"1-based line number of the task line to update."
      • addedInput schema / properties / priority / description
        Added value: +"Tasks-plugin priority level."
      • addedOutput schema / description
        Added value: +"Standard mutation envelope. Individual tools may attach additional fields (e.g. `created`, `appended`, `before`/`after` counts) — those are documented in the tool description."
      • addedOutput schema / properties / changed / description
        Added value: +"True if the tool altered vault state on this call; false if it was a no-op."
      • addedOutput schema / properties / summary / description
        Added value: +"Short human-readable summary of what happened."
      • addedOutput schema / properties / target / description
        Added value: +"The path or identifier the tool acted on."
    • Removedtemplates.createNote
    • Removedtemplates.createNoteTemplater
    • Removedtemplates.expand
    • Removedtemplates.insertTemplater
    • Changedtemplates.list5 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / templateFolder / description
        Added value: +"Folder to scan for templates. Defaults to the vault's configured Templates folder."
      • addedOutput schema / properties / items / items / properties / name
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / items / items / properties / path
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / items / items / required
        Added value: +[
        +  "path",
        +  "name"
        +]
    • Removedtemplates.renderTemplater
    • Addedtemplates.use
    • Addedvault.current
    • Addedvault.list
    • Addedvault.reset
    • Addedvault.select
    • Changedwiki.indexRebuild4 fields changed
      • addedOutput schema / description
        Added value: +"Standard mutation envelope. Individual tools may attach additional fields (e.g. `created`, `appended`, `before`/`after` counts) — those are documented in the tool description."
      • addedOutput schema / properties / changed / description
        Added value: +"True if the tool altered vault state on this call; false if it was a no-op."
      • addedOutput schema / properties / summary / description
        Added value: +"Short human-readable summary of what happened."
      • addedOutput schema / properties / target / description
        Added value: +"The path or identifier the tool acted on."
    • Changedwiki.ingest4 fields changed
      • addedOutput schema / description
        Added value: +"Standard mutation envelope. Individual tools may attach additional fields (e.g. `created`, `appended`, `before`/`after` counts) — those are documented in the tool description."
      • addedOutput schema / properties / changed / description
        Added value: +"True if the tool altered vault state on this call; false if it was a no-op."
      • addedOutput schema / properties / summary / description
        Added value: +"Short human-readable summary of what happened."
      • addedOutput schema / properties / target / description
        Added value: +"The path or identifier the tool acted on."
    • Changedwiki.init4 fields changed
      • addedOutput schema / description
        Added value: +"Standard mutation envelope. Individual tools may attach additional fields (e.g. `created`, `appended`, `before`/`after` counts) — those are documented in the tool description."
      • addedOutput schema / properties / changed / description
        Added value: +"True if the tool altered vault state on this call; false if it was a no-op."
      • addedOutput schema / properties / summary / description
        Added value: +"Short human-readable summary of what happened."
      • addedOutput schema / properties / target / description
        Added value: +"The path or identifier the tool acted on."
    • Changedwiki.lint1 field changed
      • addedOutput schema / description
        Added value: +"Freeform object. The specific shape depends on the tool; see the tool description."
    • Changedwiki.logAppend4 fields changed
      • addedOutput schema / description
        Added value: +"Standard mutation envelope. Individual tools may attach additional fields (e.g. `created`, `appended`, `before`/`after` counts) — those are documented in the tool description."
      • addedOutput schema / properties / changed / description
        Added value: +"True if the tool altered vault state on this call; false if it was a no-op."
      • addedOutput schema / properties / summary / description
        Added value: +"Short human-readable summary of what happened."
      • addedOutput schema / properties / target / description
        Added value: +"The path or identifier the tool acted on."
    • Changedwiki.query1 field changed
      • addedOutput schema / description
        Added value: +"Freeform object. The specific shape depends on the tool; see the tool description."
    • Changedwiki.summaryMerge4 fields changed
      • addedOutput schema / description
        Added value: +"Standard mutation envelope. Individual tools may attach additional fields (e.g. `created`, `appended`, `before`/`after` counts) — those are documented in the tool description."
      • addedOutput schema / properties / changed / description
        Added value: +"True if the tool altered vault state on this call; false if it was a no-op."
      • addedOutput schema / properties / summary / description
        Added value: +"Short human-readable summary of what happened."
      • addedOutput schema / properties / target / description
        Added value: +"The path or identifier the tool acted on."
    • Changedworkspace.activeFile2 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedOutput schema / description
        Added value: +"Freeform object. The specific shape depends on the tool; see the tool description."
    • Changedworkspace.closeActiveFile2 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedOutput schema / description
        Added value: +"Freeform object. The specific shape depends on the tool; see the tool description."
    • Addedworkspace.navigate
    • Removedworkspace.navigateBack
    • Removedworkspace.navigateForward
    • Changedworkspace.openFile4 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / filePath / description
        Added value: +"Vault-relative path of the note to open."
      • addedInput schema / properties / newPane / description
        Added value: +"Open in a new split pane instead of the current one. Defaults to false."
      • addedOutput schema / description
        Added value: +"Freeform object. The specific shape depends on the tool; see the tool description."
    • Changedworkspace.toggleEditMode2 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedOutput schema / description
        Added value: +"Freeform object. The specific shape depends on the tool; see the tool description."
  5. 92 tool updatesv0.1.0
    • First observedcanvas.addEdge
    • First observedcanvas.addNode
    • First observedcanvas.connections
    • First observedcanvas.create
    • First observedcanvas.parse
    • First observedcanvas.removeNode
    • First observedcommands.execute
    • First observedcommands.list
    • First observedcommands.search
    • First observeddataview.fields.add
    • First observeddataview.fields.extract
    • First observeddataview.fields.remove
    • First observeddataview.fields.search
    • First observeddataview.index.read
    • First observeddataview.js.read
    • First observeddataview.js.update
    • First observeddataview.listByFolder
    • First observeddataview.listByTag
    • First observeddataview.query
    • First observeddataview.query.read
    • First observeddataview.query.update
    • First observeddataview.table
    • First observedkanban.addCard
    • First observedkanban.moveCard
    • First observedkanban.parse
    • First observedkanban.stats
    • First observedkanban.toggleCard
    • First observedlinks.backlinks
    • First observedlinks.broken
    • First observedlinks.connections
    • First observedlinks.graph
    • First observedlinks.health
    • First observedlinks.hubs
    • First observedlinks.orphaned
    • First observedlinks.outgoing
    • First observedmarp.deck.read
    • First observedmarp.frontmatter.update
    • First observedmarp.slides.list
    • First observedmarp.slides.read
    • First observedmarp.slides.update
    • First observedmermaid.blocks.list
    • First observedmermaid.blocks.read
    • First observedmermaid.blocks.update
    • First observednotes.append
    • First observednotes.create
    • First observednotes.createFolder
    • First observednotes.delete
    • First observednotes.info
    • First observednotes.insertAfterBlock
    • First observednotes.insertAfterHeading
    • First observednotes.list
    • First observednotes.listFolders
    • First observednotes.move
    • First observednotes.moveFolder
    • First observednotes.read
    • First observednotes.search
    • First observednotes.searchByDate
    • First observednotes.update
    • First observednotes.updateFrontmatter
    • First observedstats.note
    • First observedstats.vault
    • First observedsystem.version
    • First observedtags.add
    • First observedtags.analyze
    • First observedtags.list
    • First observedtags.remove
    • First observedtags.search
    • First observedtags.update
    • First observedtasks.create
    • First observedtasks.search
    • First observedtasks.stats
    • First observedtasks.toggle
    • First observedtasks.updateMetadata
    • First observedtemplates.createNote
    • First observedtemplates.createNoteTemplater
    • First observedtemplates.expand
    • First observedtemplates.insertTemplater
    • First observedtemplates.list
    • First observedtemplates.renderTemplater
    • First observedwiki.indexRebuild
    • First observedwiki.ingest
    • First observedwiki.init
    • First observedwiki.lint
    • First observedwiki.logAppend
    • First observedwiki.query
    • First observedwiki.summaryMerge
    • First observedworkspace.activeFile
    • First observedworkspace.closeActiveFile
    • First observedworkspace.navigateBack
    • First observedworkspace.navigateForward
    • First observedworkspace.openFile
    • First observedworkspace.toggleEditMode

TDQS

A4.2/5.0
Disambiguation4/5

Tools are generally distinct with clear categories (notes, links, tags, etc.), but some potential overlap exists between dataview.query and dataview.fields.write, and between multiple search tools (notes.search, tags.search, tasks.search).

Naming Consistency5/5

All tools follow a consistent category.tool naming pattern with clear verbs (list, create, read, etc.), making the surface predictable and easy to navigate.

Tool Count3/5

42 tools is a large surface for an Obsidian assistant, covering many features but feeling somewhat heavy. Some tools could be consolidated (e.g., multiple links.* tools).

Completeness3/5

Covers core Obsidian operations well, but missing a notes.move tool for renaming, and no simple tool to list all notes (only search). Wiki tools are extensive but other areas are slightly incomplete.

Maintenance

ActivityMaintained
ResponsivenessWithin a week

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

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

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    Not graded
    maintenance
    This is a connector to allow Claude Desktop (or any MCP client) to read and search any directory containing Markdown notes (such as an Obsidian vault).
    1,444
    1,352
    AGPL 3.0
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables AI assistants to interact with Obsidian vaults, providing tools for reading, creating, editing and managing notes and tags.
    4,785
    733
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    MCP server that implements Karpathy's LLM Wiki pattern for Obsidian vaults, enabling persistent knowledge storage and BM25 search across AI sessions.
    14
    1
    MIT

Latest Blog Posts

MCP directory API

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

curl -X GET 'https://glama.ai/api/mcp/v1/servers/bezata/kObsidian'

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