obsidian-mcp-pro
obsidian-mcp-pro gives AI assistants deep, structured access to an Obsidian vault for reading, writing, searching, tagging, link analysis, graph traversal, and canvas manipulation.
Read & Search
search_notes— Full-text search with optional folder scopingget_note— Read full content and metadata by pathlist_notes— List all notes in the vault or a specific folderget_daily_note— Retrieve today's or a specific date's daily notesearch_by_frontmatter— Find notes by frontmatter property values
Write & Modify
create_note— Create a note with optional frontmatter and contentappend_to_note/prepend_to_note— Add content to end or beginning of a noteupdate_frontmatter— Update frontmatter without altering the note bodycreate_daily_note— Create a daily note, optionally from a templatemove_note— Move or rename a note (with automatic link updates)delete_note— Delete a note (to trash by default, or permanently)
Tags
get_tags— List all tags with usage counts, sortable by count or namesearch_by_tag— Find notes by single or multiple tags, with optional content preview
Links & Graph
get_backlinks/get_outlinks— Find notes linking to or from a given notefind_orphans— Identify notes with no incoming or outgoing linksfind_broken_links— Detect wikilinks pointing to non-existent notesget_graph_neighbors— Traverse the link graph up to 5 hops in any direction
Canvas
list_canvases— List all.canvasfiles in the vaultread_canvas— Read a canvas's full node and edge dataadd_canvas_node— Add a text, file, link, or group node with position, size, and coloradd_canvas_edge— Add a directed edge between nodes with optional label and side anchors
MCP Resources
Access vault data via URI patterns: obsidian://note/{path}, obsidian://tags, and obsidian://daily.
Vault selection is configured via OBSIDIAN_VAULT_PATH/OBSIDIAN_VAULT_NAME environment variables or automatic OS detection.
Allows for structured manipulation of Markdown documents within the vault, including parsing and updating frontmatter properties, as well as appending or prepending content to existing files.
Provides comprehensive access to Obsidian vaults, enabling AI agents to search notes, read and write content with frontmatter support, manage tags, analyze backlinks and outlinks, and traverse the link graph.
obsidian-mcp-pro
The most feature-complete MCP server for Obsidian vaults.
⭐ Please star us on GitHub, it helps us reach more users!
💙 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.
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
Read & Search
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_notesorders by mtime;get_vault_statsreports counts, words, tag coverage;resolve_aliastranslates 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
.trashfolder by default, with an optional permanent flag and elicitation-based confirmationSurgical edits by heading:
update_section,insert_at_section,list_sections, plus single-notereplace_in_note(regex with match-count guard) andedit_blockfor paragraphs tagged with^id
Tags
Build and query a complete tag index (incremental: cached across runs)
Search notes by single or multiple tags
rename_tagrewrites both inline#tagoccurrences and frontmattertags:arrays vault-wide; hierarchical mode also rebases nested sub-tags (project/alphafollowsproject)
Links & Graph
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
.canvasfiles with full node and edge dataAdd new nodes (text, file, link, group) to canvases
Add edges between canvas nodes
List all canvases in the vault
Bases (Obsidian 1.10+)
list_basesenumerates.basefilesread_basereturns the parsed YAML (filters, properties, views)query_baseruns the filter DSL against the vault and returns matching notes; supportstaggedWith(),file.hasTag(),file.inFolder(), comparison operators, andand/or/notcombinators. Unsupported filters warn and fail closed instead of broadening results.
Attachments
list_attachmentsenumerates every non-md/canvas/base file with a per-extension count summaryfind_unused_attachmentsflags assets no note references via embeds or markdown links; optional reclaimable-bytes reportget_attachmentreturns image / audio / blob bytes inline as MCP content blocks (5 MB default cap, 50 MB hard cap)
Semantic Search (optional, Ollama or OpenAI)
index_vaultchunks each note (heading-aware), embeds via the configured provider, persists vectors to<vault>/.obsidian/cache/, and incrementally re-embeds only changed notesBecause indexing sends readable note chunks to the configured embedding provider,
index_vaultrequiresconfirm: "send-vault-text-to-embedding-provider"on each callsearch_semanticranks notes by cosine similarity against an embedded queryfind_similar_notesreuses an existing note's embeddings, with source-topic anchoring, to surface neighbors without a live API callStored 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 pathobsidian://tagsretrieves the full tag index as JSONobsidian://dailygets 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-reviewwalks today's daily note, surfaces unchecked tasks, and proposes follow-upsweekly-rollupaggregates the last seven daily notes into themes / decisions / open tasksfind-stale-noteslocates untouched notes and clusters them as orphaned vs. broken-linked vs. still-linkedextract-action-itemspulls all- [ ] …lines from a note (or every note matching a tag) into a checklistbuild-mocgenerates a Map of Content (MOC) for a tag or folder
Operational features
Folder-scoped permissions:
OBSIDIAN_READ_PATHS/OBSIDIAN_WRITE_PATHSallowlists gate every tool at the path-resolution choke pointIn-memory mtime cache speeds repeated vault scans within a running process without persisting note bodies to disk
Progress notifications (
notifications/progress) onrename_tag,find_unused_attachments, andindex_vaultwhen the client subscribes via_meta.progressTokenHard bulk-write latches require
confirmPathfor defaultmove_notereference rewrites,confirmTagfor non-dry-runrename_tag, andconfirm=truefor 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 installThis 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/vaultManual 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-proHTTP Transport (Remote Clients, Cursor, ChatGPT, Web)
MCP_HTTP_TOKEN=your-secret npx -y obsidian-mcp-pro --transport=http --port=3333Endpoint: 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=httpThe 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
Hostheader exactly and case-sensitively, including a port when present. Usevault.example.com:443if the proxy forwards that value instead ofvault.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
allowedHostsor 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).
/healthand/versionskip Host validation (pre-existing)./mcprejects 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.
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, andRestrict
--allow-originto the specific origins you trust, andSet
--rate-limitto 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 |
| Restrict CORS to an allowlist (e.g. |
| Cap requests per minute per client IP. |
Operational endpoints (no auth required):
Endpoint | Returns |
|
|
|
|
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
#projectI 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."
)
→ okClaude: I reviewed 7 project notes tagged
#project. Atlas is on track pending design review; the Q2 milestone is at risk — details inmilestones.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_notes→get_outlinks→get_graph_neighborswalks the graph todepth=2and surfaces related notes the user may have forgotten.Clean up dangling references after a rename.
move_note→find_broken_linksreturns every wikilink that now points nowhere, with source note and line number.Maintain a daily log.
get_daily_notereads today's note (using the vault's configured date format) andappend_to_noteadds 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_edgelays 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 |
| Environment variable with the absolute path to your vault |
2 |
| Environment variable to select a vault by folder name when multiple vaults exist |
3 | Auto-detection | Reads Obsidian's global config ( |
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 |
| Absolute path to the vault (highest-priority vault selector). | auto-detect |
| Select a vault by folder name when several exist. | first valid vault |
| Comma/colon list of folders read tools may access (see Folder-Scoped Permissions). | unrestricted |
| Same shape, for mutating tools. | unrestricted |
| Set truthy to disable the in-memory mtime cache (see Caches). | enabled |
| Semantic-search provider, e.g. | unset (disabled) |
| Embedding model name for the chosen provider. | provider default |
| Override the embedding endpoint base URL. | provider default |
| API key for the embedding provider. | falls back to |
| Used as the embedding key when | unset |
| Bearer token required by the HTTP transport (see HTTP Transport). | unset |
| Logger verbosity: |
|
| Log output format: |
|
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 | |
|
|
|
| |
|
|
|
| |
|
|
|
| |
|
|
|
| |
|
|
|
| |
|
|
|
| |
|
|
|
| |
|
|
|
| |
| renders the bracket contents verbatim, e.g. |
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 |
| Comma- or colon-separated list of folders that read tools may access. Unset means unrestricted. Use |
| 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 |
| Persisted embeddings for semantic search (only present once |
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 |
|
|
|
|
| Provider-specific model identifier. |
|
| Base URL without credentials, query strings, or fragments. |
|
| 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
.mdfiles; attachments, Canvas files, and Bases stay on their dedicated tools with their own caps and parsers.Full-note cap — full
.mdnote reads and read-modify-write helpers refuse notes over 5 MiB before materializing them;get_noteline fragments still stream from large notes for targeted inspection.Excluded directories —
.obsidian,.git, and.trashare 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.1by default with DNS rebinding protection (host-header allowlist)./mcprequests must sendAuthorization: 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 withtext/plainresource metadata.Canvas link safety — Canvas link nodes added through the server accept only absolute
http://andhttps://URLs, preventing local file and application-protocol links from being persisted by tool calls.Regex edit safety —
replace_in_notecaps 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 errorbody 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 freshness —
search_semanticandfind_similar_notesre-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 confirmation —
index_vaultrefuses to read and embed vault notes unless the call includesconfirm: "send-vault-text-to-embedding-provider", making provider-bound note transfer explicit.Bulk-write confirmations —
move_notereference rewrites requireconfirmPathto match the destination path, and non-dry-runrename_tagrequiresconfirmTagto 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. Theinstallsubcommand uses the same pattern and keeps a backup of the previous config.Rate limiting + CORS allowlist — optional
--rate-limitcaps per-IP request volume;--allow-originrestricts browser-facing CORS and refuses*unless bearer auth is enabled./healthand/versionstay 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 supervision —
uncaughtExceptionexits cleanly so systemd/Docker/npx supervisors can restart;unhandledRejectionlogs but doesn't kill the process.
Wikilink Resolution
[[Target]] resolves in the same order Obsidian does:
Exact relative-path match (case-insensitive).
Path-suffix match (e.g.
[[projects/foo]]pickswork/projects/foo.md).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.
Frontmatter
aliases—[[Display Name]]resolves to a note whose frontmatter declares that alias.aliases,Aliases, andALIASESare 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 |
| Focus-ranked full-text search with query-centered snippets (cached) |
|
| Read a note whole, or by |
|
| List notes in the vault or a folder |
|
| Get today's (or a specific date's) daily note |
|
| Find notes by frontmatter property values with case-insensitive key/value matching |
|
| Notes sorted by mtime; optional ISO-or-relative |
|
| Vault counts, bytes, words, tag coverage, most-recent note |
|
| Translate frontmatter alias (or basename) to note path |
|
Write
Tool | Description | Key Parameters |
| Create a new note with content and frontmatter |
|
| Append content to an existing note |
|
| Prepend content after frontmatter |
|
| Update frontmatter properties on a note |
|
| Create today's daily note from template |
|
| Move or rename a note; rewrites references across the vault |
|
| Delete a note (trash by default); optional elicitation on permanent |
|
Section-level edits
Tool | Description | Key Parameters |
| Replace the body under a heading path (heading kept) |
|
| Insert at |
|
| Return the heading outline of a note as an indented tree |
|
| Find/replace within one note (literal or regex, with match-count guard) |
|
| Replace content of a paragraph tagged |
|
Tags
Tool | Description | Key Parameters |
| Get all tags and their usage counts |
|
| Find all notes with a specific tag |
|
| Rewrite inline + frontmatter occurrences vault-wide; hierarchical |
|
Links & graph
Tool | Description | Key Parameters |
| Get all notes that link to a given note |
|
| Get all links from a given note |
|
| Find notes with no links in or out |
|
| Detect links pointing to non-existent notes |
|
| Get notes connected within N link hops |
|
Canvas
Tool | Description | Key Parameters |
| List all | (none) |
| Read a bounded |
|
| Add a node to a canvas |
|
| Add an edge between two canvas nodes |
|
Bases
Tool | Description | Key Parameters |
| Enumerate | (none) |
| Parse a Base file (filters, properties, views) |
|
| Run a Base's filter DSL against the vault; unsupported filters warn and fail closed |
|
Attachments
Tool | Description | Key Parameters |
| Enumerate every non-md/canvas/base file |
|
| Attachments not referenced via embeds or markdown links |
|
| Return image / audio / blob content (5 MB default cap) |
|
Semantic search
Tool | Description | Key Parameters |
| Build / refresh the embedding index (incremental, progress events) |
|
| Cosine search the embedding index for a natural-language query |
|
| Surface notes most similar to a source note, anchored to its opening topic (no live API call) |
|
MCP Resources
Resources provide a URI-based way to access vault data:
Resource URI | Description |
| Read any note by its vault-relative path |
| Full tag index with file lists (JSON) |
| 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:
OBSIDIAN_VAULT_PATHenv var (absolute path) — always wins if set.OBSIDIAN_VAULT_NAMEenv var — picks a named vault from Obsidian's global config.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 startGitHub 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.tsTesting
npm test952 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-fixWhat's New
v1.8.2 rolls in a deeper-dive audit pass on top of 1.8.1:
rename_tagand other vault-wide bulk writers now hold the same rewrite lock asmove_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.applyRewritesretries failed edits via content search. When bytes shift between plan and apply (Obsidian sync, text editor, concurrent tool), the apply step now finds the uniqueexpectedsubstring at its new position and splices there. If ambiguous or missing, the failure is still surfaced rather than corrupting the file.planMoveRewritesandplanDeleteRewritesnow 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).
/healthno longer leaks the live session count when a Bearer token is configured. Status + version stay public for monitoring;sessionsis dropped in authenticated deployments. In 4.0.0 and later, HTTP always starts with bearer auth, so the field stays hidden.constantTimeEqualis now fully length-safe (pads both inputs to a fixed width before comparing), and the regex / parser hardening list also closed:resolveWikilinkproximity tie-break for path-suffix matches, escaped]in markdown link labels, control- character validation onrunInstall.vaultName, backup-path hint on install write failure, andmapConcurrentreturn-value usage in the canvas planner.npm auditclean. 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 evaluatedOBSIDIAN_READ_PATHS/OBSIDIAN_WRITE_PATHSagainst the raw user-supplied path beforepath.resolvecollapsed... An input likeAllowed/../OtherFolder/note.mdslipped past the prefix check.assertAllowednow collapses..viapath.posix.normalizeand 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 inrename_tagclosed by moving the rewrite insideupdateNote's transform, andsearch_semantic/find_similar_notesnow invalidate stale vectors when the active provider/model differs from what produced the index.MEDIUM: depth guard on Bases filter recursion,
updateNoteskips 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
acceptelicitation 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 onget_note(section,block,lines).Bases support.
list_bases,read_base,query_basefor Obsidian's database-view files. First filesystem-only MCP server to ship native Bases.Semantic search.
index_vault,search_semantic,find_similar_notesbacked 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_tagrewrites both inline#tagand frontmattertags:(hierarchical mode rebases nested sub-tags).Folder-scoped permissions.
OBSIDIAN_READ_PATHS/OBSIDIAN_WRITE_PATHSallowlists.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_notereference rewrites, and non-dry-runrename_tag, plus elicitation prompts for clients that support them.eslint wired up with typescript-eslint flat config;
npm run lintandlint:fix.
v1.7.0 — delete_note reference handling:
delete_notecan strip references vault-wide whenpermanent: trueis paired withremoveReferences: 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 rewrites —
move_note(withupdateLinks: true) anddelete_note(withremoveReferences: true) serialize per vault, removing the partial-failure mode for parallel rewrite-bearing operations.
v1.6.0 — Obsidian-parity link maintenance:
move_noterewrites references across the vault by default, matching Obsidian's "Automatically update internal links" behavior. Wikilinks (with aliases / fragments preserved), markdown links, and canvasnodes[].filefields 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_notebetween plan and apply is surfaced infailedReferrersrather than corrupting referrers silently.Control-char injection defense —
sanitizeErrorand the newescapeControlCharsstrip 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 thesanitizeErrordefense-in-depth hardening contributed by @brentkearney.
For the full list of everyone who's contributed, see the contributors page.
Available Tools
41 toolsadd_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.
| Name | Required | Description | Default |
|---|---|---|---|
| label | No | Optional text label rendered on the edge | |
| toNode | Yes | UUID of the target (destination) node - must already exist on the canvas | |
| toSide | No | Face of the target node the edge arrives at (default: auto-chosen by Obsidian) | |
| fromNode | Yes | UUID of the source (origin) node - must already exist on the canvas | |
| fromSide | No | Face of the source node the edge leaves from (default: auto-chosen by Obsidian) | |
| canvasPath | Yes | Relative path from vault root to the target .canvas file |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | X 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. | |
| y | No | Y 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. | |
| type | Yes | Node kind: 'text' = markdown block, 'file' = vault note reference, 'link' = external URL, 'group' = labeled container | |
| color | No | Color: '1'-'6' for Obsidian's preset palette (red/orange/yellow/green/cyan/purple), or a hex code like '#ff5555' | |
| width | No | Node width in pixels (default: 250, max: 10000) | |
| height | No | Node height in pixels (default: 60, max: 10000) | |
| content | Yes | Interpretation depends on type: text body for 'text', relative note path for 'file', URL for 'link', display label for 'group' | |
| canvasPath | Yes | Relative path from vault root to the target .canvas file |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Relative path from vault root to the target note (e.g., 'journal/2026-04-15.md'). Extension optional. | |
| content | Yes | Markdown 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
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | Target date in YYYY-MM-DD format (defaults to today). Determines filename and {{date}} substitution. | |
| content | No | Initial markdown body for the daily note. Ignored if templatePath is provided. | |
| templatePath | No | Relative 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
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Relative path from vault root, e.g., 'folder/note.md' or 'note' (.md added automatically) | |
| content | Yes | Markdown body content for the note (rendered below the frontmatter block if any) | |
| frontmatter | No | JSON object string of frontmatter key-value pairs (e.g., '{"status":"draft","tags":["idea"]}'). Rendered as YAML at the top of the note. |
TDQS
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.
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.
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.
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.
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.
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 NoteADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Relative path from vault root to the note to delete (e.g., 'archive/old.md'). Extension optional. | |
| confirm | No | Safety 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. | |
| permanent | No | If true, delete the file permanently from disk; if false (default), move it to the vault's .trash folder so it can be recovered. | |
| removeReferences | No | 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. |
TDQS
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.
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.
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.
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.
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.
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 BlockADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Vault-relative path to the note. | |
| block | Yes | Block id with or without the leading `^` (e.g. `myid` or `^myid`). | |
| newContent | Yes | Replacement content. The `^id` anchor is appended automatically. |
TDQS
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.
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.
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.
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.
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.
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_broken_linksFind Broken LinksARead-onlyIdempotent
Scan notes for wikilinks ([[target]]) whose target does not resolve to any existing note in the vault. Returns a per-source report grouping each note with its broken link text and line numbers, plus a total count. Use after renaming, moving, or deleting notes to catch dangling references. Resolution uses the whole vault even when scanning a single folder, so only truly unresolvable links are reported.
| Name | Required | Description | Default |
|---|---|---|---|
| folder | No | Restrict the scan to notes within this folder (resolution still uses the entire vault). Omit to scan every note. | |
| maxResults | No | Maximum broken link entries to show (1-1000, default: 200). Grouped by source note. Remaining matches are summarized. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations show readOnlyHint and idempotentHint, consistent with scanning. Description adds behavioral context: returns per-source report, total count, only truly unresolvable links reported, uses whole vault for resolution, and groups entries by source note.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, each essential. Front-loaded with purpose. No filler or redundancy. Efficiently provides all necessary context without excess.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Even without output schema, description explains return format (per-source report with broken link text, line numbers, total count). Covers scanning scope and resolution behavior. Contextually complete for a scan tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers 100% of parameters. Description adds meaning beyond schema: folder restricts scan but resolution uses whole vault; maxResults groups by source and summarizes remaining entries. This helps agent understand behavior beyond parameter limits.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the tool scans for wikilinks whose target does not resolve, returns per-source report with broken link text and line numbers, and total count. It distinguishes from sibling tools like find_orphans or find_unused_attachments by focusing on dangling references after renaming/moving/deleting.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to use after renaming, moving, or deleting notes to catch dangling references. Also clarifies that resolution uses whole vault even when scanning a single folder. No explicit when-not, but context is clear and helpful.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_orphansFind Orphan NotesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| maxResults | No | Maximum total note paths to list across all categories (1-1000, default: 200). Full counts are always reported regardless. | |
| includeOutlinksCheck | No | If true (default), also report notes with no outgoing links; if false, only report fully-isolated notes and notes with no backlinks. |
TDQS
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.
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.
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.
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.
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.
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 NotesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Vault-relative path to the source note, e.g. 'projects/atlas.md'. | |
| limit | No | Maximum number of similar notes to return (1-100, default: 10). |
TDQS
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.
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.
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.
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.
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.
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 AttachmentsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of unused-attachment paths to return (1-10000, default: 200). Total counts are still reported. | |
| includeBytes | No | If true, also stat each unused attachment and report total reclaimable bytes. |
TDQS
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.
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.
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.
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.
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.
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 AttachmentARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Vault-relative path to the attachment, e.g. 'assets/diagram.png'. | |
| maxBytes | No | Maximum file size to fetch in bytes (default: 5,242,880, hard cap: 52,428,800). |
TDQS
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.
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.
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.
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.
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.
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_backlinksGet BacklinksARead-onlyIdempotent
List all notes that contain a wikilink pointing to the target note. Each result includes the source note path, line number, and the surrounding line text for context. Use to understand which notes reference a topic, or to assess the impact of renaming or deleting a note. Accepts paths with or without .md extension; falls back to basename matching if exact match fails.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Target note path relative to vault root (e.g., 'folder/note.md' or 'note'). Extension optional. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already show readOnlyHint and idempotentHint. Description adds valuable behavioral details beyond annotations: accepts paths with/without .md extension and fallback to basename matching. 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, no wasted words. Front-loaded with purpose, then output details, then usage context, then edge cases. Perfectly sized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema, description lists output fields (source path, line, context). Covers purpose, output, usage, and fallback behavior. Complete for a read-only tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with description on path. Description adds meaning: relative path, extension optional, and fallback behavior. Goes beyond schema to provide practical usage guidance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states it lists notes with wikilinks to the target, with specific output details (source path, line number, context). Distinguishes from sibling get_outlinks by focusing on incoming links.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use (understand references, assess rename/delete impact). Does not mention when not to use or compare to siblings like find_broken_links, but context is clear enough for typical use.
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 NoteARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | Target date in YYYY-MM-DD format (defaults to today's local date) |
TDQS
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.
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.
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.
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.
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.
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 NeighborsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Starting note path relative to vault root (e.g., 'projects/alpha.md'). Extension optional; falls back to basename match. | |
| depth | No | Maximum link-hops to traverse from the start note (1-3, default: 1). Higher values explore exponentially more notes. | |
| direction | No | Traversal direction: 'outbound' follows outlinks the start note points to, 'inbound' follows backlinks pointing at the start note, 'both' follows either (default) | both |
| maxResults | No | Maximum neighbor notes to return (1-1000, default: 200). Traversal stops early when this cap is reached and a truncation notice is appended. |
TDQS
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.
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.
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.
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.
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.
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 NoteARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Relative path from vault root to the note (e.g., 'folder/note.md'). Extension required. | |
| block | No | Block id (without the leading `^`). Returns just the paragraph or block tagged with that id. | |
| lines | No | Line range, 1-indexed and inclusive (e.g., '10-25' or '42'). Returns just those lines. | |
| section | No | Heading path (e.g., 'Tasks' or 'Project A/Status'). Returns just that section's body. |
TDQS
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.
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.
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.
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.
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.
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_outlinksGet OutlinksARead-onlyIdempotent
List every outgoing wikilink from a note, partitioned into valid links (resolve to an existing note), broken links (target not found), and file embeds (![[...]]). Returns the raw link text and resolved paths. Use to audit a note's references, detect broken links, or follow downstream dependencies.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Source note path relative to vault root (e.g., 'folder/note.md'). Extension optional. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true. The description adds value by specifying that links are partitioned into categories and that raw text and resolved paths are returned. No contradictions; it supplements the annotations with functional behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no wasted words. Key information is front-loaded: what it does, then the partitioning details, then usage guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with one parameter, full schema coverage, no output schema, and clear annotations, the description is complete. It explains the output categories and usage. Minor omission: no mention of how aliases or transclusions are handled, but this is acceptable for a focused tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter 'path' is already well-documented in the schema (100% coverage), including an example. The description mentions return values but does not add new semantic meaning to the parameter beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists outgoing wikilinks from a note, partitioning them into valid, broken, and file embeds. It uses specific verbs ('List') and resources ('outgoing wikilinks'), and distinguishes from siblings like get_backlinks which handles incoming links.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage scenarios: 'audit a note's references, detect broken links, or follow downstream dependencies.' However, it does not explicitly contrast with find_broken_links, which is a sibling tool for broader link checking.
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 NotesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of notes to return (1-1000, default: 20). | |
| since | No | Filter 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'. | |
| folder | No | Restrict to notes within this folder (relative to vault root). Omit to scan the entire vault. |
TDQS
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.
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.
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.
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.
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.
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 StatsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| folder | No | Restrict stats to this folder (relative to vault root). Omit for whole-vault stats. |
TDQS
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.
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.
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.
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.
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.
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 SearchAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | If true, re-embed every note even if its content hash matches the cached one. | |
| folder | No | Restrict the indexing pass to this folder. Notes outside the folder are left untouched. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Vault-relative path to the note. | |
| content | Yes | Content to insert. A trailing newline is normalized. | |
| section | Yes | Heading path identifying the section. | |
| position | No | Insert before the heading line, immediately after the heading, or at the end of the section body. | append |
TDQS
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.
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.
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.
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.
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.
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 AttachmentsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of attachment paths to return (1-10000, default: 200). Total counts are still reported. | |
| extension | No | Restrict to one extension (e.g., 'png' or '.png'). Omit for every attachment. |
TDQS
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.
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.
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.
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.
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.
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 BasesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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 CanvasesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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 NotesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of note paths to return (1-10000, default: 50). The full total count is still reported separately. | |
| folder | No | Folder relative to vault root to restrict the listing (omit to list the entire vault) |
TDQS
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.
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.
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.
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.
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.
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 SectionsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Vault-relative path to the note. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
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.
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.
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.
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.
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.
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 TagsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| sortBy | No | Sort order: 'count' = by usage count descending (most-used first, default), 'name' = alphabetical by tag name | count |
TDQS
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.
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.
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.
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.
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.
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 NoteADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| newPath | Yes | Destination relative path from vault root (e.g., 'projects/idea.md'). Creates intermediate folders as needed. | |
| oldPath | Yes | Current relative path of the note from vault root (e.g., 'inbox/idea.md') | |
| updateLinks | No | 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. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Relative path from vault root to the target note (e.g., 'notes/log.md'). Extension optional. | |
| content | Yes | Markdown text to insert at the top of the body, after any frontmatter |
TDQS
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.
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.
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.
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.
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.
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 BaseARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Vault-relative path to the .base file. | |
| view | No | Optional view name (or view type) to apply on top of the base-level filters. | |
| limit | No | Maximum number of matching notes to return (1-1000, default: 100). | |
| includeFrontmatter | No | If true, include each row's frontmatter in the output. |
TDQS
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.
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.
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.
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.
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.
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 BaseARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Vault-relative path to the .base file. |
TDQS
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.
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.
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.
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.
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.
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 CanvasARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Relative path from vault root to the .canvas file (e.g., 'boards/roadmap.canvas') |
TDQS
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.
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.
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.
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.
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.
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 TagADestructive
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/alpha → client/alpha. With dryRun: true, returns the planned counts without writing. Strip the leading # from oldName/newName — they're tag names, not tag tokens.
| Name | Required | Description | Default |
|---|---|---|---|
| dryRun | No | If true, count matches without modifying any notes. | |
| newName | Yes | New tag name (without leading #), e.g. 'client'. | |
| oldName | Yes | Existing tag name (without leading #), e.g. 'project'. | |
| hierarchical | No | Also rename nested sub-tags (default: true). |
TDQS
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.
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.
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.
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.
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.
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 NoteADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| find | Yes | Literal string (default) or regex pattern to match. | |
| path | Yes | Vault-relative path to the note. | |
| flags | No | Regex flags (e.g., 'gi'). Defaults to 'g' so all matches are replaced. | |
| regex | No | Treat `find` as a JavaScript regex (multi-line, case-sensitive by default). | |
| replace | Yes | Replacement text. With `regex: true`, supports $1, $2 backreferences. | |
| expectedCount | No | If set, abort unless exactly this many matches are found. |
TDQS
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.
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.
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.
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.
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.
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 AliasARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Alias or display name to resolve, e.g. 'My Project'. | |
| includeBasename | No | If true (default), also match notes whose filename (without extension) equals `name`. |
TDQS
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.
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.
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.
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.
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.
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 FrontmatterARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| value | Yes | Value to match against the property (case-insensitive; matches any array element) | |
| folder | No | Restrict search to this folder relative to the vault root (omit to search entire vault) | |
| property | Yes | Frontmatter key to look up (e.g., 'status', 'type', 'author') | |
| maxResults | No | Maximum number of matching notes to return (1-500, default: 50) |
TDQS
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.
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.
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.
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.
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.
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 TagARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | Yes | Tag to search for, with or without # prefix (e.g., 'project' or '#project'). Matches nested tags like 'project/alpha'. | |
| maxResults | No | Maximum number of matching notes to return (1-1000, default: 100) | |
| includeContent | No | If true, include the first 200 characters of each matching note as a preview (default: false) |
TDQS
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.
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.
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.
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.
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.
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 NotesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Literal search string matched against note body text (not regex) | |
| folder | No | Restrict search to this folder relative to the vault root (omit to search entire vault) | |
| maxResults | No | Maximum number of matching notes to return (1-500, default: 20) | |
| caseSensitive | No | If true, match case exactly; otherwise case-insensitive (default: false) |
TDQS
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.
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.
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.
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.
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.
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 SearchARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of notes to return (1-100, default: 10). | |
| query | Yes | Natural-language description of what you're looking for, e.g. 'notes about onboarding new hires'. | |
| folder | No | Restrict the search to a folder relative to the vault root. | |
| includeSnippet | No | If true (default), include a short snippet of the matching chunk under each hit. |
TDQS
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.
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.
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.
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.
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.
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 FrontmatterADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Relative path from vault root to the note (e.g., 'projects/alpha.md'). Extension optional. | |
| properties | Yes | JSON object string of frontmatter keys to set, e.g., '{"status":"done","priority":1,"tags":["review"]}'. Existing keys not in the payload are preserved. |
TDQS
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.
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.
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.
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.
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.
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 SectionADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Vault-relative path to the note (e.g., 'folder/note.md'). Extension required. | |
| newBody | Yes | Replacement body content. The heading line itself is kept intact. | |
| section | Yes | Heading path identifying the section to replace (e.g., 'Tasks' or 'Daily/Today'). |
TDQS
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.
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.
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.
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.
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.
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.
41 tool updates
v2.0.0- Added
add_canvas_edge - Added
add_canvas_node - Added
append_to_note - Added
create_daily_note - Added
create_note - Added
delete_note - Added
edit_block - Added
find_broken_links - Added
find_orphans - Added
find_similar_notes - Added
find_unused_attachments - Added
get_attachment - Added
get_backlinks - Added
get_daily_note - Added
get_graph_neighbors - Added
get_note - Added
get_outlinks - Added
get_recent_notes - Added
get_vault_stats - Added
index_vault - Added
insert_at_section - Added
list_attachments - Added
list_bases - Added
list_canvases - Added
list_notes - Added
list_sections - Added
list_tags - Added
move_note - Added
prepend_to_note - Added
query_base - Added
read_base - Added
read_canvas - Added
rename_tag - Added
replace_in_note - Added
resolve_alias - Added
search_by_frontmatter - Added
search_by_tag - Added
search_notes - Added
search_semantic - Added
update_frontmatter - Added
update_section
41 tool updates
v1.9.0- Removed
add_canvas_edge - Removed
add_canvas_node - Removed
append_to_note - Removed
create_daily_note - Removed
create_note - Removed
delete_note - Removed
edit_block - Removed
find_broken_links - Removed
find_orphans - Removed
find_similar_notes - Removed
find_unused_attachments - Removed
get_attachment - Removed
get_backlinks - Removed
get_daily_note - Removed
get_graph_neighbors - Removed
get_note - Removed
get_outlinks - Removed
get_recent_notes - Removed
get_tags - Removed
get_vault_stats - Removed
index_vault - Removed
insert_at_section - Removed
list_attachments - Removed
list_bases - Removed
list_canvases - Removed
list_notes - Removed
list_sections - Removed
move_note - Removed
prepend_to_note - Removed
query_base - Removed
read_base - Removed
read_canvas - Removed
rename_tag - Removed
replace_in_note - Removed
resolve_alias - Removed
search_by_frontmatter - Removed
search_by_tag - Removed
search_notes - Removed
search_semantic - Removed
update_frontmatter - Removed
update_section
19 tool updates
v1.8.0- Added
edit_block - Added
find_similar_notes - Added
find_unused_attachments - Added
get_attachment - Changed
get_note3 fields changed- added
Input schema / properties / blockAdded value: +{ + "description": "Block id (without the leading `^`). Returns just the paragraph or block tagged with that id.", + "type": "string" +} - added
Input schema / properties / linesAdded value: +{ + "description": "Line range, 1-indexed and inclusive (e.g., '10-25' or '42'). Returns just those lines.", + "pattern": "^\\d+(-\\d+)?$", + "type": "string" +} - added
Input schema / properties / sectionAdded value: +{ + "description": "Heading path (e.g., 'Tasks' or 'Project A/Status'). Returns just that section's body.", + "type": "string" +}
- Added
get_recent_notes - Added
get_vault_stats - Added
index_vault - Added
insert_at_section - Added
list_attachments - Added
list_bases - Added
list_sections - Added
query_base - Added
read_base - Added
rename_tag - Added
replace_in_note - Added
resolve_alias - Added
search_semantic - Added
update_section
3 tool updates
v1.4.0- Added
get_graph_neighbors - Added
get_tags - Added
search_by_tag
3 tool updates
v1.5.3- Removed
get_graph_neighbors - Removed
get_tags - Removed
search_by_tag
1 tool update
v1.5.0- Added
get_graph_neighbors
4 tool updates
v1.5.2- Changed
add_canvas_node1 field changed- added
Input schema / properties / color / patternAdded value: +"^([1-6]|#[0-9a-fA-F]{3,8})$"
- Changed
delete_note1 field changed- added
Input schema / properties / removeReferencesAdded 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" +}
- Removed
get_graph_neighbors - Changed
move_note1 field changed- added
Input schema / properties / updateLinksAdded 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
Scored across 41 tools
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.
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.
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.
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
Related MCP Connectors
Markdown-based note-taking with a hosted MCP server. Your notes serve you and your AI.
MCP-native open-source Notion alternative: read & write pages, databases and kanban boards.
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
Serve a folder of Markdown notes as an MCP server: hybrid search, reading, and sourced answers.
Related MCP Servers
- AlicenseBqualityDmaintenanceLocal-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.66MIT
- AlicenseAqualityAmaintenanceStandalone 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.433596 npm19MIT
- AlicenseNot gradedqualityAmaintenanceMCP 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.39Apache 2.0
- AlicenseBqualityDmaintenanceA comprehensive MCP server for Obsidian with 45 tools across hybrid filesystem-native and API-based architectures, enabling note management, backlinks, tag management, and analytics.638MIT