Skip to main content
Glama
markdown-vault-mcp

markdown-vault-mcp

by pvliesdonk

Markdown Vault MCP

CI Quality Gate Status Coverage Reliability Rating Security Rating PyPI Python License Docker Docs llms.txt Template

Generic markdown vault MCP with hybrid search

Documentation | Config wizard | PyPI | Docker

Give Claude, or any MCP client, a folder of Markdown notes to search, read and write. An Obsidian vault works as it is.

  • Hybrid search. Keyword search with SQLite FTS5 and, once an embedding provider is configured, search by meaning, fused by Reciprocal Rank Fusion, with the vectors kept in SQLite, files or PostgreSQL. Results are short snippets; read fetches the whole section. See Embeddings and Choosing an embedding store.

  • Hosted CLI reads. Search a running vault with markdown-vault-mcp search "term" --server https://vault.example/mcp; read notes, list metadata, collect context, traverse note links and discover paths with query path "topic" --fuzzy using the same connection options. Use query metadata, query body or query note for exact lexical pages, query count for the full matching population, and query aggregate --by tag for buckets. Use --json for native payloads or --agent for escaped records. See the CLI reference.

  • Exact queries. Page through indexed notes, count every match, or group the full population with query_documents, count_documents and aggregate_documents. See Reader tools and the library API.

  • Path discovery. Find literal paths or nearby ASCII spellings with search_paths; approximate coverage and output truncation are reported separately. See Reader tools.

  • Frontmatter as data. YAML frontmatter fields become search filters, and long notes are split at their headings.

  • Careful writes. The write tools (write, edit, append, delete, rename, move_folder, fetch, git_sync, the okf_* tools, create_upload_link) are on by default and hidden when MARKDOWN_VAULT_MCP_READ_ONLY=true. Replacing a file takes the etag from reading it. A rename still accepts an etag that only the server's own link rewrites made stale. Per-folder _conventions.md rules reach the client as it writes.

  • Git. Optional commit per write with a delayed push, pull or webhook sync, and history and diffs; an overwritten note can be read back at the revision it replaced. See Git integration.

  • Links. Backlinks, outlinks, broken links and the path between two notes, for wikilinks and Markdown links alike, with interactive views in clients that render MCP Apps. With MARKDOWN_VAULT_MCP_REPORT_UNRESOLVED_LINKS=true, write, edit and append name each link they added that doesn't resolve.

  • Open Knowledge Format. OKF bundles are recognized, and results carry each note's type, status and trust tier. See OKF.

The tools reference lists every tool. The same engine is a Python library: see the Vault API.

Does it fit?

What the server can reach, what it changes and who gets in is set out in the security model; the block below says who it serves and where it stops.

It suits one person or a small team who keep notes as Markdown files and want Claude to search them, follow their links and write back into them, on their own machine or as a shared server. It reaches the vault folder, plus only what you configure: a git remote, an embedding or summarizing model, and the URLs a fetch call names.

What it assumes:

  • One vault per server. Several vaults take one server each, for now (#1232); give each a MARKDOWN_VAULT_MCP_SERVER_NAME.

  • Markdown is what gets searched. Other files, such as PDFs and images, can be read and written as attachments, but their contents are not indexed yet (#1234).

  • The default store trades search speed for memory. With an index path the vectors live in a SQLite database and each search reads them from it: measured with 227,640 sections at 1,024 dimensions, searching added 25 MB to the server and 95 in 100 searches returned within about a second. Holding them in memory (the numpy store) answered those searches about ten times faster, and peaked at about 1.25 GB while searching. Choosing an embedding store has the measured costs and the limits.

  • State sits on local disk. The index and embeddings are files, and the change-tracking file sits beside the index, never inside the vault. Without MARKDOWN_VAULT_MCP_INDEX_PATH, the index and that file stay in memory and are rebuilt at each start.

Reach for something else for a corpus beyond the 227,640 sections it was measured at (a vector database behind a retrieval pipeline), for mostly scanned or office documents (a document management system with text recognition), or for many users who must not see each other's notes (a multi-tenant knowledge platform): every caller the server admits gets every tool it exposes.

Related MCP server: kmd

Quick start

Pick the client you use. Each line installs the released version; the Get started tutorials carry on from there.

Claude Desktop. Download the .mcpb bundle from the releases page and open it with Claude Desktop (or Settings › Extensions › Advanced settings › Install Extension…). Claude Desktop asks for the required settings itself. Tutorial.

Claude Code. Two commands inside Claude Code; the second asks for a scope. Tutorial.

/plugin marketplace add pvliesdonk/claude-plugins
/plugin install markdown-vault-mcp@pvliesdonk

A client that runs a command (stdio). To register it in Claude Code, see the Claude Code tutorial.

uv tool install "markdown-vault-mcp"
markdown-vault-mcp serve

A server for remote clients (streamable HTTP). A remote server connects the clients.

docker run --rm -p 8000:8000 --env-file .env ghcr.io/pvliesdonk/markdown-vault-mcp:latest

A compose.yml ships at the repository root and runs as-is: copy .env.example to .env, then docker compose up -d. Deploy covers authentication, OIDC, a reverse proxy and system packages (.deb/.rpm on the releases page). The server answers /health and /health/ready outside the MCP mount, and its get_server_info tool reports the running version.

The plain package covers keyword search, the write tools and git. Search by meaning, the file watcher, the summarize tool and keeping embeddings in PostgreSQL need extras; [all] installs every one:

uv tool install "markdown-vault-mcp[all]"

The Docker image, the .mcpb bundle and the Claude Code plugin already include them. Installation lists each extra.

Configuration

Everything is configured through environment variables with the MARKDOWN_VAULT_MCP_ prefix. The ones most installs set:

Variable

Default

Required

Description

MARKDOWN_VAULT_MCP_SOURCE_DIR

/data/vault

No

Path to the markdown vault directory. When it does not exist, or the server cannot access it, the server starts but every tool fails with a message saying which until it is fixed (managed git mode clones into it). Symbolic links inside the vault are followed on Python 3.13+.

MARKDOWN_VAULT_MCP_READ_ONLY

false

No

Set to true to hide the write tools (write, edit, append, delete, rename, move_folder, fetch, git_sync, the okf_* tools, create_upload_link) and serve a search-only vault.

MARKDOWN_VAULT_MCP_WRITE_PROTECT_EXISTING

true

No

Refuse a write that would overwrite an existing file when no if_match etag is supplied. Deliberate replacement still works: read the file first, then pass if_match. Unaffected: edit, append, delete, rename. Set to false to allow blind overwrites.

MARKDOWN_VAULT_MCP_REPORT_UNRESOLVED_LINKS

false

No

Set to true to have write, edit and append list, under unresolved_links, the target of each link the call added that get_broken_links reports. Links the note already held are left out. Off by default, leaving those responses unchanged.

MARKDOWN_VAULT_MCP_DEFAULT_SEARCH_MODE

auto

No

Mode used when a search call omits 'mode': auto, keyword, semantic, or hybrid. The default 'auto' picks hybrid when embeddings are configured and keyword when they are not. Pin 'keyword' to keep unqualified searches off the embedding provider (each hybrid or semantic search embeds the query, which costs an API call on a metered provider). A configured semantic/hybrid default also degrades to keyword without embeddings, so no setting can make a vault unsearchable; an explicit mode= argument is never downgraded.

MARKDOWN_VAULT_MCP_EMBEDDING_PROVIDER

(none)

No

Embedding provider: openai, voyage, ollama, or fastembed; setting it turns on search by meaning. Unset auto-detects from the environment (never voyage), but only when EMBEDDINGS_PATH is set or EMBEDDING_STORE=postgres. Any OpenAI-compatible endpoint works with openai plus OPENAI_BASE_URL; see the embeddings guide.

MARKDOWN_VAULT_MCP_GIT_REPO_URL

(none)

No

HTTPS remote URL for managed git mode: the server clones into an empty SOURCE_DIR on startup (or validates an existing origin) and enables the pull loop, auto-commit, and deferred push.

MARKDOWN_VAULT_MCP_FILE_WATCHER

true

No

Watch the vault for external filesystem changes; auto-disabled when git pull is active or a webhook can deliver (HTTP/SSE transports only). Requires the file-watcher extra.

MARKDOWN_VAULT_MCP_SUMMARIZE_OPENAI_BASE_URL

(none)

No

OpenAI-compatible endpoint base URL for the summarize tool; setting it enables the tool even without an API key. The bare OPENAI_BASE_URL routes traffic only when a key already enables the feature.

Every variable the server reads, the shared ones included, is in the configuration reference; .env.example lists the same surface in copy-paste form, and the config wizard writes one for your deployment.

Documentation

  • Security model: what the server can reach, what it changes and who gets in.

  • Get started: a first success with your client.

  • Deploy: Docker, authentication, OIDC, reverse proxy.

  • Use: the features, for real tasks.

  • Reference: configuration, tools, resources, prompts, command line.

  • Upgrade: release channels, and what an upgrade changes for your clients and your data.

  • Contribute: local development, secrets, where a fix belongs; CONTRIBUTING.md and SECURITY.md at the root.

Design decisions

  • Document identity is the relative path with .md extension; frontmatter is optional by default (REQUIRED_FIELDS opts into enforcement).

  • Hybrid search uses Reciprocal Rank Fusion over the FTS5 and vector result lists, with diversity-aware ranking capping chunks per document.

  • Tool semantics mirror Claude Code's Read/Write/Edit patterns, so LLM clients drive the vault with habits they already have.

  • The library is synchronous; the MCP layer wraps calls in asyncio.to_thread(). File writes return after saving, while index updates run in the background. Index-dependent mutations wait for prior writes; see index freshness.

  • Indexing is hash-based: unchanged files are never re-parsed, and any change to how stored rows derive from a note's bytes bumps INDEX_SEMANTICS_VERSION so deployed vaults rebuild themselves once on upgrade.

The full decision log lives in the design document.

Available Tools

48 tools
aggregate_documentsAggregate NotesA
Read-onlyIdempotent

Group every matching indexed note into bounded frequency buckets.

Counts cover the whole population. Multi-value tag buckets can sum above total; missing counts notes without a tag value. UTC months use YYYY-MM. Buckets rank by count descending then key.casefold() and raw key.

NameRequiredDescriptionDefault
byYesGroup by folder, configured tag field or UTC modification month.
pathNoCase-sensitive exact vault-relative path, including .md.
fieldNoIndexed field for tag grouping; ignored for folder/month.tags
limitNoMaximum returned buckets, 1-1000; never caps the input population.
queryNoFTS5 expression; blank selects all indexed notes. Malformed syntax matches its literal words.
scopeNoIndexed columns to match: metadata (path, title, headings, summary), body, or all. Terms must match within one indexed section.all
folderNoRestrict to this folder and descendants; empty selects root notes.
filtersNoAND equality over fields in indexed_frontmatter_fields from stats. List fields match a member; computed OKF fields use search instead.
patternNoCase-sensitive path glob; *, ? and bracket classes are wildcards.
modified_afterNoInclusive RFC3339 modification instant with timezone.
modified_beforeNoExclusive RFC3339 modification instant with timezone.
wait_for_pending_writesNoWait for recent index writes. On timeout, answer from the current index with _meta.index_stale=true. Default false.

Output Schema

NameRequiredDescription
totalYes
bucketsYes
missingYes
truncatedYes
index_staleYes

TDQS

A3.6/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, so the description earns credit for the semantics it adds: counts span the whole population (limit never caps input), multi-value tag buckets can exceed the total, missing values form their own bucket, and buckets are ranked by count desc then casefolded key. That is real behavioral detail an agent cannot get from structured fields.

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

Conciseness4/5

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

Dense and front-loaded — five short clauses covering grouping, count semantics, caveats, key format, and ordering, with no filler. The telegraphic phrasing ('missing counts notes without a tag value') is slightly awkward but the compactness is mostly earned.

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

Completeness4/5

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

With an output schema present and 100% schema description coverage, the description only needs to carry behavioral quirks, which it does well for a 12-parameter tool. The remaining gap is the absence of any routing guidance relative to count_documents, stats, and query_documents.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3; the description still adds meaning beyond the schema by specifying the YYYY-MM month key format and the tag-bucket overflow behavior tied to the `by`/`field` parameters. It leaves the remaining filter parameters (pattern, filters, modified_*) to the schema, which is acceptable at full coverage.

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

Purpose4/5

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

States a specific verb and resource: group every matching indexed note into bounded frequency buckets. An agent can distinguish this from count_documents or stats, though the description never names a sibling to contrast against explicitly.

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

Usage Guidelines2/5

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

No when-to-use guidance and no indication of when the aggregation alternatives (count_documents, stats, query_documents) should be preferred. The agent must infer from the purpose that this is the grouping/frequency tool rather than a flat listing.

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

appendAppend to NoteA

Add text to the end of an existing note without reading it first.

Prefer it over edit when the change only adds at the end, such as a log entry. The text starts on a new line; begin it with a blank line or a heading to start a paragraph or section.

NameRequiredDescriptionDefault
pathYesPath of the note, such as `"Journal/2026.md"`.
contentYesNon-empty text to add after everything the note holds.
if_matchNoEtag from read; the text is then added only to that version. Omit to append regardless.
create_if_missingNoCreate the note with content as its body when path does not exist. Default false, so a mistyped path creates nothing.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare non-read-only, non-idempotent, non-destructive, so the safety profile is covered. The description adds genuinely non-obvious behavioral detail: the appended text lands on a new line and the agent must prefix a blank line or heading to control paragraph/section formatting. It stops short of describing conflict behavior or what happens on a path collision, but if_match and create_if_missing carry that in the schema.

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

Conciseness5/5

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

Three short sentences, front-loaded with the core action, followed by the alternative and the formatting rule. No sentence is redundant and nothing is buried.

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

Completeness4/5

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

For a simple append tool with full schema coverage, annotations and an output schema, the description covers purpose, alternative and formatting behavior. The only remaining gap is concurrency or failure behavior, which is reasonably delegated to the if_match and create_if_missing schema docs.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline applies and the description need not restate path, content, if_match or create_if_missing. It mentions no parameter by name, so it adds nothing beyond the schema's own documentation.

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

Purpose5/5

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

States a specific verb and resource ("Add text to the end of an existing note") plus a distinguishing constraint ("without reading it first") that separates it from edit/write siblings. An agent can identify the operation without opening the schema.

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

Usage Guidelines5/5

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

Explicitly names the alternative ("Prefer it over edit") and the selecting condition ("when the change only adds at the end, such as a log entry"). The exclusion is implied by the same clause, so routing between append and edit requires no inference.

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

browse_vaultBrowse VaultA
Read-onlyIdempotent

Open an interactive vault explorer for the user to look through: the file tree, the link graph or one note's relationships.

It shows the vault to the user and returns nothing to read; use search, read, list_documents or get_context for content.

NameRequiredDescriptionDefault
pathNoNote to open on, such as `"Journal/2024-01-15.md"`; omit to start from the whole vault.
viewNo`"context"` for a note's relationships, `"graph"` for the link graph, `"browse"` for the file tree, or `"note"` for the note itself; omit for `"context"` with a path and `"browse"` without.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already cover safety (readOnly, idempotent, non-destructive), but the description adds the non-obvious behavioral fact that this launches an interactive surface for a human and yields no readable content — a critical disclosure that prevents an agent from expecting data back. It stops short of saying what happens in a non-interactive/headless client, which is the remaining behavioral unknown.

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

Conciseness5/5

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

Four short lines total: purpose first, then the routing exclusions. Every sentence earns its place and nothing is repeated from the schema or annotations.

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

Completeness4/5

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

An output schema exists, so return values need no explanation — and the description usefully clarifies that there is nothing to read anyway. The one gap is environmental: an agent in a non-interactive session gets no warning that an interactive explorer may not be renderable or useful there.

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

Parameters3/5

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

Schema coverage is 100% and both parameters already document their defaults and the path-dependent default resolution for `view` (context with a path, browse without). The description mirrors the three view modes in prose but adds no format, path syntax, or edge-case detail beyond what the schema states, so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb+resource ('Open an interactive vault explorer') and enumerates the three modes (file tree, link graph, note relationships) that map to the `view` parameter. It is clearly distinguished from the read/search siblings by the explicit 'returns nothing to read' clause, so an agent can tell it apart from vault_graph_neighborhood or get_backlinks without opening a schema.

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

Usage Guidelines5/5

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

Gives an explicit when-to-use (user wants to visually look through the vault) and an explicit when-not-to-use with named alternatives: 'use search, read, list_documents or get_context for content.' The routing decision between this tool and content tools is fully resolved in the text.

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

build_embeddingsBuild EmbeddingsA
Idempotent

Bring the vector index behind semantic and hybrid search up to date with the notes; returns the number of chunks embedded.

Embeddings are built automatically, so it is needed only after reindex with force, after a failed build (last_build_embeddings_error in get_index_status), or with force to rebuild them all.

NameRequiredDescriptionDefault
forceNoRe-embed every chunk, as after the embedding model changed; the current embeddings keep serving until the rebuild completes. Default false embeds only what changed.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, idempotentHint=true and destructiveHint=false, so the write scope is structured. The description adds genuinely new operational context: the build is normally automatic, failures are diagnosable through last_build_embeddings_error, and force is the escalation path. It stops short of stating cost/duration or whether concurrent runs are safe for what is a heavy write operation.

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

Conciseness5/5

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

Two short paragraphs: what it does and returns first, then exactly when it is warranted. No restatement of the name or title, and every clause carries decision-relevant information (automatic default, error hook, force path).

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

Completeness5/5

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

For a single-optional-boolean tool with full schema coverage, complete annotations and an output schema, nothing an agent needs is missing. The definition covers scope, triggers, failure recovery and the interaction with reindex, which is the only real ambiguity in this cluster.

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

Parameters4/5

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

Schema coverage is 100% and the force parameter already documents its own default and non-destructive swap behavior, so the baseline is 3. The description earns an extra point by tying force to concrete scenarios (a prior forced reindex, or a changed embedding model) that the schema does not name.

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

Purpose5/5

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

Specific verb and resource: "Bring the vector index behind semantic and hybrid search up to date with the notes," plus the return value (chunks embedded). It implicitly distinguishes itself from reindex, embeddings_status and get_index_status by framing itself as the incremental catch-up step rather than a status query.

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

Usage Guidelines5/5

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

Explicitly states the default of not needing it ("Embeddings are built automatically") and enumerates the three conditions that do select it: after reindex with force, after a failed build indicated by last_build_embeddings_error in get_index_status, or with force for a full rebuild. Both when-to-use and when-not are covered.

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

count_documentsCount NotesA
Read-onlyIdempotent

Count every matching indexed note without fetching content.

The exact total is independent of search result caps and counts each note once.

NameRequiredDescriptionDefault
pathNoCase-sensitive exact vault-relative path, including .md.
queryNoFTS5 expression; blank selects all indexed notes. Malformed syntax matches its literal words.
scopeNoIndexed columns to match: metadata (path, title, headings, summary), body, or all. Terms must match within one indexed section.all
folderNoRestrict to this folder and descendants; empty selects root notes.
filtersNoAND equality over fields in indexed_frontmatter_fields from stats. List fields match a member; computed OKF fields use search instead.
patternNoCase-sensitive path glob; *, ? and bracket classes are wildcards.
modified_afterNoInclusive RFC3339 modification instant with timezone.
modified_beforeNoExclusive RFC3339 modification instant with timezone.
wait_for_pending_writesNoWait for recent index writes. On timeout, answer from the current index with _meta.index_stale=true. Default false.

Output Schema

NameRequiredDescription
totalYes
index_staleYes

TDQS

A4.1/5.0
Behavior4/5

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

Beyond the safety annotations, the description discloses useful behavior: no content is fetched, the total is exact and unaffected by search result caps, and each note is counted once. It does not discuss permissions or index freshness, but the provided annotations and schema already cover the safety profile and pending-write behavior.

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

Conciseness5/5

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

The description is two short sentences with the core purpose front-loaded. Every sentence adds useful information about scope and counting behavior, with no redundant wording.

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

Completeness5/5

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

For a count tool with a rich input schema, full schema description coverage, annotations, and an output schema, the description provides the essential behavioral context. It explains the key guarantee that the count is exact and independent of result caps, which is the main thing an agent needs beyond the structured fields.

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

Parameters3/5

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

The input schema already documents every parameter at 100% coverage, so the schema carries the parameter semantics. The description adds only a general notion of 'matching' notes and does not clarify filter combinations, query syntax, or scope beyond what the schema states. This is the expected baseline when schema coverage is complete.

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

Purpose4/5

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

The description states a specific verb and resource: counting matching indexed notes. It also distinguishes itself from content-fetching search tools by saying it operates 'without fetching content' and returns an exact total. It does not name a sibling alternative explicitly, which keeps it just below the top score.

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

Usage Guidelines4/5

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

The description gives clear implied usage context: use it when you need a count rather than note content, and when search result caps would distort the total. It lacks an explicit statement of when not to use it or which sibling to choose for retrieving notes, but the intended use case is clear.

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

deleteDelete NoteA
DestructiveIdempotent

Permanently delete a note or attachment; only git history can bring it back.

NameRequiredDescriptionDefault
pathYesPath of the note or attachment.
if_matchNoEtag from read; the file is then deleted only as that version. Omit to delete it as it is.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is covered; the description adds the genuinely new fact that recovery is only possible through git history. It does not explain how if_match changes the failure behavior, but the critical irreversibility is disclosed.

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

Conciseness5/5

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

A single short sentence with the most important consequence ('Permanently delete') front-loaded and the recovery caveat second. Nothing is wasted and nothing important is buried.

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

Completeness4/5

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

For a two-parameter destructive tool with full annotation coverage and an output schema, the description supplies the one thing annotations cannot: the irreversibility and its git-history escape hatch. Only the conditional-delete behavior of if_match is left entirely to the schema.

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

Parameters3/5

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

Schema description coverage is 100%, so both 'path' and 'if_match' (including its conditional/etag semantics) are already documented in the schema. The description adds no parameter-level meaning, so the baseline of 3 applies.

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

Purpose4/5

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

States a specific verb and scope ('Permanently delete a note or attachment'), which is far more informative than the bare tool name 'delete'. It implicitly separates itself from non-destructive siblings like move_folder or rename, but never names an alternative explicitly.

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

Usage Guidelines3/5

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

Usage is only implied: an agent can infer this is the removal operation when a note should no longer exist. There is no explicit 'use this instead of X' routing, no note about when to prefer rename/move_folder to relocate rather than delete, and no prerequisite guidance.

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

editEdit NoteA

Replace text in an existing note, chosen by an exact old_text, by a range of lines, or by an old_text within a range of lines.

Read the note first for its current text. When old_text has no exact match, a unique match after normalising Unicode, dashes, quotes and whitespace is used and reported as match_type "normalized".

NameRequiredDescriptionDefault
pathYesPath of the note.
if_matchNoEtag from read. Pass it, one edit per read, when line_start and line_end are given; omit it for several old_text-only edits to one note at once.
line_endNoLast line to replace, inclusive; pass with line_start.
new_textNoReplacement text; empty deletes the matched text or the lines.
old_textNoText to replace, occurring once in the note or in the line range; omit to replace the whole line range.
line_startNoFirst line to replace, counting from 1 over the content read returns, frontmatter included; pass with line_end.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false, idempotentHint=false and destructiveHint=false, so the safety profile is partly covered. The description adds genuinely new behavior — Unicode/dash/quote/whitespace normalisation matching and that such a match is reported as match_type "normalized" — but says nothing about failure when no unique match exists, what is returned, or why edits are not idempotent.

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

Conciseness4/5

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

Front-loaded with the core action and the three modes, then the operational prerequisite, then the normalisation caveat — a sensible ordering. Slightly dense in the second sentence and the awkward mid-sentence line breaks make it marginally harder to scan, but no sentence is filler.

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

Completeness4/5

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

With a full schema and an output schema present, return values need not be explained, and the description covers the modes plus one non-obvious edge case (normalised matching). It is slightly incomplete on the no-match/ambiguous-match error path and on why repeat calls are not idempotent, which matter for an edit tool.

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

Parameters3/5

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

Schema description coverage is 100%, so all six parameters (including the if_match concurrency rules and line_start/line_end pairing) are already documented in the schema; baseline is 3. The description reinforces the matching semantics of old_text and adds the uniqueness-after-normalisation rule, but does not extend meaning for path, new_text or if_match beyond what the schema states.

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

Purpose4/5

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

States a specific verb and resource ('Replace text in an existing note') and enumerates the three selection modes (exact old_text, line range, old_text within a range). Together with the title 'Edit Note' this readily separates it from sibling mutation tools like write, append, rename and delete, though none of those siblings are named explicitly.

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

Usage Guidelines4/5

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

Gives a clear prerequisite ('Read the note first for its current text') and a conditional fallback rule for when an exact old_text match does not exist. It stops short of stating when to prefer this over append/write or when a line-range edit is preferable to an old_text edit, so the alternative-selection guidance is only implied.

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

embeddings_statusEmbeddings StatusA
Read-onlyIdempotent

Check embedding provider and vector-index status.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is fully covered. The description adds the specific scope (embedding provider and vector-index status) but doesn't disclose what the status output contains, whether it performs any checks that could be slow, or what failure modes exist. With annotations covering the safety profile, a 3 is appropriate.

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

Conciseness5/5

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

The description is a single, efficient sentence that front-loads the verb and resource. Every word earns its place, and there is no redundancy or filler.

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

Completeness4/5

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

For a zero-parameter, read-only status tool with an output schema present, the description is largely complete. The output schema presumably documents the return structure, so the description doesn't need to explain return values. The only minor gap is not naming sibling alternatives for disambiguation, but the tool's purpose is clear enough given the sibling list.

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

Parameters4/5

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

The tool has zero parameters, so the schema provides no parameter documentation. The description correctly indicates the tool takes no input and simply checks status. With 0 params, the baseline is 4, and the description adequately conveys that no parameters are needed.

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

Purpose4/5

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

The description states a specific verb ('Check') and resource ('embedding provider and vector-index status'), which clearly identifies the tool's purpose. It distinguishes itself from siblings like get_index_status and build_embeddings by focusing on status checking rather than building or indexing, though it doesn't explicitly name those alternatives.

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

Usage Guidelines3/5

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

The description implies usage context: it's a read-only status check for embeddings and vector-index health. However, it doesn't explicitly state when to use this tool versus alternatives like get_index_status or build_embeddings, nor does it mention any prerequisites or conditions that would make this tool the right choice.

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

fetchFetch to VaultA
Idempotent

Download a URL on the server and save it in the vault as a note or attachment; returns its path, size and final_url.

The bytes never pass through the conversation, so use it for large files and then pass the path to other tools.

NameRequiredDescriptionDefault
urlYesAn HTTP or HTTPS URL on the public internet. Redirects are followed, so check final_url in the result when the source host matters.
pathYesDestination path, such as `"notes/report.md"` or `"assets/diagram.png"`; .md saves a note, anything else an attachment.
if_matchNoEtag from read, to replace an existing file; omit for a new file.
timeout_sNoDownload timeout in seconds (default 30); raise it for a large file from a slow host.
frontmatterNoFrontmatter for a note, such as `{"title": "Report", "source": "https://example.org/report"}`.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

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

Annotations declare readOnlyHint=false, idempotentHint=true, destructiveHint=false; the description is consistent, describing a save operation. It adds genuinely useful context the annotations don't carry – the bytes never traverse the conversation, so this is the right path for large payloads – though it doesn't warn about overwrite semantics when a file already exists at path.

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

Conciseness5/5

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

Two tight sentences: the operation and its return shape first, then the reason to prefer it. No filler, and the most decision-relevant fact (bytes bypass the conversation) is front-loaded in the second sentence.

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

Completeness4/5

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

Annotations cover the safety profile and an output schema exists, so the description needn't enumerate returns; it still names the return fields for convenience. Combined with 100% schema coverage, the definition is essentially complete, with only overwrite/concurrency behavior left unaddressed.

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

Parameters3/5

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

Schema description coverage is 100%, so url, path, if_match, timeout_s and frontmatter are already fully documented, including the .md-vs-attachment rule and the redirect/final_url caveat. The description adds no parameter meaning beyond that, so the baseline 3 applies.

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

Purpose4/5

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

States a concrete verb+resource pair: downloads a URL server-side and saves it into the vault, with the destination deciding note vs attachment via the path schema. It implicitly differentiates from the vault-only siblings like read/list_documents, but never names an alternative explicitly.

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

Usage Guidelines4/5

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

"Use it for large files and then pass the path to other tools" gives a clear selection rule and a follow-on workflow, which is real usage guidance. It stops short of naming the alternative (read) for the case where the content is already in the vault, or stating when-not to use it.

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

get_connection_pathConnection PathA
Read-onlyIdempotent

Find the shortest chain of links between two notes, following links in either direction.

NameRequiredDescriptionDefault
sourceYesPath of the starting note, such as `"Ideas/spark.md"`.
targetYesPath of the destination note.
max_depthNoMost links to follow, 1 to 10 (default 10).
wait_for_pending_writesNoWait for recent index writes. On timeout, answer from the current index with _meta.index_stale=true. Default false.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so safety is covered. The description adds genuinely useful behavior beyond that: traversal is bidirectional and returns the shortest chain (implying breadth-first search). However, it says nothing about what happens when no path exists or when max_depth is exhausted.

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

Conciseness5/5

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

A single tight sentence with no filler, front-loading the verb and the result ('shortest chain') before the traversal qualifier.

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

Completeness4/5

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

An output schema exists and the input schema is fully documented, so the description need not explain returns. The one meaningful omission is failure semantics — whether a missing path yields an empty result or an error — which matters for a graph traversal bounded by max_depth.

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

Parameters3/5

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

Schema description coverage is 100% and every parameter is documented inline, including the wait_for_pending_writes staleness semantics, so the baseline is 3. The description adds only the directional meaning of the traversal, not any parameter-level detail such as path formatting or depth-limit behavior.

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

Purpose5/5

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

The description names a specific verb and resource ('Find the shortest chain of links between two notes') and adds the key scoping detail 'following links in either direction', which distinguishes path-finding from the one-directional, single-hop siblings like get_backlinks and get_outlinks.

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

Usage Guidelines3/5

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

The 'between two notes' framing implies the use case, but there is no explicit when-to-use guidance, no exclusions, and no named alternatives (e.g., use get_backlinks for a single hop). The agent must infer selection logic from the sibling list.

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

get_contextNote ContextA
Read-onlyIdempotent

Return a note's metadata, backlinks, outlinks, similar notes, folder neighbours, indexed tags and applicable conventions in one call.

Use it instead of get_backlinks, get_outlinks and get_similar when you need more than one of them.

NameRequiredDescriptionDefault
pathYesPath of the note, such as `"notes/topic.md"`; case-sensitive.
link_limitNoMaximum backlinks, and separately outlinks (default 10).
similar_limitNoMaximum similar notes (default 5); 0 skips them, which suits a vault where stats shows semantic_search_available false.
wait_for_pending_writesNoWait for recent index writes. On timeout, answer from the current index with _meta.index_stale=true. Default false.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so safety is covered elsewhere. The description adds behavioral value by disclosing that several result categories are bundled in one call, which implies a batching/cost advantage and that the note body is not returned (only metadata plus link and tag structures). It does not mention result size, pagination beyond the limits, or what happens when a note has no backlinks.

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

Conciseness5/5

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

Two sentences, zero filler, with the returned categories front-loaded and the routing guidance immediately after. Every clause earns its place.

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

Completeness5/5

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

Given an output schema exists, the description need not explain return shapes, yet it enumerates the categories returned so the agent knows the call's scope. Combined with full schema coverage on all four parameters and annotations covering safety, nothing material is missing for correct invocation.

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

Parameters3/5

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

Schema description coverage is 100%, and all four parameters carry their own descriptions including defaults and the stale-index fallback. The description adds no parameter-level meaning beyond the schema, so the baseline of 3 applies.

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

Purpose5/5

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

The description names a specific verb ('Return') and resource ('a note's metadata, backlinks, outlinks, similar notes, folder neighbours, indexed tags and applicable conventions'), and explicitly scopes the result as a single aggregated call. An agent can distinguish it from get_backlinks, get_outlinks and get_similar without opening any schema.

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

Usage Guidelines4/5

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

It gives a clear selection rule: use this 'instead of get_backlinks, get_outlinks and get_similar when you need more than one of them'. That is genuine when-to-use guidance with named alternatives. It stops short of covering other overlapping siblings such as get_conventions or get_toc, and gives no when-not condition beyond the implicit 'more than one' threshold.

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

get_conventionsFolder ConventionsA
Read-onlyIdempotent

Return the vault owner's authoring conventions for a note or folder, vault root first and the most specific last.

NameRequiredDescriptionDefault
pathNoA note or folder path, such as `"3-Resources/topic.md"` or `"3-Resources"`; a note takes its folder's conventions. `""` (the default) returns the root conventions and lists every folder that has its own.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so safety is covered. The description adds genuinely new behavioral detail: results are ordered from root to most specific, and a note inherits its folder's conventions, which tells the agent how to interpret the output rather than repeating annotation data.

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

Conciseness5/5

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

A single tight sentence with the resource first and the ordering semantics trailing. Nothing is redundant and no sentence could be removed without losing information.

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

Completeness4/5

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

One optional parameter, an output schema, and full annotation coverage mean the description is nearly complete. It still leaves open what a 'convention' record contains and how precedence interacts with any explicit per-note overrides, but the output schema handles the return-shape gap.

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

Parameters3/5

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

Schema description coverage is 100%, and the schema already explains the path parameter, the note-inherits-folder rule, and the empty-string default that returns root conventions plus a folder listing. The description's 'for a note or folder' only restates this, so the baseline of 3 applies.

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

Purpose4/5

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

The description uses a specific verb and resource: 'Return the vault owner's authoring conventions for a note or folder.' This clearly separates it from data-reading siblings like read or list_documents, and the ordering clause ('vault root first and the most specific last') further pins down what is returned. It does not explicitly name the nearby context tools (vault_context, get_context, show_context) it could be confused with.

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

Usage Guidelines3/5

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

Usage is implied by the resource: call it to learn authoring conventions before writing. There is no explicit when-to-use statement, no exclusion, and no pointer to alternatives such as vault_context or get_context, which an agent might reasonably pick instead.

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

get_diffNote DiffA
Read-onlyIdempotent

Return how a note or attachment changed from an earlier commit to now, as one unified diff or one per commit.

Pass exactly one of since_sha and since_timestamp; find commits with get_history. A vault without git history returns an empty diff.

NameRequiredDescriptionDefault
pathYesA note or attachment path, such as `"notes/alpha.md"`; a binary attachment returns a summary of size and renames instead of a patch.
limitNoWith per_commit, how many of the most recent commits to include, 1 to 100; omit for all.
since_shaNoA commit SHA to diff from, such as from get_history; at least 4 hex digits.
per_commitNoTrue for one diff per commit since the starting point, newest first; default false for a single diff.
since_timestampNoAn ISO 8601 time; diffs from the latest commit at or before it.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, so the safety bar is low; the description still adds the mutual-exclusion rule the schema does not enforce and the empty-diff edge case for vaults without git history. It also discloses the per-commit vs unified output shape, though it says nothing about binary-vs-text beyond what the schema documents.

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

Conciseness5/5

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

Three short sentences with the core behavior front-loaded, then the constraint, then the edge case. No restated title, no filler, and the constraint is placed where an agent will read it before building arguments.

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

Completeness4/5

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

Output schema and annotations carry the return format and safety profile, and the description covers the one genuine trap (specifying both since_sha and since_timestamp). Minor gaps remain: no mention of how limit interacts with per_commit default semantics, though the schema covers that.

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

Parameters3/5

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

Schema coverage is 100%, so the schema already explains path, limit, since_sha, since_timestamp and per_commit in detail. The description's only addition is the exactly-one-of constraint between the two since_* parameters, which is a meaningful but small increment over the structured data.

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

Purpose5/5

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

Names a specific verb and resource ('Return how a note or attachment changed from an earlier commit to now') and immediately states the output shape (one unified diff or one per commit). This cleanly separates it from get_history, which the description routes to for finding commits.

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

Usage Guidelines4/5

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

Gives an explicit precondition ('Pass exactly one of since_sha and since_timestamp') and names get_history as the way to obtain a SHA, which is real routing guidance. It stops short of saying when to prefer this over reading the note's current contents, but the core alternatives are covered.

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

get_historyNote HistoryA
Read-onlyIdempotent

List the commits that touched a note, an attachment, a folder or the whole vault, newest first.

A vault without git history returns no commits.

NameRequiredDescriptionDefault
pathNoA note or attachment path, such as `"notes/alpha.md"`, or a folder, such as `"guides"`; omit for the whole vault. Give a note's current name: history from before a rename is included.
limitNoMaximum commits to return (default 20, at most 100).
sinceNoEarliest commit date, inclusive: an ISO 8601 time such as `"2026-04-01T00:00:00"` or a relative date such as `"1 week ago"`; omit for all history.
untilNoLatest commit date, inclusive, in the same forms as since; omit for no upper bound.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive), and the description adds two real behavioral facts: results are ordered newest first, and a vault without git history yields an empty list rather than an error. It says nothing about paging behavior or how commits are identified, but the output schema covers the return shape.

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

Conciseness5/5

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

Two sentences, front-loaded with the core action and scope, followed by the one precondition an agent must know. Nothing is wasted or redundant with the schema.

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

Completeness4/5

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

For a read-only listing tool with a full parameter schema and an output schema, the description covers purpose, scope, ordering and the empty-result case, which is nearly everything needed. The remaining gap is routing guidance against the many sibling history/link tools.

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

Parameters3/5

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

Schema description coverage is 100%, so path, limit, since and until are already fully documented with formats, defaults and bounds. The description adds only the ordering semantics implied by limit (newest commits first), which is marginal value over the schema; baseline 3 applies.

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

Purpose4/5

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

States a specific verb and resource ("List the commits that touched a note...") plus the scoping options and sort order (newest first), so an agent knows exactly what comes back. It does not name or contrast with the closest siblings such as get_diff or get_recent, so sibling differentiation is left implicit.

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

Usage Guidelines3/5

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

Usage is implied by the scope statement (history of a path or the whole vault) and the note that an empty result means no git history. There is no explicit guidance on when to choose this over get_diff (per-commit content) or get_recent (recently modified notes), which is the main gap given how many siblings overlap.

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

get_index_statusIndex StatusA
Read-only

Report FTS index readiness, progress, and last build error.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so the description's 'Report' is consistent and adds no contradiction. It supplements the annotation by specifying that the tool reports progress and last build error, which are useful behavioral details beyond the generic read-only hint. It does not discuss rate limits or side effects, but none are needed for a pure status report.

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

Conciseness5/5

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

A single, information-dense sentence that front-loads the action and scope. No filler or redundant wording. Every phrase contributes meaning.

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

Completeness5/5

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

For a parameterless status tool, the description is complete: it states what it reports (readiness, progress, error) and the output schema covers return details. No additional guidance is necessary. The tool's role is clear within the sibling set.

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

Parameters4/5

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

With zero parameters, the baseline is 4 per the rubric. There is nothing to document, and the description correctly mentions no inputs. The output schema (not shown) presumably defines the return structure, so the description does not need to compensate.

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

Purpose5/5

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

States a specific verb ('Report') and resource ('FTS index'), and clearly enumerates the reported aspects (readiness, progress, last build error). This distinguishes it from sibling tools like reindex, build_embeddings, or okf_generate_index, which perform actions rather than report status.

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

Usage Guidelines3/5

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

The description implies a read-only status check, and the readOnlyHint annotation reinforces this. However, it does not explicitly state when to use this tool versus alternatives (e.g., before reindexing, or to diagnose build failures). The intended use is inferable from the tool name and the sibling context, but not stated.

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

get_job_resultGet Job ResultA
Read-only

Get the status of a background job started by a long-running tool on this server; returns status (working, completed or failed) with the result or error once it finishes. Job records expire, so fetch a finished job's result promptly. On this server, background jobs come from slow summarize, reindex, and build_embeddings calls.

NameRequiredDescriptionDefault
job_idYesThe job_id a long-running tool returned when it continued in the background.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so safety is covered; the description adds non-obvious lifecycle context — that job records expire and finished results must be fetched promptly, and that a working job yields no result yet. It does not mention polling cadence or what happens if the job_id is unknown or expired (error shape), leaving a small behavioral gap for a read tool.

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

Conciseness5/5

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

Two tight sentences: the first front-loads purpose and return shape, the second adds the expiration constraint and job origins. No redundancy with the title and no filler wording.

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

Completeness4/5

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

With an output schema present, return-value detail needn't be explained, and annotations cover the safety profile; the description supplies the missing pieces — job origin, expiration, and terminal states. Only minor gaps remain, such as handling of unknown or expired job_ids and whether the caller should retry or poll.

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

Parameters3/5

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

Schema coverage is 100% and the single job_id parameter is already documented as the value a long-running tool returned. The description adds only indirect meaning by naming which tools emit job_ids, without adding format, expected value, or failure behavior for the parameter.

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

Purpose5/5

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

States a specific verb and resource (get the status of a background job) and enumerates the return states (working, completed, failed) with result or error. It also scopes the tool to jobs started by long-running tools on this server, which separates it from sibling listing/read tools like reindex, build_embeddings, and get_index_status.

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

Usage Guidelines4/5

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

Explicitly tells the agent to call this after a slow summarize, reindex, or build_embeddings call continues in the background, which is concrete when-to-use guidance tied to named siblings. It stops short of stating what to do instead when no job was started (presumably read the synchronous result directly), so it is clear context rather than a full when/when-not pairing.

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

get_most_linkedMost-Linked NotesA
Read-onlyIdempotent

List the notes with the most backlinks, most first.

Use get_backlinks for the notes that link to one of them.

NameRequiredDescriptionDefault
limitNoMaximum notes to return (default 10).
wait_for_pending_writesNoWait for recent index writes. On timeout, answer from the current index with _meta.index_stale=true. Default false.

Output Schema

NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so safety is covered. The description adds the ordering guarantee, which is genuine behavior beyond annotations, but says nothing about result shape limits, whether backlink counts are included, or index freshness beyond what the schema already documents.

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

Conciseness5/5

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

Two short sentences, zero filler, with the core purpose front-loaded and the sibling routing as the follow-up. Nothing could be removed without losing information.

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

Completeness4/5

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

An output schema exists so return values need not be explained, and both params are fully documented. Purpose, ordering and sibling routing are all present; only minor context such as what a 'backlink' counts as is left implicit.

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

Parameters3/5

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

Schema description coverage is 100%: limit and wait_for_pending_writes are both documented in the schema, including timeout fallback behavior. The description adds no parameter meaning on top of that, which hits the baseline of 3.

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

Purpose5/5

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

States a specific verb and resource ('List the notes with the most backlinks') plus the sort order ('most first'), so the agent knows exactly what comes back. It also names a sibling it is not, distinguishing itself from the per-note link tools without requiring the schema to be opened.

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

Usage Guidelines4/5

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

Gives explicit routing to get_backlinks for the complementary question ('the notes that link to one of them'). It doesn't state an explicit trigger sentence like 'use this to find hub notes', so usage is partly implied, but the alternative-selection guidance is real and actionable.

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

get_orphan_notesOrphan NotesA
Read-onlyIdempotent

List every note with no links in or out, with no limit on the count.

stats reports orphan_count; check it first on a large vault.

NameRequiredDescriptionDefault
wait_for_pending_writesNoWait for recent index writes. On timeout, answer from the current index with _meta.index_stale=true. Default false.

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already establish a read-only, idempotent, non-destructive call. The description adds that results are unbounded ('no limit on the count'), which warns about output size. That is valuable context the annotations don't give.

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

Conciseness5/5

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

Two sentences with the purpose front-loaded and an actionable caveat. No wasted words.

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

Completeness5/5

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

This is a simple, single-optional-parameter read tool with an output schema and full annotations. The description covers purpose, the unbounded-size risk and a pre-check strategy, which is complete for its complexity.

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

Parameters3/5

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

Schema coverage is 100%, and the single parameter wait_for_pending_writes is fully explained there, including stale-index behavior. The description adds nothing about the parameter, so baseline 3 applies.

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

Purpose5/5

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

The description says it lists every note with no links in or out. That is a specific verb, resource and definition of 'orphan', and it sets the tool apart from link siblings like get_backlinks, get_outlinks, get_broken_links and get_most_linked.

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

Usage Guidelines4/5

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

It tells the agent to check orphan_count in the stats sibling before calling on a large vault, which is useful sequencing guidance. It doesn't say when an orphan listing beats other discovery tools, or how to filter or limit if the count is huge.

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

get_recentRecent NotesA
Read-onlyIdempotent

List the most recently modified notes, newest first.

Use it to pick up recent activity without a search query.

NameRequiredDescriptionDefault
limitNoMaximum notes to return (default 20).
folderNoOnly notes in this folder and its sub-folders, such as `"Journal"`; `""` for top-level notes only; omit for the whole vault.
wait_for_pending_writesNoWait for recent index writes. On timeout, answer from the current index with _meta.index_stale=true. Default false.

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare it read-only, idempotent, and non-destructive. The description adds that results are sorted by modification time, newest first. It says nothing about index freshness at the description level, though the schema covers the stale-index behavior.

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

Conciseness5/5

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

There are two sentences, front-loaded with the purpose and then the usage context. Neither sentence is wasted.

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

Completeness4/5

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

For a simple read-only listing tool with an output schema, full annotations, and a fully described schema, the description is nearly sufficient. The main gap is differentiation within a large set of overlapping listing and query siblings.

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

Parameters3/5

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

Schema coverage is 100%, and the schema documents folder semantics and stale-index behavior thoroughly. The description adds no parameter information of its own, so the baseline of 3 applies.

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

Purpose4/5

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

It names a specific verb and resource, "List the most recently modified notes," and gives the ordering, "newest first." It does not separate itself from close siblings like list_documents, query_documents, or get_history, which could also list notes by date.

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

Usage Guidelines3/5

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

"Use it to pick up recent activity without a search query" gives a usage context and implies search is the alternative when a query exists. It gives no guidance relative to list_documents, query_documents, or get_history, which overlap with this tool.

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

get_server_infoServer InfoA
Read-only

Report the version information of markdown-vault-mcp; returns server_name, server_version, core_version, the MCP protocol revisions supported and the revision and client of this connection, and, when configured, the upstream service's version. Use it when asked which version or build is running or which protocol revision is in use.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

Annotations only declare readOnlyHint=true, so the description adds real value by disclosing the conditional nature of one field ("when configured, the upstream service's version") and that the payload is connection-scoped ("the revision and client of this connection"). It stops short of saying the call has no side effects or that results are static from server start, but the safety profile is already covered by annotations.

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

Conciseness4/5

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

Front-loaded with the verb and purpose, followed by a usage sentence. The middle field list is dense but each named field earns its place by telling the agent what questions this tool can answer; it is slightly encyclopedic for a zero-argument call.

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

Completeness5/5

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

An output schema exists, so return values did not need spelling out, yet the description still signals the key conditional (optional upstream version) an agent would otherwise misread. For a zero-parameter, read-only introspection tool this is fully sufficient.

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

Parameters4/5

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

There are no parameters, so the baseline is 4; the description correctly says nothing about inputs rather than inventing them. Nothing further can be added on this dimension.

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

Purpose5/5

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

Uses a specific verb and resource ("Report the version information of markdown-vault-mcp") and enumerates exactly what comes back: server_name, server_version, core_version, supported protocol revisions, this connection's revision/client, and optionally the upstream service version. No sibling tool does version introspection, and the description makes that scope unmistakable.

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

Usage Guidelines4/5

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

Gives a clear trigger condition: "Use it when asked which version or build is running or which protocol revision is in use." That covers the realistic invocation contexts. It doesn't name an alternative or a when-not case, but with zero sibling overlap there is little to route against.

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

get_similarSimilar NotesA
Read-onlyIdempotent

Find the notes closest in meaning to a given note; returns them ranked by similarity with their closest sections, the note itself excluded.

Needs semantic_search_available from stats. A note whose embeddings are not built yet has no similar notes.

NameRequiredDescriptionDefault
pathYesPath of the note to compare against, such as `"notes/topic.md"`; case-sensitive.
limitNoMaximum notes to return (default 10).
folderNoOnly notes in this folder or below, such as `"3-Resources"`; `""` for top-level notes only.
filtersNoFrontmatter values to match, all of them, such as `{"type": "resource"}`; any key works and a list field matches when it holds the value. On an OKF bundle, status (stable includes notes with none), stale (`"true"` or `"false"`) and trust_tier filter too.
chunks_per_fileNoMaximum sections per note, at least 1; omit for the server default.
wait_for_pending_writesNoWait for recent index writes. On timeout, answer from the current index with _meta.index_stale=true. Default false.

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so safety is covered by structured data. The description adds genuinely new behavior — self-exclusion from results, similarity ranking, per-section grouping, and the embeddings prerequisite — but says nothing about empty-result behavior or ordering ties beyond what the schema's wait_for_pending_writes note implies.

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

Conciseness5/5

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

Two short sentences, front-loaded with what the tool returns, followed by the prerequisite caveat. No redundant restatement of the title or annotations.

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

Completeness4/5

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

With an output schema present, return values need not be described, and the description covers the prerequisite, the self-exclusion rule and ranking semantics. It leaves minor gaps around failure modes (invalid path, partially built embeddings) and how folder/filters narrow the comparison set.

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

Parameters3/5

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

Schema description coverage is 100%, so path, limit, folder, filters, chunks_per_file and wait_for_pending_writes are all documented in the schema itself. The description adds no syntax, defaults, or interaction rules beyond the schema, so the baseline 3 applies.

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

Purpose4/5

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

The description names a specific verb and resource ('Find the notes closest in meaning to a given note') and adds output shape ('ranked by similarity with their closest sections, the note itself excluded'). It distinguishes itself implicitly from query-based siblings like search, but never names an alternative explicitly, which keeps it short of a 5.

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

Usage Guidelines4/5

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

It states a concrete gating condition — semantic_search_available must be true per stats, and notes without built embeddings yield no results — which directly informs whether the agent should call this tool at all. It does not, however, contrast the tool with search or query_documents for agents choosing between retrieval strategies.

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

get_tocTable of ContentsA
Read-onlyIdempotent

Return the heading outline of a note, or of every note under a folder.

For a note: a list of {heading, level}, the title first as level 1. For a folder: {path, notes, truncated}, each note with its path, title and headings.

NameRequiredDescriptionDefault
pathYesA note path ending in .md, such as `"a/b.md"`, or a folder, such as `"a/b"`.
max_levelNoDeepest heading level to keep, such as 2 for H1 and H2; omit for all. The title always stays.
max_notesNoFolders only: notes to include, first by path (default 200); truncated is true when more exist.
wait_for_pending_writesNoWait for recent index writes. On timeout, answer from the current index with _meta.index_stale=true. Default false.

Output Schema

NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

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

Annotations already cover readOnly/idempotent/non-destructive, so the description's added value is in behavior: folder results include a truncated flag, note results lead with the title as level 1. It does not mention the index_stale behavior that wait_for_pending_writes implies, but the mode-dependent shape disclosure is genuinely useful context.

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

Conciseness5/5

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

Two short sentences, front-loaded with the core operation, then a compact breakdown of the two result shapes. No filler or repetition.

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

Completeness4/5

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

With an output schema present and full schema coverage, the description only needs to frame the two modes, which it does. The main omission is any note about index freshness or when to prefer this over read, but nothing required to call it correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100% and each parameter is documented with examples and defaults, so the schema does the heavy lifting. The description adds nothing parameter-specific beyond the schema, which is the expected baseline at full coverage.

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

Purpose5/5

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

States a specific verb and resource ('Return the heading outline of a note, or of every note under a folder') and cleanly distinguishes itself from read/list_documents by naming the outline concept. An agent can tell what this produces without opening the schema.

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

Usage Guidelines3/5

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

Usage is implied by the operation — you call it when you want a structural outline rather than full content — but there is no explicit when-to-use/when-not or routing to siblings like read or list_documents. The two modes (note vs folder) are clarified, which is the strongest guidance present.

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

list_documentsList DocumentsA
Read-onlyIdempotent

List notes, and optionally attachments, with path, title and frontmatter but no body text.

Use search to find notes by what they say.

NameRequiredDescriptionDefault
folderNoOnly notes in this folder and its sub-folders, such as `"Journal"`; `""` for top-level notes only; omit for the whole vault.
filtersNoFrontmatter values to match, all of them, such as `{"tags": "craft"}`; any key works, a list field matches when it holds the value, and attachments never match. On an OKF bundle, status (draft, stable or deprecated; stable includes notes with none), stale (`"true"` or `"false"`) and trust_tier (unverified, machine-confirmed or human-reviewed) filter too.
patternNoGlob matched against paths, such as `"Journal/*.md"` or `"**/*meeting*.md"`.
include_attachmentsNoAlso list non-note files, marked kind=`"attachment"` with their mime_type. Default false.
wait_for_pending_writesNoWait for recent index writes. On timeout, answer from the current index with _meta.index_stale=true. Default false.

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral context beyond that: results carry metadata only, never body text, and attachments are excluded unless requested. It stays silent on index staleness and pending-write waiting, but those are documented in the schema and output schema.

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

Conciseness5/5

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

Two short sentences with no waste. The return-shape constraint is front-loaded and the disambiguation follows immediately, so the reader gets the most decision-relevant fact first.

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

Completeness4/5

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

With an output schema present and full parameter coverage, the description need not restate return values or parameter formats; it correctly focuses on scope and sibling routing. Minor gap: it does not hint that the listing is filterable by folder, frontmatter or glob, which is the tool's main power, though the schema carries that fully.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already explains folder scoping, frontmatter filters, glob patterns, attachment inclusion and write-waiting. The description only alludes to the attachment option and the returned fields, adding no syntax or edge-case detail beyond the schema. Baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource ("List notes, and optionally attachments") and pins down the returned fields (path, title, frontmatter) while explicitly excluding body text. It also names the sibling it is not ("search") and the distinction between them, so an agent can route correctly without opening a schema.

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

Usage Guidelines4/5

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

The second sentence gives a clear selection rule: use this to enumerate, use search to find notes by content. That is a genuine when-to-use statement with a named alternative, though it does not mention other plausible alternatives such as count_documents or query_documents, nor any when-not conditions.

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

list_foldersList FoldersA
Read-onlyIdempotent

List every folder that holds notes; "" stands for the top level.

Pass one as the folder argument of search, list_documents and the other folder-scoped tools.

NameRequiredDescriptionDefault
wait_for_pending_writesNoWait for recent index writes. On timeout, answer from the current index with _meta.index_stale=true. Default false.

Output Schema

NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description adds real behavioral context beyond that: only folders containing notes are returned, and `""` denotes the top level — non-obvious semantics an agent would otherwise guess wrong.

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

Conciseness5/5

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

Two short sentences, the core definition front-loaded and the usage hint second. No filler, no restatement of the title, and the awkward line wrap does not obscure meaning.

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

Completeness4/5

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

An output schema exists and annotations are rich, so the description only needs to frame the concept, the sentinel value, and downstream use — all present. Minor gap: it does not say whether folder identifiers are paths, names, or namespaced, which matters for chaining into search/list_documents.

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

Parameters3/5

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

The single parameter wait_for_pending_writes is fully documented in the schema (100% coverage) including its timeout/staleness fallback behavior. The description says nothing about that parameter; its discussion of `""` concerns return values, not inputs. Baseline 3 applies since the schema does the work.

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

Purpose4/5

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

States a specific verb and resource (list folders) plus a scope qualifier ('that holds notes') and defines the top-level sentinel `""`. It is clearly distinct from data-listing siblings like list_documents or list_tags, though it never explicitly contrasts itself with them.

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

Usage Guidelines4/5

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

Second sentence gives concrete downstream guidance: pass a returned value as the folder argument of search, list_documents and other folder-scoped tools, which implies the tool should be called before folder-scoped operations. No explicit when-not or alternative-to-use-instead guidance is given.

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

list_tagsList TagsA
Read-onlyIdempotent

List the distinct values one indexed frontmatter field takes across the vault.

Use the values in the filters argument of search.

NameRequiredDescriptionDefault
fieldNoA field from indexed_frontmatter_fields in stats (default `"tags"`).tags
wait_for_pending_writesNoWait for recent index writes. On timeout, answer from the current index with _meta.index_stale=true. Default false.

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnly, idempotent, and non-destructive, so the safety profile is covered. The description adds that results are distinct values and vault-wide in scope, but says nothing about index staleness or what happens when the index lags — that behavior only lives in the schema text for wait_for_pending_writes.

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

Conciseness4/5

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

Two short sentences with no filler; the core scope (distinct values of one field, vault-wide) is front-loaded. The follow-up sentence on using the output in search filters is compact and earns its place, though the tool name and description are slightly out of alignment.

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

Completeness5/5

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

An output schema exists and both parameters are fully documented, so the description only needs to convey scope and purpose, which it does. Combined with annotations, an agent has enough to select and invoke it correctly without further prose.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already explains both parameters, including the indexed_frontmatter_fields constraint and the stale-index timeout behavior. The description's phrase 'one indexed frontmatter field' lightly reinforces the field constraint but adds no format or example detail beyond the schema, so baseline 3 applies.

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

Purpose4/5

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

States a specific verb and resource: returns the distinct values a single indexed frontmatter field takes across the vault. That is precise and tells an agent it is an enumeration/distinct-values tool rather than a document listing. It stops short of naming how it differs from siblings like list_folders or aggregate_documents, and the name 'list_tags' undersells that the field is configurable.

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

Usage Guidelines3/5

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

The second sentence gives downstream guidance ('Use the values in the filters argument of search'), which is useful routing but describes what to do with the output, not when to call this tool versus alternatives. There is no explicit when-not or prerequisite (e.g. field must be indexed) stated as usage guidance.

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

move_folderMove FolderA
Destructive

Move a folder and everything under it to a new location, rewriting every link into it across the vault: rename for a whole folder.

Notes whose links could not be rewritten are listed in failed_links.

NameRequiredDescriptionDefault
new_dirYesDestination folder, such as `"archive/2026"`; an existing folder is merged into.
old_dirYesFolder to move, such as `"drafts"`.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and idempotentHint=false, so the safety bar is lower, yet the description still adds real substance: it discloses that every inbound link is rewritten vault-wide and that unrepaired links surface in failed_links, i.e. partial-failure semantics. It stops short of stating irreversibility or whether a failed rewrite leaves the vault in a half-moved state.

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

Conciseness5/5

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

Two tight sentences, front-loaded with the action and scope. The colon appositive 'rename for a whole folder' gives the agent a one-glance mental model, and the failed_links sentence earns its place by flagging partial failure.

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

Completeness4/5

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

For a destructive two-parameter move, the description covers scope, the vault-wide link-rewriting consequence, and failure reporting, and an output schema exists so return values need no explanation. It could go further on ordering/atomicity and what happens to a folder already at the destination, but nothing essential for a correct call is missing.

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

Parameters3/5

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

Schema description coverage is 100% and both parameters are already documented with examples, including the merge-into-existing-folder behavior for new_dir. The description adds no parameter-level meaning beyond the schema, so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource (move a folder) plus the scope ('and everything under it') and the key side effect (rewriting every link into it across the vault). The gloss 'rename for a whole folder' cleanly separates it from the sibling `rename`, which acts on a single note.

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

Usage Guidelines3/5

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

The phrase 'rename for a whole folder' implies the boundary against `rename` and `write`, but usage is only implied — there is no explicit 'use this instead of X when Y' or warning about when a move is inappropriate (e.g. moving into a descendant). Guidance exists but requires inference.

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

okf_generate_indexOKF: Generate index.mdA
DestructiveIdempotent

Write a folder's Open Knowledge Format index.md: a link to each note directly in it with its description, and one to each subfolder's index.md, replacing the old listing and keeping its frontmatter.

Subfolders without an index.md get one too.

NameRequiredDescriptionDefault
folderNoFolder to index, such as `"guides"`; omit for the bundle root.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is known; the description usefully specifies exactly what is destroyed ('replacing the old listing') and what is preserved ('keeping its frontmatter'), plus the non-obvious recursive behavior that subfolders lacking an index.md also get one. It stops short of saying what happens on a nonexistent folder or whether existing subfolder indexes are rewritten.

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

Conciseness5/5

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

Two short sentences with zero filler; the primary action and its outputs come first, and the recursive subfolder caveat is placed as a trailing note where it belongs.

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

Completeness4/5

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

For a one-parameter tool with an output schema, the description covers the essential behavioral facts: content generated, overwrite semantics, frontmatter preservation, and recursive scope. Minor gaps remain around error behavior for missing folders and whether subfolder indexes are regenerated or only created.

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

Parameters3/5

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

With one parameter at 100% schema coverage, the schema already documents the folder string and the root default, so the baseline of 3 applies. The description only reinforces that the target is 'a folder's' index and adds no syntax, path-resolution, or edge-case detail beyond the schema.

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

Purpose5/5

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

States a specific verb and resource ('Write a folder's Open Knowledge Format index.md') and immediately enumerates the content produced: a link per note with its description plus a link per subfolder index. This is clearly distinguishable from siblings like okf_validate, okf_convert_links, reindex, and get_index_status.

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

Usage Guidelines3/5

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

Usage is implied rather than stated: the reader infers you run this after notes change to regenerate a folder listing. There is no explicit when-to-use or when-not-to-use guidance, and no routing versus reindex or get_index_status, which an agent may plausibly confuse with index maintenance.

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

okf_seed_logOKF: Seed log.mdA

Create a folder's Open Knowledge Format log.md from the git history of the notes under it, one dated section per day, newest first.

It never replaces an existing log.md. It covers the 100 most recent commits. A vault without git history gets an empty log.

NameRequiredDescriptionDefault
folderNoFolder to write log.md in, whose history it covers, such as `"guides"`; omit for the bundle root and the whole vault's history.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already mark this as a non-read-only, non-idempotent, non-destructive write. The description adds real value on top: a hard 100-commit cap, the guarantee that existing log.md files are untouched, and the edge case of a vault with no git history yielding an empty log. It does not clarify whether the call fails or silently no-ops when a log already exists.

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

Conciseness5/5

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

Three short sentences, zero padding, with the core action and output shape front-loaded before the constraints. Every sentence carries distinct information (what it builds, what it won't overwrite, the commit limit, the empty-history case).

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

Completeness4/5

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

With an output schema present and full parameter coverage, the description covers the limits and edge cases an agent needs before invoking. The remaining gap is failure semantics when log.md already exists and whether git availability is a precondition, which matters for a write tool.

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

Parameters3/5

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

Schema description coverage is 100% and the single 'folder' parameter is fully documented in the schema, including the default-to-vault-root behavior. The description adds no meaning beyond that, so the baseline of 3 applies.

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

Purpose5/5

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

States a specific verb and resource ('Create a folder's Open Knowledge Format log.md') plus the source of content ('from the git history of the notes under it') and the resulting shape ('one dated section per day, newest first'). This clearly separates it from siblings like get_history, okf_validate, and okf_generate_index, which read or transform rather than seed a log file.

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

Usage Guidelines4/5

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

Gives clear operating context and an implicit exclusion ('It never replaces an existing log.md'), which tells an agent not to call it expecting a refresh. It stops short of naming alternatives (e.g., get_history for raw commit data) or stating prerequisites such as needing a git-backed vault.

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

okf_validateValidate OKF BundleA
Read-onlyIdempotent

Audit how far the vault conforms to the Open Knowledge Format, with example paths per rule; works on a vault not yet declared as a bundle.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds two useful behavioral facts beyond that: the report is graded ('how far the vault conforms') rather than binary, and it includes example paths per rule, plus the undeclared-vault precondition. It stops short of describing scope of the audit, failure behavior, or cost, so it is solid but not rich.

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

Conciseness4/5

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

A single sentence that front-loads the audit action and packs the output detail and precondition into trailing clauses. Nothing is wasted, though the semicolon joins two fairly distinct ideas (output content and vault precondition) into one slightly dense line.

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

Completeness4/5

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

With an output schema present, the description need not explain return values, and with zero parameters there is no input burden. It covers the essential precondition and characterizes the report, leaving only minor gaps such as whether it is read-only in effect on undeclared vaults or how large audits are handled.

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

Parameters4/5

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

The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline 4 applies. The description correctly avoids inventing parameter talk and instead spends its words on scope and output content.

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

Purpose4/5

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

States a specific verb and resource: auditing vault conformance to the Open Knowledge Format. The sibling tools okf_convert_links, okf_generate_index, and okf_seed_log are visibly different actions, so an agent can distinguish this audit tool from them without opening the schema, though the description never names them.

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

Usage Guidelines3/5

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

The clause 'works on a vault not yet declared as a bundle' gives a real precondition that implies when this tool applies. However, there is no explicit when-not guidance and no mention of which sibling (e.g. okf_convert_links) to reach for if the vault is already a bundle or if the agent wants to fix rather than just audit.

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

query_documentsQuery NotesA
Read-onlyIdempotent

Page through all matching indexed notes with an exact total.

Queries with text rank by keyword score then path; blank queries rank by modification time descending then path. Pages are live views, so concurrent writes can move notes between pages. Use read to retrieve full note content.

NameRequiredDescriptionDefault
pathNoCase-sensitive exact vault-relative path, including .md.
limitNoMaximum returned notes, 1-1000; total is independent of this cap.
queryNoFTS5 expression; blank selects all indexed notes. Malformed syntax matches its literal words.
scopeNoIndexed columns to match: metadata (path, title, headings, summary), body, or all. Terms must match within one indexed section.all
folderNoRestrict to this folder and descendants; empty selects root notes.
offsetNoNotes to skip in this live view, at least 0.
filtersNoAND equality over fields in indexed_frontmatter_fields from stats. List fields match a member; computed OKF fields use search instead.
patternNoCase-sensitive path glob; *, ? and bracket classes are wildcards.
snippet_wordsNoExcerpt width in words, at least 0; 0 returns whole sections.
modified_afterNoInclusive RFC3339 modification instant with timezone.
chunks_per_fileNoMaximum matching sections per note, at least 1.
modified_beforeNoExclusive RFC3339 modification instant with timezone.
wait_for_pending_writesNoWait for recent index writes. On timeout, answer from the current index with _meta.index_stale=true. Default false.

Output Schema

NameRequiredDescription
itemsYes
limitYes
totalYes
offsetYes
truncatedYes
index_staleYes

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already establish readOnly/idempotent/non-destructive, and the description adds genuine behavior: exact totals independent of the page cap, ranking rules (keyword score then path for text, modification time descending for blank queries), and the important caveat that pages are live views where concurrent writes can shift notes across pages. That live-view instability note is a real operational disclosure not derivable from annotations or schema.

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

Conciseness5/5

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

Three short sentences, front-loaded with the core action and total guarantee, then ranking rules, then the live-view caveat and the pointer to `read`. Nothing is redundant and no sentence is filler.

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

Completeness4/5

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

With 13 parameters, an output schema, and full schema coverage, the description needs only to explain the query model and result-stability semantics, which it does. The main residual gap is sibling disambiguation among the many list/search/count tools, which the description does not address.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all 13 parameters in detail. The description adds only indirect meaning about how `query` behaves (text vs blank ranking, total vs limit), without explaining scope, filters, pattern, or the pending-writes flag. Baseline 3 applies when the schema does the heavy lifting.

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

Purpose4/5

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

"Page through all matching indexed notes with an exact total" names a specific verb (page/query), the resource (indexed notes), and the distinguishing output property (exact total). It is clearly a paginated index-listing tool rather than a content fetch, but it never explicitly contrasts with siblings like list_documents, search, or count_documents.

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

Usage Guidelines3/5

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

The only explicit routing is "Use read to retrieve full note content," which usefully separates querying from fetching. There is no guidance on when to prefer this over list_documents, search, count_documents, or get_recent, despite those being close alternatives in the sibling set.

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

readRead NoteA
Read-onlyIdempotent

Return a note's text, frontmatter and etag, or an attachment's bytes as base64.

Look paths up with search or list_documents first rather than guessing them.

NameRequiredDescriptionDefault
pathYesPath in the vault, such as `"Journal/note.md"` or `"assets/diagram.pdf"`; case-sensitive.
sectionNoA heading, such as the heading field of a search result; returns that section and its sub-sections instead of the whole note. Notes only.
revisionNoA commit SHA from get_history or from a write result's previous_revision; returns the note as it stood then, without an etag. Pass path as the note is named today. To restore that text, write it with the etag of a read without revision.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, so safety is covered. The description adds real behavior beyond that: attachments come back base64-encoded, and revision-based reads omit the etag — a subtle but consequential detail for callers planning a follow-up write.

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

Conciseness5/5

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

Two sentences, front-loaded with the return contract before the path-lookup caveat. Zero filler and no restatement of the tool name or title.

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

Completeness4/5

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

With an output schema present, the description does not need to explain return shapes, and it correctly focuses on the return contract and path discovery. Minor gaps remain around error behavior for missing paths and any size limits on base64 attachment reads.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already explains path casing, section-as-heading, and the revision/SHA-without-etag workflow. The description adds little parameter-level meaning beyond noting that etag appears only in the non-revision case, so the baseline 3 applies.

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

Purpose5/5

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

The description states a specific verb ('Return') and enumerates exactly what comes back: note text, frontmatter, etag, or attachment bytes as base64. That dual note/attachment coverage plus the explicit return payload lets an agent distinguish this from write, edit, append, or search without opening the schema.

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

Usage Guidelines4/5

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

It gives explicit routing advice for the path-resolution problem: 'Look paths up with search or list_documents first rather than guessing them.' However, it is silent on when to choose this over the sibling 'vault_read', which appears to be a close analogue, and gives no guidance on when not to read (e.g., huge attachments).

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

reindexReindex VaultA
Idempotent

Bring the search index up to date with files changed outside this server, such as by an editor or a sync tool; returns counts of added, modified, deleted and unchanged notes.

Writes through this server's tools update the index themselves, so do not call it after them.

NameRequiredDescriptionDefault
forceNoDrop the index and re-parse every note instead of only changed ones: slower, and search waits until it finishes. Use it when results no longer match the notes, then run build_embeddings if the vault has semantic search. Default false.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

The annotations already declare that this is a non-read-only, idempotent, non-destructive operation. The description adds meaningful behavior: it exists for out-of-band changes, internal writes already update the index, and it returns added/modified/deleted/unchanged counts. It does not discuss force-reindex cost or search blocking, but those are covered in the parameter schema.

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

Conciseness5/5

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

The description is two short paragraphs and front-loads the trigger condition. The second paragraph earns its place by preventing redundant calls after server-side writes.

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

Completeness5/5

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

For a single optional parameter, an output schema, and clear annotations, the description supplies the key missing context: external-change use case and the exclusion for internal writes. The remaining force-reindex details are fully handled by the schema.

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

Parameters3/5

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

Schema coverage is 100%, and the single force parameter is thoroughly documented in the schema, including its default, cost, blocking effect, and follow-up embedding step. The description itself does not mention force, so it adds no parameter meaning beyond the schema.

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

Purpose5/5

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

The description states a specific verb and resource: bringing the search index up to date. It also scopes the operation to files changed outside this server, which distinguishes it from index updates performed by write tools.

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

Usage Guidelines5/5

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

It explicitly says when to use the tool (after external edits or sync changes) and when not to use it (after writes through this server, because those update the index themselves). This is clear routing guidance with no ambiguity.

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

renameRename NoteA

Rename or move a note or attachment; with update_links, links to it in other notes follow it.

For a note, always pass update_links=True. Parent folders are created as needed.

NameRequiredDescriptionDefault
if_matchNoEtag from read of old_path; still accepted when the only changes since are link rewrites the server made.
new_pathYesNew path, such as `"projects/idea.md"`, where nothing exists yet.
old_pathYesCurrent path, such as `"drafts/idea.md"` or `"assets/old.png"`.
update_linksNoRewrite links to old_path in other notes so they point at new_path; attachment references are not tracked. Default false; pass true for every note.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

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

Annotations mark the tool as non-destructive and non-idempotent. The description adds that parent folders are auto-created and that links in other notes get rewritten. The schema adds that new_path must not exist and that attachment references are not tracked. The description does not say what happens on a path collision or an etag mismatch.

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

Conciseness4/5

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

Two short sentences, front-loaded with the purpose and no filler. The update_links advice is duplicated between the description and the schema.

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

Completeness4/5

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

An output schema exists and the schema documents parameters well, so the description is reasonably complete for a 4-parameter mutation. It is missing failure behavior and folder-move routing.

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

Parameters3/5

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

Schema coverage is 100% and covers if_match, new_path constraints and update_links. The description mostly repeats the update_links recommendation already stated in the schema, adding little new parameter meaning.

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

Purpose4/5

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

It names a specific action on specific resources: "Rename or move a note or attachment," plus link-following. It does not set itself apart from move_folder, which is the sibling most likely to cause confusion, though "note or attachment" implies single-file scope.

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

Usage Guidelines3/5

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

The directive "For a note, always pass update_links=True" is useful invocation guidance. There is no when-to-use versus alternatives, such as using move_folder for folders, or write/delete instead of rename.

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

search_pathsDiscover Note PathsA
Read-onlyIdempotent

Discover note paths with direct matches before optional typo matches.

Returns metadata without bodies. Exact paths rank first, then case-insensitive literal prefix matches, followed by other literal matches and approximate matches. Coverage describes the approximate scan; truncated independently describes omitted results. Use read with a returned path to retrieve its content.

NameRequiredDescriptionDefault
fuzzyNoTry ASCII alphanumeric tokens of length 3-64 within one edit; transposition costs two edits. Non-ASCII queries use direct matching. The approximate pass evaluates at most 10,000 candidates in 200 ms.
limitNoMaximum returned metadata items, 1-1000.
queryYesLiteral path text, 1-256 Unicode code points; whitespace alone is empty. Surrounding whitespace is ignored; wildcard characters are literal.
folderNoRestrict to this folder and descendants; empty selects root notes.
filtersNoAND equality over indexed_frontmatter_fields from stats; list fields match a member. Use search for computed OKF filters.
wait_for_pending_writesNoWait for recent index writes. On timeout, answer from the current index with _meta.index_stale=true. Default false.

Output Schema

NameRequiredDescription
itemsYes
reasonsYes
coverageYes
truncatedYes
index_staleYes

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already establish readOnly, idempotent, and non-destructive, so the safety profile is covered. The description adds genuine behavioral detail beyond that: results are metadata-only (no bodies), an explicit ranking order (exact, then case-insensitive prefix, then other literal, then approximate), and the distinction between 'coverage' and 'truncated' as separate signals. It does not mention the fuzzy scan's candidate/time budget, though that lives in the schema.

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

Conciseness4/5

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

The opening clause front-loads the core purpose and the ranking rules follow in a compact, ordered sequence that mirrors actual result order. Every sentence carries information; the only slight drag is the coverage/truncated sentence, which reads as output-field plumbing though it is still relevant.

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

Completeness4/5

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

With an output schema present, the description is not obliged to explain return values, and it correctly focuses on ranking, metadata-only scope, and the next-step call. The remaining gap is comparative placement among the many sibling search/listing tools, which for a vault with this many alternatives would be worth one extra clause.

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

Parameters3/5

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

Schema description coverage is 100%, so all six parameters are already documented in detail, including fuzzy edit-distance rules and limits. The description only contributes indirectly by framing fuzzy as 'optional typo matches' and tying 'coverage' to the approximate pass, which is marginal added meaning over the schema — baseline 3 applies.

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

Purpose4/5

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

States a specific verb and resource ('Discover note paths') and immediately scopes it to path/metadata discovery rather than content retrieval ('Returns metadata without bodies'). An agent can distinguish it from read, but the description does not name what separates it from list_documents, browse_vault, or search, so it falls short of full sibling differentiation.

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

Usage Guidelines3/5

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

It gives one explicit routing instruction — 'Use read with a returned path to retrieve its content' — which covers the natural follow-up call. However, there is no guidance on when to prefer this over search, list_documents, or browse_vault, and no exclusion conditions, leaving the main selection decision to inference.

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

show_contextContext CardA
Read-onlyIdempotent

Open an interactive card for the user showing a note's backlinks, outlinks, similar notes, tags and frontmatter.

It shows the note to the user and returns only counts; use get_context for the data.

NameRequiredDescriptionDefault
pathYesPath of the note, such as `"Journal/2024-01-15.md"`.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds two non-obvious facts beyond that: the tool has a user-facing side effect (it renders a card and "shows the note to the user") and its response is deliberately impoverished ("returns only counts"), which prevents an agent from expecting payload data despite the output schema.

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

Conciseness5/5

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

Two sentences with zero waste. The capability statement comes first and the sibling routing plus return-shape caveat follow, so the reader gets action, scope, and destination in the first pass.

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

Completeness5/5

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

The tool is simple (one path parameter, output schema present, annotations covering safety), and the description supplies exactly the missing pieces: that the output is a UI card rather than data, and where to go for the underlying data. Nothing needed to call it correctly is absent.

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

Parameters3/5

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

Schema description coverage is 100% and there is only one required parameter whose format and example are documented in the schema. The description says "a note's" and "shows the note," reinforcing that the argument identifies a single note, but it adds no syntax or edge-case meaning beyond the schema. Baseline 3 applies.

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

Purpose5/5

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

The description uses a specific verb and resource ("open an interactive card... showing a note's backlinks, outlinks, similar notes, tags and frontmatter") and explicitly names the sibling it is not ("use get_context for the data"). An agent can distinguish it from get_backlinks, get_similar, and get_context without opening any schema.

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

Usage Guidelines4/5

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

It names the alternative (get_context) and states the condition that selects it: this tool displays to the user and returns only counts, so fetch the data through get_context instead. It lacks an explicit when-not (for example, non-interactive or headless use where no human is watching), but the routing logic is clear.

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

statsVault StatsA
Read-onlyIdempotent

Report the vault's size, link health and capabilities: the search modes it serves and the frontmatter fields search can filter on.

NameRequiredDescriptionDefault
wait_for_pending_writesNoWait for recent index writes. On timeout, answer from the current index with _meta.index_stale=true. Default false.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is fully covered and the description need not repeat it. What the description adds is the scope of reported data, but it omits relevant behavior such as whether figures come from the index (and may lag pending writes) and how expensive the link-health computation is.

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

Conciseness5/5

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

One sentence, verb-first, with the four reported data classes enumerated after the colon and no filler. Nothing here could be deleted without losing information.

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

Completeness4/5

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

With an output schema present, return-shape explanation is unnecessary, and the one optional parameter plus annotations are handled by structured fields. The description covers what is reported, leaving only minor gaps around index staleness and its relationship to the status/capability siblings.

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

Parameters3/5

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

Schema description coverage is 100% and the single parameter, wait_for_pending_writes, is documented in the schema including its timeout/_meta.index_stale behavior. The description adds nothing about the parameter, so the baseline of 3 applies.

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

Purpose4/5

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

The description uses a specific verb ("Report") and enumerates the resources returned: vault size, link counts, supported search modes, and facetable frontmatter fields. That is far more informative than the bare name "stats", though it does not distinguish this tool from capability/status siblings such as get_index_status, get_index_stats, or list_tags.

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

Usage Guidelines3/5

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

Usage is only implied: an agent can infer this is a capability-discovery call to run before constructing a search, since the description lists the search modes and filterable fields it exposes. There is no explicit when-to-use statement, no exclusion, and no pointer to the overlapping status siblings.

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

vault_contextVault ContextB
Read-onlyIdempotent

Return the full NoteContext for a note (app-only).

Called by the SPA context card view via app.callServerTool(). Not visible to the LLM.

NameRequiredDescriptionDefault
pathYesRelative note path (such as `"Journal/2024-01-15.md"`).

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.1/5.0
Behavior3/5

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

The annotations already declare that the tool is read-only, idempotent, non-destructive, and closed-world, so the safety profile needs no further explanation. The description adds the non-obvious detail that this is a UI-internal call path rather than a general-purpose endpoint, which is genuinely useful behavioral context. It does not say whether the result is cached, whether it is scoped to the current editor state, or what happens if the note is not open.

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

Conciseness4/5

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

The description is three short lines, and the core action is front-loaded, so there is no wasted prose. The closing note that the tool is not visible to the LLM is slightly meta and self-referential, since this text is being read by an agent, but it is short and it carries real information.

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

Completeness3/5

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

The tool is simple: one required parameter and an output schema that defines the returned NoteContext, so return values need not be described. The annotations cover the safety profile, and the description covers the unusual calling context. The main gap is that an agent has no basis to know how this differs from the context siblings, which is the one thing a complete definition here should settle.

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

Parameters3/5

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

Schema description coverage is 100%, and the single path parameter is documented with an example format of 'Journal/2024-01-15.md'. The description adds nothing about path resolution, whether a leading slash is accepted, or behavior on a missing note. With one fully documented parameter, the baseline of 3 is correct.

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

Purpose3/5

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

The description states a specific verb and resource: 'Return the full NoteContext for a note', so the action is clear. However, 'NoteContext' is an internal term that is never defined, and the description does not distinguish this tool from sibling context tools such as show_context, get_context, or read. The parenthetical '(app-only)' narrows it, but only by saying it is not for the caller.

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

Usage Guidelines3/5

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

It does state a usage condition, namely that the SPA context card view calls it via app.callServerTool(), and that it is not for the LLM. This amounts to implicit guidance for an agent to avoid the tool. It never names alternatives such as get_context or show_context, and it gives no criteria for choosing between them.

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

vault_graph_hubsGraph HubsA
Read-onlyIdempotent

Return the most-linked notes and their connections as a graph (app-only).

Called by the SPA graph view for the hub overview. Not visible to the LLM.

NameRequiredDescriptionDefault
limitNoMax number of hub notes to include.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

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

Annotations already provide readOnlyHint=true, idempotentHint=true, and destructiveHint=false, indicating a safe read operation. The description adds the important behavior that it is 'app-only' and 'Not visible to the LLM,' which is critical for an agent to know before calling it, as it may not be relevant or accessible for LLM workflows.

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

Conciseness5/5

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

The description is extremely concise, with three short sentences. The core purpose is front-loaded, and every sentence adds value: what it returns, when it's used, and a crucial caveat about LLM visibility. No waste.

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

Completeness4/5

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

The tool has only one optional parameter and an output schema, so it's relatively simple. The description covers the purpose and usage context, and the output schema likely explains the return format. The main missing piece is an explicit mention of the 'limit' parameter's effect on performance or graph size, but this is minor.

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

Parameters3/5

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

The schema provides 100% coverage for the single parameter 'limit' with a clear description of 'Max number of hub notes to include.' The description does not add further parameter semantics, but since schema coverage is high, baseline 3 is appropriate.

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

Purpose5/5

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

The description clearly states it returns the most-linked notes and their connections as a graph, specifying it is app-only and used by the SPA graph view. This distinguishes it from siblings like get_most_linked, which likely returns a simple list, and vault_graph_neighborhood, which focuses on a specific note's connections.

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

Usage Guidelines3/5

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

It states it is called by the SPA graph view for the hub overview, giving clear usage context. However, it does not explicitly explain when to use this over siblings like get_most_linked or get_connection_path, nor does it mention any exclusions or alternatives.

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

vault_graph_neighborhoodGraph NeighborhoodA
Read-onlyIdempotent

Return the link neighborhood of a note as a node/edge graph (app-only).

Called by the SPA graph view via app.callServerTool(). Not visible to the LLM.

NameRequiredDescriptionDefault
pathYesCenter note path.
depthNoHow many hops to traverse (default 1).
max_nodesNoSoft cap on returned node count (default 200). BFS and any semantic expansion both stop once the cap is hit; the response sets `truncated=True`. Bounds dense-vault depth=2 traversals that would otherwise bog down vis-network.
include_semanticNoWhen True, add dashed semantic-similarity edges for each interior node (requires embeddings to be configured; silently omitted when unavailable).

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare readOnly, idempotent, non-destructive, closed-world, and an output schema covers the return shape, so the bar is low. The description adds one genuine behavioral fact beyond them — that this is an internal SPA-facing entry point — but says nothing about traversal cost, semantic-edge fallback, or truncation, all of which live in the schema instead.

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

Conciseness5/5

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

Two short sentences with no filler, and the most decision-relevant fact (app-only, not for the LLM) is front-loaded so an agent can dismiss the tool immediately.

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

Completeness4/5

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

With an output schema, full parameter coverage, and four annotations, the only thing the description needs to convey is scope, which it does decisively. What is missing is minor: no pointer to the sibling an agent should use instead for backlink/connection queries.

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

Parameters3/5

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

Schema description coverage is 100%, including defaults, BFS/truncation behavior and the embeddings requirement for include_semantic, so the schema carries parameter meaning fully. The description adds nothing about path, depth, max_nodes or include_semantic, making 3 the correct baseline.

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

Purpose4/5

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

States a specific verb and resource — returns the link neighborhood of a note as a node/edge graph — and specifies the output shape, which separates it from list-style siblings like get_backlinks or get_outlinks. It does not name those siblings explicitly, so an agent must infer which graph/list tool to reach for.

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

Usage Guidelines4/5

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

Unusually explicit routing guidance: '(app-only)', 'Called by the SPA graph view via app.callServerTool()' and 'Not visible to the LLM' tell an agent clearly that this tool is out of scope for it. It stops short of naming the LLM-facing alternative (e.g. get_backlinks, get_connection_path) for the same neighborhood need.

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

vault_listVault ListB
Read-onlyIdempotent

List folders and notes in a vault directory (app-only).

Called by the SPA browser view via app.callServerTool(). Not visible to the LLM.

NameRequiredDescriptionDefault
folderNoFolder to list (root if omitted).

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered. The description adds the meaningful operational fact that this is an internal SPA-invoked tool, but says nothing about recursion depth, whether hidden files are included, or pagination behavior on large vaults.

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

Conciseness4/5

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

Three short lines, front-loaded with the actual capability before the invocation context. Nothing is padded, though the 'Not visible to the LLM' line is somewhat redundant with '(app-only)'.

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

Completeness3/5

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

With an output schema, complete annotations, and a fully documented single parameter, the structured data carries most of the burden. The description is adequate but leaves the main ambiguity unresolved: how this differs from the several other listing tools in the sibling set.

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

Parameters3/5

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

Schema description coverage is 100% and the single `folder` parameter is already documented as 'Folder to list (root if omitted).' The description adds no syntax, path format, or delimiter conventions beyond that, so the baseline of 3 applies.

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

Purpose4/5

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

States a concrete verb and resource: lists folders and notes within a vault directory. It partially distinguishes itself from list_documents and list_folders by covering both in one call, though it never names those siblings explicitly.

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

Usage Guidelines3/5

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

The '(app-only)' marker plus 'Called by the SPA browser view' establishes who invokes it, which is a usage constraint rather than routing guidance. It gives no when-to-use versus list_documents, list_folders, or browse_vault, so an agent must infer selection from names alone.

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

vault_readVault ReadA
Read-onlyIdempotent

Read a note's full content for preview rendering (app-only).

Called by the SPA browser view via app.callServerTool(). Not visible to the LLM.

NameRequiredDescriptionDefault
pathYesRelative note path.

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

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

The annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered. The description adds that the entire note body is returned (not a summary) and that invocation happens through the SPA bridge, but says nothing about behavior for missing/invalid paths, encoding, or size limits. An output schema exists, so return-shape disclosure is not required, keeping this at a solid but unremarkable 3.

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

Conciseness4/5

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

Three short lines, front-loaded with the action and resource, with no filler. The trailing audience note is slightly meta for a tool definition but is short and informative rather than wasteful.

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

Completeness5/5

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

For a single-parameter read with full annotation coverage and an output schema, the description supplies what an agent needs: what is returned, who calls it, and through what mechanism. The only gap is sibling differentiation against `read`, which is minor given the explicit app-only scoping.

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

Parameters3/5

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

There is a single parameter with 100% schema description coverage ('Relative note path'), so the schema carries the semantics. The description adds no information about path resolution, vault root, extension handling, or what counts as 'relative', which is the one place added value would have mattered.

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

Purpose4/5

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

The description gives a specific verb and resource — read a note's full content — and narrows the scope to preview rendering. It also distinguishes itself from the sibling `read` tool by declaring itself an app-internal endpoint rather than a general LLM-facing read, though it never explains the functional difference between the two.

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

Usage Guidelines4/5

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

It clearly states the caller context ('Called by the SPA browser view via `app.callServerTool()`') and explicitly excludes the LLM audience, which functions as a when-not-to-use signal. What is missing is routing guidance toward the likely alternative (`read`, `browse_vault`) for an agent that actually needs note content.

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

writeWrite NoteA
Idempotent

Create a note or attachment, or replace one whole; returns its path and whether it was created.

Use edit for targeted changes and append to add to the end. Parent folders are created as needed.

NameRequiredDescriptionDefault
pathYesPath in the vault, such as `"Journal/note.md"` or `"assets/photo.png"`; the extension decides between note and attachment.
contentNoThe note's Markdown body, without frontmatter.
if_matchNoEtag from read, to replace an existing file; omit for a new file.
frontmatterNoThe note's frontmatter, such as `{"title": "My Note", "tags": ["draft"]}`.
content_base64NoAn attachment's bytes, base64-encoded; for paths not ending in .md.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior3/5

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

Beyond the annotations it discloses that the call reports whether the file was created and that parent folders are created implicitly. However, the phrase 'replace one whole' signals full-content overwrite while destructiveHint is false, and the description never warns that existing content is discarded or that if_match is the guard against clobbering; that is exactly the kind of context a write tool should surface. The mismatch is a soft tension rather than a flat contradiction, since overwrites may be recoverable via the history siblings.

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

Conciseness5/5

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

Two tight sentences with the create/replace semantics front-loaded and the sibling routing immediately after. Every clause carries information: return values, alternatives, and implicit folder creation; nothing is padded.

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

Completeness4/5

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

An output schema exists, so return values do not need spelling out, and the description covers the create-vs-replace distinction, implicit folder creation, and sibling routing. It is nearly complete for a 5-parameter write tool; the missing piece is a caution about overwriting an existing note without an etag.

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

Parameters3/5

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

Schema coverage is 100%, so path, content, if_match, frontmatter and content_base64 are all already explained, including the extension-decides-note-vs-attachment rule. The description adds no parameter-level meaning beyond that, so the baseline 3 applies; folder auto-creation is behavioral rather than parameter guidance.

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

Purpose5/5

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

States a specific verb and resource ('Create a note or attachment'), plus a second mode ('replace one whole') and the return signal ('its path and whether it was created'). It also names the sibling tools it is not (edit, append), so an agent can separate it from the neighbouring mutation tools without inspecting any schema.

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

Usage Guidelines5/5

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

Explicitly routes between alternatives: 'Use edit for targeted changes and append to add to the end', which defines both when this tool is the right pick and which siblings cover the cases it does not. The only unstated condition is when an overwrite requires an etag, which the schema itself documents.

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

Tool Schema Changelog

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

  1. 37 tool updatesv6.1.0
    • Addedaggregate_documents
    • Changedappend4 fields changed
      • changedInput schema / properties / content / description
        Previous value: -"Text to append (must be non-empty). Added at the end\nof the file, after frontmatter and all existing content."New value: +"Non-empty text to add after everything the note holds."
      • changedInput schema / properties / create_if_missing / description
        Previous value: -"When true, a missing note is created with\n'content' as its body instead of failing. Default false —\na typo in 'path' fails loudly rather than silently creating\na new note."New value: +"Create the note with content as its body when path does\nnot exist. Default false, so a mistyped path creates nothing."
      • changedInput schema / properties / if_match / description
        Previous value: -"Optional etag obtained from a previous 'read' call.\nWhen provided, the append only proceeds if the file has not\nbeen modified since that read (optimistic concurrency).\nOmit to append unconditionally."New value: +"Etag from read; the text is then added only to that version. Omit\nto append regardless."
      • changedInput schema / properties / path / description
        Previous value: -"Relative path to the document (e.g. \"Journal/2026.md\")."New value: +"Path of the note, such as `\"Journal/2026.md\"`."
    • Changedbrowse_vault2 fields changed
      • changedInput schema / properties / path / description
        Previous value: -"Optional note path to focus on (e.g. ``\"Journal/2024-01-15.md\"``)."New value: +"Note to open on, such as `\"Journal/2024-01-15.md\"`; omit to start from the\nwhole vault."
      • changedInput schema / properties / view / description
        Previous value: -"Which view to open: ``\"context\"`` (note relationships),\n``\"graph\"`` (link visualization), ``\"browse\"`` (file tree),\nor ``\"note\"`` (full note preview).\nDefaults to ``\"context\"`` if a path is given, ``\"browse\"`` otherwise."New value: +"`\"context\"` for a note's relationships, `\"graph\"` for the link graph,\n`\"browse\"` for the file tree, or `\"note\"` for the note itself; omit for\n`\"context\"` with a path and `\"browse\"` without."
    • Changedbuild_embeddings1 field changed
      • changedInput schema / properties / force / description
        Previous value: -"When True, discards existing embeddings and rebuilds from\nscratch. Use only if the embedding model has changed.\nWhen False (default), converges the vector index to the\nFTS chunk set — work scales with the size of the drift,\nnot the size of the vault (#665)."New value: +"Re-embed every chunk, as after the embedding model changed; the\ncurrent embeddings keep serving until the rebuild completes.\nDefault false embeds only what changed."
    • Addedcount_documents
    • Changeddelete2 fields changed
      • changedInput schema / properties / if_match / description
        Previous value: -"Optional etag obtained from a previous 'read' call.\nWhen provided, the deletion only proceeds if the file has\nnot been modified since that read (optimistic concurrency).\nOmit to delete unconditionally."New value: +"Etag from read; the file is then deleted only as that version.\nOmit to delete it as it is."
      • changedInput schema / properties / path / description
        Previous value: -"Relative path to the document or attachment to delete."New value: +"Path of the note or attachment."
    • Changededit6 fields changed
      • changedInput schema / properties / if_match / description
        Previous value: -"Optional etag obtained from a previous 'read' call.\nWhen provided, the edit only proceeds if the file has not\nbeen modified since that read (optimistic concurrency)."New value: +"Etag from read. Pass it, one edit per read, when line_start and\nline_end are given; omit it for several old_text-only edits to one note\nat once."
      • changedInput schema / properties / line_end / description
        Previous value: -"Last line to replace (1-based, inclusive).\nMust be provided together with line_start."New value: +"Last line to replace, inclusive; pass with line_start."
      • changedInput schema / properties / line_start / description
        Previous value: -"First line to replace (1-based, inclusive).\nMust be provided together with line_end."New value: +"First line to replace, counting from 1 over the content read\nreturns, frontmatter included; pass with line_end."
      • changedInput schema / properties / new_text / description
        Previous value: -"Replacement text. May be longer or shorter."New value: +"Replacement text; empty deletes the matched text or the lines."
      • changedInput schema / properties / old_text / description
        Previous value: -"Text to replace. Must appear exactly once in the\ndocument or line range. Get this via 'read'. Optional\nwhen using line-range mode."New value: +"Text to replace, occurring once in the note or in the line range;\nomit to replace the whole line range."
      • changedInput schema / properties / path / description
        Previous value: -"Relative path to the document."New value: +"Path of the note."
    • Changedfetch5 fields changed
      • changedInput schema / properties / frontmatter / description
        Previous value: -"Optional YAML frontmatter dict for .md files,\ne.g. {\"title\": \"Report\", \"source\": \"http://...\"}. Ignored\nfor attachments."New value: +"Frontmatter for a note, such as\n`{\"title\": \"Report\", \"source\": \"https://example.org/report\"}`."
      • changedInput schema / properties / if_match / description
        Previous value: -"Etag from 'read'; required by default to replace an\nexisting file. A stale etag refuses the write. Omit for new files."New value: +"Etag from read, to replace an existing file; omit for a new file."
      • changedInput schema / properties / path / description
        Previous value: -"Destination path in the vault (e.g. \"notes/report.md\"\nor \"assets/diagram.png\"). Extension determines handling:\n.md for notes, anything else for attachments."New value: +"Destination path, such as `\"notes/report.md\"` or `\"assets/diagram.png\"`; .md\nsaves a note, anything else an attachment."
      • changedInput schema / properties / timeout_s / description
        Previous value: -"Download timeout in seconds (default 30). Increase\nfor large files on slow connections."New value: +"Download timeout in seconds (default 30); raise it for a large\nfile from a slow host."
      • changedInput schema / properties / url / description
        Previous value: -"Source URL to download from. Only http:// and https://\nschemes are allowed. SSRF protection (via pvl-core's hardened\n``fetch_url``, #862): the host is resolved and rejected unless\nevery address is publicly routable (private, loopback,\nlink-local, CGNAT/shared, and reserved ranges are all\nblocked), the validated IP is pinned for the connection\n(closing DNS rebinding), and ambient HTTP(S)_PROXY / .netrc\nsettings are ignored. Redirects ARE followed (changed in\n#1116; through v3.1.0 a redirect was refused), and every hop\nrepeats the whole chain above — a ``Location`` pointing at an\ninternal target is refused exactly as a directly supplied one\nis. Because of that, the bytes need not come from the host in\n*url*: check the returned ``final_url`` when the source host\nmatters."New value: +"An HTTP or HTTPS URL on the public internet. Redirects are followed, so\ncheck final_url in the result when the source host matters."
    • Changedget_backlinks2 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum number of backlinks to return. Omitted (the\ndefault) returns all."New value: +"Maximum backlinks to return; omit for all."
      • changedInput schema / properties / path / description
        Previous value: -"Relative path of the target document (e.g.\n\"notes/topic.md\"). Case-sensitive."New value: +"Path of the note linked to, such as `\"notes/topic.md\"`; case-sensitive."
    • Changedget_broken_links1 field changed
      • changedInput schema / properties / folder / description
        Previous value: -"Optional folder filter. When provided, only checks\nlinks from documents in this folder (e.g. \"Journal\").\nUse folder=\"\" for root-level (top-level) documents only.\nWithout this, checks all documents."New value: +"Only links in notes in this folder and its sub-folders, such as\n`\"Journal\"`; `\"\"` for top-level notes only; omit for the whole vault."
    • Changedget_connection_path3 fields changed
      • changedInput schema / properties / max_depth / description
        Previous value: -"Maximum number of hops to search. Default 10, max 10."New value: +"Most links to follow, 1 to 10 (default 10)."
      • changedInput schema / properties / source / description
        Previous value: -"Vault-relative path of the starting note (e.g. 'Ideas/spark.md')."New value: +"Path of the starting note, such as `\"Ideas/spark.md\"`."
      • changedInput schema / properties / target / description
        Previous value: -"Vault-relative path of the destination note."New value: +"Path of the destination note."
    • Changedget_context3 fields changed
      • changedInput schema / properties / link_limit / description
        Previous value: -"Maximum number of backlinks and outlinks to include\neach (default 10)."New value: +"Maximum backlinks, and separately outlinks (default 10)."
      • changedInput schema / properties / path / description
        Previous value: -"Relative path of the document (e.g. \"notes/topic.md\").\nCase-sensitive."New value: +"Path of the note, such as `\"notes/topic.md\"`; case-sensitive."
      • changedInput schema / properties / similar_limit / description
        Previous value: -"Maximum number of similar notes to include\n(default 5). Pass 0 to skip the similarity lookup — do this\nwhen 'stats' shows semantic_search_available=False (embeddings\nare not configured)."New value: +"Maximum similar notes (default 5); 0 skips them, which suits\na vault where stats shows semantic_search_available false."
    • Changedget_conventions1 field changed
      • changedInput schema / properties / path / description
        Previous value: -"Relative note path (e.g. \"3-Resources/topic.md\") or folder\npath (e.g. \"3-Resources\"). A note path resolves to its\nparent folder. Pass \"\" (default) for discovery mode:\nvault-root conventions plus the full list of folders\ncarrying convention files."New value: +"A note or folder path, such as `\"3-Resources/topic.md\"` or `\"3-Resources\"`; a\nnote takes its folder's conventions. `\"\"` (the default) returns the root\nconventions and lists every folder that has its own."
    • Changedget_diff5 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"When per_commit=True, cap the number of intervening commits\nreturned to the `limit` most recent ones. Clamped to [1, 100].\nDefaults to null (unbounded — still bounded by the underlying\nsince..HEAD range). Ignored when per_commit=False. Useful for\nkeeping per-commit responses within context budgets when\nauditing long histories."New value: +"With per_commit, how many of the most recent commits to include, 1 to\n100; omit for all."
      • changedInput schema / properties / path / description
        Previous value: -"Vault-relative path of the note or attachment to diff (e.g.\n\"notes/alpha.md\" or \"assets/diagram.png\"). May be a `.md`\nnote or a configured attachment extension (png, pdf, svg, …).\nA binary attachment returns a `--stat` size/rename summary\ninstead of a full unified patch; a text attachment (e.g.\n`.svg`, `.csv`) returns a full unified diff. `.md` notes are\nunchanged. An unsupported extension is rejected."New value: +"A note or attachment path, such as `\"notes/alpha.md\"`; a binary attachment\nreturns a summary of size and renames instead of a patch."
      • changedInput schema / properties / per_commit / description
        Previous value: -"When False (default), return a single unified diff from\nthe reference point to HEAD. When True, return one diff per\nintervening commit."New value: +"True for one diff per commit since the starting point, newest\nfirst; default false for a single diff."
      • changedInput schema / properties / since_sha / description
        Previous value: -"A commit SHA (full or abbreviated, at least 4 hex digits)\nto diff from. Mutually exclusive with since_timestamp."New value: +"A commit SHA to diff from, such as from get_history; at least 4 hex\ndigits."
      • changedInput schema / properties / since_timestamp / description
        Previous value: -"ISO 8601 datetime string, resolved via\n`git rev-list --before=<ts> -1 HEAD` to the most recent\ncommit at or before that instant. Boundary is\n**inclusive**: a commit whose committer date equals\nsince_timestamp IS the resolved ref. Mutually exclusive\nwith since_sha."New value: +"An ISO 8601 time; diffs from the latest commit at or before\nit."
    • Changedget_history4 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum number of commits to return. Default 20, max 100."New value: +"Maximum commits to return (default 20, at most 100)."
      • changedInput schema / properties / path / description
        Previous value: -"Vault-relative path to filter on. A `.md` note or a\nconfigured attachment extension (png, pdf, svg, …) scopes to\nthat single file (e.g. \"notes/alpha.md\",\n\"assets/diagram.png\"); an existing folder scopes to its\nsubtree (e.g. \"guides\" returns commits touching guides/**).\nOmit (or pass null) for vault-wide commit history."New value: +"A note or attachment path, such as `\"notes/alpha.md\"`, or a folder, such as\n`\"guides\"`; omit for the whole vault. Give a note's current name:\nhistory from before a rename is included."
      • changedInput schema / properties / since / description
        Previous value: -"ISO 8601 datetime string (\"2026-04-01T00:00:00\") or a git\ndate expression (\"1 week ago\"). Passed as --since to git log.\nOmit for full history."New value: +"Earliest commit date, inclusive: an ISO 8601 time such as\n`\"2026-04-01T00:00:00\"` or a relative date such as `\"1 week ago\"`; omit for\nall history."
      • changedInput schema / properties / until / description
        Previous value: -"ISO 8601 datetime string or git date expression, passed as\n--until to git log. Both 'since' and 'until' boundaries are\ninclusive: a commit whose committer date equals either\nendpoint is included in the result. Omit to disable the upper\nbound."New value: +"Latest commit date, inclusive, in the same forms as since; omit for\nno upper bound."
    • Changedget_job_result1 field changed
      • addedInput schema / properties / job_id / description
        Added value: +"The job_id a long-running tool returned when it continued\nin the background."
    • Changedget_most_linked1 field changed
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum number of results to return. Default 10."New value: +"Maximum notes to return (default 10)."
    • Changedget_outlinks2 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum number of outlinks to return. Omitted (the\ndefault) returns all."New value: +"Maximum outlinks to return; omit for all."
      • changedInput schema / properties / path / description
        Previous value: -"Relative path of the source document (e.g.\n\"notes/topic.md\"). Case-sensitive."New value: +"Path of the note holding the links, such as `\"notes/topic.md\"`;\ncase-sensitive."
    • Changedget_recent2 fields changed
      • changedInput schema / properties / folder / description
        Previous value: -"Optional folder filter. When provided, only returns\nnotes from this folder (e.g. \"Journal\").\nUse folder=\"\" for root-level (top-level) documents only."New value: +"Only notes in this folder and its sub-folders, such as `\"Journal\"`;\n`\"\"` for top-level notes only; omit for the whole vault."
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum number of notes to return (default 20)."New value: +"Maximum notes to return (default 20)."
    • Changedget_similar5 fields changed
      • changedInput schema / properties / chunks_per_file / description
        Previous value: -"Maximum sections returned per file (default 2).\nSet to 1 for one best section per file.  Must be >= 1."New value: +"Maximum sections per note, at least 1; omit for the server\ndefault."
      • changedInput schema / properties / filters / description
        Previous value: -"Frontmatter equality filters, ANDed — e.g.\n{\"type\": \"resource\"}. Matched post-hoc against each\ncandidate's full frontmatter, so any frontmatter key works\n(unlike keyword 'search' filters, which are limited to\nindexed_frontmatter_fields). List-valued fields match if\nthe value is among them. On an OKF bundle three keys carry\nOKF semantics, exactly as in 'search': status (\"stable\"\nalso matches notes without a status field), stale\n(\"true\"/\"false\"), and trust_tier."New value: +"Frontmatter values to match, all of them, such as\n`{\"type\": \"resource\"}`; any key works and a list field matches when it holds the\nvalue. On an OKF bundle, status (stable includes notes with none), stale\n(`\"true\"` or `\"false\"`) and trust_tier filter too."
      • changedInput schema / properties / folder / description
        Previous value: -"Restrict results to this folder (exact match or\nsub-folder prefix), e.g. \"3-Resources\". Useful to scope\nlink candidates to one part of the vault.\nUse folder=\"\" for root-level (top-level) documents only."New value: +"Only notes in this folder or below, such as `\"3-Resources\"`; `\"\"` for\ntop-level notes only."
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum number of similar notes to return (default 10)."New value: +"Maximum notes to return (default 10)."
      • changedInput schema / properties / path / description
        Previous value: -"Relative path of the reference document (e.g.\n\"notes/topic.md\"). Case-sensitive."New value: +"Path of the note to compare against, such as `\"notes/topic.md\"`;\ncase-sensitive."
    • Changedget_toc3 fields changed
      • changedInput schema / properties / max_level / description
        Previous value: -"Drop headings deeper than this level (e.g. 2 keeps\nH1-H2); must be >= 1. The synthetic H1 title always survives.\nDefault None returns all levels."New value: +"Deepest heading level to keep, such as 2 for H1 and H2; omit for\nall. The title always stays."
      • changedInput schema / properties / max_notes / description
        Previous value: -"Folder mode only — cap on distinct notes (default 200,\nmust be >= 1). When more notes match, the first max_notes (by\npath) are returned and 'truncated' is True."New value: +"Folders only: notes to include, first by path (default 200);\ntruncated is true when more exist."
      • changedInput schema / properties / path / description
        Previous value: -"Note path (\"a/b.md\") or folder prefix (\"a/b\")."New value: +"A note path ending in .md, such as `\"a/b.md\"`, or a folder, such as `\"a/b\"`."
    • Changedlist_documents4 fields changed
      • changedInput schema / properties / filters / description
        Previous value: -"Frontmatter equality filters, ANDed (e.g.\n{\"tags\": \"craft\"}); any frontmatter key works and list\nfields match by membership. On an OKF bundle three keys\ncarry OKF semantics: status (\"draft\"/\"stable\"/\"deprecated\";\n\"stable\" also matches notes without a status field), stale\n(\"true\"/\"false\" — stale_after reached), and trust_tier\n(\"unverified\"/\"machine-confirmed\"/\"human-reviewed\"). Use\n{\"status\": \"deprecated\"} or {\"stale\": \"true\"} to build\ntriage listings. Any filter excludes attachments (they\ncarry no frontmatter)."New value: +"Frontmatter values to match, all of them, such as `{\"tags\": \"craft\"}`;\nany key works, a list field matches when it holds the value, and\nattachments never match. On an OKF bundle, status (draft, stable or\ndeprecated; stable includes notes with none), stale (`\"true\"` or `\"false\"`)\nand trust_tier (unverified, machine-confirmed or human-reviewed) filter\ntoo."
      • changedInput schema / properties / folder / description
        Previous value: -"Return only documents in this folder (e.g. \"Journal\").\nUse folder=\"\" for root-level (top-level) documents only."New value: +"Only notes in this folder and its sub-folders, such as `\"Journal\"`;\n`\"\"` for top-level notes only; omit for the whole vault."
      • changedInput schema / properties / include_attachments / description
        Previous value: -"When True, also returns non-.md files (PDFs,\nimages, etc.) that match the configured allowlist. Each\nattachment entry includes kind=\"attachment\" and mime_type.\nDefault False (notes only)."New value: +"Also list non-note files, marked kind=`\"attachment\"` with\ntheir mime_type. Default false."
      • changedInput schema / properties / pattern / description
        Previous value: -"Unix glob matched against relative paths (e.g.\n\"Journal/*.md\", \"**/*meeting*.md\")."New value: +"Glob matched against paths, such as `\"Journal/*.md\"` or\n`\"**/*meeting*.md\"`."
    • Changedlist_tags1 field changed
      • changedInput schema / properties / field / description
        Previous value: -"Frontmatter field name to enumerate (default \"tags\"). Must\nbe one of the values in indexed_frontmatter_fields (from 'stats')\n— passing any other field silently returns an empty list, not an\nerror."New value: +"A field from indexed_frontmatter_fields in stats (default `\"tags\"`)."
    • Changedmove_folder2 fields changed
      • changedInput schema / properties / new_dir / description
        Previous value: -"Relative target folder prefix (e.g. \"archive/2026\").\nMay be an existing folder — files merge in; a per-file name\nclash aborts the whole move."New value: +"Destination folder, such as `\"archive/2026\"`; an existing folder is\nmerged into."
      • changedInput schema / properties / old_dir / description
        Previous value: -"Relative source folder prefix (e.g. \"drafts\")."New value: +"Folder to move, such as `\"drafts\"`."
    • Changedokf_convert_links1 field changed
      • changedInput schema / properties / folder / description
        Previous value: -"Restrict to this folder subtree (e.g. \"guides\"). Omit to\nconvert the whole vault."New value: +"Only notes in this folder and below, such as `\"guides\"`; omit for the\nwhole vault."
    • Changedokf_generate_index1 field changed
      • changedInput schema / properties / folder / description
        Previous value: -"Vault-relative folder to index (e.g. \"guides\"). Omit for\nthe bundle root."New value: +"Folder to index, such as `\"guides\"`; omit for the bundle root."
    • Changedokf_seed_log1 field changed
      • changedInput schema / properties / folder / description
        Previous value: -"Vault-relative folder to write log.md into and scope\nhistory to (e.g. \"guides\"). Omit for the bundle root\n(whole-vault history)."New value: +"Folder to write log.md in, whose history it covers, such as `\"guides\"`;\nomit for the bundle root and the whole vault's history."
    • Addedquery_documents
    • Changedread3 fields changed
      • changedInput schema / properties / path / description
        Previous value: -"Relative path to the document or attachment\n(e.g. \"Journal/note.md\" or \"assets/diagram.pdf\").\nCase-sensitive."New value: +"Path in the vault, such as `\"Journal/note.md\"` or `\"assets/diagram.pdf\"`;\ncase-sensitive."
      • changedInput schema / properties / revision / description
        Previous value: -"Read the note as it stood at that commit instead of on\ndisk (git-backed vaults, .md only). A sha from 'get_history'\nor a write result's 'previous_revision'. Pass *path* as the\nnote is named today; renames are followed. Composes with\nsection=."New value: +"A commit SHA from get_history or from a write result's\nprevious_revision; returns the note as it stood then, without an etag.\nPass path as the note is named today. To restore that text, write it\nwith the etag of a read without revision."
      • changedInput schema / properties / section / description
        Previous value: -"When provided, return the whole section whose heading\nmatches *section* — every paragraph, list, and sub-section\nfrom the heading up to the next heading at the same or higher\nlevel (case-sensitive; internal whitespace is collapsed before\ncomparison). Pass the ``heading`` value from a ``search``\nresult unchanged for guaranteed match. ``None`` (the default)\nreturns the whole document. Ignored for non-.md paths."New value: +"A heading, such as the heading field of a search result; returns that\nsection and its sub-sections instead of the whole note. Notes only."
    • Changedreindex1 field changed
      • changedInput schema / properties / force / description
        Previous value: -"When True, drop every indexed document and re-parse the\nwhole vault instead of applying the hash-detected delta.\nThe index is not queryable while the rebuild runs, and the\ncost scales with the vault rather than the drift, so prefer\nthe default."New value: +"Drop the index and re-parse every note instead of only changed ones:\nslower, and search waits until it finishes. Use it when results no\nlonger match the notes, then run build_embeddings if the vault has\nsemantic search. Default false."
    • Changedrename4 fields changed
      • changedInput schema / properties / if_match / description
        Previous value: -"Optional etag obtained from a previous 'read' call\nfor old_path. When provided, the rename only proceeds if\nthe file has not been modified since that read (optimistic\nconcurrency). Omit to rename unconditionally."New value: +"Etag from read of old_path; still accepted when the only\nchanges since are link rewrites the server made."
      • changedInput schema / properties / new_path / description
        Previous value: -"Target relative path (e.g. \"projects/idea.md\"\nor \"assets/new.png\"). Fails if new_path already exists."New value: +"New path, such as `\"projects/idea.md\"`, where nothing exists yet."
      • changedInput schema / properties / old_path / description
        Previous value: -"Current relative path (e.g. \"drafts/idea.md\"\nor \"assets/old.png\")."New value: +"Current path, such as `\"drafts/idea.md\"` or `\"assets/old.png\"`."
      • changedInput schema / properties / update_links / description
        Previous value: -"When True, all .md documents that link to old_path\nare also updated so their links point to new_path. Replacement\nis best-effort — failures are logged but do not prevent the\nrename. Default False; set True whenever renaming a .md note\n(omitting this leaves backlinks pointing to the old path)."New value: +"Rewrite links to old_path in other notes so they point at\nnew_path; attachment references are not tracked. Default false; pass\ntrue for every note."
    • Changedsearch7 fields changed
      • changedInput schema / properties / chunks_per_file / description
        Previous value: -"Maximum number of sections to return per file\n(default 2).  Set to 1 to get only the top-ranked section\nper file.  Must be >= 1."New value: +"Maximum sections per note, at least 1; omit for the server\ndefault."
      • changedInput schema / properties / filters / description
        Previous value: -"Filter by indexed frontmatter field values, e.g.\n{\"cluster\": \"craft\", \"tags\": \"pacing\"}. Only fields listed\nin indexed_frontmatter_fields (see 'stats') can be filtered.\nMultiple filters are ANDed. For list fields (e.g. tags),\nthis checks membership — {\"tags\": \"pacing\"} matches any\ndocument where \"pacing\" appears in the tags list. On an OKF\nbundle three keys carry OKF semantics: status (\"draft\"/\n\"stable\"/\"deprecated\"; \"stable\" also matches notes without\na status field), stale (\"true\"/\"false\" — stale_after\nreached), and trust_tier (\"unverified\"/\"machine-confirmed\"/\n\"human-reviewed\"); \"type\" filters normally, e.g.\n{\"type\": \"Playbook\", \"stale\": \"false\"}."New value: +"Frontmatter values to match, all of them, such as `{\"tags\": \"pacing\"}`;\nkeys come from indexed_frontmatter_fields in stats, and a list field\nmatches when it holds the value. On an OKF bundle, status (draft, stable\nor deprecated; stable includes notes with none), stale (`\"true\"` or\n`\"false\"`) and trust_tier (unverified, machine-confirmed or\nhuman-reviewed) filter too."
      • changedInput schema / properties / folder / description
        Previous value: -"Restrict to documents under this folder path (e.g.\n\"Journal\"). Must match a value from 'list_folders'.\nUse folder=\"\" for root-level (top-level) documents only."New value: +"Only notes under this folder, a value from list_folders; `\"\"` for\ntop-level notes only."
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum results to return (default 10)."New value: +"Maximum notes to return (default 10)."
      • changedInput schema / properties / mode / description
        Previous value: -"\"keyword\" uses FTS5/BM25 for exact terms. \"semantic\" uses\nvector similarity (requires embeddings). \"hybrid\" fuses both\nvia reciprocal rank fusion — best quality when available.\nOmit it (the default) to follow the vault's configured\nDEFAULT_SEARCH_MODE, which ships as \"auto\": hybrid where\nembeddings exist, keyword otherwise. Any configured default\ndegrades to \"keyword\" when it needs embeddings the vault\nlacks; an explicit \"semantic\"/\"hybrid\" still errors when\nunconfigured."New value: +"Omit for the best mode this vault serves. `\"keyword\"` suits exact terms,\noperators and filenames; `\"semantic\"` matches meaning only; `\"hybrid\"`\ncombines both. `\"semantic\"` and `\"hybrid\"` need semantic_search_available\nfrom stats."
      • changedInput schema / properties / query / description
        Previous value: -"Natural language or keyword query string."New value: +"Words to match or a natural-language question."
      • changedInput schema / properties / snippet_words / description
        Previous value: -"Width of the snippet window in words. Omit to use\nthe server default. Set to 0 to return full chunk content.\nUse read(path, section=heading) for full section recovery."New value: +"Snippet width in words; omit for the server default, 0 for\nwhole sections. read with section set to a result's heading returns that\nwhole section."
    • Addedsearch_paths
    • Changedshow_context1 field changed
      • changedInput schema / properties / path / description
        Previous value: -"Relative note path (e.g. ``\"Journal/2024-01-15.md\"``)."New value: +"Path of the note, such as `\"Journal/2024-01-15.md\"`."
    • Changedvault_context1 field changed
      • changedInput schema / properties / path / description
        Previous value: -"Relative note path (e.g. ``\"Journal/2024-01-15.md\"``)."New value: +"Relative note path (such as `\"Journal/2024-01-15.md\"`)."
    • Changedvault_graph_neighborhood1 field changed
      • changedInput schema / properties / max_nodes / description
        Previous value: -"Soft cap on returned node count (default 200). BFS\nand any semantic expansion both stop once the cap is hit;\nthe response sets ``truncated=True``. Bounds dense-vault\ndepth=2 traversals that would otherwise bog down vis-network."New value: +"Soft cap on returned node count (default 200). BFS\nand any semantic expansion both stop once the cap is hit;\nthe response sets `truncated=True`. Bounds dense-vault\ndepth=2 traversals that would otherwise bog down vis-network."
    • Changedwrite5 fields changed
      • changedInput schema / properties / content / description
        Previous value: -"Full markdown body for .md files (excluding\nfrontmatter). Ignored for attachments."New value: +"The note's Markdown body, without frontmatter."
      • changedInput schema / properties / content_base64 / description
        Previous value: -"Base64-encoded binary content for attachment\nfiles. Required when path is not ``.md``.\n\n**Context cost:** base64 encoding inflates by ~33%; even a 1 MB\nattachment becomes ~1.3 MB of tokens."New value: +"An attachment's bytes, base64-encoded; for paths not ending\nin .md."
      • changedInput schema / properties / frontmatter / description
        Previous value: -"Optional YAML frontmatter dict for .md files,\ne.g. {\"title\": \"My Note\", \"tags\": [\"draft\"]}.\nIgnored for attachments."New value: +"The note's frontmatter, such as\n`{\"title\": \"My Note\", \"tags\": [\"draft\"]}`."
      • changedInput schema / properties / if_match / description
        Previous value: -"Etag from 'read'; required by default to replace an\nexisting file. A stale etag refuses the write. Omit for new files."New value: +"Etag from read, to replace an existing file; omit for a new file."
      • changedInput schema / properties / path / description
        Previous value: -"Relative path (e.g. \"Journal/note.md\" or\n\"assets/photo.png\"). Extension determines handling."New value: +"Path in the vault, such as `\"Journal/note.md\"` or `\"assets/photo.png\"`; the\nextension decides between note and attachment."
  2. 24 tool updatesv5.0.0
    • Changedfetch1 field changed
      • changedInput schema / properties / if_match / description
        Previous value: -"Optional etag from a previous 'read' call for\noptimistic concurrency. Omit to write unconditionally."New value: +"Etag from 'read'; required by default to replace an\nexisting file. A stale etag refuses the write. Omit for new files."
    • Changedget_backlinks1 field changed
      • changedInput schema / properties / wait_for_pending_writes / description
        Previous value: -"When True, wait until your recent\ndocument mutations have been applied to the\nindex before answering, so the results reflect those changes.\nUse it right after modifying notes when this read must see\nthem (e.g. right after a document mutation whose\neffect this read should reflect). Default\nFalse answers immediately from the current index — almost\nalways already up to date; inspect the response's\n``_meta.index_stale`` field to tell whether a write was still\nin flight. Bounded by a server timeout (default 60s); on\ntimeout it answers from the current index rather than waiting\nlonger."New value: +"Wait for recent index writes. On timeout, answer from the current index with _meta.index_stale=true. Default false."
    • Changedget_broken_links1 field changed
      • changedInput schema / properties / wait_for_pending_writes / description
        Previous value: -"When True, wait until your recent\ndocument mutations have been applied to the\nindex before answering, so the results reflect those changes.\nUse it right after modifying notes when this read must see\nthem (e.g. right after a document mutation whose\neffect this read should reflect). Default\nFalse answers immediately from the current index — almost\nalways already up to date; inspect the response's\n``_meta.index_stale`` field to tell whether a write was still\nin flight. Bounded by a server timeout (default 60s); on\ntimeout it answers from the current index rather than waiting\nlonger."New value: +"Wait for recent index writes. On timeout, answer from the current index with _meta.index_stale=true. Default false."
    • Changedget_connection_path1 field changed
      • changedInput schema / properties / wait_for_pending_writes / description
        Previous value: -"When True, wait until your recent\ndocument mutations have been applied to the\nindex before answering, so the results reflect those changes.\nUse it right after modifying notes when this read must see\nthem (e.g. right after a document mutation whose\neffect this read should reflect). Default\nFalse answers immediately from the current index — almost\nalways already up to date; inspect the response's\n``_meta.index_stale`` field to tell whether a write was still\nin flight. Bounded by a server timeout (default 60s); on\ntimeout it answers from the current index rather than waiting\nlonger."New value: +"Wait for recent index writes. On timeout, answer from the current index with _meta.index_stale=true. Default false."
    • Changedget_context1 field changed
      • changedInput schema / properties / wait_for_pending_writes / description
        Previous value: -"When True, wait until your recent\ndocument mutations have been applied to the\nindex before answering, so the results reflect those changes.\nUse it right after modifying notes when this read must see\nthem (e.g. right after a document mutation whose\neffect this read should reflect). Default\nFalse answers immediately from the current index — almost\nalways already up to date; inspect the response's\n``_meta.index_stale`` field to tell whether a write was still\nin flight. Bounded by a server timeout (default 60s); on\ntimeout it answers from the current index rather than waiting\nlonger."New value: +"Wait for recent index writes. On timeout, answer from the current index with _meta.index_stale=true. Default false."
    • Changedget_most_linked1 field changed
      • changedInput schema / properties / wait_for_pending_writes / description
        Previous value: -"When True, wait until your recent\ndocument mutations have been applied to the\nindex before answering, so the results reflect those changes.\nUse it right after modifying notes when this read must see\nthem (e.g. right after a document mutation whose\neffect this read should reflect). Default\nFalse answers immediately from the current index — almost\nalways already up to date; inspect the response's\n``_meta.index_stale`` field to tell whether a write was still\nin flight. Bounded by a server timeout (default 60s); on\ntimeout it answers from the current index rather than waiting\nlonger."New value: +"Wait for recent index writes. On timeout, answer from the current index with _meta.index_stale=true. Default false."
    • Changedget_orphan_notes1 field changed
      • changedInput schema / properties / wait_for_pending_writes / description
        Previous value: -"When True, wait until your recent\ndocument mutations have been applied to the\nindex before answering, so the results reflect those changes.\nUse it right after modifying notes when this read must see\nthem (e.g. right after a document mutation whose\neffect this read should reflect). Default\nFalse answers immediately from the current index — almost\nalways already up to date; inspect the response's\n``_meta.index_stale`` field to tell whether a write was still\nin flight. Bounded by a server timeout (default 60s); on\ntimeout it answers from the current index rather than waiting\nlonger."New value: +"Wait for recent index writes. On timeout, answer from the current index with _meta.index_stale=true. Default false."
    • Changedget_outlinks1 field changed
      • changedInput schema / properties / wait_for_pending_writes / description
        Previous value: -"When True, wait until your recent\ndocument mutations have been applied to the\nindex before answering, so the results reflect those changes.\nUse it right after modifying notes when this read must see\nthem (e.g. right after a document mutation whose\neffect this read should reflect). Default\nFalse answers immediately from the current index — almost\nalways already up to date; inspect the response's\n``_meta.index_stale`` field to tell whether a write was still\nin flight. Bounded by a server timeout (default 60s); on\ntimeout it answers from the current index rather than waiting\nlonger."New value: +"Wait for recent index writes. On timeout, answer from the current index with _meta.index_stale=true. Default false."
    • Changedget_recent1 field changed
      • changedInput schema / properties / wait_for_pending_writes / description
        Previous value: -"When True, wait until your recent\ndocument mutations have been applied to the\nindex before answering, so the results reflect those changes.\nUse it right after modifying notes when this read must see\nthem (e.g. right after a document mutation whose\neffect this read should reflect). Default\nFalse answers immediately from the current index — almost\nalways already up to date; inspect the response's\n``_meta.index_stale`` field to tell whether a write was still\nin flight. Bounded by a server timeout (default 60s); on\ntimeout it answers from the current index rather than waiting\nlonger."New value: +"Wait for recent index writes. On timeout, answer from the current index with _meta.index_stale=true. Default false."
    • Changedget_similar1 field changed
      • changedInput schema / properties / wait_for_pending_writes / description
        Previous value: -"When True, wait until your recent\ndocument mutations have been applied to the\nindex before answering, so the results reflect those changes.\nUse it right after modifying notes when this read must see\nthem (e.g. right after a document mutation whose\neffect this read should reflect). Default\nFalse answers immediately from the current index — almost\nalways already up to date; inspect the response's\n``_meta.index_stale`` field to tell whether a write was still\nin flight. Bounded by a server timeout (default 60s); on\ntimeout it answers from the current index rather than waiting\nlonger."New value: +"Wait for recent index writes. On timeout, answer from the current index with _meta.index_stale=true. Default false."
    • Changedget_toc1 field changed
      • changedInput schema / properties / wait_for_pending_writes / description
        Previous value: -"When True, wait until recent\ndocument mutations are applied to the index\nbefore answering. Default False answers from the current\nindex; inspect '_meta.index_stale' to tell whether a write was\nstill in flight. Bounded by a server timeout (default 60s)."New value: +"Wait for recent index writes. On timeout, answer from the current index with _meta.index_stale=true. Default false."
    • Changedlist_documents2 fields changed
      • changedInput schema / properties / filters / description
        Previous value: -"Frontmatter equality filters, ANDed (e.g.\n{\"tags\": \"craft\"}); any frontmatter key works and list\nfields match by membership. On an OKF bundle three keys\ncarry OKF semantics: status (\"draft\"/\"stable\"/\"deprecated\";\n\"stable\" also matches notes without a status field), stale\n(\"true\"/\"false\" — stale_after passed), and trust_tier\n(\"unverified\"/\"machine-confirmed\"/\"human-reviewed\"). Use\n{\"status\": \"deprecated\"} or {\"stale\": \"true\"} to build\ntriage listings. Any filter excludes attachments (they\ncarry no frontmatter)."New value: +"Frontmatter equality filters, ANDed (e.g.\n{\"tags\": \"craft\"}); any frontmatter key works and list\nfields match by membership. On an OKF bundle three keys\ncarry OKF semantics: status (\"draft\"/\"stable\"/\"deprecated\";\n\"stable\" also matches notes without a status field), stale\n(\"true\"/\"false\" — stale_after reached), and trust_tier\n(\"unverified\"/\"machine-confirmed\"/\"human-reviewed\"). Use\n{\"status\": \"deprecated\"} or {\"stale\": \"true\"} to build\ntriage listings. Any filter excludes attachments (they\ncarry no frontmatter)."
      • changedInput schema / properties / wait_for_pending_writes / description
        Previous value: -"When True, wait until your recent\ndocument mutations have been applied to the\nindex before answering, so the results reflect those changes.\nUse it right after modifying notes when this read must see\nthem (e.g. right after a document mutation whose\neffect this read should reflect). Default\nFalse answers immediately from the current index — almost\nalways already up to date; inspect the response's\n``_meta.index_stale`` field to tell whether a write was still\nin flight. Bounded by a server timeout (default 60s); on\ntimeout it answers from the current index rather than waiting\nlonger."New value: +"Wait for recent index writes. On timeout, answer from the current index with _meta.index_stale=true. Default false."
    • Changedlist_folders1 field changed
      • changedInput schema / properties / wait_for_pending_writes / description
        Previous value: -"When True, wait until your recent\ndocument mutations have been applied to the\nindex before answering, so the results reflect those changes.\nUse it right after modifying notes when this read must see\nthem (e.g. right after a document mutation whose\neffect this read should reflect). Default\nFalse answers immediately from the current index — almost\nalways already up to date; inspect the response's\n``_meta.index_stale`` field to tell whether a write was still\nin flight. Bounded by a server timeout (default 60s); on\ntimeout it answers from the current index rather than waiting\nlonger."New value: +"Wait for recent index writes. On timeout, answer from the current index with _meta.index_stale=true. Default false."
    • Changedlist_tags1 field changed
      • changedInput schema / properties / wait_for_pending_writes / description
        Previous value: -"When True, wait until your recent\ndocument mutations have been applied to the\nindex before answering, so the results reflect those changes.\nUse it right after modifying notes when this read must see\nthem (e.g. right after a document mutation whose\neffect this read should reflect). Default\nFalse answers immediately from the current index — almost\nalways already up to date; inspect the response's\n``_meta.index_stale`` field to tell whether a write was still\nin flight. Bounded by a server timeout (default 60s); on\ntimeout it answers from the current index rather than waiting\nlonger."New value: +"Wait for recent index writes. On timeout, answer from the current index with _meta.index_stale=true. Default false."
    • Changedread1 field changed
      • addedInput schema / properties / revision
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Read the note as it stood at that commit instead of on\ndisk (git-backed vaults, .md only). A sha from 'get_history'\nor a write result's 'previous_revision'. Pass *path* as the\nnote is named today; renames are followed. Composes with\nsection=."
        +}
    • Changedsearch2 fields changed
      • changedInput schema / properties / filters / description
        Previous value: -"Filter by indexed frontmatter field values, e.g.\n{\"cluster\": \"craft\", \"tags\": \"pacing\"}. Only fields listed\nin indexed_frontmatter_fields (see 'stats') can be filtered.\nMultiple filters are ANDed. For list fields (e.g. tags),\nthis checks membership — {\"tags\": \"pacing\"} matches any\ndocument where \"pacing\" appears in the tags list. On an OKF\nbundle three keys carry OKF semantics: status (\"draft\"/\n\"stable\"/\"deprecated\"; \"stable\" also matches notes without\na status field), stale (\"true\"/\"false\" — stale_after\npassed), and trust_tier (\"unverified\"/\"machine-confirmed\"/\n\"human-reviewed\"); \"type\" filters normally, e.g.\n{\"type\": \"Playbook\", \"stale\": \"false\"}."New value: +"Filter by indexed frontmatter field values, e.g.\n{\"cluster\": \"craft\", \"tags\": \"pacing\"}. Only fields listed\nin indexed_frontmatter_fields (see 'stats') can be filtered.\nMultiple filters are ANDed. For list fields (e.g. tags),\nthis checks membership — {\"tags\": \"pacing\"} matches any\ndocument where \"pacing\" appears in the tags list. On an OKF\nbundle three keys carry OKF semantics: status (\"draft\"/\n\"stable\"/\"deprecated\"; \"stable\" also matches notes without\na status field), stale (\"true\"/\"false\" — stale_after\nreached), and trust_tier (\"unverified\"/\"machine-confirmed\"/\n\"human-reviewed\"); \"type\" filters normally, e.g.\n{\"type\": \"Playbook\", \"stale\": \"false\"}."
      • changedInput schema / properties / wait_for_pending_writes / description
        Previous value: -"When True, wait until your recent\ndocument mutations have been applied to the\nindex before answering, so the results reflect those changes.\nUse it right after modifying notes when this read must see\nthem (e.g. right after a document mutation whose\neffect this read should reflect). Default\nFalse answers immediately from the current index — almost\nalways already up to date; inspect the response's\n``_meta.index_stale`` field to tell whether a write was still\nin flight. Bounded by a server timeout (default 60s); on\ntimeout it answers from the current index rather than waiting\nlonger."New value: +"Wait for recent index writes. On timeout, answer from the current index with _meta.index_stale=true. Default false."
    • Changedstats1 field changed
      • changedInput schema / properties / wait_for_pending_writes / description
        Previous value: -"When True, wait until your recent\ndocument mutations have been applied to the\nindex before answering, so the results reflect those changes.\nUse it right after modifying notes when this read must see\nthem (e.g. right after a document mutation whose\neffect this read should reflect). Default\nFalse answers immediately from the current index — almost\nalways already up to date; inspect the response's\n``_meta.index_stale`` field to tell whether a write was still\nin flight. Bounded by a server timeout (default 60s); on\ntimeout it answers from the current index rather than waiting\nlonger."New value: +"Wait for recent index writes. On timeout, answer from the current index with _meta.index_stale=true. Default false."
    • Addedvault_context
    • Addedvault_graph_hubs
    • Addedvault_graph_neighborhood
    • Addedvault_list
    • Addedvault_read
    • Addedvault_search
    • Changedwrite1 field changed
      • changedInput schema / properties / if_match / description
        Previous value: -"Optional etag obtained from a previous 'read' call.\nWhen provided, the write only proceeds if the file has not\nbeen modified since that read (optimistic concurrency).\nOmit to write unconditionally."New value: +"Etag from 'read'; required by default to replace an\nexisting file. A stale etag refuses the write. Omit for new files."
  3. 1 tool updatev4.1.0
    • Changedsearch5 fields changed
      • addedInput schema / properties / mode / anyOf
        Added value: +[
        +  {
        +    "enum": [
        +      "keyword",
        +      "semantic",
        +      "hybrid"
        +    ],
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / mode / default
        Previous value: -"keyword"New value: +null
      • changedInput schema / properties / mode / description
        Previous value: -"\"keyword\" uses FTS5/BM25 for exact terms. \"semantic\" uses\nvector similarity (requires embeddings). \"hybrid\" fuses both\nvia reciprocal rank fusion — best quality when available."New value: +"\"keyword\" uses FTS5/BM25 for exact terms. \"semantic\" uses\nvector similarity (requires embeddings). \"hybrid\" fuses both\nvia reciprocal rank fusion — best quality when available.\nOmit it (the default) to follow the vault's configured\nDEFAULT_SEARCH_MODE, which ships as \"auto\": hybrid where\nembeddings exist, keyword otherwise. Any configured default\ndegrades to \"keyword\" when it needs embeddings the vault\nlacks; an explicit \"semantic\"/\"hybrid\" still errors when\nunconfigured."
      • removedInput schema / properties / mode / enum
        Removed value: -[
        -  "keyword",
        -  "semantic",
        -  "hybrid"
        -]
      • removedInput schema / properties / mode / type
        Removed value: -"string"
  4. 30 tool updatesv4.0.0
    • Addedappend
    • Addeddelete
    • Addededit
    • Addedfetch
    • Changedget_backlinks1 field changed
      • changedInput schema / properties / wait_for_pending_writes / description
        Previous value: -"When True, wait until your recent\nwrite/edit/delete/rename operations have been applied to the\nindex before answering, so the results reflect those changes.\nUse it right after modifying notes when this read must see\nthem (e.g. right after a write/edit/delete/rename whose\neffect this read should reflect). Default\nFalse answers immediately from the current index — almost\nalways already up to date; inspect the response's\n``_meta.index_stale`` field to tell whether a write was still\nin flight. Bounded by a server timeout (default 60s); on\ntimeout it answers from the current index rather than waiting\nlonger."New value: +"When True, wait until your recent\ndocument mutations have been applied to the\nindex before answering, so the results reflect those changes.\nUse it right after modifying notes when this read must see\nthem (e.g. right after a document mutation whose\neffect this read should reflect). Default\nFalse answers immediately from the current index — almost\nalways already up to date; inspect the response's\n``_meta.index_stale`` field to tell whether a write was still\nin flight. Bounded by a server timeout (default 60s); on\ntimeout it answers from the current index rather than waiting\nlonger."
    • Changedget_broken_links2 fields changed
      • changedInput schema / properties / folder / description
        Previous value: -"Optional folder filter. When provided, only checks\nlinks from documents in this folder (e.g. \"Journal\").\nWithout this, checks all documents."New value: +"Optional folder filter. When provided, only checks\nlinks from documents in this folder (e.g. \"Journal\").\nUse folder=\"\" for root-level (top-level) documents only.\nWithout this, checks all documents."
      • changedInput schema / properties / wait_for_pending_writes / description
        Previous value: -"When True, wait until your recent\nwrite/edit/delete/rename operations have been applied to the\nindex before answering, so the results reflect those changes.\nUse it right after modifying notes when this read must see\nthem (e.g. right after a write/edit/delete/rename whose\neffect this read should reflect). Default\nFalse answers immediately from the current index — almost\nalways already up to date; inspect the response's\n``_meta.index_stale`` field to tell whether a write was still\nin flight. Bounded by a server timeout (default 60s); on\ntimeout it answers from the current index rather than waiting\nlonger."New value: +"When True, wait until your recent\ndocument mutations have been applied to the\nindex before answering, so the results reflect those changes.\nUse it right after modifying notes when this read must see\nthem (e.g. right after a document mutation whose\neffect this read should reflect). Default\nFalse answers immediately from the current index — almost\nalways already up to date; inspect the response's\n``_meta.index_stale`` field to tell whether a write was still\nin flight. Bounded by a server timeout (default 60s); on\ntimeout it answers from the current index rather than waiting\nlonger."
    • Changedget_connection_path1 field changed
      • changedInput schema / properties / wait_for_pending_writes / description
        Previous value: -"When True, wait until your recent\nwrite/edit/delete/rename operations have been applied to the\nindex before answering, so the results reflect those changes.\nUse it right after modifying notes when this read must see\nthem (e.g. right after a write/edit/delete/rename whose\neffect this read should reflect). Default\nFalse answers immediately from the current index — almost\nalways already up to date; inspect the response's\n``_meta.index_stale`` field to tell whether a write was still\nin flight. Bounded by a server timeout (default 60s); on\ntimeout it answers from the current index rather than waiting\nlonger."New value: +"When True, wait until your recent\ndocument mutations have been applied to the\nindex before answering, so the results reflect those changes.\nUse it right after modifying notes when this read must see\nthem (e.g. right after a document mutation whose\neffect this read should reflect). Default\nFalse answers immediately from the current index — almost\nalways already up to date; inspect the response's\n``_meta.index_stale`` field to tell whether a write was still\nin flight. Bounded by a server timeout (default 60s); on\ntimeout it answers from the current index rather than waiting\nlonger."
    • Changedget_context1 field changed
      • changedInput schema / properties / wait_for_pending_writes / description
        Previous value: -"When True, wait until your recent\nwrite/edit/delete/rename operations have been applied to the\nindex before answering, so the results reflect those changes.\nUse it right after modifying notes when this read must see\nthem (e.g. right after a write/edit/delete/rename whose\neffect this read should reflect). Default\nFalse answers immediately from the current index — almost\nalways already up to date; inspect the response's\n``_meta.index_stale`` field to tell whether a write was still\nin flight. Bounded by a server timeout (default 60s); on\ntimeout it answers from the current index rather than waiting\nlonger."New value: +"When True, wait until your recent\ndocument mutations have been applied to the\nindex before answering, so the results reflect those changes.\nUse it right after modifying notes when this read must see\nthem (e.g. right after a document mutation whose\neffect this read should reflect). Default\nFalse answers immediately from the current index — almost\nalways already up to date; inspect the response's\n``_meta.index_stale`` field to tell whether a write was still\nin flight. Bounded by a server timeout (default 60s); on\ntimeout it answers from the current index rather than waiting\nlonger."
    • Addedget_conventions
    • Changedget_history1 field changed
      • changedInput schema / properties / path / description
        Previous value: -"Vault-relative path of the note or attachment to filter on\n(e.g. \"notes/alpha.md\" or \"assets/diagram.png\"). May be a\n`.md` note or a configured attachment extension (png, pdf,\nsvg, …). Omit (or pass null) for vault-wide commit history."New value: +"Vault-relative path to filter on. A `.md` note or a\nconfigured attachment extension (png, pdf, svg, …) scopes to\nthat single file (e.g. \"notes/alpha.md\",\n\"assets/diagram.png\"); an existing folder scopes to its\nsubtree (e.g. \"guides\" returns commits touching guides/**).\nOmit (or pass null) for vault-wide commit history."
    • Addedget_job_result
    • Changedget_most_linked1 field changed
      • changedInput schema / properties / wait_for_pending_writes / description
        Previous value: -"When True, wait until your recent\nwrite/edit/delete/rename operations have been applied to the\nindex before answering, so the results reflect those changes.\nUse it right after modifying notes when this read must see\nthem (e.g. right after a write/edit/delete/rename whose\neffect this read should reflect). Default\nFalse answers immediately from the current index — almost\nalways already up to date; inspect the response's\n``_meta.index_stale`` field to tell whether a write was still\nin flight. Bounded by a server timeout (default 60s); on\ntimeout it answers from the current index rather than waiting\nlonger."New value: +"When True, wait until your recent\ndocument mutations have been applied to the\nindex before answering, so the results reflect those changes.\nUse it right after modifying notes when this read must see\nthem (e.g. right after a document mutation whose\neffect this read should reflect). Default\nFalse answers immediately from the current index — almost\nalways already up to date; inspect the response's\n``_meta.index_stale`` field to tell whether a write was still\nin flight. Bounded by a server timeout (default 60s); on\ntimeout it answers from the current index rather than waiting\nlonger."
    • Changedget_orphan_notes1 field changed
      • changedInput schema / properties / wait_for_pending_writes / description
        Previous value: -"When True, wait until your recent\nwrite/edit/delete/rename operations have been applied to the\nindex before answering, so the results reflect those changes.\nUse it right after modifying notes when this read must see\nthem (e.g. right after a write/edit/delete/rename whose\neffect this read should reflect). Default\nFalse answers immediately from the current index — almost\nalways already up to date; inspect the response's\n``_meta.index_stale`` field to tell whether a write was still\nin flight. Bounded by a server timeout (default 60s); on\ntimeout it answers from the current index rather than waiting\nlonger."New value: +"When True, wait until your recent\ndocument mutations have been applied to the\nindex before answering, so the results reflect those changes.\nUse it right after modifying notes when this read must see\nthem (e.g. right after a document mutation whose\neffect this read should reflect). Default\nFalse answers immediately from the current index — almost\nalways already up to date; inspect the response's\n``_meta.index_stale`` field to tell whether a write was still\nin flight. Bounded by a server timeout (default 60s); on\ntimeout it answers from the current index rather than waiting\nlonger."
    • Changedget_outlinks1 field changed
      • changedInput schema / properties / wait_for_pending_writes / description
        Previous value: -"When True, wait until your recent\nwrite/edit/delete/rename operations have been applied to the\nindex before answering, so the results reflect those changes.\nUse it right after modifying notes when this read must see\nthem (e.g. right after a write/edit/delete/rename whose\neffect this read should reflect). Default\nFalse answers immediately from the current index — almost\nalways already up to date; inspect the response's\n``_meta.index_stale`` field to tell whether a write was still\nin flight. Bounded by a server timeout (default 60s); on\ntimeout it answers from the current index rather than waiting\nlonger."New value: +"When True, wait until your recent\ndocument mutations have been applied to the\nindex before answering, so the results reflect those changes.\nUse it right after modifying notes when this read must see\nthem (e.g. right after a document mutation whose\neffect this read should reflect). Default\nFalse answers immediately from the current index — almost\nalways already up to date; inspect the response's\n``_meta.index_stale`` field to tell whether a write was still\nin flight. Bounded by a server timeout (default 60s); on\ntimeout it answers from the current index rather than waiting\nlonger."
    • Changedget_recent2 fields changed
      • changedInput schema / properties / folder / description
        Previous value: -"Optional folder filter. When provided, only returns\nnotes from this folder (e.g. \"Journal\")."New value: +"Optional folder filter. When provided, only returns\nnotes from this folder (e.g. \"Journal\").\nUse folder=\"\" for root-level (top-level) documents only."
      • changedInput schema / properties / wait_for_pending_writes / description
        Previous value: -"When True, wait until your recent\nwrite/edit/delete/rename operations have been applied to the\nindex before answering, so the results reflect those changes.\nUse it right after modifying notes when this read must see\nthem (e.g. right after a write/edit/delete/rename whose\neffect this read should reflect). Default\nFalse answers immediately from the current index — almost\nalways already up to date; inspect the response's\n``_meta.index_stale`` field to tell whether a write was still\nin flight. Bounded by a server timeout (default 60s); on\ntimeout it answers from the current index rather than waiting\nlonger."New value: +"When True, wait until your recent\ndocument mutations have been applied to the\nindex before answering, so the results reflect those changes.\nUse it right after modifying notes when this read must see\nthem (e.g. right after a document mutation whose\neffect this read should reflect). Default\nFalse answers immediately from the current index — almost\nalways already up to date; inspect the response's\n``_meta.index_stale`` field to tell whether a write was still\nin flight. Bounded by a server timeout (default 60s); on\ntimeout it answers from the current index rather than waiting\nlonger."
    • Changedget_similar3 fields changed
      • addedInput schema / properties / filters
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Frontmatter equality filters, ANDed — e.g.\n{\"type\": \"resource\"}. Matched post-hoc against each\ncandidate's full frontmatter, so any frontmatter key works\n(unlike keyword 'search' filters, which are limited to\nindexed_frontmatter_fields). List-valued fields match if\nthe value is among them. On an OKF bundle three keys carry\nOKF semantics, exactly as in 'search': status (\"stable\"\nalso matches notes without a status field), stale\n(\"true\"/\"false\"), and trust_tier."
        +}
      • addedInput schema / properties / folder
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Restrict results to this folder (exact match or\nsub-folder prefix), e.g. \"3-Resources\". Useful to scope\nlink candidates to one part of the vault.\nUse folder=\"\" for root-level (top-level) documents only."
        +}
      • changedInput schema / properties / wait_for_pending_writes / description
        Previous value: -"When True, wait until your recent\nwrite/edit/delete/rename operations have been applied to the\nindex before answering, so the results reflect those changes.\nUse it right after modifying notes when this read must see\nthem (e.g. right after a write/edit/delete/rename whose\neffect this read should reflect). Default\nFalse answers immediately from the current index — almost\nalways already up to date; inspect the response's\n``_meta.index_stale`` field to tell whether a write was still\nin flight. Bounded by a server timeout (default 60s); on\ntimeout it answers from the current index rather than waiting\nlonger."New value: +"When True, wait until your recent\ndocument mutations have been applied to the\nindex before answering, so the results reflect those changes.\nUse it right after modifying notes when this read must see\nthem (e.g. right after a document mutation whose\neffect this read should reflect). Default\nFalse answers immediately from the current index — almost\nalways already up to date; inspect the response's\n``_meta.index_stale`` field to tell whether a write was still\nin flight. Bounded by a server timeout (default 60s); on\ntimeout it answers from the current index rather than waiting\nlonger."
    • Changedget_toc1 field changed
      • changedInput schema / properties / wait_for_pending_writes / description
        Previous value: -"When True, wait until recent\nwrite/edit/delete/rename operations are applied to the index\nbefore answering. Default False answers from the current\nindex; inspect '_meta.index_stale' to tell whether a write was\nstill in flight. Bounded by a server timeout (default 60s)."New value: +"When True, wait until recent\ndocument mutations are applied to the index\nbefore answering. Default False answers from the current\nindex; inspect '_meta.index_stale' to tell whether a write was\nstill in flight. Bounded by a server timeout (default 60s)."
    • Changedlist_documents2 fields changed
      • addedInput schema / properties / filters
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Frontmatter equality filters, ANDed (e.g.\n{\"tags\": \"craft\"}); any frontmatter key works and list\nfields match by membership. On an OKF bundle three keys\ncarry OKF semantics: status (\"draft\"/\"stable\"/\"deprecated\";\n\"stable\" also matches notes without a status field), stale\n(\"true\"/\"false\" — stale_after passed), and trust_tier\n(\"unverified\"/\"machine-confirmed\"/\"human-reviewed\"). Use\n{\"status\": \"deprecated\"} or {\"stale\": \"true\"} to build\ntriage listings. Any filter excludes attachments (they\ncarry no frontmatter)."
        +}
      • changedInput schema / properties / wait_for_pending_writes / description
        Previous value: -"When True, wait until your recent\nwrite/edit/delete/rename operations have been applied to the\nindex before answering, so the results reflect those changes.\nUse it right after modifying notes when this read must see\nthem (e.g. right after a write/edit/delete/rename whose\neffect this read should reflect). Default\nFalse answers immediately from the current index — almost\nalways already up to date; inspect the response's\n``_meta.index_stale`` field to tell whether a write was still\nin flight. Bounded by a server timeout (default 60s); on\ntimeout it answers from the current index rather than waiting\nlonger."New value: +"When True, wait until your recent\ndocument mutations have been applied to the\nindex before answering, so the results reflect those changes.\nUse it right after modifying notes when this read must see\nthem (e.g. right after a document mutation whose\neffect this read should reflect). Default\nFalse answers immediately from the current index — almost\nalways already up to date; inspect the response's\n``_meta.index_stale`` field to tell whether a write was still\nin flight. Bounded by a server timeout (default 60s); on\ntimeout it answers from the current index rather than waiting\nlonger."
    • Changedlist_folders1 field changed
      • changedInput schema / properties / wait_for_pending_writes / description
        Previous value: -"When True, wait until your recent\nwrite/edit/delete/rename operations have been applied to the\nindex before answering, so the results reflect those changes.\nUse it right after modifying notes when this read must see\nthem (e.g. right after a write/edit/delete/rename whose\neffect this read should reflect). Default\nFalse answers immediately from the current index — almost\nalways already up to date; inspect the response's\n``_meta.index_stale`` field to tell whether a write was still\nin flight. Bounded by a server timeout (default 60s); on\ntimeout it answers from the current index rather than waiting\nlonger."New value: +"When True, wait until your recent\ndocument mutations have been applied to the\nindex before answering, so the results reflect those changes.\nUse it right after modifying notes when this read must see\nthem (e.g. right after a document mutation whose\neffect this read should reflect). Default\nFalse answers immediately from the current index — almost\nalways already up to date; inspect the response's\n``_meta.index_stale`` field to tell whether a write was still\nin flight. Bounded by a server timeout (default 60s); on\ntimeout it answers from the current index rather than waiting\nlonger."
    • Changedlist_tags1 field changed
      • changedInput schema / properties / wait_for_pending_writes / description
        Previous value: -"When True, wait until your recent\nwrite/edit/delete/rename operations have been applied to the\nindex before answering, so the results reflect those changes.\nUse it right after modifying notes when this read must see\nthem (e.g. right after a write/edit/delete/rename whose\neffect this read should reflect). Default\nFalse answers immediately from the current index — almost\nalways already up to date; inspect the response's\n``_meta.index_stale`` field to tell whether a write was still\nin flight. Bounded by a server timeout (default 60s); on\ntimeout it answers from the current index rather than waiting\nlonger."New value: +"When True, wait until your recent\ndocument mutations have been applied to the\nindex before answering, so the results reflect those changes.\nUse it right after modifying notes when this read must see\nthem (e.g. right after a document mutation whose\neffect this read should reflect). Default\nFalse answers immediately from the current index — almost\nalways already up to date; inspect the response's\n``_meta.index_stale`` field to tell whether a write was still\nin flight. Bounded by a server timeout (default 60s); on\ntimeout it answers from the current index rather than waiting\nlonger."
    • Addedmove_folder
    • Addedokf_convert_links
    • Addedokf_generate_index
    • Addedokf_seed_log
    • Addedokf_validate
    • Changedreindex1 field changed
      • addedInput schema / properties / force
        Added value: +{
        +  "default": false,
        +  "description": "When True, drop every indexed document and re-parse the\nwhole vault instead of applying the hash-detected delta.\nThe index is not queryable while the rebuild runs, and the\ncost scales with the vault rather than the drift, so prefer\nthe default.",
        +  "type": "boolean"
        +}
    • Addedrename
    • Changedsearch2 fields changed
      • changedInput schema / properties / filters / description
        Previous value: -"Filter by indexed frontmatter field values, e.g.\n{\"cluster\": \"craft\", \"tags\": \"pacing\"}. Only fields listed\nin indexed_frontmatter_fields (see 'stats') can be filtered.\nMultiple filters are ANDed. For list fields (e.g. tags),\nthis checks membership — {\"tags\": \"pacing\"} matches any\ndocument where \"pacing\" appears in the tags list."New value: +"Filter by indexed frontmatter field values, e.g.\n{\"cluster\": \"craft\", \"tags\": \"pacing\"}. Only fields listed\nin indexed_frontmatter_fields (see 'stats') can be filtered.\nMultiple filters are ANDed. For list fields (e.g. tags),\nthis checks membership — {\"tags\": \"pacing\"} matches any\ndocument where \"pacing\" appears in the tags list. On an OKF\nbundle three keys carry OKF semantics: status (\"draft\"/\n\"stable\"/\"deprecated\"; \"stable\" also matches notes without\na status field), stale (\"true\"/\"false\" — stale_after\npassed), and trust_tier (\"unverified\"/\"machine-confirmed\"/\n\"human-reviewed\"); \"type\" filters normally, e.g.\n{\"type\": \"Playbook\", \"stale\": \"false\"}."
      • changedInput schema / properties / wait_for_pending_writes / description
        Previous value: -"When True, wait until your recent\nwrite/edit/delete/rename operations have been applied to the\nindex before answering, so the results reflect those changes.\nUse it right after modifying notes when this read must see\nthem (e.g. right after a write/edit/delete/rename whose\neffect this read should reflect). Default\nFalse answers immediately from the current index — almost\nalways already up to date; inspect the response's\n``_meta.index_stale`` field to tell whether a write was still\nin flight. Bounded by a server timeout (default 60s); on\ntimeout it answers from the current index rather than waiting\nlonger."New value: +"When True, wait until your recent\ndocument mutations have been applied to the\nindex before answering, so the results reflect those changes.\nUse it right after modifying notes when this read must see\nthem (e.g. right after a document mutation whose\neffect this read should reflect). Default\nFalse answers immediately from the current index — almost\nalways already up to date; inspect the response's\n``_meta.index_stale`` field to tell whether a write was still\nin flight. Bounded by a server timeout (default 60s); on\ntimeout it answers from the current index rather than waiting\nlonger."
    • Changedstats1 field changed
      • changedInput schema / properties / wait_for_pending_writes / description
        Previous value: -"When True, wait until your recent\nwrite/edit/delete/rename operations have been applied to the\nindex before answering, so the results reflect those changes.\nUse it right after modifying notes when this read must see\nthem (e.g. right after a write/edit/delete/rename whose\neffect this read should reflect). Default\nFalse answers immediately from the current index — almost\nalways already up to date; inspect the response's\n``_meta.index_stale`` field to tell whether a write was still\nin flight. Bounded by a server timeout (default 60s); on\ntimeout it answers from the current index rather than waiting\nlonger."New value: +"When True, wait until your recent\ndocument mutations have been applied to the\nindex before answering, so the results reflect those changes.\nUse it right after modifying notes when this read must see\nthem (e.g. right after a document mutation whose\neffect this read should reflect). Default\nFalse answers immediately from the current index — almost\nalways already up to date; inspect the response's\n``_meta.index_stale`` field to tell whether a write was still\nin flight. Bounded by a server timeout (default 60s); on\ntimeout it answers from the current index rather than waiting\nlonger."
    • Addedwrite
  5. 25 tool updatesv3.1.0
    • First observedbrowse_vault
    • First observedbuild_embeddings
    • First observedembeddings_status
    • First observedget_backlinks
    • First observedget_broken_links
    • First observedget_connection_path
    • First observedget_context
    • First observedget_diff
    • First observedget_history
    • First observedget_index_status
    • First observedget_most_linked
    • First observedget_orphan_notes
    • First observedget_outlinks
    • First observedget_recent
    • First observedget_server_info
    • First observedget_similar
    • First observedget_toc
    • First observedlist_documents
    • First observedlist_folders
    • First observedlist_tags
    • First observedread
    • First observedreindex
    • First observedsearch
    • First observedshow_context
    • First observedstats

TDQS

B3.4/5.0

Scored across 48 tools

Disambiguation3/5

There is real overlap in the note-querying family: search, query_documents, search_paths, list_documents, count_documents and aggregate_documents all answer 'find notes', and only careful reading of the descriptions separates them. Similarly get_context is explicitly a superset of get_backlinks/get_outlinks/get_similar, and the app-only vault_* tools duplicate read/search/list_documents for the SPA. The descriptions do a lot of work to disambiguate ('use X instead when...'), which keeps it from scoring lower.

Naming Consistency3/5

Most names are snake_case, but the verb conventions are mixed: bare verbs (read, search, write, edit, append, delete, fetch, stats, reindex), get_/list_ prefixed tools, plus okf_*, vault_* and embeddings_status as noun-style names. The okf_ and vault_ prefixes are meaningful groupings, so it stays readable, but there is no single predictable pattern.

Tool Count2/5

48 tools (roughly 41 LLM-visible once the app-only vault_* and context-card tools are excluded) is heavy for a markdown vault server, and several of them are narrow variants of one another (count_documents, aggregate_documents, search_paths, query_documents). The surface feels like it accumulated features rather than being scoped deliberately.

Completeness4/5

Coverage is genuinely broad: CRUD (read/write/edit/append/rename/delete/move_folder), link analysis (backlinks, outlinks, broken links, orphans, hubs, connection paths), git history/diff, indexing, embeddings, OKF tooling and fetch. Minor gaps remain — no folder deletion, no dedicated frontmatter-edit tool, and attachment discovery is only implicit — but nothing that blocks typical workflows.

Maintenance

ActivityActive
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    MCP server for structured markdown knowledge vaults that provides validation, FTS5 search, and wikilink cross-references. Enables AI agents to prime context and search across vaults using two MCP tools and template resources.
    8
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Local MCP server for querying and maintaining a Markdown vault. Provides full-text search, backlinks, note retrieval, and optional confined write tools, without sending the whole vault to the client context.
    22
    73 PyPI
    1
    Apache 2.0