Skip to main content
Glama

obsidian-mcp-pro

The most feature-complete MCP server for Obsidian vaults.

Please star us on GitHub, it helps us reach more users!

Patreon Ko-fi

💙 Support this project. obsidian-mcp-pro is free and open-source. If it saves you time, consider becoming a patron for ongoing support, or tipping on Ko-fi for a one-time thanks. Patrons get release notes early, priority on bug reports, and (optionally) their name in the README.

obsidian-mcp-pro MCP server

npm version npm downloads GitHub stars License: MIT Node >= 24 Tests Tool Quality

Give AI assistants deep, structured access to your Obsidian knowledge base. Read, write, search, tag, analyze links, traverse graphs, manipulate canvases, query Bases, edit by heading or block reference, run semantic search, and pull binary attachments. All through the Model Context Protocol.

41 tools, 5 prompts, 3 resources. Every tool ships with rich descriptions, typed schemas, human-readable titles, and safety annotations (readOnlyHint, destructiveHint, idempotentHint) so your agent picks the right tool, passes the right arguments, and handles results correctly. The original 23 tools earned an average 4.40/5 score and all-A grades on Glama's quality index; the 18 newer ones follow the same authoring conventions documented in docs/TOOL_AUTHORING.md.


Contents


Related MCP server: Vault Cortex Obsidian MCP Server

Features

  • Focus-ranked full-text search across all vault notes, with query-centered snippets (cached: re-runs only re-read changed files)

  • Read individual notes whole, or as a fragment by heading path, block id, or line range

  • List and filter notes by folder, date, or pattern

  • Search by frontmatter fields and values

  • Retrieve daily notes automatically using the vault's configured filename format

  • get_recent_notes orders by mtime; get_vault_stats reports counts, words, tag coverage; resolve_alias translates a display name to a real note path

Write & Modify

  • Create new notes with frontmatter and content

  • Append or prepend content to existing notes

  • Update frontmatter properties programmatically (merge: unlisted keys are preserved)

  • Move and rename notes (rewrites every wikilink, markdown link, and canvas reference across the vault by default)

  • Delete notes safely; moved to the vault's .trash folder by default, with an optional permanent flag and elicitation-based confirmation

  • Surgical edits by heading: update_section, insert_at_section, list_sections, plus single-note replace_in_note (regex with match-count guard) and edit_block for paragraphs tagged with ^id

Tags

  • Build and query a complete tag index (incremental: cached across runs)

  • Search notes by single or multiple tags

  • rename_tag rewrites both inline #tag occurrences and frontmatter tags: arrays vault-wide; hierarchical mode also rebases nested sub-tags (project/alpha follows project)

  • Get backlinks (what links to a note)

  • Get outlinks (what a note links to)

  • Find orphan notes with no inbound or outbound links

  • Detect broken links pointing to non-existent notes

  • Traverse graph neighbors to a configurable depth

Canvas

  • Read .canvas files with full node and edge data

  • Add new nodes (text, file, link, group) to canvases

  • Add edges between canvas nodes

  • List all canvases in the vault

Bases (Obsidian 1.10+)

  • list_bases enumerates .base files

  • read_base returns the parsed YAML (filters, properties, views)

  • query_base runs the filter DSL against the vault and returns matching notes; supports taggedWith(), file.hasTag(), file.inFolder(), comparison operators, and and/or/not combinators. Unsupported filters warn and fail closed instead of broadening results.

Attachments

  • list_attachments enumerates every non-md/canvas/base file with a per-extension count summary

  • find_unused_attachments flags assets no note references via embeds or markdown links; optional reclaimable-bytes report

  • get_attachment returns image / audio / blob bytes inline as MCP content blocks (5 MB default cap, 50 MB hard cap)

Semantic Search (optional, Ollama or OpenAI)

  • index_vault chunks each note (heading-aware), embeds via the configured provider, persists vectors to <vault>/.obsidian/cache/, and incrementally re-embeds only changed notes

  • Because indexing sends readable note chunks to the configured embedding provider, index_vault requires confirm: "send-vault-text-to-embedding-provider" on each call

  • search_semantic ranks notes by cosine similarity against an embedded query

  • find_similar_notes reuses an existing note's embeddings, with source-topic anchoring, to surface neighbors without a live API call

  • Stored snippets are returned only while the current note content hash still matches the indexed text; stale chunks are pruned on search

MCP Resources

  • obsidian://note/{path} reads any note by its vault-relative path

  • obsidian://tags retrieves the full tag index as JSON

  • obsidian://daily gets today's daily note content

MCP Prompts

The server exposes five starter prompts that clients (Claude Desktop, Cursor) surface in their slash-command palette:

  • daily-review walks today's daily note, surfaces unchecked tasks, and proposes follow-ups

  • weekly-rollup aggregates the last seven daily notes into themes / decisions / open tasks

  • find-stale-notes locates untouched notes and clusters them as orphaned vs. broken-linked vs. still-linked

  • extract-action-items pulls all - [ ] … lines from a note (or every note matching a tag) into a checklist

  • build-moc generates a Map of Content (MOC) for a tag or folder

Operational features

  • Folder-scoped permissions: OBSIDIAN_READ_PATHS / OBSIDIAN_WRITE_PATHS allowlists gate every tool at the path-resolution choke point

  • In-memory mtime cache speeds repeated vault scans within a running process without persisting note bodies to disk

  • Progress notifications (notifications/progress) on rename_tag, find_unused_attachments, and index_vault when the client subscribes via _meta.progressToken

  • Hard bulk-write latches require confirmPath for default move_note reference rewrites, confirmTag for non-dry-run rename_tag, and confirm=true for permanent deletion; clients with elicitation support also get typed prompts


Quick Start

Using Obsidian? There's also an Obsidian plugin that runs this server inside the app with a ribbon toggle and settings UI — no config-file editing. Recommended for most users.

One-Command Install (Claude Desktop / Cursor)

npx -y obsidian-mcp-pro install

This merges an entry into your claude_desktop_config.json (or ~/.cursor/mcp.json with --client=cursor), backs up the previous file, and prints next steps. Works on macOS, Windows, and Linux.

Pin a specific vault:

npx -y obsidian-mcp-pro install --vault /path/to/your/vault

Manual Claude Desktop Config

Add this to your Claude Desktop configuration file (claude_desktop_config.json):

{
  "mcpServers": {
    "obsidian": {
      "command": "npx",
      "args": ["-y", "obsidian-mcp-pro"]
    }
  }
}

If you have multiple vaults, specify which one:

{
  "mcpServers": {
    "obsidian": {
      "command": "npx",
      "args": ["-y", "obsidian-mcp-pro"],
      "env": {
        "OBSIDIAN_VAULT_PATH": "/path/to/your/vault"
      }
    }
  }
}

Claude Code

claude mcp add obsidian-mcp-pro -- npx -y obsidian-mcp-pro

HTTP Transport (Remote Clients, Cursor, ChatGPT, Web)

MCP_HTTP_TOKEN=your-secret npx -y obsidian-mcp-pro --transport=http --port=3333

Endpoint: http://127.0.0.1:3333/mcp (Streamable HTTP). HTTP transport requires a bearer token:

MCP_HTTP_TOKEN=your-secret npx -y obsidian-mcp-pro --transport=http

The HTTP server binds to 127.0.0.1 by default with DNS rebinding protection enabled. Startup always requires MCP_HTTP_TOKEN, including loopback-only local servers. The old --token flag was removed because command-line secrets can be exposed through OS process listings.

When embedding the library, set allowedHosts to accept additional destination addresses, such as the hostname forwarded by an HTTPS reverse proxy:

import { buildMcpServer, startHttpServer } from "obsidian-mcp-pro";

const vaultPath = process.env.OBSIDIAN_VAULT_PATH!;
const server = await startHttpServer({
  host: "127.0.0.1",
  port: 3333,
  bearerToken: process.env.MCP_HTTP_TOKEN!,
  allowedHosts: ["vault.example.com", "192.0.2.10:3333"],
  buildMcpServer: () => buildMcpServer(vaultPath),
  installSignalHandlers: false,
});

// On application shutdown:
await server.stop();
  • Entries match the HTTP Host header exactly and case-sensitively, including a port when present. Use vault.example.com:443 if the proxy forwards that value instead of vault.example.com. IPv6 must keep brackets ([::1]:port). There is no IDN / punycode normalization. Do not include schemes, paths, or wildcards; "*" is rejected at startup (it is not a wildcard).

  • Configured entries extend the bound-address and loopback defaults. Omitting allowedHosts or passing [] preserves the defaults.

  • The server copies and validates the list at startup. Restart it to apply configuration changes. Listen-time logs include the effective Host allowlist (never the bearer token).

  • /health and /version skip Host validation (pre-existing). /mcp rejects a disallowed Host with 403 and a warn log, including when the bearer is valid.

  • This controls destination addresses, not client identity. Bearer authentication and Origin validation still apply; DNS-rebinding protection remains enabled.

  • This is an embedding API option, not a CLI flag.

WARNING

Never bind --host=0.0.0.0 directly to the public internet. Doing so exposes your entire Obsidian vault to anyone who can reach the port. The server refuses HTTP startup without a bearer token, but if you need remote access:

  • Put the server behind a reverse proxy (nginx, Caddy, Cloudflare Tunnel) that terminates TLS, and

  • Set MCP_HTTP_TOKEN, and

  • Restrict --allow-origin to the specific origins you trust, and

  • Set --rate-limit to cap request volume per IP.

For local-only setups (same machine / VPN / SSH tunnel), keep the default 127.0.0.1 bind.

Additional hardening flags:

Flag

Purpose

--allow-origin=<csv>

Restrict CORS to an allowlist (e.g. https://claude.ai,https://chat.openai.com). Default is localhost-only; * requires bearer auth.

--rate-limit=<n>

Cap requests per minute per client IP. /health and /version are exempt. Default is unlimited.

Operational endpoints (no auth required):

Endpoint

Returns

GET /health

{ status: "ok", version: <string> } — liveness for monitoring.

GET /version

{ version: <string> } — package version, for rollout auditing.

Structured logging is controlled by LOG_LEVEL (debug/info/warn/error/silent, default info) and LOG_FORMAT (text/json, default text). All logs go to stderr so the stdio transport on stdout is never polluted, with absolute paths, vault-relative path fields, secret-bearing URLs, and control characters redacted before write.


Usage

Once installed, the server exposes 41 tools, 5 prompts, and 3 resources to whichever MCP client you configured. Below is a transcript of a Claude Desktop conversation showing what day-to-day use looks like.

You: Find notes tagged #project I touched this week, then summarize the status of each and append today's date under a "Last reviewed" heading in each one.

Claude picks the right tools in order, with no guidance beyond the prompt:

🔧 search_by_tag(tag="project", includeContent=false)
  → 7 notes: "Atlas/overview.md", "Atlas/milestones.md", "Beacon/spec.md", ...

🔧 list_notes(folder="Atlas", limit=100)
  → filters to recent modifications via get_note stats

🔧 get_note(path="Atlas/overview.md")
  → reads content + frontmatter + tags

🔧 get_note(path="Atlas/milestones.md")
  → ...

🔧 append_to_note(
    path="Atlas/overview.md",
    content="\n## Last reviewed\n2026-04-21 — on track; waiting on design review."
  )
  → ok

🔧 append_to_note(
    path="Atlas/milestones.md",
    content="\n## Last reviewed\n2026-04-21 — Q2 milestone at risk, see spec.md."
  )
  → ok

Claude: I reviewed 7 project notes tagged #project. Atlas is on track pending design review; the Q2 milestone is at risk — details in milestones.md. Beacon's spec is complete but has 3 open questions in the frontmatter. I appended a "Last reviewed" section to each.

Other things the tool set lets agents do without hand-holding:

  • Research a topic across the vault. search_notesget_outlinksget_graph_neighbors walks the graph to depth=2 and surfaces related notes the user may have forgotten.

  • Clean up dangling references after a rename. move_notefind_broken_links returns every wikilink that now points nowhere, with source note and line number.

  • Maintain a daily log. get_daily_note reads today's note (using the vault's configured date format) and append_to_note adds the new entry — daily-note plugin config is honored, no manual date formatting.

  • Canvas editing. read_canvas → agent reasons about the node graph → add_canvas_node + add_canvas_edge lays out new ideas on an existing board.

Tool descriptions + typed schemas + safety hints (readOnlyHint, destructiveHint) are what make this work reliably — the agent knows delete_note is destructive and asks first, knows search_notes is free to call speculatively, and knows the expected shape of every argument.


Configuration

The server locates your vault using the following priority:

Priority

Method

Description

1

OBSIDIAN_VAULT_PATH

Environment variable with the absolute path to your vault

2

OBSIDIAN_VAULT_NAME

Environment variable to select a vault by folder name when multiple vaults exist

3

Auto-detection

Reads Obsidian's global config (obsidian.json) and uses the first valid vault found

Auto-detection works on macOS, Windows, and Linux by reading the platform-specific Obsidian configuration directory.

Environment Variables

Every setting is optional unless noted. The sections below explain the grouped ones in depth.

Variable

Purpose

Default

OBSIDIAN_VAULT_PATH

Absolute path to the vault (highest-priority vault selector).

auto-detect

OBSIDIAN_VAULT_NAME

Select a vault by folder name when several exist.

first valid vault

OBSIDIAN_READ_PATHS

Comma/colon list of folders read tools may access (see Folder-Scoped Permissions).

unrestricted

OBSIDIAN_WRITE_PATHS

Same shape, for mutating tools.

unrestricted

OBSIDIAN_CACHE_DISABLED

Set truthy to disable the in-memory mtime cache (see Caches).

enabled

OBSIDIAN_EMBEDDING_PROVIDER

Semantic-search provider, e.g. openai (see Semantic Search Provider).

unset (disabled)

OBSIDIAN_EMBEDDING_MODEL

Embedding model name for the chosen provider.

provider default

OBSIDIAN_EMBEDDING_URL

Override the embedding endpoint base URL.

provider default

OBSIDIAN_EMBEDDING_API_KEY

API key for the embedding provider.

falls back to OPENAI_API_KEY

OPENAI_API_KEY

Used as the embedding key when OBSIDIAN_EMBEDDING_API_KEY is unset.

unset

MCP_HTTP_TOKEN

Bearer token required by the HTTP transport (see HTTP Transport).

unset

LOG_LEVEL

Logger verbosity: debug, info, warn, error.

info

LOG_FORMAT

Log output format: text or json.

text

Daily-Note Filename Format

get_daily_note, create_daily_note, and the obsidian://daily resource render the note path using your vault's .obsidian/daily-notes.json format string. Moment.js-style tokens are supported:

Token

Example

Token

Example

YYYY

2026

dddd

Thursday

YY

26

ddd

Thu

MMMM

April

dd

Th

MMM

Apr

HH / H

05 / 5

MM / M

04 / 4

hh / h

05 / 5

DD / D

09 / 9

mm / m

07 / 7

Do

9th

ss / s

03 / 3

DDDD / DDD

099 / 99

Q

2

[literal]

renders the bracket contents verbatim, e.g. YYYY-[Q]Q2026-Q2

Unrecognized tokens pass through unchanged. Local time is used (matching Obsidian's rendering).

Folder-Scoped Permissions

Restrict the tools' read/write surface to specific folders without exposing the rest of the vault:

Env var

Purpose

OBSIDIAN_READ_PATHS

Comma- or colon-separated list of folders that read tools may access. Unset means unrestricted. Use . to mean the vault root.

OBSIDIAN_WRITE_PATHS

Same shape, but for mutations (create / append / update / delete / move / surgical edits).

Read and write are independent, so an audit account can be read-only on most of the vault but write-only to a Drafts/ folder. Moving a note requires read access to the source and write access to the destination, because the move carries the source content into its new folder. Surgical edits (replace_in_note, update_section, insert_at_section, and edit_block) require read access to the target plus write access because they inspect existing content before writing. In-vault symlinks are checked against their real target before the allowlist decision is finalized. The startup log line and --help advertise the active scope. The allowlist is enforced at a single path-resolution choke point so every tool inherits it.

Caches

The note-content mtime cache is in-memory only. It speeds repeated vault-wide scans inside the running process, but it does not persist note bodies or absolute paths to disk. Any legacy <vault>/.obsidian/cache/mcp-pro-index-cache.json snapshot is ignored and removed on first cache use.

Semantic embeddings live under <vault>/.obsidian/cache/:

File

Purpose

mcp-pro-embeddings.json

Persisted embeddings for semantic search (only present once index_vault has run). Vault-relocation safe via an embedded vaultRoot check; switching providers/models or stale note content invalidates entries automatically.

The embedding cache is vault-local, excluded from vault scans (.obsidian/ is pruned), and can be deleted at any time. Persistence can be turned off with OBSIDIAN_CACHE_DISABLED=1.

Semantic Search Provider

The semantic-search tools (index_vault, search_semantic, find_similar_notes) need an embedding provider. Configure via env:

Env var

Default

Notes

OBSIDIAN_EMBEDDING_PROVIDER

ollama if unset or blank

ollama, openai, or none to disable.

OBSIDIAN_EMBEDDING_MODEL

nomic-embed-text (Ollama), text-embedding-3-small (OpenAI) if unset or blank

Provider-specific model identifier.

OBSIDIAN_EMBEDDING_URL

http://localhost:11434 (Ollama), https://api.openai.com/v1 (OpenAI) if unset or blank

Base URL without credentials, query strings, or fragments.

OBSIDIAN_EMBEDDING_API_KEY

OPENAI_API_KEY falls back if unset or blank

Required for hosted providers.

For local Ollama: install Ollama, then ollama pull nomic-embed-text. The semantic tools register even when no provider is configured, so they're discoverable; calls return a configuration hint until set up.

index_vault sends readable note chunks to that provider. Calls must include:

{ "confirm": "send-vault-text-to-embedding-provider" }

This latch is per call so scripted index refreshes have to keep the privacy decision visible.

Observability

Logs stream to stderr as either plain text (default) or single-line JSON, controlled by LOG_LEVEL (debug/info/warn/error/silent) and LOG_FORMAT (text/json). Local stderr and MCP-forwarded log payloads both redact absolute paths, vault-relative path fields, secret-bearing URLs, and control characters.

The server also declares the MCP logging capability, so every log line is forwarded to the connected client as a notifications/message frame alongside tool responses. Clients that honor logging/setLevel can filter server-side logs at runtime without restarting. Claude Desktop surfaces these in its MCP DevTools pane; most other clients currently ignore them, so this is useful primarily for self-hosters and tooling authors.


Security

  • Vault boundary — every tool and resource routes through a single path resolver that rejects .. traversal, null-byte injection, and symlinks pointing outside the vault (ancestor-realpath check). On Windows it also rejects reserved device names, alternate data stream syntax, and trailing-dot/space filename aliases.

  • Note/file boundary — note read and edit surfaces only target .md files; attachments, Canvas files, and Bases stay on their dedicated tools with their own caps and parsers.

  • Full-note cap — full .md note reads and read-modify-write helpers refuse notes over 5 MiB before materializing them; get_note line fragments still stream from large notes for targeted inspection.

  • Excluded directories.obsidian, .git, and .trash are pruned at traversal time and at resolution time, so nested occurrences never leak back to clients.

  • HTTP transport — requires a bearer token at startup and binds to 127.0.0.1 by default with DNS rebinding protection (host-header allowlist). /mcp requests must send Authorization: Bearer <secret>, compared in constant time. Malformed request URL or Host data is rejected before routing.

  • Attachment safety — executable extensions are blocked, SVGs are returned as text/plain, and active text formats such as HTML/XML/CSS are served with text/plain resource metadata.

  • Canvas link safety — Canvas link nodes added through the server accept only absolute http:// and https:// URLs, preventing local file and application-protocol links from being persisted by tool calls.

  • Regex edit safetyreplace_in_note caps regex pattern/input size and rejects backtracking-prone repeated groups before matching.

  • Error and log sanitization — filesystem error messages are stripped of absolute host paths before being returned to MCP clients, local stderr and MCP-forwarded logs redact paths and secret-bearing URLs, ASCII control bytes and Unicode bidi controls are escaped in displayed values, and note-derived duplicate-alias text is not copied into graph warnings. Uncaught HTTP errors respond with a generic Internal server error body while server logs keep sanitized diagnostics.

  • Untrusted vault text boundaries — tool outputs that include note bodies, read, search result, semantic result, semantic index failure, write rewrite-warning, link-graph, attachment, Base, and Canvas path summaries, attachment extension summaries, search snippets, semantic snippets and heading paths, tag lists, tag search result paths and previews, tag rename skipped-note rows, frontmatter values, Base data, wikilink targets in link-analysis output, SVG attachment text, section headings, Canvas node identities, colors, previews, edge endpoints, and edge labels, or backlink context wrap those vault-authored portions in [BEGIN UNTRUSTED VAULT CONTENT: ...] / [END UNTRUSTED VAULT CONTENT: ...] markers before they enter an MCP client's model context. Note and daily resources use the same visible boundaries for markdown bodies and carry _meta["obsidian-mcp-pro/contentTrust"] = "untrusted-vault-content".

  • YAML parser boundaries — Obsidian properties are parsed only from --- YAML delimiter lines; non-YAML gray-matter language blocks stay as body text, oversized frontmatter is skipped on reads and refused for metadata updates, and note/Base YAML containing anchors or aliases is not parsed.

  • Semantic index freshnesssearch_semantic and find_similar_notes re-check current note content hashes before returning stored snippets or source-note embeddings, pruning stale cache entries instead of surfacing old note text.

  • Semantic indexing confirmationindex_vault refuses to read and embed vault notes unless the call includes confirm: "send-vault-text-to-embedding-provider", making provider-bound note transfer explicit.

  • Bulk-write confirmationsmove_note reference rewrites require confirmPath to match the destination path, and non-dry-run rename_tag requires confirmTag to match the new tag. Clients that support MCP elicitation are also asked to re-type the destination path or new tag before the rewrite runs.

  • Atomic writes — every note write (create_note, append, prepend, update_frontmatter, canvas mutations) stages content to a sibling temp file then renames onto the target, so a crash or kill mid-write never leaves a truncated file. Combined with per-path locks for the full read-modify-write cycle, concurrent callers can't lose each other's updates. The install subcommand uses the same pattern and keeps a backup of the previous config.

  • Rate limiting + CORS allowlist — optional --rate-limit caps per-IP request volume; --allow-origin restricts browser-facing CORS and refuses * unless bearer auth is enabled. /health and /version stay reachable under load for monitoring.

  • Request timeout — HTTP POST requests are capped at 2 minutes of wall-clock time. Long-lived SSE GET streams are exempt so idle clients aren't reaped.

  • Process supervisionuncaughtException exits cleanly so systemd/Docker/npx supervisors can restart; unhandledRejection logs but doesn't kill the process.


[[Target]] resolves in the same order Obsidian does:

  1. Exact relative-path match (case-insensitive).

  2. Path-suffix match (e.g. [[projects/foo]] picks work/projects/foo.md).

  3. Basename match. When multiple notes share a basename, the one that shares the deepest directory prefix with the linking note wins; ties break on shortest overall path.

  4. Frontmatter aliases[[Display Name]] resolves to a note whose frontmatter declares that alias. aliases, Aliases, and ALIASES are all recognized.

Tag extraction is similarly case-tolerant: tags, Tags, TAGS, tag, and Tag frontmatter keys are all read.


Tool Reference

Read

Tool

Description

Key Parameters

search_notes

Focus-ranked full-text search with query-centered snippets (cached)

query, caseSensitive, maxResults, folder

get_note

Read a note whole, or by section / block / lines

path, section, block, lines

list_notes

List notes in the vault or a folder

folder, limit

get_daily_note

Get today's (or a specific date's) daily note

date

search_by_frontmatter

Find notes by frontmatter property values with case-insensitive key/value matching

property, value, folder

get_recent_notes

Notes sorted by mtime; optional ISO-or-relative since filter

limit, since, folder

get_vault_stats

Vault counts, bytes, words, tag coverage, most-recent note

folder

resolve_alias

Translate frontmatter alias (or basename) to note path

name, includeBasename

Write

Tool

Description

Key Parameters

create_note

Create a new note with content and frontmatter

path, content, frontmatter

append_to_note

Append content to an existing note

path, content, ensureNewline

prepend_to_note

Prepend content after frontmatter

path, content

update_frontmatter

Update frontmatter properties on a note

path, properties

create_daily_note

Create today's daily note from template

date, content, templatePath

move_note

Move or rename a note; rewrites references across the vault

oldPath, newPath, updateLinks, confirmPath

delete_note

Delete a note (trash by default); optional elicitation on permanent

path, permanent, removeReferences

Section-level edits

Tool

Description

Key Parameters

update_section

Replace the body under a heading path (heading kept)

path, section, newBody

insert_at_section

Insert at before / after-heading / append of a section

path, section, content, position

list_sections

Return the heading outline of a note as an indented tree

path

replace_in_note

Find/replace within one note (literal or regex, with match-count guard)

path, find, replace, regex, flags, expectedCount

edit_block

Replace content of a paragraph tagged ^id (anchor preserved)

path, block, newContent

Tags

Tool

Description

Key Parameters

get_tags

Get all tags and their usage counts

sortBy

search_by_tag

Find all notes with a specific tag

tag, includeContent

rename_tag

Rewrite inline + frontmatter occurrences vault-wide; hierarchical

oldName, newName, hierarchical, dryRun, confirmTag

Tool

Description

Key Parameters

get_backlinks

Get all notes that link to a given note

path

get_outlinks

Get all links from a given note

path

find_orphans

Find notes with no links in or out

includeOutlinksCheck

find_broken_links

Detect links pointing to non-existent notes

folder

get_graph_neighbors

Get notes connected within N link hops

path, depth, direction

Canvas

Tool

Description

Key Parameters

list_canvases

List all .canvas files in the vault

(none)

read_canvas

Read a bounded .canvas node/edge summary

path

add_canvas_node

Add a node to a canvas

canvasPath, type, content, x, y

add_canvas_edge

Add an edge between two canvas nodes

canvasPath, fromNode, toNode

Bases

Tool

Description

Key Parameters

list_bases

Enumerate .base files in the vault

(none)

read_base

Parse a Base file (filters, properties, views)

path

query_base

Run a Base's filter DSL against the vault; unsupported filters warn and fail closed

path, view, limit, includeFrontmatter

Attachments

Tool

Description

Key Parameters

list_attachments

Enumerate every non-md/canvas/base file

extension, limit

find_unused_attachments

Attachments not referenced via embeds or markdown links

limit, includeBytes

get_attachment

Return image / audio / blob content (5 MB default cap)

path, maxBytes

Tool

Description

Key Parameters

index_vault

Build / refresh the embedding index (incremental, progress events)

force, folder, confirm

search_semantic

Cosine search the embedding index for a natural-language query

query, limit, folder, includeSnippet

find_similar_notes

Surface notes most similar to a source note, anchored to its opening topic (no live API call)

path, limit


MCP Resources

Resources provide a URI-based way to access vault data:

Resource URI

Description

obsidian://note/{path}

Read any note by its vault-relative path

obsidian://tags

Full tag index with file lists (JSON)

obsidian://daily

Today's daily note content


Troubleshooting

Tools Don't Show Up in Claude Desktop

MCP clients only re-read their config on startup. After editing claude_desktop_config.json (or running npx obsidian-mcp-pro install), fully quit Claude Desktop (⌘Q on macOS, tray → Quit on Windows) and relaunch. Hot-reloading the window is not enough.

"No Obsidian vault configured" on Startup

The server couldn't locate a vault. Resolution order is:

  1. OBSIDIAN_VAULT_PATH env var (absolute path) — always wins if set.

  2. OBSIDIAN_VAULT_NAME env var — picks a named vault from Obsidian's global config.

  3. Auto-detection — reads obsidian.json (platform-specific) and uses the first valid vault found.

Fastest fix: set OBSIDIAN_VAULT_PATH in the env block of your MCP client's config. Auto-detection fails when Obsidian has never been launched, obsidian.json is missing/corrupt, or all registered vaults resolve to paths that no longer exist.

"Path traversal detected" Error on Tool Calls

All tool paths must be vault-relative (e.g. notes/hello.md), never absolute (/Users/me/vault/notes/hello.md) or containing ... The agent normally gets this right — if you see this error, check whether a custom instruction is asking it to use absolute paths.

HTTP Transport Returns 401 Unauthorized

The server was started with MCP_HTTP_TOKEN but the client isn't sending a matching Authorization: Bearer <secret> header. Verify the token value and that the header is present — comparison is case-sensitive and constant-time.

HTTP Transport Returns 429 Too Many Requests

--rate-limit=<n> is set and the client exceeded N requests in the last 60 seconds from that IP. Either raise the limit, drop it, or wait 60 seconds. /health and /version are exempt if you need to check liveness under load.

Daily-Note Path Is Wrong or Unresolved

The server reads .obsidian/daily-notes.json from the vault for the filename format and folder. If that file doesn't exist (the Daily Notes core plugin has never been configured), the server falls back to YYYY-MM-DD.md in the vault root. Configure the plugin once inside Obsidian and the server picks it up automatically.

npx obsidian-mcp-pro Silently Exits With Code 0

This was a bug in versions < 1.4.1 where the npx-symlinked CLI entry failed to detect itself as the entrypoint. Upgrade: npx -y obsidian-mcp-pro@latest install.

Windows: "EPERM: operation not permitted" During Writes

The server retries these transparently (Windows holds stricter file-sharing locks than POSIX) — if you still see the error, it usually means antivirus or a sync client (OneDrive, Dropbox) is holding the file. Exclude the vault folder from real-time antivirus scanning, or pause the sync client during heavy agent sessions.


Development

# Clone the repository
git clone https://github.com/rps321321/obsidian-mcp-pro.git
cd obsidian-mcp-pro

# Install dependencies
npm install

# Build
npm run build

# Run the full local maintenance gate
npm run verify

# Run in development (watch mode)
npm run dev

# Start the server locally
OBSIDIAN_VAULT_PATH=/path/to/vault npm start

GitHub Actions workflows are manual-only in this repository. Use npm run verify as the required local gate before merging or publishing.

Commits run a local Husky hook that rejects maintainer-only paths, formats staged files, then runs the type-checker and test suite. Run npm ci after cloning to install the hook.

Project Structure

src/
  index.ts                # Server entry, CLI parser, resource + prompt registration
  config.ts               # Vault detection, daily-notes config loader
  http-server.ts          # Streamable HTTP transport, Bearer auth, session TTL
  install.ts              # `install` subcommand (Claude Desktop / Cursor)
  types.ts                # Shared TypeScript interfaces
  lib/
    vault.ts              # Core vault ops (read, search, list, per-file locks,
                          # symlink boundary, canvas + base + attachment round-trip)
    permissions.ts        # OBSIDIAN_READ_PATHS / OBSIDIAN_WRITE_PATHS allowlist
    markdown.ts           # Frontmatter, wikilinks, tags, alias-aware resolver
    sections.ts           # Heading parser, block-id parser, section bounds
    tag-rewriter.ts       # Vault-wide tag rewriting (inline + frontmatter)
    link-rewriter.ts      # Plan/apply edit pipeline used by move + delete
    bases.ts              # Bases YAML parser + filter DSL evaluator
    chunker.ts            # Heading-aware chunking for embeddings
    embedding-providers.ts# Ollama + OpenAI providers
    embedding-store.ts    # Persistent vector index, cosine search
    index-cache.ts        # mtime-keyed content cache (in-memory)
    progress.ts           # MCP progress-notification helper
    mime.ts               # extension -> MIME map for attachments
    dates.ts              # Moment-style date format for daily-note filenames
    errors.ts             # sanitizeError: strips absolute paths from fs errors
    concurrency.ts        # Bounded-concurrency fan-out helper
    logger.ts             # Leveled stderr logger (text + JSON modes)
  tools/
    read.ts               # search, get, list, daily, frontmatter, recent, stats, alias
    write.ts              # create, append, prepend, update_frontmatter, move, delete
    sections.ts           # update_section, insert_at_section, list_sections,
                          # replace_in_note, edit_block
    tags.ts               # get_tags, search_by_tag, rename_tag
    links.ts              # backlinks, outlinks, orphans, broken, graph_neighbors
    canvas.ts             # list, read, add_node, add_edge
    bases.ts              # list_bases, read_base, query_base
    attachments.ts        # list_attachments, find_unused_attachments, get_attachment
    semantic.ts           # index_vault, search_semantic, find_similar_notes
    prompts.ts            # daily-review, weekly-rollup, find-stale-notes,
                          # extract-action-items, build-moc
  __tests__/
    vault.test.ts            markdown.test.ts            tools.test.ts
    security.test.ts         http-server.test.ts         semantics.test.ts
    logger.test.ts           sections.test.ts            tag-rewriter.test.ts
    bases.test.ts            permissions.test.ts         index-cache.test.ts
    chunker.test.ts          embedding-store.test.ts     errors.test.ts
    link-rewriter.test.ts
    handlers/
      read.test.ts          write.test.ts          tags.test.ts
      links.test.ts         canvas.test.ts         attachments.test.ts
      semantic.test.ts      harness.ts

Testing

npm test

952 tests covering vault operations, atomic writes + concurrent-mutation races, markdown parsing (frontmatter, wikilinks, tags, fenced + indented code blocks, multi-backtick inline code), section / block-id parsing, tag rewriting (inline + frontmatter, hierarchical sub-tags), Bases filter DSL, attachment classification, semantic chunking + cosine ranking + persistent embedding store, moment-token date formatting, canvas round-trip fidelity, HTTP transport (Bearer auth, oversize-body, CORS allowlist with Vary: Origin, per-IP rate limiting, /version), leveled logger (text + JSON output), folder-permission allowlist, mtime-cache rehydration across simulated restarts, vault-wide link rewriting on move_note and delete_note (TOCTOU correctness, control-char injection escape), and security regression guards (symlink escape, case-only rename, path-leak sanitization, cross-process exclusive-create). Handler tests exercise every tool through a real MCP client/server pair via InMemoryTransport.

npm run lint       # eslint v9 + typescript-eslint v8 (flat config)
npm run lint:fix   # auto-fix

What's New

v1.8.2 rolls in a deeper-dive audit pass on top of 1.8.1:

  • rename_tag and other vault-wide bulk writers now hold the same rewrite lock as move_note / delete_note. Closes a cross-tool TOCTOU where running tag-rename concurrently with a move could surface "content changed during move" failures and leave stale links.

  • applyRewrites retries failed edits via content search. When bytes shift between plan and apply (Obsidian sync, text editor, concurrent tool), the apply step now finds the unique expected substring at its new position and splices there. If ambiguous or missing, the failure is still surfaced rather than corrupting the file.

  • planMoveRewrites and planDeleteRewrites now read each note exactly once. The previous two-pass implementation doubled I/O on rename / delete operations across large vaults.

  • CommonMark fenced-code indentation now matches the spec. Lines with more than 3 leading spaces no longer falsely close a fenced block (and don't expose subsequent content to wikilink rewriting).

  • /health no longer leaks the live session count when a Bearer token is configured. Status + version stay public for monitoring; sessions is dropped in authenticated deployments. In 4.0.0 and later, HTTP always starts with bearer auth, so the field stays hidden.

  • constantTimeEqual is now fully length-safe (pads both inputs to a fixed width before comparing), and the regex / parser hardening list also closed: resolveWikilink proximity tie-break for path-suffix matches, escaped ] in markdown link labels, control- character validation on runInstall.vaultName, backup-path hint on install write failure, and mapConcurrent return-value usage in the canvas planner.

  • npm audit clean. Resolved 4 moderate-severity advisories in transitive devDependencies. Production deps were already clean.

v1.8.1 was a security and correctness patch on top of 1.8.0:

  • CRITICAL: permission allowlist bypass via .. segments closed. v1.8.0 evaluated OBSIDIAN_READ_PATHS / OBSIDIAN_WRITE_PATHS against the raw user-supplied path before path.resolve collapsed ... An input like Allowed/../OtherFolder/note.md slipped past the prefix check. assertAllowed now collapses .. via path.posix.normalize and rejects any path that climbs above its starting point. Six regression tests cover the bypass classes.

  • HIGH: HTTP timeout on every embedding-provider fetch (AbortSignal.timeout(30s)), TOCTOU race in rename_tag closed by moving the rewrite inside updateNote's transform, and search_semantic / find_similar_notes now invalidate stale vectors when the active provider/model differs from what produced the index.

  • MEDIUM: depth guard on Bases filter recursion, updateNote skips the disk write when the transform returns unchanged content (no more spurious mtime bumps on no-op tools), and embedding-provider error bodies are truncated to 200 chars before being interpolated into thrown errors.

  • LOW: empty accept elicitation responses are now cancellations, not errors, and the in-memory mtime cache snapshot orders by content length so small entries fill the budget first.

v1.8.0 was the largest feature drop since v1.0:

  • Surgical edits by heading and block id. update_section, insert_at_section, list_sections, replace_in_note, edit_block, plus fragment retrieval modes on get_note (section, block, lines).

  • Bases support. list_bases, read_base, query_base for Obsidian's database-view files. First filesystem-only MCP server to ship native Bases.

  • Semantic search. index_vault, search_semantic, find_similar_notes backed by Ollama (default) or OpenAI. Persistent vector index with content-hash incremental updates.

  • Attachments. list_attachments, find_unused_attachments, get_attachment (returns image / audio / blob bytes inline).

  • Tag renames vault-wide. rename_tag rewrites both inline #tag and frontmatter tags: (hierarchical mode rebases nested sub-tags).

  • Folder-scoped permissions. OBSIDIAN_READ_PATHS / OBSIDIAN_WRITE_PATHS allowlists.

  • In-memory mtime cache. Vault-wide scans (get_tags, search_notes, search_by_tag) reuse unchanged note content within the running process without persisting note bodies to disk.

  • Quick wins. get_recent_notes, get_vault_stats, resolve_alias.

  • MCP prompts. daily-review, weekly-rollup, find-stale-notes, extract-action-items, build-moc.

  • Progress notifications on rename_tag, find_unused_attachments, index_vault.

  • Bulk-write confirmation latches on delete_note(permanent: true), move_note reference rewrites, and non-dry-run rename_tag, plus elicitation prompts for clients that support them.

  • eslint wired up with typescript-eslint flat config; npm run lint and lint:fix.

v1.7.0delete_note reference handling:

  • delete_note can strip references vault-wide when permanent: true is paired with removeReferences: true. Wikilinks fall back to alias-or-basename, markdown links fall back to visible text, embeds drop entirely, fragments are discarded. Trash-mode (default) leaves references intact since trashed files stay recoverable.

  • Concurrent-safe rewritesmove_note (with updateLinks: true) and delete_note (with removeReferences: true) serialize per vault, removing the partial-failure mode for parallel rewrite-bearing operations.

v1.6.0 — Obsidian-parity link maintenance:

  • move_note rewrites references across the vault by default, matching Obsidian's "Automatically update internal links" behavior. Wikilinks (with aliases / fragments preserved), markdown links, and canvas nodes[].file fields all follow the moved file. Output form is preserved when possible.

  • TOCTOU correctness — every edit's pre-edit content is verified before splicing, so a parallel write_note between plan and apply is surfaced in failedReferrers rather than corrupting referrers silently.

  • Control-char injection defensesanitizeError and the new escapeControlChars strip newlines/control bytes from any caller-controlled string before it reaches LLM context. Closes a prompt-injection vector via attacker-named filenames.

Full version history in CHANGELOG.md.


License

MIT


Contributing

Contributions welcome! Please open an issue first to discuss what you'd like to change. Pull requests without a corresponding issue may be closed.

If you're adding or editing a tool, read docs/TOOL_AUTHORING.md first — it documents the description, schema, and annotation conventions that keep every tool at A-grade quality.


Acknowledgments

  • Vault-wide link rewriting on move_note (#3, #4) and the sanitizeError defense-in-depth hardening contributed by @brentkearney.

For the full list of everyone who's contributed, see the contributors page.

Available Tools

41 tools
add_canvas_edgeAdd Canvas EdgeA

Create a directed edge connecting two existing canvas nodes. Both fromNode and toNode must already exist on the canvas (use read_canvas to list node ids, or capture the id returned by add_canvas_node). Optional fromSide/toSide control which face of each node the edge anchors to. Returns the generated edge UUID.

ParametersJSON Schema
NameRequiredDescriptionDefault
labelNoOptional text label rendered on the edge
toNodeYesUUID of the target (destination) node - must already exist on the canvas
toSideNoFace of the target node the edge arrives at (default: auto-chosen by Obsidian)
fromNodeYesUUID of the source (origin) node - must already exist on the canvas
fromSideNoFace of the source node the edge leaves from (default: auto-chosen by Obsidian)
canvasPathYesRelative path from vault root to the target .canvas file

TDQS

A4.6/5.0
Behavior4/5

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

Annotations provide no behavioral hints (all false), so the description carries full burden. It discloses creation, default behavior for sides, and the return value (edge UUID). No contradictions 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?

Three sentences with zero filler. Each sentence serves a distinct purpose: stating the action and prerequisite, detailing optional parameters, and specifying the return value. Front-loaded with key information.

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 6-parameter tool with no output schema, the description covers the essential aspects: purpose, prerequisites, optional parameters, and return value. Could mention error cases but not required for basic completeness.

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%, so baseline is 3. The description adds value by reinforcing prerequisite conditions, explaining how to obtain node IDs, and stating the return value—all 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 clearly states the verb ('Create a directed edge') and the resource ('connecting two existing canvas nodes'), and it distinguishes from sibling tools like add_canvas_node by specifying that nodes must already exist and suggesting read_canvas for IDs.

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 the prerequisite ('fromNode and toNode must already exist on the canvas') and provides specific guidance on how to obtain those IDs (use read_canvas or capture from add_canvas_node). Also explains optional parameters and their defaults.

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

add_canvas_nodeAdd Canvas NodeA

Add a new node to an Obsidian canvas and persist the updated file. Supports four node types: 'text' (markdown block), 'file' (embedded vault note reference), 'link' (external URL), and 'group' (labeled container). Returns the generated node UUID, needed to connect nodes via add_canvas_edge. When neither x nor y is supplied, the new node is auto-positioned at (50 * existing_count, 50 * existing_count) to avoid stacking multiple defaulted nodes at the origin. Supplying an explicit x or y always overrides this stagger.

ParametersJSON Schema
NameRequiredDescriptionDefault
xNoX coordinate on the canvas. When omitted (and y is also omitted) the node is auto-staggered to avoid origin pile-up; an explicit value always wins.
yNoY coordinate on the canvas. When omitted (and x is also omitted) the node is auto-staggered to avoid origin pile-up; an explicit value always wins.
typeYesNode kind: 'text' = markdown block, 'file' = vault note reference, 'link' = external URL, 'group' = labeled container
colorNoColor: '1'-'6' for Obsidian's preset palette (red/orange/yellow/green/cyan/purple), or a hex code like '#ff5555'
widthNoNode width in pixels (default: 250, max: 10000)
heightNoNode height in pixels (default: 60, max: 10000)
contentYesInterpretation depends on type: text body for 'text', relative note path for 'file', URL for 'link', display label for 'group'
canvasPathYesRelative path from vault root to the target .canvas file

TDQS

A4.4/5.0
Behavior4/5

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

Beyond annotations (which are minimal), the description discloses that the file is persisted (write operation), returns a UUID, and includes auto-stagger logic for coordinates. It does not cover error conditions or permissions, but the key behaviors are transparent.

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 well-structured sentences, front-loading the core purpose and then detailing node types, return value, and coordinate behavior. Every word earns its place with no redundancy.

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 8 parameters and no output schema, the description covers node types, return value, auto-stagger, and content interpretation. It omits prerequisites (canvas file must exist) and error cases, but overall is sufficiently complete for a creation 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?

With 100% schema coverage, the description still adds value by explaining auto-stagger for x and y coordinates, summarizing node type interpretations, and noting default widths/heights already in schema. The added context goes beyond raw schema 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 clearly states it adds a node to an Obsidian canvas and persists the file, using a specific verb+resource. It distinguishes from sibling add_canvas_edge by mentioning the returned UUID is needed to connect nodes.

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 this tool (adding nodes) and hints at its relationship with add_canvas_edge via the UUID return. However, it does not explicitly exclude alternatives or state prerequisites like canvas file existence.

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

append_to_noteAppend to NoteA

Append text to the end of an existing note without altering prior content. By default, inserts a leading newline if the file does not already end in one, so appended content starts on its own line. Use for log entries, running lists, or adding new sections. Fails if the note does not exist — use create_note to make a new note first.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesRelative path from vault root to the target note (e.g., 'journal/2026-04-15.md'). Extension optional.
contentYesMarkdown text to append to the end of the note. A leading newline is auto-inserted when the file does not already end in one.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations indicate readOnlyHint=false, consistent with a write operation. The description adds context beyond annotations: the leading newline insertion, failure condition if note doesn't exist, and use cases. No contradictions exist, and the description provides meaningful behavioral 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 four sentences, each serving a distinct purpose: purpose, newline behavior, use cases, failure condition and alternative. No extraneous information, well-structured, and front-loaded with the core function.

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 no output schema, the description covers key aspects: behavior, newline insertion, failure, and alternative. It could mention the return value or success confirmation, but it's fairly complete for a simple mutation tool. Siblings include both append and prepend variants, but the description only references 'create_note' as alternative.

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

Parameters3/5

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

Schema coverage is 100% with adequate descriptions for both 'path' and 'content'. The overall description restates some info (e.g., newline behavior) but doesn't add significant new meaning beyond the schema. Baseline of 3 is appropriate.

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

Purpose5/5

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

The description clearly states 'Append text to the end of an existing note' with a specific verb and resource. It distinguishes from siblings like 'prepend_to_note' and 'replace_in_note' by emphasizing appending without altering prior content, and provides use cases (log entries, running lists, new sections).

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 when to use (append to existing notes) and when not (fails if note doesn't exist, recommending 'create_note' instead). It also clarifies the newline insertion behavior. However, it doesn't explicitly contrast with 'prepend_to_note' or 'insert_at_section', which would further guide selection.

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

create_daily_noteCreate Daily NoteA

Create a daily note for today (or a specific date) in the vault's configured daily-note folder using its configured filename format. Optionally seed the note from a template file with Obsidian-style placeholder substitution: {{date}} and {{title}} → the formatted date; {{time}} → local HH:mm; {{date:FORMAT}} / {{time:FORMAT}} → custom moment-style format. Fails if the daily note already exists.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNoTarget date in YYYY-MM-DD format (defaults to today). Determines filename and {{date}} substitution.
contentNoInitial markdown body for the daily note. Ignored if templatePath is provided.
templatePathNoRelative path to a template note. Its content is copied into the new daily note with Obsidian-style placeholders substituted: {{date}}/{{title}} → formatted date, {{time}} → local HH:mm, and {{date:FORMAT}}/{{time:FORMAT}} → custom moment-style format.

TDQS

A4.4/5.0
Behavior4/5

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

Description explains placeholder substitution behavior in detail and failure condition on duplicate. Annotations are minimal (no readOnly/destructive hints), so description carries burden well, adding useful context beyond 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?

Three sentences with no redundancy. First sentence states core purpose, second details template, third states failure condition. Each sentence earns its place. Perfectly concise.

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 all essential aspects: purpose, optional date, template substitution, failure on duplicate. No output schema needed for a create tool; the description is sufficient. Could mention whether note is opened after creation, but not critical.

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%, but description adds value by explaining template placeholder behavior and interaction between content and templatePath (content ignored if templatePath provided). This enriches the parameter meaning beyond schema alone.

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

Purpose5/5

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

The description clearly states the action (create), resource (daily note), and context (today/specific date, configured folder/format). It distinguishes from siblings like create_note (generic note) and get_daily_note (retrieval) by specifying the daily-note folder and failure on duplicate.

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 context: can be used for today or specific date, optionally with template. States failure condition (if daily note already exists), implicitly guiding against calling when note exists. Could be more explicit about when to use over create_note, but still strong.

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

create_noteCreate NoteA

Create a new markdown note at the given path with body content and optional YAML frontmatter. Fails (does not overwrite) if a note already exists at that path — use append_to_note, prepend_to_note, or update_frontmatter for existing notes. Missing directories are created automatically, and a .md extension is appended if omitted.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesRelative path from vault root, e.g., 'folder/note.md' or 'note' (.md added automatically)
contentYesMarkdown body content for the note (rendered below the frontmatter block if any)
frontmatterNoJSON object string of frontmatter key-value pairs (e.g., '{"status":"draft","tags":["idea"]}'). Rendered as YAML at the top of the note.

TDQS

A4.9/5.0
Behavior5/5

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

Describes key behaviors: fails on existing note (no overwrite), auto-creates directories, appends .md extension. Annotations are minimal, so description provides essential transparency.

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

Conciseness5/5

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

Two sentences, no fluff, front-loaded with main purpose. Every sentence adds 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 tool with 3 parameters and no output schema, the description covers purpose, constraints, usage guidelines, and parameter context completely.

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 baseline is 3. Description adds value by clarifying 'body content', 'optional YAML frontmatter', and path behavior beyond 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 clearly states it creates a new markdown note at a given path with body and optional frontmatter. It distinguishes from siblings by specifying when to use other tools like append_to_note.

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 the tool fails if a note exists and directs to alternatives (append_to_note, prepend_to_note, update_frontmatter). Also notes automatic directory creation and .md extension addition.

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

delete_noteDelete NoteA
Destructive

Delete a note. By default the file is moved to the vault's .trash folder (recoverable inside Obsidian); pass permanent=true to unlink it from disk immediately. When permanent=true, you can additionally pass removeReferences=true to strip wikilinks and markdown links to the deleted file across the vault (embeds are removed entirely; plain links fall back to their visible text). References are never rewritten when the file moves to .trash, since trashed files are recoverable.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesRelative path from vault root to the note to delete (e.g., 'archive/old.md'). Extension optional.
confirmNoSafety latch: must be set to true when permanent=true to confirm the caller intends irreversible deletion. Ignored when permanent=false (trash deletes are recoverable). If permanent=true and confirm is not true, the tool returns an error without deleting.
permanentNoIf true, delete the file permanently from disk; if false (default), move it to the vault's .trash folder so it can be recovered.
removeReferencesNoIf true (and permanent=true), strip wikilinks and markdown links pointing at the deleted file across the vault. Embeds are removed entirely; plain links fall back to their visible text (alias if present, else the deleted file's basename). Ignored when permanent=false. Default false — opt in explicitly because the rewrite is irreversible.

TDQS

A4.7/5.0
Behavior5/5

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

Goes well beyond annotations by detailing trash folder behavior, recovery, reference removal conditions, and the confirm safety latch. No contradiction with destructiveHint=true.

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

Conciseness5/5

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

Three sentences, front-loaded with main purpose, then details. No wasted words; every sentence is informative and 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?

Given the destructive nature and 4 parameters, the description fully covers behavior, safety, and edge cases (reference removal ignored when trashing). No output schema needed.

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 all parameters (100% coverage). The description adds value by explaining interactions (e.g., permanent+confirm, removeReferences only works with permanent), though schema already provides basic 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 'Delete a note' and distinguishes between trashing (recoverable) and permanent deletion, making the purpose unambiguous and differentiating it from sibling tools like move_note.

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 when to use permanent vs non-permanent deletion and the safety confirm flag. It lacks explicit guidance on when not to use this tool versus alternatives like archive or move, but the context is clear.

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

edit_blockEdit BlockA
DestructiveIdempotent

Replace the content of a block tagged with ^id. The trailing ^id anchor is preserved on the last line of the new content so existing transclusions (![[note#^id]]) keep working. Use to update a single paragraph or list item that other notes reference.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesVault-relative path to the note.
blockYesBlock id with or without the leading `^` (e.g. `myid` or `^myid`).
newContentYesReplacement content. The `^id` anchor is appended automatically.

TDQS

A4.5/5.0
Behavior4/5

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

Discloses that the trailing ^id anchor is preserved, which is key behavioral info beyond annotations. No contradiction with annotations. Does not mention error cases (e.g., missing block or note), but annotations already indicate destructive behavior.

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

Conciseness5/5

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

Two sentences, front-loaded with purpose, every word earns its place. No redundancy.

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?

No output schema, but description does not need to explain return values for a mutation tool. Adequate for the tool's simplicity; could mention success confirmation or error handling, but not essential.

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 description adds valuable semantic detail: clarifies that block can include or omit leading ^, and that ^id is appended automatically to newContent.

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 explicitly states 'Replace the content of a block tagged with ^id', includes the use case 'update a single paragraph or list item that other notes reference', and distinguishes from sibling tools like replace_in_note and append_to_note.

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 context for when to use ('update a single paragraph or list item that other notes reference') and explains the anchor preservation benefit, but could explicitly mention when not to use (e.g., for larger edits use replace_in_note).

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

find_orphansFind Orphan NotesA
Read-onlyIdempotent

Identify disconnected notes in the vault's link graph, classified into three groups: fully isolated (no links in or out), no-backlinks (nothing links to them), and no-outlinks (they link to nothing). Returns counts per category and an example list per category, capped by maxResults. Use to surface abandoned notes, missing hub pages, or candidates for archiving.

ParametersJSON Schema
NameRequiredDescriptionDefault
maxResultsNoMaximum total note paths to list across all categories (1-1000, default: 200). Full counts are always reported regardless.
includeOutlinksCheckNoIf true (default), also report notes with no outgoing links; if false, only report fully-isolated notes and notes with no backlinks.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already mark it as read-only/idempotent. Description adds detail on three classification groups, return structure (counts always full, examples capped), and parameter behavior (includeOutlinksCheck).

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, efficient and well-structured. Front-loaded with purpose, followed by detailed classification and usage. No unnecessary words.

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 no output schema, description adequately explains return structure (counts per category, example list capped by maxResults). Covers main behavioral aspects for effective use.

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 parameters with descriptions. Description adds meaning by explaining how maxResults caps examples per category and how includeOutlinksCheck affects reporting groups, beyond 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?

Clearly identifies the tool's function: finding disconnected notes in the link graph with three specific categories. Distinguishes itself from siblings like find_broken_links by focusing on orphan detection.

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 use cases: surface abandoned notes, missing hub pages, or archiving candidates. Provides good context but lacks explicit when-not-to-use or alternative tool references.

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

find_similar_notesFind Similar NotesA
Read-onlyIdempotent

Given a note path, return the K most semantically similar notes from the index (excluding the source note). Uses the source note's existing chunk embeddings — no live API call to the embedding provider, so this is fast and free. Run index_vault first to populate embeddings for both the source and the candidates.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesVault-relative path to the source note, e.g. 'projects/atlas.md'.
limitNoMaximum number of similar notes to return (1-100, default: 10).

TDQS

A4.4/5.0
Behavior5/5

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

The description discloses key behavioral traits beyond annotations: it uses existing chunk embeddings from the source note, makes no live API call, and is fast and free. It also notes the exclusion of the source note. No contradictions with readOnlyHint and idempotentHint.

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 with two focused sentences: the first states the core purpose, the second adds behavioral context and a prerequisite. No redundant or extraneous information.

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

Completeness4/5

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

The description is mostly complete given the tool's simplicity and available annotations. However, it does not specify the return format (e.g., list of note paths or scores). With no output schema, a brief mention of the return structure would enhance completeness.

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 covers both parameters with full descriptions (100% coverage). The description adds marginal value by explaining that 'K' corresponds to the limit and that the source note is excluded, but these are largely implicit in 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 clearly states the action: given a note path, return semantically similar notes from the index. It specifies the resource (notes) and distinguishes from sibling tools like search_semantic by highlighting the use of existing embeddings without live API calls.

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 a clear prerequisite (run index_vault first) but does not explicitly state when not to use this tool or compare it directly to alternatives. The context implies use cases but lacks explicit exclusions.

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

find_unused_attachmentsFind Unused AttachmentsA
Read-onlyIdempotent

Locate attachments that no note references — neither via ![[file]] embeds nor [text](file) markdown links. Useful for vault hygiene before archiving or before running a sync. Pair the output with delete operations from your shell, since this tool deliberately doesn't unlink files.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of unused-attachment paths to return (1-10000, default: 200). Total counts are still reported.
includeBytesNoIf true, also stat each unused attachment and report total reclaimable bytes.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already mark readOnlyHint and idempotentHint; description adds that it deliberately avoids unlinking files. This extra behavioral detail helps the agent understand tool's limitations 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?

Two sentences, each serving a purpose: first explains what the tool does, second gives usage context. No fluff, front-loaded, easy to scan.

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?

No output schema, so description should convey return format. It mentions 'unused-attachment paths' and 'total reclaimable bytes' but doesn't specify exact structure (e.g., array of strings vs objects). Otherwise covers purpose, parameters, and usage well.

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 both parameters (limit, includeBytes) with descriptions. Description adds nuance: for includeBytes, it mentions reporting total reclaimable bytes, and for limit, it notes total counts are still reported even when truncated. This adds value beyond 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?

Clearly states the tool locates attachments unreferenced by any note, specifying two reference types (`![[file]]` and `[text](file)`). Distinguishes itself from siblings like `find_broken_links` and `find_orphans` by focusing on attachments and explicit exclusion of unlinking.

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?

Specifies when to use (before archiving or sync) and what not to expect (tool doesn't delete/unlink, suggests pairing with shell deletes). Could explicitly compare to siblings but current guidance is clear.

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

get_attachmentGet AttachmentA
Read-onlyIdempotent

Read an attachment file and return its bytes to the client. Images come back as image content blocks (rendered inline by Claude / Cursor), audio as audio blocks, everything else as a base64 resource block with a vault:// URI. Caps at 5 MB by default to keep token usage sane; raise via maxBytes up to 50 MB. The attachment must be inside the vault — markdown notes (.md), canvases (.canvas), and Bases (.base) are deliberately rejected so callers don't accidentally pull text-format files through this binary path; use get_note / read_canvas / read_base instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesVault-relative path to the attachment, e.g. 'assets/diagram.png'.
maxBytesNoMaximum file size to fetch in bytes (default: 5,242,880, hard cap: 52,428,800).

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the annotations (readOnlyHint, idempotentHint), the description discloses that images return as `image` blocks, audio as `audio` blocks, others as base64 `resource`, and that attachments must be inside the vault. It also specifies the 5 MB default cap with maxBytes up to 50 MB. 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?

Three sentences, each serving a distinct purpose: purpose, return types and size limit, and exclusions with alternatives. No redundancy, front-loaded with key 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 binary file reading nature, the description covers return formats, size limits, vault scope, and file type restrictions. With no output schema, the description sufficiently explains what to expect. It also cross-references sibling tools for completeness.

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%, so baseline is 3. The description adds context about maxBytes' default (5,242,880 bytes) and hard cap, and explains that path is vault-relative. While it doesn't add much for path, the description of how maxBytes affects the behavior (raising cap) provides marginal added value, justifying 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 tool reads and returns attachment bytes, specifies the return types (image, audio, resource), and explicitly distinguishes itself from siblings by noting that .md, .canvas, and .base files are rejected and should use get_note, read_canvas, or read_base instead.

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

Usage Guidelines5/5

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

The description provides explicit when-to-use and when-not-to-use guidance: for binary attachments, not for text-format files. It mentions the default 5 MB cap and how to raise it via maxBytes, and suggests alternative tools for rejected file types.

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

get_daily_noteGet Daily NoteA
Read-onlyIdempotent

Read the daily note for today or for a specific date, resolved via the vault's configured daily-note folder and filename format. Returns the note path, parsed frontmatter (as a labeled header block), and body. Errors if no daily note exists for that date — use create_daily_note to create one.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNoTarget date in YYYY-MM-DD format (defaults to today's local date)

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 and idempotentHint=true, but the description adds value beyond these by stating that the tool errors if no note exists and describing the return structure (path, frontmatter, body). No contradictions 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 sentences long, front-loads the core functionality, and contains no filler. Every sentence adds essential information.

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

Completeness4/5

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

For a simple read tool with one optional parameter and no output schema, the description is complete: it covers purpose, error case, return values, and ties to related tool. Could mention that the frontmatter is parsed, but it's already implied.

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 100% schema description coverage (the single 'date' parameter is well-documented with pattern, format, and default), the description does not add new semantic meaning beyond what the schema provides. Baseline 3 is appropriate.

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

Purpose5/5

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

The description clearly states the tool reads the daily note for today or a specific date, resolved via the vault's configured folder and filename format. It specifies the return values (path, frontmatter, body) and distinguishes itself from create_daily_note by mentioning error case and alternative.

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 says to use create_daily_note if no note exists, providing a clear when-not-to-use guideline. However, it doesn't contrast with other read tools like get_note for non-daily notes, which could help an agent decide between tools.

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

get_graph_neighborsGet Graph NeighborsA
Read-onlyIdempotent

Traverse the wikilink graph outward from a starting note and return every note reachable within N hops, grouped by depth level with an indented tree visualization. Each neighbor is tagged with its hop distance and direction (inbound = reached via backlink, outbound = reached via outlink). Use to explore a topic cluster, map a note's local neighborhood, or find related notes beyond direct links. Accepts paths with or without .md extension.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesStarting note path relative to vault root (e.g., 'projects/alpha.md'). Extension optional; falls back to basename match.
depthNoMaximum link-hops to traverse from the start note (1-3, default: 1). Higher values explore exponentially more notes.
directionNoTraversal direction: 'outbound' follows outlinks the start note points to, 'inbound' follows backlinks pointing at the start note, 'both' follows either (default)both
maxResultsNoMaximum neighbor notes to return (1-1000, default: 200). Traversal stops early when this cap is reached and a truncation notice is appended.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already indicate readOnlyHint and idempotentHint. Description adds specific behaviors: early truncation at maxResults with a notice, neighbor tagging with hop distance and direction, and traversal stopping at depth cap. No contradictions.

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?

Concise two-sentence description plus a bullet list of use cases. Front-loaded with main action. Every sentence adds value, 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?

Despite no output schema, the description explains return format (grouped by depth, tree visualization, tagging with hop distance and direction). Covers all necessary aspects for a complex graph traversal tool.

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% with descriptions for all 4 parameters. Description adds extra meaning: path accepts .md extension or not, depth range and exponential growth warning, direction clarification, maxResults early stop behavior.

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 traverses the wikilink graph outward from a starting note, returning reachable notes grouped by depth with visualization and tagging. This distinguishes it from siblings like get_backlinks or get_outlinks which handle single-hop links.

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 explicitly mentions use cases: exploring topic clusters, mapping neighborhoods, finding related notes beyond direct links. It also clarifies path handling with or without .md extension. Lacks explicit when-not-to-use but provides sufficient context.

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

get_noteGet NoteA
Read-onlyIdempotent

Read a note in full or as a fragment. With no fragment options, returns parsed frontmatter (as a labeled header), a flat list of inline #tags, and the body. With section, returns just the body under that heading (path-form like 'Tasks/Today' is supported). With block, returns the paragraph or block tagged ^id. With lines, returns the inclusive 1-indexed line range. Fragment modes skip the frontmatter/tag header and return raw text — use them to keep token usage tight on long notes.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesRelative path from vault root to the note (e.g., 'folder/note.md'). Extension required.
blockNoBlock id (without the leading `^`). Returns just the paragraph or block tagged with that id.
linesNoLine range, 1-indexed and inclusive (e.g., '10-25' or '42'). Returns just those lines.
sectionNoHeading path (e.g., 'Tasks' or 'Project A/Status'). Returns just that section's body.

TDQS

A5/5.0
Behavior5/5

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

Goes beyond annotations (readOnlyHint, idempotentHint) by detailing behavior: fragment modes skip frontmatter/tag header, return raw text; full mode returns parsed frontmatter, tags, and body. No contradictions.

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 main action, followed by concise mode explanations. Every sentence adds value; no redundancy. Well-structured for quick parsing.

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?

Completes the picture for a tool without output schema by describing return format per mode. Covers all parameters and usage scenarios adequately.

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?

Adds significant meaning beyond schema: for 'section' explains path-form support, for 'block' clarifies block id format, for 'lines' specifies 1-indexed inclusive range. Complements 100% schema coverage with contextual 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?

Clearly states 'Read a note in full or as a fragment' and distinguishes four modes (full, section, block, lines). Differentiates from sibling tools like get_backlinks or get_recent_notes by focusing on note content retrieval.

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 describes when to use each fragment mode ('keep token usage tight on long notes') and what each returns. Provides clear context for selection without needing alternatives.

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

get_recent_notesGet Recent NotesA
Read-onlyIdempotent

List notes ordered by most-recently-modified first. Optional since filter accepts an ISO date (e.g. '2026-04-01') or a relative span ('7d', '24h', '2w'); only notes modified at or after that time are returned. Use to surface what you've been working on, build a 'what changed this week' digest, or pick targets for review.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of notes to return (1-1000, default: 20).
sinceNoFilter to notes modified at or after this point. Accepts ISO 8601 (YYYY-MM-DD or full timestamp) or a relative span like '7d', '24h', '2w'.
folderNoRestrict to notes within this folder (relative to vault root). Omit to scan the entire vault.

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, so the agent knows it's safe and repeatable. The description adds ordering behavior and the optional `since` filter syntax (ISO date or relative span), going beyond what annotations provide. No contradictions.

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

Conciseness5/5

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

The description is two sentences, front-loading the core purpose and then explaining the filter. No wasted words; 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 simple tool (3 parameters, no output schema), the description covers the main functionality, ordering, filter options, and use cases. It doesn't detail pagination or error handling, but those are implicit from the schema (limit param) and annotations. Adequate for the complexity level.

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% with descriptions for all three parameters. The description adds value by giving concrete examples for `since` (e.g., '7d', '24h', '2w'), which clarifies usage beyond the schema's generic text. For limit and folder, the description doesn't repeat schema details, which is acceptable given full schema 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 clearly states 'List notes ordered by most-recently-modified first', specifying the verb (list), resource (notes), and ordering. It distinguishes from related tools like list_notes (which likely has no ordering) and search_notes (query-based) by focusing on recency and offering a time filter.

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 concrete use cases: 'surfaces what you've been working on', 'what changed this week digest', or 'pick targets for review'. While it doesn't explicitly exclude alternatives like search_notes or get_note, the use cases implicitly guide when to use this tool.

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

get_vault_statsGet Vault StatsA
Read-onlyIdempotent

Return a quick health snapshot of the vault: note count, total bytes, total words, unique tag count, untagged-note count, and the most-recently-modified note. Useful for dashboards and 'is this vault healthy?' checks. Reads through the mtime cache so repeat calls are cheap.

ParametersJSON Schema
NameRequiredDescriptionDefault
folderNoRestrict stats to this folder (relative to vault root). Omit for whole-vault stats.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already provide readOnlyHint and idempotentHint. The description adds value by revealing the mtime cache mechanism, explaining performance behavior for repeated calls.

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 concise sentences, front-loaded with output description and use case. Every sentence adds value without 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?

Despite no output schema, the description explicitly lists all return fields and explains caching behavior. For a simple read tool with one optional parameter, this is complete.

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

Parameters3/5

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

Schema description covers the single parameter (folder) 100%. The description does not add new semantic information beyond stating 'restrict stats to this folder', which aligns with 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 clearly states the tool returns a health snapshot with specific fields (note count, bytes, words, etc.) and explicitly distinguishes it from siblings by its aggregate nature. No sibling offers vault-wide stats.

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?

Description advises use for dashboards and health checks, and notes cheap repeat calls via cache. While it doesn't mention when not to use, the purpose is self-explanatory and unique among siblings.

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

index_vaultIndex Vault for Semantic SearchA
Idempotent

Build or refresh the embedding index used by search_semantic and find_similar_notes. Splits each note into heading-aware chunks, embeds them via the configured provider (Ollama by default, OpenAI optional), and persists the index to <vault>/.obsidian/cache/mcp-pro-embeddings.json. Incremental: notes whose content hash matches the prior pass are skipped. Use force: true to re-embed everything (e.g., after switching models). Emits progress notifications when the client subscribes.

ParametersJSON Schema
NameRequiredDescriptionDefault
forceNoIf true, re-embed every note even if its content hash matches the cached one.
folderNoRestrict the indexing pass to this folder. Notes outside the folder are left untouched.

TDQS

A4.3/5.0
Behavior4/5

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

The description adds context beyond annotations: it splits notes into heading-aware chunks, embeds via configured provider, persists to a specific file, and emits progress notifications. Annotations already indicate idempotent and non-destructive, which align with description.

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 front-loaded with purpose, then process, incremental behavior, force usage, and progress notifications. No wasted words.

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

Completeness5/5

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

With no output schema, the description fully explains the tool's behavior, side effects, and progress notifications. Annotations cover safety. Complete for the tool's complexity.

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

Parameters3/5

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

Schema covers 100% of parameters with descriptions. The description adds minimal additional meaning beyond incremental behavior related to force. Baseline score of 3 is appropriate.

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

Purpose5/5

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

The description clearly states the tool builds or refreshes the embedding index used by search_semantic and find_similar_notes. It specifies the verb (build/refresh) and resource (embedding index) and distinguishes it from sibling tools that consume the 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 explains incremental behavior and when to use force (re-embed everything after model changes). The folder parameter restricts indexing. However, it does not explicitly mention when not to use this tool or alternatives beyond referencing search_semantic and find_similar_notes.

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

insert_at_sectionInsert at SectionA

Insert content into a specific section without replacing it. position controls where: 'before' inserts above the heading, 'after-heading' inserts immediately under the heading line (at the top of the section body), 'append' inserts at the end of the section's body just before the next heading. Use to add a new bullet or paragraph without rewriting the section.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesVault-relative path to the note.
contentYesContent to insert. A trailing newline is normalized.
sectionYesHeading path identifying the section.
positionNoInsert before the heading line, immediately after the heading, or at the end of the section body.append

TDQS

A4.4/5.0
Behavior4/5

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

With all annotation hints set to false (readOnly, openWorld, idempotent, destructive), the description compensates by stating the tool is non-destructive ('without replacing it'). It also details the three position behaviors, adding context about insertion points. No contradictions 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 sentences, no superfluous words. The first sentence states the core purpose, the second explains position options and a concrete use case. Every part earns its place.

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

Completeness4/5

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

For a tool with no output schema and straightforward input, the description covers what it does, the position variants, and a typical use scenario. It does not mention error handling or prerequisites, but given the context, it is sufficiently complete for an agent to select and invoke 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%, providing a baseline of 3. The description adds value by explaining the 'position' enum in plain language ('before', 'after-heading', 'append') and the trailing newline normalization hint for 'content', which goes beyond the schema's brief descriptions.

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

Purpose5/5

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

The description uses the specific verb 'Insert' and identifies the resource as 'content into a specific section'. It clearly differentiates from siblings like append_to_note (which appends to entire note) and update_section (which replaces), by stating 'without replacing it'. The explanation of position values further clarifies the exact insertion behavior.

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 a clear use case: 'add a new bullet or paragraph without rewriting the section.' It implicitly distinguishes from replace_in_note by emphasizing non-replacement. However, it does not explicitly state when not to use or list alternative tools, leaving some inference to the agent.

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

list_attachmentsList AttachmentsA
Read-onlyIdempotent

Enumerate every non-markdown file in the vault — images, PDFs, audio/video clips, anything pasted in beyond notes/canvases/Bases. Returns a sorted list of relative paths plus a per-extension count summary. Use to audit assets, find duplicates by name, or pick targets for find_unused_attachments.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of attachment paths to return (1-10000, default: 200). Total counts are still reported.
extensionNoRestrict to one extension (e.g., 'png' or '.png'). Omit for every attachment.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations declare readOnlyHint, idempotentHint, openWorldHint. Description adds behavioral context: returns sorted list of relative paths and per-extension count summary. It clarifies scope ('beyond notes/canvases/Bases'). No contradictions.

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

Conciseness5/5

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

Three sentences: first states action, second output, third use cases. No wasted words. Front-loaded with core purpose.

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?

No output schema, but description adequately describes return format (sorted list + count summary). Lacks mention of limit's effect on count or pagination, but is sufficient for a list tool.

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

Parameters3/5

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

Schema description coverage is 100%, so baseline is 3. The description does not add meaning beyond schema for limit and extension. It mentions output structure but not parameter 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 clearly states the tool enumerates every non-markdown file in the vault, listing specific file types (images, PDFs, audio/video clips). It uses specific verb 'enumerate' and resource 'non-markdown file', distinguishing it from siblings like list_notes or list_bases.

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 explicit use cases: 'audit assets, find duplicates by name, or pick targets for find_unused_attachments.' This guides when to use, though it doesn't explicitly state when not to use it or mention alternatives beyond the sibling reference.

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

list_basesList BasesA
Read-onlyIdempotent

Enumerate every Obsidian Bases (.base) file in the vault. Bases are YAML-defined database views over notes (filters, properties, table/calendar/kanban views). Returns a sorted list of relative paths plus the total count. Pair with read_base or query_base.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and idempotentHint. The description adds behavioral details: returns sorted list, relative paths, and count. It does not contradict 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 sentences, each adding unique value: enumerates, defines bases, describes output, suggests next steps. No wasted words, 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?

With no parameters and no output schema, the description fully explains the tool's operation and output. It is self-contained and sufficient for an agent to use 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?

The tool has no parameters, and schema coverage is 100%. The description does not need to add parameter details, and the baseline score for 0 params is 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 explicitly states it enumerates every .base file in the vault, defines what a base is, and specifies the output (sorted relative paths and count). It clearly distinguishes the tool's purpose from siblings by focusing specifically on .base files.

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 advises pairing with read_base or query_base, indicating a typical workflow. While it doesn't explicitly contrast with sibling list tools like list_notes or list_attachments, the context and tool name make its usage clear.

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

list_canvasesList CanvasesA
Read-onlyIdempotent

Enumerate every Obsidian canvas file (.canvas) anywhere in the vault, returning a numbered list of relative paths and the total count. Takes no parameters — scans the entire vault. Use to discover available canvases before calling read_canvas, add_canvas_node, or add_canvas_edge.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=false. The description adds that it scans entire vault and takes no parameters, but no new behavioral traits beyond 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 sentences, efficient, front-loaded with key information, no waste.

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 no parameters and no output schema, the description is complete: it specifies scope, return type, and usage 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?

No parameters, baseline 4 per guidelines. The description correctly states 'Takes no 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 clearly states it enumerates Obsidian canvas files, returns a numbered list of relative paths and total count, and distinguishes from sibling tools by noting it scans the entire vault and takes no parameters.

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 to use to discover available canvases before calling read_canvas, add_canvas_node, or add_canvas_edge, providing clear context and alternatives.

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

list_notesList NotesA
Read-onlyIdempotent

Enumerate every markdown note in the vault (or a single folder), returning a sorted list of relative paths along with the total count. Truncates output to limit entries but still reports the total. Use to browse vault structure, build a file picker, or enumerate targets for batch processing.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of note paths to return (1-10000, default: 50). The full total count is still reported separately.
folderNoFolder relative to vault root to restrict the listing (omit to list the entire vault)

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already signal readOnly and idempotent. Description adds truncation behavior (limit truncates output but full count reported) and that the list is sorted, which are helpful beyond 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 sentences, zero fluff. First sentence defines core action and output, second sentence provides usage guidance. Every sentence earns its place.

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

Completeness5/5

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

Despite lacking an output schema, the description fully explains return format (sorted relative paths and total count) and detailed behavior around limit. Sufficient for an agent to correctly invoke.

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 baseline is 3. Description adds value by clarifying truncation semantics and that folder restricts scope. This goes beyond 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?

Description uses specific verb 'enumerate' and resource 'markdown notes', specifies scope (vault or folder), and lists use cases (browse, file picker, batch processing) that distinguish it from sibling search or retrieval tools.

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 to use (browse structure, file picker, batch processing) and, by contrast, implies not for content search. While no direct exclusion of alternatives, the context is sufficient for an agent to decide.

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

list_sectionsList SectionsA
Read-onlyIdempotent

List all headings in a note as a tree of paths (with depth). Useful for discovering valid section arguments before calling get_note, update_section, or insert_at_section.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesVault-relative path to the note.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already indicate readOnlyHint=true and idempotentHint=true. Description adds behavioral detail by stating it returns a tree of paths with depth, which goes beyond annotations 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 sentences that convey essential information without any fluff. Each sentence adds value.

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 parameter and no output schema, the description sufficiently explains what the tool does and the nature of its output (tree with depth).

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

Parameters3/5

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

Schema coverage is 100% with a clear description for the 'path' parameter. The description does not add additional meaning beyond what the schema provides, so baseline of 3 is appropriate.

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

Purpose5/5

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

Description explicitly states it lists headings as a tree of paths with depth, which is specific. It also mentions its utility for discovering section arguments, distinguishing it from related tools like get_note or update_section.

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?

Directly states that the tool is useful for discovering valid section arguments before calling other tools (get_note, update_section, insert_at_section), providing clear guidance on when to use it.

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

list_tagsList All TagsA
Read-onlyIdempotent

Enumerate every unique tag used across the vault along with the number of notes each tag appears in. Detects tags from both inline #hashtags and YAML frontmatter, normalizes them case-insensitively, and returns a sorted list plus the total unique tag count. Use to build a tag cloud, pick categories, audit taxonomy, or discover available tags before calling search_by_tag.

ParametersJSON Schema
NameRequiredDescriptionDefault
sortByNoSort order: 'count' = by usage count descending (most-used first, default), 'name' = alphabetical by tag namecount

TDQS

A4.7/5.0
Behavior5/5

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

Beyond annotations (readOnlyHint, idempotentHint), description adds detection sources (inline, YAML), case-insensitive normalization, and output details (sorted list, total count). 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 sentences, front-loaded with purpose, no extraneous words. Highly concise and well-structured.

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

Completeness5/5

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

Given the simple tool (1 param, read-only, no output schema), the description fully covers functionality, usage, and output. Complete for its complexity.

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

Parameters3/5

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

Schema covers the only parameter (sortBy) with enum and default. Description adds no new parameter-specific info beyond mentioning 'sorted list', which is sufficient given high schema 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?

Clearly states it enumerates unique tags, detects from inline and YAML, normalizes case-insensitively, and returns sorted list with total count. Differentiates from sibling tools like search_by_tag and rename_tag.

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 provides use cases: build tag cloud, pick categories, audit taxonomy, and discover tags before calling search_by_tag. Also implies when to use it before other operations.

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

move_noteMove/Rename NoteA
Destructive

Move or rename a note within the vault, preserving its full content. Parent folders at the destination are created as needed. By default, wikilinks and file references are updated, matching Obsidian's "Automatically update internal links" behavior. Pass updateLinks: false to skip the rewrite scan (faster on large vaults; pair with find_broken_links if you need to audit afterward). A .md extension is added automatically if omitted from either path.

ParametersJSON Schema
NameRequiredDescriptionDefault
newPathYesDestination relative path from vault root (e.g., 'projects/idea.md'). Creates intermediate folders as needed.
oldPathYesCurrent relative path of the note from vault root (e.g., 'inbox/idea.md')
updateLinksNoIf true (default), update every wikilink, markdown link, and canvas node reference across the vault to point at the new path. Set false to skip the rewrite pass.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations indicate destructiveHint: true. Description adds specifics: content preserved, parent folders created, links updated by default, and .md extension auto-added. 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?

Three sentences with no wasted words. Each sentence adds meaningful information: action, parent folder behavior, link update trade-off, and automatic extension.

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?

No output schema, but description covers key effects. Missing explicit mention of what happens if destination already exists or error cases, but overall sufficient for common use.

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% with descriptions for each parameter. Description adds value by noting automatic .md extension addition and explaining updateLinks default behavior, but schema already conveys basics.

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 clearly states 'Move or rename a note within the vault, preserving its full content.' This is a specific verb (move/rename) and resource (note), and it distinguishes from related tools like create_note or delete_note.

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

Usage Guidelines5/5

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

Explicitly explains when to use default updateLinks behavior vs. setting false for speed, and suggests pairing with find_broken_links for auditing. Also mentions parent folder creation as needed.

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

prepend_to_notePrepend to NoteA

Insert content at the top of an existing note's body, immediately after the YAML frontmatter block if one is present (so metadata stays at the top of the file). Use for adding new items to the front of a running list, pinning context, or inserting TL;DR sections. Fails if the note does not exist.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesRelative path from vault root to the target note (e.g., 'notes/log.md'). Extension optional.
contentYesMarkdown text to insert at the top of the body, after any frontmatter

TDQS

A4.3/5.0
Behavior4/5

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

Annotations indicate write operation (readOnlyHint=false), and description adds specifics: inserts after frontmatter, fails if missing. No contradictions.

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 focused sentences front-loading the main action and key constraint (frontmatter placement), with no superfluous words.

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 for a simple 2-parameter tool with no output schema; covers behavior, constraints, and use cases adequately.

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?

100% schema coverage with descriptions; description adds context about placement after frontmatter but no extra parameter details beyond schema.

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

Purpose5/5

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

The description clearly states the tool inserts content at the top after frontmatter, distinguishing it from 'append_to_note' and other 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 clear use cases (front of lists, pinning context, TL;DR) and notes failure if note doesn't exist, but lacks explicit alternatives for similar tools.

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

query_baseQuery BaseA
Read-onlyIdempotent

Run a Base file's filters against the vault and return matching note paths. Optionally pick a named view to apply that view's filters and ordering on top of the base-level filters. Supported filter syntax (subset of Obsidian's full DSL): chained methods file.hasTag("tag"), file.hasProperty("key"), file.inFolder("path"), file.linksTo("target"), file.name.contains("x")/.startsWith/.endsWith/.equals, plus .isEmpty/.isNotEmpty on any value; legacy function form taggedWith(file, "tag"); comparisons key == "val", key != x, key contains x, >=, <=, >, <; combinators and:, or:, not:. Recognized file properties: file.name, file.basename, file.folder, file.ext, file.path, file.size, file.ctime, file.mtime, file.tags, file.properties, file.links, file.embeds, file.backlinks. Unsupported clauses are reported as warnings and treated as match-all.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesVault-relative path to the .base file.
viewNoOptional view name (or view type) to apply on top of the base-level filters.
limitNoMaximum number of matching notes to return (1-1000, default: 100).
includeFrontmatterNoIf true, include each row's frontmatter in the output.

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, idempotent, and not open-world. The description adds critical behavioral context: unsupported clauses are reported as warnings and treated as match-all, and it enumerates supported filter syntax and recognized file properties. This goes well beyond 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 with the core purpose and then expands on syntax and behavior. While it is somewhat lengthy, every sentence adds value (syntax details, unsupported clause handling). It could be slightly more concise, but it remains well-structured and informative.

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 has 4 parameters, no output schema, and moderate complexity, the description covers purpose, parameters (via schema and description), filter syntax, and edge cases (unsupported clauses). It lacks an explicit description of the output structure beyond 'matching note paths', but the overall completeness is high.

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 baseline is 3. The description adds significant meaning by detailing the filter syntax and recognized properties, which is not present in the schema. However, the description does not elaborate on the 'view' parameter's expected format or behavior beyond 'apply view filters and ordering'. This prevents a 5.

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 runs a Base file's filters against the vault and returns matching note paths. It specifies the action ('Run'), the resource ('Base file's filters'), and the output ('matching note paths'). It also distinguishes itself from siblings like search_notes by focusing on Base file-driven queries.

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 explains when to use this tool (to apply Base file filters with optional view) and provides detailed filter syntax, which serves as usage guidance. It does not explicitly state when not to use it, but the context of siblings and the specificity of the Base file mechanism imply the appropriate scenarios.

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

read_baseRead BaseA
Read-onlyIdempotent

Return the parsed contents of a Base file: filters, properties, view definitions, and any unrecognized fields. Use to discover what queries a Base supports before calling query_base.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesVault-relative path to the .base file.

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 and idempotentHint=true. Description adds value by detailing what is returned (filters, properties, view definitions, unrecognized fields), which gives a clear picture of the tool's output behavior.

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

Conciseness5/5

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

Two sentences, perfectly concise. First sentence describes what it returns, second gives usage advice. No wasted words.

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 simplicity (one parameter, read-only, no output schema), the description covers the purpose, return content, and usage context adequately. Missing error handling details but standard for such a tool.

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

Parameters3/5

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

Schema coverage is 100% with a well-described single parameter. The description does not add extra semantics beyond the schema's parameter description, so baseline score of 3 is appropriate.

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

Purpose5/5

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

Clearly states it returns parsed contents of a Base file, listing exactly what is returned (filters, properties, view definitions, etc.). Distinguishes from sibling tool query_base by noting its use as a discovery step before querying.

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 advises to use tool to discover queries that a Base supports before calling query_base. Provides clear context for when to use, though does not mention when not to use or alternatives like list_bases.

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

read_canvasRead CanvasA
Read-onlyIdempotent

Read an Obsidian canvas file (.canvas, JSON format) and return a human-readable summary of its structure: every node with id, type, position, size, and content preview, plus every edge with source/target node ids and optional label. Use to inspect or navigate a canvas before calling add_canvas_node or add_canvas_edge.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesRelative path from vault root to the .canvas file (e.g., 'boards/roadmap.canvas')

TDQS

A4.5/5.0
Behavior4/5

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

Annotations (readOnlyHint, idempotentHint) already declare safety; description adds specific output details (node properties, edges). No contradiction.

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

Conciseness5/5

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

Two sentences, no fluff, front-loaded with purpose. Every sentence adds value.

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?

Single simple parameter fully covered, no output schema needed, description explains return format. Complete for this low-complexity tool.

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

Parameters3/5

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

Schema coverage is 100% with a well-described 'path' parameter. Description does not add additional meaning beyond the schema, warranting baseline 3.

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?

Clearly states it reads a .canvas file and returns a structured summary of nodes and edges. Distinguishes from siblings by mentioning usage before add_canvas_node/add_canvas_edge.

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 to inspect or navigate a canvas before calling add_canvas_node or add_canvas_edge', providing clear when-to-use and naming alternative tools.

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

rename_tagRename TagA
Destructive

Rename a tag everywhere it appears across the vault, in both inline #tags and frontmatter tags: fields. With hierarchical: true (default), nested tags also rebase: renaming project to client also renames project/alphaclient/alpha. With dryRun: true, returns the planned counts without writing. Strip the leading # from oldName/newName — they're tag names, not tag tokens.

ParametersJSON Schema
NameRequiredDescriptionDefault
dryRunNoIf true, count matches without modifying any notes.
newNameYesNew tag name (without leading #), e.g. 'client'.
oldNameYesExisting tag name (without leading #), e.g. 'project'.
hierarchicalNoAlso rename nested sub-tags (default: true).

TDQS

A4.7/5.0
Behavior5/5

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

The description adds important behavioral context beyond annotations: it explains hierarchical rebasing, dry-run mode, and the requirement to strip leading '#'. The annotations indicate destructive behavior, and the description confirms and elaborates without contradiction.

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

Conciseness5/5

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

The description is concise (three sentences), front-loaded with the main purpose, and each sentence adds necessary detail. No fluff or repetition.

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

Completeness5/5

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

Given 4 parameters, no output schema, and annotations, the description adequately covers all behavioral aspects: scope, hierarchical behavior, dryRun, and parameter formatting. It is complete for the tool's complexity.

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 has 100% description coverage, so baseline is 3. The description provides additional meaning by explaining the leading '#' removal and the effect of hierarchical=true, which adds value 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 clearly states the tool renames a tag everywhere in the vault, including inline #tags and frontmatter fields. It provides specific scope and distinguishes itself from sibling tools (no other rename tool exists).

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 implicitly makes the usage clear by stating the tool's purpose. While it does not explicitly mention when to use alternatives, the naming and context make it obvious; however, no explicit when-not-to-use or alternatives are provided.

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

replace_in_noteReplace in NoteA
Destructive

Search-and-replace within a single note. Supports literal strings or regex patterns. With expectedCount, the operation refuses to commit unless that many matches are present, guarding against accidental over-replacement when an LLM drafts a pattern that's too broad. Returns the count of replacements made.

ParametersJSON Schema
NameRequiredDescriptionDefault
findYesLiteral string (default) or regex pattern to match.
pathYesVault-relative path to the note.
flagsNoRegex flags (e.g., 'gi'). Defaults to 'g' so all matches are replaced.
regexNoTreat `find` as a JavaScript regex (multi-line, case-sensitive by default).
replaceYesReplacement text. With `regex: true`, supports $1, $2 backreferences.
expectedCountNoIf set, abort unless exactly this many matches are found.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations indicate destructiveHint=true and readOnlyHint=false. The description adds valuable behavioral context: the expectedCount guard prevents accidental over-replacement, and it returns the replacement count. This goes beyond what annotations 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 three sentences, each adding critical information. It is front-loaded with the core purpose, then explains the regex option and safety guard, and finally the return value. No wasted words.

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 destructive tool with 6 parameters and no output schema, the description covers the operation, the guard, and return value. It does not explain error handling for expectedCount mismatch (e.g., what happens if count doesn't match), but the phrase 'refuses to commit' implies an abort. Adequate but has a minor gap.

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

Parameters4/5

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

Schema coverage is 100%, so parameters are documented. The description adds meaning by explaining the distinction between literal and regex, the purpose of expectedCount (guard against over-replacement), and that backreferences work with regex. This is useful context beyond 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 clearly states it performs a search-and-replace within a single note, supporting literal strings and regex. This distinguishes it from sibling tools like append_to_note or edit_block, which are not find-and-replace operations.

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 specifies it operates on a single note, implying when to use it. It does not explicitly mention when not to use it or provide alternatives, but the context is clear enough. The expectedCount guard adds usage guidance.

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

resolve_aliasResolve AliasA
Read-onlyIdempotent

Find every note whose frontmatter aliases: field contains the given name (case-insensitive). With includeBasename: true, also matches notes whose filename (without .md) equals the name — Obsidian's resolution fallback when no alias matches. Use to translate a human-friendly title like 'My Project' into the actual note path before calling get_note.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesAlias or display name to resolve, e.g. 'My Project'.
includeBasenameNoIf true (default), also match notes whose filename (without extension) equals `name`.

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already indicate readOnly and idempotent. Description adds case-insensitive matching and fallback behavior for basename, which supplements the structured data 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?

Three sentences, each earning its place: first explains core function, second details optional behavior, third provides usage guidance. No fluff, well-structured.

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 no output schema, description implies return type (list of note paths) but doesn't specify format. However, with 2 simple parameters and clear annotations, it adequately completes the 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 100%, but description enriches both parameters: explains 'name' is case-insensitive and 'includeBasename' defaults to true with matching logic. Adds useful behavioral nuance beyond schema.

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

Purpose5/5

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

The description clearly states the tool's action: find notes whose frontmatter aliases field contains a given name case-insensitively. It also distinguishes from sibling tools by specifying it translates human-friendly titles to actual note paths before calling get_note.

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 usage context: 'Use to translate a human-friendly title... before calling get_note.' This tells the agent when to use this tool and references a sibling tool, guiding correct invocation.

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

search_by_frontmatterSearch by FrontmatterA
Read-onlyIdempotent

Find notes whose YAML frontmatter contains a given property/value pair. Comparison is case-insensitive; for array-valued properties, a match is declared if any element matches. Returns matching note paths with their full frontmatter. Use to filter notes by metadata like status, type, or tags stored in frontmatter.

ParametersJSON Schema
NameRequiredDescriptionDefault
valueYesValue to match against the property (case-insensitive; matches any array element)
folderNoRestrict search to this folder relative to the vault root (omit to search entire vault)
propertyYesFrontmatter key to look up (e.g., 'status', 'type', 'author')
maxResultsNoMaximum number of matching notes to return (1-500, default: 50)

TDQS

A4.5/5.0
Behavior5/5

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

The description adds value beyond annotations by detailing case-insensitive comparison, array matching, and that results include full frontmatter. Annotations only indicate readOnly and idempotent, so this extra context is beneficial.

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 three sentences, front-loaded with purpose, then providing matching behavior and usage hints. It is concise and well-structured, with no unnecessary words.

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 purpose, matching logic, return value, and usage context. It is complete for the tool's complexity, especially given the high schema coverage and annotations.

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%. The description reiterates case-insensitivity and array matching, which are already in the schema, so no significant new semantics are added. Baseline 3 is appropriate.

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

Purpose5/5

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

The description clearly states the tool's purpose: 'Find notes whose YAML frontmatter contains a given property/value pair.' It specifies a specific verb and resource, and the function is distinct from sibling tools like search_by_tag or search_notes.

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

Usage Guidelines4/5

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

The description explicitly suggests use cases: 'Use to filter notes by metadata like status, type, or tags stored in frontmatter.' It provides clear context but lacks explicit when-not-to-use guidance or comparisons to alternative tools.

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

search_by_tagSearch by TagA
Read-onlyIdempotent

Find all notes tagged with a specific tag, including nested sub-tags (searching 'project' matches both #project and #project/alpha). Detects tags from both inline #hashtags and YAML frontmatter. Returns matching note paths with optional content previews. Use to collect notes belonging to a topic, area, or workflow stage.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagYesTag to search for, with or without # prefix (e.g., 'project' or '#project'). Matches nested tags like 'project/alpha'.
maxResultsNoMaximum number of matching notes to return (1-1000, default: 100)
includeContentNoIf true, include the first 200 characters of each matching note as a preview (default: false)

TDQS

A4.4/5.0
Behavior5/5

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

The description discloses key behavioral traits beyond the annotations: it explains nested sub-tag matching, detection from both inline and YAML frontmatter, and the return format (note paths with optional content previews). This adds significant context on top of the readOnlyHint and idempotentHint 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 at three sentences, each serving a distinct purpose: stating the main function with a key feature, adding a detail on tag sources, and providing a use case. It is front-loaded with the verb and resource, with no wasted words.

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

Completeness4/5

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

For a simple search tool with three parameters and no output schema, the description covers the primary functionality, tag matching behavior, and return type. It is mostly complete, though it does not mention result ordering or pagination limits; however, these are covered in the schema for maxResults.

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 has 100% coverage and already contains detailed descriptions for all three parameters (e.g., tag, maxResults, includeContent). The tool description does not add new parameter-level meaning beyond what the schema provides, so it meets the baseline of 3.

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 resource 'all notes tagged with a specific tag', and distinguishes itself from siblings by explicitly mentioning nested sub-tags and detection from inline #hashtags and YAML frontmatter. It also provides a concrete use case: 'collect notes belonging to a topic, area, or workflow stage'.

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 advises when to use the tool ('Use to collect notes belonging to a topic, area, or workflow stage'), and its mention of nested sub-tags implicitly differentiates it from other search tools. However, it does not explicitly state when not to use it or compare to specific alternatives, which would elevate it to a 5.

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

search_notesSearch NotesA
Read-onlyIdempotent

Full-text search across all notes in the vault. Returns matching note paths grouped with the line numbers and snippet content of each hit. Use to locate notes containing a phrase, keyword, or code fragment; pair with get_note to retrieve full bodies.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesLiteral search string matched against note body text (not regex)
folderNoRestrict search to this folder relative to the vault root (omit to search entire vault)
maxResultsNoMaximum number of matching notes to return (1-500, default: 20)
caseSensitiveNoIf true, match case exactly; otherwise case-insensitive (default: false)

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 idempotentHint=true; description adds details on return format (paths with line numbers and snippet content) which is consistent and valuable. No contradictions.

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, zero waste. Front-loaded with the core functionality and return format. Efficient and easy to parse.

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?

No output schema, but description explains return format. Suggests pairing with get_note for completeness. Covers behavior adequately; minor omission of what happens on no results, but overall complete for a search tool.

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

Parameters3/5

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

Schema description coverage is 100%, so baseline is 3. The description does not add new meaning beyond what the schema already provides (e.g., query is literal, folder restricts, etc.)

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?

Clear verb+resource: 'full-text search across all notes'. Distinguishes from siblings like search_by_tag and search_semantic by specifying full-text and return format (paths with line numbers and snippets).

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: 'locate notes containing a phrase, keyword, or code fragment'. Provides a recommended pairing with get_note for full bodies, implicitly guiding against using it when tag-based or semantic search would be more appropriate.

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

search_semanticSemantic SearchA
Read-onlyIdempotent

Search notes by meaning rather than keywords. Embeds the query with the configured provider, scores every chunk in the persisted index by cosine similarity, and returns the best-matching note per cluster (deduplicated to one hit per note). Run index_vault first to populate the index — this tool does not auto-index because the user should know they're paying the embedding cost. Pair with get_note to retrieve full bodies after picking a hit.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of notes to return (1-100, default: 10).
queryYesNatural-language description of what you're looking for, e.g. 'notes about onboarding new hires'.
folderNoRestrict the search to a folder relative to the vault root.
includeSnippetNoIf true (default), include a short snippet of the matching chunk under each hit.

TDQS

A4.4/5.0
Behavior5/5

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

Above and beyond annotations (readOnlyHint, openWorldHint, idempotentHint), the description discloses that the tool embeds queries, scores all chunks, deduplicates results, and does not auto-index due to cost. This equips the agent with operational understanding of the tool's behavior.

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

Conciseness5/5

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

Three sentences, each serving a distinct purpose: definition of functionality, explanation of internal process, and actionable usage guidance (prerequisites and pairing with get_note). No wasted words; front-loaded with critical information.

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 prerequisites, mechanism, and output structure (deduplicated best-matching note). However, lacks explicit mention of output format (e.g., list of notes with scores) and behavior for empty results. Given no output schema, these details would enhance completeness.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3. The description adds high-level context but does not significantly enhance the parameter descriptions beyond what the schema already provides. For example, the query parameter is already well-described in 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 explicitly states 'Search notes by meaning rather than keywords', clearly distinguishing it from keyword-based search tools like search_notes. It also details the mechanism (embedding, scoring, deduplication), making the specific 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 Guidelines4/5

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

It instructs to run index_vault first and explains why auto-indexing is disabled (embedding cost). It pairs with get_note for retrieval, providing a clear workflow. However, it does not explicitly list when not to use it or mention alternative sibling tools like search_by_tag.

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

update_frontmatterUpdate FrontmatterA
DestructiveIdempotent

Merge new key-value pairs into a note's YAML frontmatter, preserving any keys not mentioned and leaving the body content untouched. Keys in the payload overwrite existing values. Creates a frontmatter block if the note has none. Returns a count of properties written. Use to set status fields, tags arrays, or other metadata without rewriting the body.

Note: The YAML block is regenerated on each update — comments, custom quoting, multi-line scalar style, blank lines, and key ordering inside the block are normalized. Key presence and values are preserved; formatting is not.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesRelative path from vault root to the note (e.g., 'projects/alpha.md'). Extension optional.
propertiesYesJSON object string of frontmatter keys to set, e.g., '{"status":"done","priority":1,"tags":["review"]}'. Existing keys not in the payload are preserved.

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the annotations (destructive, idempotent), the description details that the YAML block is regenerated, normalizing comments, quoting, multi-line scalars, blank lines, and key ordering. It also notes that it creates a frontmatter block if none exists. This fully discloses 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?

Two paragraphs: first states purpose and return value, second warns about formatting normalization. Front-loaded with key information, no wasted words.

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 no output schema, the description includes the return value (count of properties written). It covers all necessary aspects: merge semantics, behavior on missing frontmatter, and formatting caveats. Sibling context is naturally handled, and the definition is self-contained.

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% with descriptions for both parameters. The description adds value by explaining the merge behavior: 'Keys in the payload overwrite existing values' and 'Existing keys not in the payload are preserved,' which is not fully captured in 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 clearly states it merges key-value pairs into YAML frontmatter, preserving existing keys and body content. It distinguishes itself from siblings like replace_in_note or update_section by focusing solely on frontmatter metadata.

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 explicitly says 'Use to set status fields, tags arrays, or other metadata without rewriting the body.' This provides clear guidance on when to use the tool, though it does not explicitly mention alternatives for body changes.

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

update_sectionUpdate SectionA
DestructiveIdempotent

Replace the body of a specific section (everything between a heading and the next heading at any level). The heading line itself is preserved. section is a heading path: 'Tasks', 'Project A/Status', etc. - case-insensitive and whitespace-tolerant. Use this instead of rewriting the whole file when you only need to update one section.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesVault-relative path to the note (e.g., 'folder/note.md'). Extension required.
newBodyYesReplacement body content. The heading line itself is kept intact.
sectionYesHeading path identifying the section to replace (e.g., 'Tasks' or 'Daily/Today').

TDQS

A4.6/5.0
Behavior4/5

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

Annotations indicate destructiveHint=true and idempotentHint=true, consistent with a replacement operation. The description adds behavior beyond annotations by stating the heading line is preserved and defining the section scope as 'everything between a heading and the next heading at any level'.

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 with two sentences plus a parenthetical detail about the section parameter. It is front-loaded with the primary action and efficiently provides necessary usage instructions without redundancy.

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 mutative nature and no output schema, the description adequately covers input behavior and constraints. It clarifies what is replaced and preserved. However, it does not address edge cases like missing sections, which could be inferred but not explicit.

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 description adds meaningful context: 'section' is a heading path with case-insensitive and whitespace-tolerant matching, 'newBody' is replacement content without the heading, and 'path' explicitly requires extension. This supplements the schema well.

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

Purpose5/5

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

The description clearly states the tool replaces the body of a specific section, preserving the heading line. It distinguishes itself from sibling tools like 'insert_at_section' by specifying it replaces content rather than inserts, and from 'replace_in_note' by targeting a section instead of the whole note.

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 advises using this tool 'instead of rewriting the whole file when you only need to update one section', giving clear context for when to choose it over alternatives. It also explains the 'section' parameter format with details on case-insensitivity and whitespace tolerance.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 41 tool updatesv2.0.0
    • Addedadd_canvas_edge
    • Addedadd_canvas_node
    • Addedappend_to_note
    • Addedcreate_daily_note
    • Addedcreate_note
    • Addeddelete_note
    • Addededit_block
    • Addedfind_broken_links
    • Addedfind_orphans
    • Addedfind_similar_notes
    • Addedfind_unused_attachments
    • Addedget_attachment
    • Addedget_backlinks
    • Addedget_daily_note
    • Addedget_graph_neighbors
    • Addedget_note
    • Addedget_outlinks
    • Addedget_recent_notes
    • Addedget_vault_stats
    • Addedindex_vault
    • Addedinsert_at_section
    • Addedlist_attachments
    • Addedlist_bases
    • Addedlist_canvases
    • Addedlist_notes
    • Addedlist_sections
    • Addedlist_tags
    • Addedmove_note
    • Addedprepend_to_note
    • Addedquery_base
    • Addedread_base
    • Addedread_canvas
    • Addedrename_tag
    • Addedreplace_in_note
    • Addedresolve_alias
    • Addedsearch_by_frontmatter
    • Addedsearch_by_tag
    • Addedsearch_notes
    • Addedsearch_semantic
    • Addedupdate_frontmatter
    • Addedupdate_section
  2. 41 tool updatesv1.9.0
    • Removedadd_canvas_edge
    • Removedadd_canvas_node
    • Removedappend_to_note
    • Removedcreate_daily_note
    • Removedcreate_note
    • Removeddelete_note
    • Removededit_block
    • Removedfind_broken_links
    • Removedfind_orphans
    • Removedfind_similar_notes
    • Removedfind_unused_attachments
    • Removedget_attachment
    • Removedget_backlinks
    • Removedget_daily_note
    • Removedget_graph_neighbors
    • Removedget_note
    • Removedget_outlinks
    • Removedget_recent_notes
    • Removedget_tags
    • Removedget_vault_stats
    • Removedindex_vault
    • Removedinsert_at_section
    • Removedlist_attachments
    • Removedlist_bases
    • Removedlist_canvases
    • Removedlist_notes
    • Removedlist_sections
    • Removedmove_note
    • Removedprepend_to_note
    • Removedquery_base
    • Removedread_base
    • Removedread_canvas
    • Removedrename_tag
    • Removedreplace_in_note
    • Removedresolve_alias
    • Removedsearch_by_frontmatter
    • Removedsearch_by_tag
    • Removedsearch_notes
    • Removedsearch_semantic
    • Removedupdate_frontmatter
    • Removedupdate_section
  3. 19 tool updatesv1.8.0
    • Addededit_block
    • Addedfind_similar_notes
    • Addedfind_unused_attachments
    • Addedget_attachment
    • Changedget_note3 fields changed
      • addedInput schema / properties / block
        Added value: +{
        +  "description": "Block id (without the leading `^`). Returns just the paragraph or block tagged with that id.",
        +  "type": "string"
        +}
      • addedInput schema / properties / lines
        Added value: +{
        +  "description": "Line range, 1-indexed and inclusive (e.g., '10-25' or '42'). Returns just those lines.",
        +  "pattern": "^\\d+(-\\d+)?$",
        +  "type": "string"
        +}
      • addedInput schema / properties / section
        Added value: +{
        +  "description": "Heading path (e.g., 'Tasks' or 'Project A/Status'). Returns just that section's body.",
        +  "type": "string"
        +}
    • Addedget_recent_notes
    • Addedget_vault_stats
    • Addedindex_vault
    • Addedinsert_at_section
    • Addedlist_attachments
    • Addedlist_bases
    • Addedlist_sections
    • Addedquery_base
    • Addedread_base
    • Addedrename_tag
    • Addedreplace_in_note
    • Addedresolve_alias
    • Addedsearch_semantic
    • Addedupdate_section
  4. 3 tool updatesv1.4.0
    • Addedget_graph_neighbors
    • Addedget_tags
    • Addedsearch_by_tag
  5. 3 tool updatesv1.5.3
    • Removedget_graph_neighbors
    • Removedget_tags
    • Removedsearch_by_tag
  6. 1 tool updatev1.5.0
    • Addedget_graph_neighbors
  7. 4 tool updatesv1.5.2
    • Changedadd_canvas_node1 field changed
      • addedInput schema / properties / color / pattern
        Added value: +"^([1-6]|#[0-9a-fA-F]{3,8})$"
    • Changeddelete_note1 field changed
      • addedInput schema / properties / removeReferences
        Added value: +{
        +  "default": false,
        +  "description": "If true (and permanent=true), strip wikilinks and markdown links pointing at the deleted file across the vault. Embeds are removed entirely; plain links fall back to their visible text (alias if present, else the deleted file's basename). Ignored when permanent=false. Default false — opt in explicitly because the rewrite is irreversible.",
        +  "type": "boolean"
        +}
    • Removedget_graph_neighbors
    • Changedmove_note1 field changed
      • addedInput schema / properties / updateLinks
        Added value: +{
        +  "default": true,
        +  "description": "If true (default), update every wikilink, markdown link, and canvas node reference across the vault to point at the new path. Set false to skip the rewrite pass.",
        +  "type": "boolean"
        +}

TDQS

A4.5/5.0

Scored across 41 tools

Disambiguation5/5

Every tool serves a unique purpose, with detailed descriptions that clearly differentiate between similar operations (e.g., search_notes vs search_semantic, edit_block vs update_section). No two tools have ambiguous boundaries.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern in snake_case, with clear verbs like create, get, list, search, and update. No mixing of conventions or confusing nomenclature.

Tool Count4/5

41 tools is numerous, but the server covers an exceptionally wide domain (notes, canvases, tags, attachments, bases, graph, daily notes, etc.), so the count is justified. It's on the high side but not excessive given the feature breadth.

Completeness5/5

The tool set provides comprehensive CRUD and lifecycle operations for almost all Obsidian vault resources: notes, canvases, bases, tags, attachments, daily notes, and graph analysis. Only minor gaps like folder management exist, but they are compensated by auto-creation on write.

Maintenance

ActivityMaintained
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    D
    maintenance
    Local-first MCP server for Obsidian vaults with 66 tools for reading, writing, searching, and managing notes, tasks, graphs, and more. Works without Obsidian running and requires no plugins.
    66
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Standalone MCP server for Obsidian vaults - hybrid search (FTS5 + vector + cross-encoder reranking), images and PDFs in agent-readable form, Kanban-aware tasks (Tasks-plugin + Dataview formats), structured memory with topic recall, fine-grained read/write tools for optimal token efficiency, and link graph support. Run locally, self-host, or one-click deploy for remote access. OAuth 2.1.
    4
    33
    596 npm
    19
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    MCP server for Obsidian that exposes tools for reading/writing notes, managing frontmatter and tags, querying Tasks, semantic search, and interacting with Obsidian Bases, with shared local caching and support for various runtime modes.
    39
    Apache 2.0