Skip to main content
Glama
russellsch

some-vault-some-mcp

by russellsch

some-vault-some-mcp

MCP server that gives AI models read/write access to Obsidian vaults with semantic search, link graph analysis, canvas manipulation, and incremental indexing.

Built on FastMCP + LanceDB. Embeds notes locally with fastembed (nomic-embed-text-v1.5-Q, 768 dims) by default — no server required. Optionally supports Ollama or OpenAI embeddings. Watches the vault filesystem and re-indexes on change.

Warning: This is a hot vibe coded mess, user beware

What it does

  • Hybrid search - vector similarity (70%) + full-text keyword (30%), with overlap boost

  • Semantic search - pure embedding-based retrieval

  • Exact search - literal substring matching, optional case sensitivity and regex

  • Note CRUD - create, read, append, prepend, move, delete (soft delete to .trash by default)

  • Frontmatter parsing - YAML extraction, tag collection (frontmatter + inline #hashtags), property filtering

  • Wikilink graph - backlinks, outlinks, orphan detection, broken link detection, BFS neighbor traversal (depth 1-5)

  • Canvas CRUD - create, read, add/update/remove nodes and edges, grid auto-layout, dangling edge cleanup

  • Daily notes - Moment.js-style date formatting, template support, reads Obsidian's daily-notes config

  • Incremental indexing - filesystem watcher with 2s debounce and SHA-256 content change detection

  • Atomic writes - temp file + POSIX rename, per-path asyncio locks

  • Tool overrides - rename or disable any tool via YAML config (per-agent customization)

Related MCP server: Grove

Requirements

  • Python 3.11+

  • uv (for uvx)

Quick start

Add this to your MCP client config (Cursor, Windsurf, Claude Code, etc.):

{
  "mcpServers": {
    "obsidian-vault": {
      "command": "uvx",
      "args": ["some-vault-some-mcp", "serve", "--transport", "stdio"],
      "env": {
        "VAULT_PATH": "/path/to/your/obsidian/vault"
      }
    }
  }
}

That's it. uvx installs the package from PyPI on first run and keeps it cached.

For alternative embedding providers, add --from with extras:

{
  "command": "uvx",
  "args": ["--from", "some-vault-some-mcp[ollama]", "some-vault-some-mcp", "serve", "--transport", "stdio"],
  "env": {
    "VAULT_PATH": "/path/to/your/obsidian/vault"
  }
}

Replace [ollama] with [openai] or [gpu] as needed.

SSE mode

If running the server separately (Docker, remote, etc.), use the SSE URL instead:

{
  "mcpServers": {
    "obsidian-vault": {
      "url": "http://localhost:3789/sse"
    }
  }
}

Running directly

VAULT_PATH=/path/to/vault uvx some-vault-some-mcp serve

First run builds a staged index generation and publishes it only after schema, vector, and full-text validation. Subsequent starts scan content hashes and publish incremental changes through staged generations too, so the last valid generation remains available on failure. Readers hold a cross-process shared lease while materializing results; publication and live cleanup take the exclusive side, so completed databases retain only the active and previous generations without dropping an in-flight reader's table.

CLI flags

some-vault-some-mcp serve [--transport sse|stdio] [--host 127.0.0.1] [--port 3789] [--reindex-force]

--reindex-force builds and validates a replacement generation without dropping the active index first. It is required when embedding dimensions change. The server also rebuilds automatically (one time) when it detects an index written by an older storage format.

CLI flags override env vars.

Environment variables

Variable

Default

Notes

VAULT_PATH

(required)

Absolute path to Obsidian vault

LANCE_DB_PATH

./data/vault.lance

Vector index location. Use a trusted absolute path outside the vault and workspace; unsafe locations produce a warning.

MCP_TRANSPORT

sse

sse or stdio

MCP_HOST

127.0.0.1

SSE bind address. Defaults to loopback — set 0.0.0.0 to expose on the network (the Docker image does this explicitly). Binding non-loopback without VAULT_API_KEY logs a warning.

MCP_PORT

3789

SSE port

EMBEDDING_PROVIDER

fastembed

fastembed, ollama, openai, or mock

FASTEMBED_MODEL

nomic-ai/nomic-embed-text-v1.5-Q

Any fastembed-supported model. On Apple Silicon, auto-detects and uses the non-quantized variant (v1.5 instead of v1.5-Q) since the quantized ONNX ops are x86-optimized

FASTEMBED_DIMENSIONS

(auto-detected)

Override dimension auto-detection

OLLAMA_URL

http://localhost:11434

Ollama API endpoint (requires --extra ollama)

OPENAI_API_KEY

Required if provider is openai (requires --extra openai)

VAULT_API_KEY

Enables Bearer token auth on SSE transport (constant-time compare; covers /sse and websocket connections)

VAULT_ALLOW_UNAUTH_SSE

false

true exempts the /sse GET from auth — only for clients that cannot send an Authorization header on the SSE stream (Cursor/Claude Code/Claude Desktop all can, so leave false)

VAULT_SOFT_DELETE_IS_PERMANENT

false

true makes delete_note do hard deletes

some_vault_some_mcp_OVERRIDES

Path to YAML override file

Docker

docker build -t some-vault-some-mcp .

docker run -p 3789:3789 \
  -v /path/to/vault:/opt/vault:ro \
  -v /data:/opt/data \
  some-vault-some-mcp

Runs as non-root user (vault:vault, UID 1000). Index data persists in /opt/data. Vault mounted read-only. Container is self-contained — fastembed runs in-process, no Ollama sidecar needed.

To use Ollama instead: docker run ... -e EMBEDDING_PROVIDER=ollama -e OLLAMA_URL=http://ollama:11434 some-vault-some-mcp

Tools (27)

Find notes by text, meaning, or exact string.

Param

Type

Default

Notes

query

string

(required)

Search query text

mode

string

"hybrid"

hybrid, semantic, or exact

top_k

int

10

Max results to return

tags

string[]

null

Pre-filter by tags

folder

string

null

Pre-filter by folder path prefix

case_sensitive

bool

false

Exact mode only - match case

Read

get_note

Read a single note with parsed frontmatter and tags.

Param

Type

Default

Notes

path

string

(required)

Vault-relative path to the note. Extension-agnostic — todo and todo.md both resolve to todo.md. A bare basename resolves Obsidian-style to a matching note anywhere in the vault.

list_notes

Enumerate vault notes with optional metadata filters. Index-backed fields (tags, projects, status, area) query LanceDB when available. Frontmatter property filtering scans files directly.

Param

Type

Default

Notes

folder

string

null

Filter by folder path prefix

tags

string[]

null

Filter by tags (index-backed)

projects

string[]

null

Filter by projects (index-backed)

status

string

null

Filter by status field (index-backed)

area

string

null

Filter by area field (index-backed)

frontmatter_property

string

null

Arbitrary frontmatter key to filter on

frontmatter_value

string

null

Value to match for frontmatter_property (case-insensitive)

include_content

bool

false

Include note content in results

limit

int

50

Max results to return

Write

create_note

Create a new note. Fails if it already exists.

Param

Type

Default

Notes

path

string

(required)

Vault-relative path for the new note

content

string

(required)

Note body text

frontmatter

string

null

JSON string of frontmatter fields, e.g. '{"title":"My Note","tags":["idea"]}'

append_to_note

Append text to the end of an existing note.

Param

Type

Default

Notes

path

string

(required)

Vault-relative path

content

string

(required)

Text to append

prepend_to_note

Insert text after frontmatter, before the note body.

Param

Type

Default

Notes

path

string

(required)

Vault-relative path

content

string

(required)

Text to prepend

update_frontmatter

Merge key-value pairs into YAML frontmatter. Unlisted keys preserved.

Param

Type

Default

Notes

path

string

(required)

Vault-relative path

properties

string

(required)

JSON string of key-value pairs, e.g. '{"status":"done","tags":["review"]}'

move_note

Move or rename a note. Rewrites wikilinks vault-wide by default. Moves are no-replace operations: an existing distinct destination is never overwritten. Filesystems without the platform's native exclusive-rename capability are rejected rather than falling back to an overwriting rename. A separately named hard-link destination also fails closed because it cannot be removed safely under a concurrent destination replacement.

Param

Type

Default

Notes

old_path

string

(required)

Current vault-relative path

new_path

string

(required)

Destination vault-relative path

update_links

bool

true

Rewrite wikilinks in all referencing notes

delete_note

Delete a note. Moves to .trash by default; use permanent for hard delete.

Param

Type

Default

Notes

path

string

(required)

Vault-relative path

permanent

bool

false

true for hard delete, false for soft delete to .trash

Daily notes

get_daily_note

Read today's or a specific date's daily note. Uses Obsidian's daily-notes config for folder and date format. Returns a text message (not an error) if no note exists for the requested date.

Param

Type

Default

Notes

date

string

null

Date string (e.g. "2024-03-15"). Omit for today

create_daily_note

Create a daily note for today or a given date. Fails if one exists. Supports {{date}} placeholder in templates.

Param

Type

Default

Notes

date

string

null

Date string. Omit for today

content

string

null

Note body text

template_path

string

null

Vault-relative path to a template note

Tags

get_tags

List all unique tags in the vault with per-note usage counts.

Param

Type

Default

Notes

sort_by

string

"count"

count (descending) or name (alphabetical)

Find notes that link to a given note.

Param

Type

Default

Notes

path

string

(required)

Vault-relative path of the target note

List all outgoing wikilinks from a note. Shows valid, broken, and embed links separately.

Param

Type

Default

Notes

path

string

(required)

Vault-relative path

find_orphans

Find disconnected notes - no inbound links, no outbound links, or both.

Param

Type

Default

Notes

include_outlinks_check

bool

true

Also report notes with no outgoing links

max_results

int

200

Cap per category

Find wikilinks pointing at notes that don't exist.

Param

Type

Default

Notes

folder

string

null

Limit scan to a folder

max_results

int

200

Max broken links to return

get_graph_neighbors

Walk the link graph outward from a note via BFS.

Param

Type

Default

Notes

path

string

(required)

Starting note path

depth

int

1

BFS depth, 1-5

direction

string

"both"

inbound, outbound, or both

Canvas

list_canvases

List all .canvas files in the vault.

Param

Type

Default

Notes

folder

string

null

Filter by folder path prefix

read_canvas

Read canvas structure (nodes + edges).

Param

Type

Default

Notes

path

string

(required)

Vault-relative path to .canvas file

create_canvas

Create a new .canvas file with optional initial nodes/edges. Fails if it already exists.

Param

Type

Default

Notes

path

string

(required)

Vault-relative path for the new canvas

nodes

string

null

JSON array of node objects, e.g. '[{"type":"text","text":"Hello"}]'

edges

string

null

JSON array of edge objects

add_canvas_node

Add a node (text/file/link/group) to a canvas. Position auto-computed via grid layout if omitted.

Param

Type

Default

Notes

canvas_path

string

(required)

Path to the canvas

node_type

string

(required)

text, file, link, or group

text

string

null

Text content (for text nodes)

file

string

null

Vault-relative file path (for file nodes). For markdown notes the .md extension is optional and a bare name resolves Obsidian-style; the full path is stored. Attachments (images/PDFs) must be given with their extension.

url

string

null

URL (for link nodes)

label

string

null

Display label

x

int

null

X position. Auto-placed if omitted

y

int

null

Y position. Auto-placed if omitted

width

int

250

Node width in pixels

height

int

60

Node height in pixels

color

string

null

Obsidian preset "1"-"6" (red, orange, yellow, green, cyan, purple) or hex "#FF0000"

update_canvas_node

Update any property of an existing canvas node by ID. Only provided fields are changed.

Param

Type

Default

Notes

canvas_path

string

(required)

Path to the canvas

node_id

string

(required)

ID of the node to update

x

int

null

New X position

y

int

null

New Y position

width

int

null

New width

height

int

null

New height

color

string

null

Preset "1"-"6" or hex "#FF0000"

text

string

null

New text content

file

string

null

New file reference

url

string

null

New URL

label

string

null

New label

remove_canvas_nodes

Remove nodes by ID. Auto-removes dangling edges.

Param

Type

Default

Notes

canvas_path

string

(required)

Path to the canvas

node_ids

string

(required)

JSON array of node ID strings, e.g. '["id1","id2"]'

add_canvas_edge

Add an edge between two canvas nodes with full property support.

Param

Type

Default

Notes

canvas_path

string

(required)

Path to the canvas

from_node

string

(required)

Source node ID

to_node

string

(required)

Target node ID

from_side

string

null

Anchor side on source: top, bottom, left, right

to_side

string

null

Anchor side on target

from_end

string

null

End style on source side (e.g. arrow, none)

to_end

string

null

End style on target side

color

string

null

Preset "1"-"6" or hex "#FF0000"

label

string

null

Edge label text

update_canvas_edge

Update properties of an existing canvas edge by ID. Only provided fields are changed.

Param

Type

Default

Notes

canvas_path

string

(required)

Path to the canvas

edge_id

string

(required)

ID of the edge to update

from_side

string

null

New source anchor side

to_side

string

null

New target anchor side

from_end

string

null

New source end style

to_end

string

null

New target end style

color

string

null

Preset "1"-"6" or hex "#FF0000"

label

string

null

New label

remove_canvas_edges

Remove edges from a canvas by ID.

Param

Type

Default

Notes

canvas_path

string

(required)

Path to the canvas

edge_ids

string

(required)

JSON array of edge ID strings

Index management

vault_index_status

Check search index health and statistics, including rebuild progress, degraded fallback serving, pending changes, and the last rebuild error. No arguments.

vault_reindex

Reindex one note incrementally, or build and atomically publish a new generation when the path is omitted.

Param

Type

Default

Notes

path

string

null

Vault-relative path to reindex a single note. Omit for full vault

MCP resources

  • obsidian://note/{path} - read a note by path

  • obsidian://tags - all tags

  • obsidian://daily - today's daily note

Tool name overrides

When you need to change the tool names and descriotions, a YAML file can be used. Create a YAML file, and set some_vault_some_mcp_OVERRIDES to its path:

tools:
  search:
    name: "vault_search"
    description: "Custom description for this agent"
  get_note:
    name: "read_note"
disabled:
  - get_tags
  - find_orphans

Overrides apply at registration time. Useful for per-agent tool namespacing or disabling tools an agent shouldn't use if your agent doesn't support tool disabling.

How search works

Hybrid (default) - runs both semantic and FTS (LanceDB full-text search, BM25-style) at 2x requested top_k, normalizes scores, combines with semantic * 0.7 + FTS * 0.3. Results appearing in both get a 1.2x boost. Returns top_k from merged set.

Semantic - embeds the query, runs vector similarity search against LanceDB.

Exact - scans raw vault files for literal substring matches. Not index-backed. Optional case sensitivity.

All search modes accept tag and folder pre-filters. Tags use SQL LIKE against comma-separated tag strings in the index. Folders use path prefix matching.

Chunking

Splits markdown by heading hierarchy first, then by paragraph for oversized sections. Tracks heading breadcrumbs through the split - a chunk under # A / ## B / ### C gets heading field "A > B > C". Metadata header prepended to embedding text: [Title: X | Section: A > B | Tags: foo, bar].

Matches Obsidian's behavior in 4 steps:

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

  2. Path-suffix match (if link contains /)

  3. Basename match with proximity tie-break (deepest shared path prefix with source)

  4. Alias match (frontmatter aliases)

First matching step wins.

Security boundaries

  • Tool paths are validated against the vault root and reject ../, null bytes, and static symlink escapes. These pathname checks do not close the concurrent symlink-swap race described as SR-04 in SECURITY_REVIEW.md.

  • .obsidian, .git, .trash denied at the tool boundary and excluded from indexing

  • Any folder whose name starts with . (for example .claude/) is skipped by the indexer and by note listings. Add more folder names with VAULT_EXCLUDED_DIRS=external,archive or with an excluded_dirs: [external, archive] list in the override file. These folders are hidden, not denied: search, listings, backlinks and link rewrites skip them, but a tool call with the exact path still works. resolve_vault_path still denies only .obsidian, .git and .trash.

  • Optional Bearer token auth on SSE transport

  • Docker container runs as non-root

  • Frontmatter normalization rejects recursive aliases, excessive depth, excessive node or scalar-payload expansion, invalid timestamps, non-string mapping keys, and unsupported scalar types. Invalid metadata is discarded while the note body remains indexable.

Index recovery

Full rebuilds retain the previous valid generation. If a newly published index must be rolled back, stop every server process using that LANCE_DB_PATH, back up the complete index directory, then swap the active and previous table names in _index_manifest.json. Write the edited JSON to a sibling temporary file and atomically replace the manifest; do not edit it in place. Restart the server and confirm vault_index_status reports the expected file and chunk counts. Keep the backup until search results have been checked. If either named table is missing or the manifest is malformed, restore the backup instead of deleting tables manually.

Developing

Setup

git clone https://github.com/russellsch/some_obsidian_some_mcp.git
cd some_obsidian_some_mcp
uv sync                           # default (fastembed CPU)
uv sync --extra gpu               # GPU-accelerated embeddings
uv sync --extra ollama            # Ollama provider
uv sync --extra openai            # OpenAI provider

Running from source

VAULT_PATH=/path/to/vault uv run some-vault-some-mcp serve

To use a local checkout in your MCP client config instead of the PyPI package:

{
  "mcpServers": {
    "obsidian-vault": {
      "command": "uv",
      "args": ["run", "--project", "/path/to/some_obsidian_some_mcp", "some-vault-some-mcp", "serve", "--transport", "stdio"],
      "env": {
        "VAULT_PATH": "/path/to/your/obsidian/vault"
      }
    }
  }
}

Tests

uv run pytest tests/unit           # unit tests (fast, no external deps)
uv run pytest tests/integration    # integration tests (real LanceDB, may download ~130MB model)
uv run pytest                      # everything

Test fixtures live in tests/fixtures/vault/.

Releasing

See RELEASING.md.

Available Tools

28 tools
add_canvas_edgeC

Add an edge between two canvas nodes with full property support.

ParametersJSON Schema
NameRequiredDescriptionDefault
colorNo
labelNo
to_endNo
to_nodeYes
to_sideNo
from_endNo
from_nodeYes
from_sideNo
canvas_pathYes

TDQS

C2.4/5.0
Behavior2/5

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

Annotations already indicate this is a non-read-only, non-idempotent, non-destructive operation, so the description adds little beyond the obvious action of adding an edge. It does not disclose what happens if the canvas or nodes do not exist, whether this modifies the canvas file, or how existing data is affected.

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

Conciseness3/5

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

The description is a single concise sentence and easy to parse, but it is informationally thin. 'Full property support' adds length without meaningful substance, and the critical parameter context is missing.

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

Completeness2/5

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

For a tool with nine parameters, no output schema, and no parameter-level descriptions, this is too sparse. An agent cannot determine edge endpoint semantics, node identifier requirements, or valid property values. It is barely adequate for selecting the tool, not for invoking it correctly.

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

Parameters1/5

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

Schema description coverage is 0%, so the description must compensate for nine parameters. It offers no explanation of canvas_path, from_node, to_node, from_side/to_side, from_end/to_end, color, or label. 'Full property support' does not convey the meaning or format of any parameter.

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 ('Add') and resource ('edge between two canvas nodes'), clearly distinguishing it from sibling tools like add_canvas_node and update_canvas_edge. The phrase 'full property support' hints at feature completeness, though it is vague about which properties are supported.

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 explicit guidance is given about when to use this tool versus update_canvas_edge or remove_canvas_edges. The name and description imply creating a new edge, but the description does not state when this is the right choice or when an alternative is preferred.

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

add_canvas_nodeA

Add a node (text/file/link/group) to a canvas. Auto-layout when position omitted.

ParametersJSON Schema
NameRequiredDescriptionDefault
xNo
yNo
urlNo
fileNo
textNo
colorNo
labelNo
widthNo
heightNo
node_typeYes
canvas_pathYes

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already indicate this is a mutation (readOnlyHint=false) and not idempotent. The description adds the behavioral detail of auto-layout when position is omitted, which is beyond what annotations provide. However, it does not disclose other potential side effects, error conditions, or prerequisites, but for a simple add operation this is acceptable given the low bar set by annotations.

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

Conciseness5/5

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

The description is two sentences with no wasted words. The primary action is front-loaded, and the auto-layout detail is placed second, which is useful and efficient. Every sentence contributes information.

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

Completeness2/5

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

For a tool with 11 parameters, no output schema, and no enum constraints, the description is far too brief. It does not mention required fields (canvas_path, node_type), nor does it explain how to select node types and which fields are relevant for each. An agent would need to infer many parameter semantics from the schema alone, which is risky. The description is not complete enough to safely invoke this tool without additional knowledge.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must compensate. It provides some context for x/y (auto-layout when omitted) and hints at node types, but it does not explain the meaning or usage of url, file, text, color, label, width, height, canvas_path, or node_type beyond the list in the first sentence. With 11 parameters and 0% coverage, this is a significant gap.

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

Purpose5/5

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

The description clearly states the action (Add), the resource (a node to a canvas), and lists the node types (text/file/link/group). It implicitly distinguishes from sibling tools like update_canvas_node and remove_canvas_nodes by using the verb 'Add', and the resource is specific enough that an agent can tell it apart 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?

The description does not explicitly state when to use this tool versus alternatives. It mentions 'Auto-layout when position omitted,' which provides a condition for behavior but not a clear routing guide. The differentiation from update/remove tools is implied by the name and verb, but no explicit 'use this for creation, use update for modification' guidance is given.

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

append_to_noteA

Append text to the end of an existing note. The .md extension is added automatically.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
contentYes

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare this is mutating (readOnlyHint false) and non-destructive; the description adds the behavior that the .md extension is appended automatically. It does not describe failure behavior when the note is missing or how newlines are handled, but this is not contradictory to annotations.

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

Conciseness5/5

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

Two short sentences, with the core action first and the extension detail second. No filler or redundancy.

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?

For a two-parameter mutation with no output schema, the description covers the main purpose and the key .md extension behavior. Gaps remain around error handling (missing note) and exact append formatting, so it is minimally viable but not thorough.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must carry the burden for both params. It implicitly associates path with the note file (including automatic .md extension) and content with the text to append, but offers no details on path format, trailing newlines, or content constraints.

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 clear action ('Append text') and target ('an existing note'), and specifies position ('to the end'), which disambiguates from prepend_to_note and create_note. The mention of automatic .md extension adds useful file-handling detail.

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?

No explicit when-to-use guidance or named alternatives are given. The wording 'existing note' and 'to the end' implies not for creating new notes or prepending, but an agent must infer this rather than being told.

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

create_canvasB

Create a new .canvas file with optional initial nodes/edges.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
edgesNo
nodesNo

TDQS

B3.3/5.0
Behavior3/5

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

Annotations already convey that this is a mutating (readOnlyHint=false) and non-destructive operation; the description's 'Create a new' is consistent with them. It adds little beyond the resource type — no disclosure of what happens if the target path already exists, overwrite behavior, or side effects — but with annotations present, the bar is lower and no contradiction exists.

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

Conciseness5/5

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

A single, front-loaded sentence with zero waste; it states the action, resource, and the optional parameters in 13 words. Every word earns its place.

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?

For a simple create-with-optional-content tool this is adequate, but with no output schema and 0% param coverage, key facts are left out: behavior when the file exists, the serialization format of the nodes/edges strings, and what the tool returns. The sibling set (list_canvases, read_canvas, add/update/remove node/edge tools) makes the tool's role clear, but the call contract is under-specified.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must carry parameter meaning. It clarifies that nodes and edges are optional and represent initial content, which maps to the two nullable params, but it does not specify the expected string format (e.g., JSON-serialized arrays/objects) or what 'path' refers to. This only partially compensates for the coverage gap.

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 ('Create') and resource ('.canvas file'), and the qualifier 'new' distinguishes it from sibling tools like add_canvas_node/add_canvas_edge that modify existing canvases. It could be stronger by explicitly naming the sibling it is not, but the resource type alone disambiguates it from create_note/create_daily_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 description implies use for brand-new canvases and that nodes/edges are optional initial content, which roughly signals when to use it versus add_canvas_node/add_canvas_edge. However, it gives no explicit guidance, exclusions, or mention of when to prefer the sibling mutation tools.

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

create_daily_noteA

Create a daily note for today or a given date. Fails if one exists.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNo
contentNo
template_pathNo

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already indicate this is a mutating, non-idempotent operation. The description adds the important behavioral detail that the tool fails if a daily note already exists, which is not visible in the annotations or schema. It does not disclose side effects beyond creation, but the failure condition is the most decision-relevant behavior.

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

Conciseness5/5

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

Two short sentences with no filler. The core action, date scope, and failure condition are all front-loaded and each sentence earns its place.

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?

For a 3-parameter tool with no output schema and no parameter descriptions, the description is minimal but covers the most critical behavior (creation and failure condition). It is missing guidance on parameter semantics and return behavior, but the tool is simple enough that an agent can likely call it correctly with the schema and this description.

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

Parameters3/5

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

Schema description coverage is 0%, so the description carries the burden for parameter meaning, but it only explains 'date' implicitly ('for today or a given date'). It does not explain what 'content' or 'template_path' do, nor how they interact (e.g., whether template_path is used when content is null). Baseline 3 is appropriate because the description adds some meaning for date but leaves the other two parameters unexplained.

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 ('Create') and resource ('daily note'), and adds a scoping detail ('for today or a given date') plus a key constraint ('Fails if one exists'). It is clear enough to distinguish from create_note, though it does not explicitly name the sibling alternative.

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

Usage Guidelines3/5

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

The description implies when to use it: when you want a daily note and one does not already exist. The failure condition ('Fails if one exists') gives a clear exclusion signal, but there is no explicit guidance about when to prefer create_note, get_daily_note, or append_to_note instead.

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

create_noteA

Create a new note. Fails if it already exists. The .md extension is added automatically — do not add .md or other extensions to the path. Never create redirect stubs, backups, or temporary files.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
contentYes
frontmatterNo

TDQS

A4.1/5.0
Behavior5/5

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

Annotations only mark the tool as non-read-only and non-idempotent. The description adds useful behavioral detail: duplicate calls fail, .md is appended automatically, extensions are forbidden in the path, and stubs/backups/temp files must never be created. This goes well beyond the annotations without contradicting them.

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

Conciseness5/5

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

Three short, front-loaded sentences with no wasted words. Each sentence contributes either the core action or a meaningful constraint.

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

Completeness4/5

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

The description covers the core action, duplicate-failure behavior, path conventions, and prohibited file types. It is slightly incomplete because frontmatter semantics are unexplained and success/return behavior is not described, though no output schema exists.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must clarify parameter meanings. It adds value for path by explaining extension handling, but it says nothing about content semantics or frontmatter formatting, leaving two of three parameters largely underspecified.

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 new note') plus a unique distinguishing constraint ('Fails if it already exists'). The description also clarifies the extension behavior, making the tool's purpose clear without needing to inspect the schema.

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

Usage Guidelines3/5

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

The description implies create_note is for new notes only, since existing notes cause failure, but it never explicitly points to alternatives like append_to_note or update_frontmatter for modifying existing notes. This is implied usage guidance rather than explicit when/when-not direction.

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

delete_noteA
Destructive

Delete a note. Moves to .trash by default (restore or empty trashed notes from within Obsidian or the filesystem — no tool lists/restores .trash); set permanent=true for an irreversible hard delete.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
permanentNo

TDQS

A4.7/5.0
Behavior5/5

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

While annotations already mark the tool as destructive, the description adds important behavioral nuance: the default moves the note to .trash, restore/empty must happen outside the tool ecosystem, and permanent=true triggers an irreversible hard delete. This goes well beyond the annotations and gives an agent the full safety picture needed to call the tool responsibly.

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

Conciseness5/5

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

The description is compact and front-loaded with the core action, then uses a parenthetical to convey the default behavior and a clear conditional for the permanent flag. Every clause earns its place; there is no filler or repetition.

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

Completeness5/5

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

With only two simple parameters Validity check. The description explains the default vs permanent behavior, the recoverability tradeoff, and the lack of in-tool restore options. No critical invocation details are missing; the description provides enough context for an agent to use the tool correctly and safely.

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

Parameters4/5

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

Schema description coverage is 0%, so the description must compensate. It does explain the permanent parameter clearly: default false moves to trash, true is irreversible. The path parameter is not explicitly formatted, but the tool name and 'Delete a note' make its purpose obvious. The description adds meaning beyond the raw schema, though path specifics could be slightly richer.

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

Purpose5/5

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

The description opens with a clear, specific action ('Delete a note.') and immediately distinguishes the behavior from a simple destructive operation by explaining the default trash behavior and permanent hard delete option. This makes it unmistakable what the tool does and how it differs from sibling tools like move_note or create_note.

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

Usage Guidelines4/5

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

The description provides clear context: deleting a note should use this tool, and the permanent flag controls whether the deletion is recoverable. It also explicitly warns that no other tool can restore or empty trashed notes, which helps an agent understand the workflow limits. It does not explicitly compare against a non-existent sibling delete tool, but the guidance is strong.

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

find_orphansA
Read-only

Find disconnected notes — no inbound links, no outbound links, or both.

ParametersJSON Schema
NameRequiredDescriptionDefault
max_resultsNo
include_outlinks_checkNo

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, which the description does not contradict. The description adds no behavioral detail beyond the core action—no mention of return format, performance, limitations, or side effects. Since annotations cover safety, this is acceptable but not enhanced.

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 concise sentence that states the core purpose without extraneous words. The key action 'Find disconnected notes' is front-loaded, and the three cases are succinctly listed.

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

Completeness2/5

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

For a tool with no output schema and two parameters, the description is too sparse. It does not explain what the tool returns (e.g., note paths), how parameters affect behavior, or how it differs from find_broken_links. An agent might misinterpret 'disconnected' or misuse the parameters.

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

Parameters2/5

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

Schema coverage is 0% and the description does not explain any parameters. The parameter 'include_outlinks_check' is ambiguous—does it control whether outbound links are considered? 'max_results' is somewhat self-explanatory but no behavior is described. The description fails to compensate for the schema gap.

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

Purpose5/5

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

Clear and specific: it identifies notes with no inbound links, no outbound links, or both. This distinguishes it from siblings like get_backlinks or find_broken_links by focusing on disconnection rather than broken links or individual link queries.

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 use case (finding orphans) but does not explicitly state when to use this tool versus alternatives like find_broken_links or get_graph_neighbors. No exclusions or comparative guidance are provided, leaving the agent to infer the appropriate context.

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

get_daily_noteA
Read-only

Read today's or a specific date's daily note.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNo

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the read-only nature is covered. The description adds useful behavioral context about the date default ('today's'), but does not describe return content, missing-note behavior, or other runtime details.

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

Conciseness5/5

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

A single, front-loaded sentence with no filler. Every word adds meaning, and the description is appropriately sized for the tool's simplicity.

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

Completeness4/5

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

Given the low complexity (one optional parameter, read-only annotations), the description covers the essential selection and invocation needs. The lack of an output schema and explicit handling of missing daily notes are minor gaps for such a simple read tool.

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

Parameters4/5

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

Schema coverage is 0%, so the description must carry parameter meaning. It does so by making clear that the optional 'date' parameter selects either today's note or a specific date's note, which the bare schema does not convey. It stops short of specifying the exact date string format, but for a single optional parameter this is adequate.

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 ('Read') and a concrete resource ('daily note') with date-based scope ('today's or a specific date's'). It clearly distinguishes this from generic note tools like get_note and from create_daily_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 description implies when to use the tool: whenever a user wants a daily note for today or a particular date. However, it does not explicitly name alternatives or state when not to use it, leaving the distinction from get_note and create_daily_note to inference.

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

get_graph_neighborsA
Read-only

Walk the link graph outward from a note. Depth 1-5, default 1.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
depthNo
directionNoboth

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds the depth range (1-5) and default behavior, which is useful. It doesn't disclose traversal direction semantics beyond 'outward' or cycle handling, but for a read-only graph walk the annotations carry much of the burden.

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, front-loaded with the core action and scope, then the key parameter constraint. Every word earns its place.

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?

For a read-only graph traversal with 3 params and no output schema, the description covers the core behavior and depth constraint. However, it doesn't clarify what 'direction' accepts (e.g., 'in', 'out', 'both') or what the return shape looks like, which an agent would need 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 0%, so the description must compensate. It explains depth (1-5, default 1) and implies the graph-walk semantics, but it doesn't explain the 'direction' parameter values or what 'path' refers to. The description adds some meaning beyond the bare schema but leaves the direction parameter ambiguous.

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 ('Walk') and resource ('the link graph outward from a note'), which clearly distinguishes it from siblings like get_backlinks and get_outlinks. It doesn't explicitly name a sibling, but the graph-walking framing makes the purpose clear.

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: you use this when you need to traverse the link graph outward from a note, as opposed to get_backlinks (inward) or get_outlinks (direct only). However, it doesn't explicitly state when not to use it or name alternatives, leaving some inference to the agent.

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

get_noteA
Read-only

Read a single note with parsed frontmatter and tags. Path extension is optional.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes

TDQS

A3.5/5.0
Behavior4/5

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

The description adds behavioral context beyond the readOnlyHint and destructiveHint annotations by mentioning that frontmatter and tags are parsed and that the path extension is optional. This helps an agent understand output structure and input flexibility, though it does not cover error behavior or full return format.

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, front-loaded sentence with no filler. Every word adds value, and the most important information (what it reads and returns) comes first.

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?

For a simple read tool, the description covers the core function but omits details about the returned note structure (beyond frontmatter and tags) and error handling. Since there is no output schema, the description should provide more on return format, making it slightly incomplete.

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

Parameters2/5

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

The schema provides no description for the 'path' parameter (0% coverage), so the description must compensate. It only notes that the path extension is optional, but does not clarify path format (relative vs absolute) or how it resolves. This is minimal guidance for a critical parameter.

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 action ('Read a single note') and what is returned ('parsed frontmatter and tags'), which clearly distinguishes it from list_notes or search. It does not explicitly name alternatives, but the scope is unambiguous.

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

Usage Guidelines3/5

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

No explicit guidance on when to use this tool versus siblings like get_daily_note or search. The usage is implied by the tool's purpose, but no conditions or exclusions are stated.

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

get_tagsA
Read-only

List all unique tags in the vault with usage counts.

ParametersJSON Schema
NameRequiredDescriptionDefault
sort_byNocount

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare this read-only and non-destructive. The description adds the aggregation behavior: unique tags and usage counts. It does not clarify whether tags are extracted from body, frontmatter, or both, or how counts are computed, so it adds only moderate behavioral context beyond the annotations.

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

Conciseness5/5

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

A single, front-loaded sentence with no filler. Every word contributes to the agent's understanding of what the tool returns.

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?

For a one-parameter, read-only tool, the description covers the core return value (tags and counts) and annotations cover safety. However, the only parameter is undocumented and there is no output schema, so the definition is minimally viable but leaves a material ambiguity around sort_by semantics.

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

Parameters2/5

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

With schema description coverage at 0% and only a bare 'sort_by' parameter with default 'count', the description needed to document valid sort values or ordering behavior. It does not mention sort_by at all, so an agent must guess whether values like 'name', 'count', or others are supported.

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 ('List') with a clear resource ('all unique tags in the vault') and indicates the output includes usage counts. It is immediately distinguishable from siblings like list_notes and search, which address notes/content rather than the tag vocabulary.

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 it should be used when a caller needs all tags with usage counts, but it gives no explicit when-to-use guidance or exclusions, and no mention of how this relates to alternatives like search or note listing. There is no close sibling for tags, so the implication is enough for a minimal score but not more.

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

list_canvasesC
Read-only

List all .canvas files in the vault.

ParametersJSON Schema
NameRequiredDescriptionDefault
folderNo

TDQS

C2.9/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=true, so the description doesn't need to repeat that. However, it adds no behavioral context beyond the annotations: it doesn't mention whether listing is recursive, what the folder parameter does, or any limits/pagination. Given annotations cover safety, the description still fails to provide useful behavioral details, so it adds little value.

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

Conciseness3/5

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

The description is a single, concise sentence with no waste, but it is under-specified. While it is appropriately short, it omits essential information about the parameter and behavioral details, so it is not merely concise but incomplete. It balances between being too terse and adequately informative.

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

Completeness2/5

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

For a tool with one unclear parameter and no output schema, the description is insufficient. It fails to explain the folder parameter, the output format, or any scoping behavior. An agent would struggle to use the tool correctly, especially when a folder is passed, making the definition incomplete.

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

Parameters1/5

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

The schema has one parameter, 'folder', but schema description coverage is 0% and the description does not mention it at all. An agent cannot infer the parameter's meaning (e.g., filter by folder, scope to subdirectory) from either the schema or description. This is a critical gap that the description should have filled.

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

Purpose5/5

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

The description clearly states the verb ('List'), the resource ('.canvas files'), and the scope ('in the vault'), making the tool's purpose unambiguous and distinct from siblings like read_canvas or create_canvas. It leaves no doubt about what the tool does.

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

Usage Guidelines3/5

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

The purpose is clear enough that an agent would know to use this tool when it needs to enumerate canvas files, but there is no explicit guidance on when not to use it or alternatives (e.g., list_notes for notes). The usage context is implied but not stated, so it meets the baseline but lacks explicit routing.

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

list_notesB

List and filter vault notes by folder, tags, projects, status, area, or frontmatter.

ParametersJSON Schema
NameRequiredDescriptionDefault
areaNo
tagsNo
limitNo
folderNo
statusNo
projectsNo
include_contentNo
frontmatter_valueNo
frontmatter_propertyNo

TDQS

B3.4/5.0
Behavior2/5

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

The annotations are all false and therefore provide no meaningful behavioral hints. The description does not disclose whether filters combine with AND/OR, how limit applies, whether include_content affects output, or what the response shape is. For a list tool with zero annotation support, the description should carry more behavioral burden.

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, front-loaded sentence that conveys the tool's action and primary filter dimensions with no wasted words. Every element contributes to understanding the tool's scope.

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

Completeness2/5

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

With 9 optional parameters, 0% schema coverage, no output schema, and unhelpful annotations, the description is too thin for an agent to invoke the tool correctly in many cases. Missing details include default limit behavior, the meaning of include_content, and how multiple filters combine.

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

Parameters3/5

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

Schema description coverage is 0%, so the description is the only source of parameter meaning. It names most filterable parameters (folder, tags, projects, status, area, frontmatter) but omits limit and include_content, and does not explain how frontmatter_property and frontmatter_value work together. This is partial but not adequate compensation for the schema gap.

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 ('List and filter') and a specific resource ('vault notes'), and enumerates clear filter dimensions: folder, tags, projects, status, area, or frontmatter. This makes the tool's purpose unmistakable and distinguishes it from siblings like get_note and search.

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

Usage Guidelines3/5

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

The description implies when to use the tool (whenever you need to list or filter notes) but provides no explicit guidance about when to prefer search or get_note instead. No exclusions or alternatives are named, so the agent must infer usage context.

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

move_noteA
Destructive

Move or rename a note. ALL wikilinks across the vault are updated automatically — do not create redirect stubs at the old path. The .md extension is added automatically. Do not use this to create backups; use delete_note instead (it moves to .trash).

ParametersJSON Schema
NameRequiredDescriptionDefault
new_pathYes
old_pathYes
update_linksNo

TDQS

A4/5.0
Behavior4/5

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

Annotations mark destructiveHint true)Skip revisiting. The description adds concrete behavioral details beyond that: wikilinks across the vault are automatically updated, no redirect stubs are created, and .md is appended. This is valuable, though the unrestricted claim that wikilinks are 'always' updated conflicts slightly with the existence of an update_links parameter that can be set to false.

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

Conciseness5/5

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

Three short sentences with all information front-loaded: the primary action first, then the most important side effects and the backup exclusion. Every sentence contributes, and there is no fluff.

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?

Given the sparse param schema and no output schema, the description covers purpose, major side effects, and one exclusion, but misses the update_links parameter explanation and possible collisions. For a destructive operation, these are meaningful gaps, so the description is merely adequate, not complete.

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

Parameters2/5

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

Schema description coverage is 0%, so description must compensate. It implicitly covers old_path/new_path through 'move or rename' and the mention of .md extension, but it says nothing about update_links, its default true value, or how to disable it. Without this, an agent cannot reason about the most configurable part of the operation.

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

Purpose5/5

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

The description starts with 'Move or rename a note,' giving a specific verb and resource. It goes further by explaining that wikilinks are updated vault-wide and explicitly distances itself from redirect stubs alerting and from delete_note, making the tool's purpose unmistakable.

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

Usage Guidelines4/5

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

It gives an explicit exclusion, 'Do not use this to create backups; use delete_note instead,' and warns against creating redirect stubs. However, it doesn't cover other potential alternatives or conditions, such as when renaming vs. moving is appropriate or what to do when a destination already exists.

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

prepend_to_noteA

Insert text after frontmatter, before the note body. The .md extension is added automatically.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
contentYes

TDQS

A3.6/5.0
Behavior4/5

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

Annotations already indicate the operation is mutating (readOnlyHint=false) and non-destructive (destructiveHint=false). The description adds valuable behavioral context by specifying the exact insertion point and the automatic `.md` extension. It does not cover edge cases like missing frontmatter or non-existent notes, but the added detail goes beyond what annotations provide.

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

Conciseness5/5

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

Two compact sentences with no filler. The core positional behavior is front-loaded, and the second sentence adds a useful operational detail. Every word earns its place.

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 and the description covers the main mechanics, but with no output schema and sparse annotations an agent is left guessing about return values and failure behaviors, such as whether the note must already exist. Given the tool's low complexity, this is adequate but not fully complete.

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

Parameters2/5

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

Schema description coverage is 0%, so the description carries the full burden of explaining `path` and `content`. It implies `content` is the text to insert and `path` gets an `.md` extension, but it never explicitly defines either parameter or explains path formats or whether directories are supported. This is insufficient compensation for the complete lack of schema descriptions.

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

Purpose5/5

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

The description states a specific verb and resource: inserting text into a note at a precise location (after frontmatter, before the body). This clearly distinguishes it from the sibling `append_to_note`, which would append elsewhere. The automatic `.md` extension detail further clarifies the intended operation.

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?

The description gives no guidance on when to choose this tool over alternatives such as `append_to_note` or `create_note`. There are no explicit conditions, exclusions, or mentions of sibling tools. An agent must infer usage purely from the name and positional wording.

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

read_canvasA
Read-only

Read canvas structure (nodes + edges).

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds that the tool returns nodes and edges, which is useful context beyond the annotations. It doesn't disclose details like whether the canvas must exist or what happens if the path is invalid, but the read-only annotation lowers the bar.

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, front-loaded sentence with zero waste. It states the operation and the exact scope (nodes + edges) in six words, which is ideal for an agent scanning tool definitions.

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?

For a simple read tool with one parameter and read-only annotations, the description is mostly complete. However, it doesn't clarify what 'path' refers to (file path vs. canvas ID) or what the return structure looks like, though no output schema exists. The sibling list includes list_canvases, which could provide context, but the description alone leaves a small 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 0%, so the description must compensate for the undocumented 'path' parameter. The description implies the path identifies the canvas but doesn't specify format, whether it's a file path or ID, or any constraints. With only one parameter, the baseline is 3, and the description adds minimal meaning beyond the schema.

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 'Read canvas structure (nodes + edges)' clearly identifies the verb (read), the resource (canvas), and the scope (nodes + edges). It distinguishes this from sibling tools like create_canvas, add_canvas_node, and add_canvas_edge, though it doesn't explicitly name 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 description implies usage for reading a canvas's structure, which is distinct from the many mutation tools in the sibling list. However, it doesn't explicitly state when to use this over alternatives like get_graph_neighbors or list_canvases, nor does it mention any exclusions or prerequisites.

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

remove_canvas_edgesC
Destructive

Remove edges from a canvas by ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
edge_idsYes
canvas_pathYes

TDQS

C2.6/5.0
Behavior2/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, and the description adds no behavioral context beyond stating the action. It does not mention that edges are permanently deleted, whether the operation can be undone, or any permission requirements. With annotations present, the bar is lower, but the description still fails to add any useful behavioral detail.

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 a single concise sentence with no wasted words. It is appropriately brief for a simple operation, though it could have been slightly more informative without sacrificing brevity. Front-loading is adequate.

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

Completeness2/5

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

For a destructive operation with two required parameters and no output schema, the description is incomplete. It does not explain the format of edge_ids (e.g., comma-separated, JSON array) or how the parameters relate. Given the low schema coverage, this is a significant gap that leaves an agent uncertain about how to call the tool correctly.

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

Parameters1/5

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

Schema description coverage is 0%, so the description must compensate for the lack of parameter explanations. However, it does not clarify that canvas_path identifies the canvas and edge_ids specifies which edges to remove. The phrase 'by ID' is vague and does not map clearly to the parameters. The parameter names are self-explanatory, but the description provides no added 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?

The description states a specific verb ('remove') and resource ('edges from a canvas'), distinguishing it from sibling tools like add_canvas_edge or update_canvas_edge. The phrase 'by ID' is slightly ambiguous—it could refer to the canvas or the edges—but the overall purpose is clear enough.

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 guidance is provided on when to use this tool versus alternatives. There are sibling tools like remove_canvas_nodes and update_canvas_edge, but the description gives no context about when removing edges is appropriate or what distinguishes this from similar operations. Usage must be inferred solely from the name.

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

remove_canvas_nodesA
Destructive

Remove nodes by ID. Auto-removes dangling edges.

ParametersJSON Schema
NameRequiredDescriptionDefault
node_idsYes
canvas_pathYes

TDQS

A3.5/5.0
Behavior4/5

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

Annotations already flag this as destructive; the description adds the key cascade behavior 'Auto-removes dangling edges,' which is genuine context beyond the structured hints because it discloses that removal affects dependent edges as well. It stops short of richer detail like irreversibility or return behavior, but the annotations lower the bar and this sentence earns its place.

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 core action is front-loaded, and the second sentence adds a distinct behavioral fact. Every word earns its place.

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

Completeness2/5

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

For a destructive tool with no output schema and 0% parameter coverage, the description leaves too much to inference: parameter formats are unspecified and the return value is entirely unknown. The dangling-edge note is valuable, but an agent still cannot safely and correctly call this on a canvas without further investigation.

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

Parameters2/5

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

Schema description coverage is 0% and the description does not compensate. 'By ID' loosely maps to node_ids but says nothing about format — whether multiple IDs are allowed or how they are separated — and canvas_path is completely unexplained. An agent cannot reliably construct the two required arguments from this text alone.

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

Purpose5/5

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

The description states a specific verb and resource: 'Remove nodes by ID.' The 'nodes' vs 'edges' distinction cleanly separates it from the sibling remove_canvas_edges, and the mechanism ('by ID') adds precision beyond the tool name. An agent can distinguish this from add/update_canvas_node and delete_note without opening schemas.

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

Usage Guidelines2/5

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

The description gives no explicit guidance on when to use this tool versus alternatives, and no exclusions. With 27 siblings including remove_canvas_edges, delete_note, and other canvas mutation tools, an agent gets no routing help. Usage context is only implied by the verb itself.

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

update_canvas_edgeC
Idempotent

Update properties of an existing canvas edge by ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
colorNo
labelNo
to_endNo
edge_idYes
to_sideNo
from_endNo
from_sideNo
canvas_pathYes

TDQS

C2.4/5.0
Behavior2/5

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

Annotations already declare idempotentHint=true and destructiveHint=false, but the description adds no behavioral detail beyond the word 'update'. It does not disclose partial-update semantics (whether unset fields are left unchanged), error handling, or the impact of null parameters, so it fails to add meaningful context beyond structured data.

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 a single, efficient sentence that front-loads the action and target. It has no filler, though one might argue it is too sparse for an 8-parameter tool; nevertheless, the brevity itself is clean and structured.

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

Completeness1/5

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

For a mutation tool with 8 parameters, 0% schema coverage, and no output schema, a one-sentence description is grossly inadequate. The agent is left without knowledge of which properties can be updated, how edge_id and canvas_path are formatted, or what happens when the edge does not exist, making correct invocation unlikely.

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

Parameters1/5

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

Schema description coverage is 0%, so the description must explain the 8 parameters, but it mentions none of them. Even ambiguous parameters like to_end, from_end, to_side, and from_side are left entirely unexplained, providing zero semantic value to the agent.

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 clear verb+resource: 'Update properties of an existing canvas edge by ID.' It distinguishes from adding or removing edges by saying 'existing' and 'by ID', but it does not explicitly name sibling tools like add_canvas_edge or remove_canvas_edges, so it falls 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 Guidelines2/5

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

No guidance is given on when to use this tool versus alternatives such as add_canvas_edge or update_canvas_node. The description does not mention prerequisites, conditions, or exclusions, leaving the agent to infer usage from the tool name alone.

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

update_canvas_nodeC
Idempotent

Update any property of an existing canvas node by ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
xNo
yNo
urlNo
fileNo
textNo
colorNo
labelNo
widthNo
heightNo
node_idYes
canvas_pathYes

TDQS

C2.9/5.0
Behavior2/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 mutation intent is covered. However, the description adds no behavioral detail about how partial updates work; in particular, it does not clarify whether omitted properties (which default to null in the schema) are preserved or reset to null. This is a critical gap for a tool that says 'any property' can be updated.

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 a single, front-loaded sentence with no filler words. It communicates the core operation efficiently. It loses a point because the brevity borders on under-specification for a tool with 11 parameters and ambiguous null-update semantics.

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

Completeness2/5

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

Given the tool's complexity (11 params, no output schema, no parameter descriptions), the description is incomplete. It does not address how to update specific fields without affecting others, what the required canvas_path refers to, or what happens when optional properties are omitted. An agent would need to infer critical invocation details from the schema alone.

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

Parameters2/5

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

Schema description coverage is 0% across 11 parameters, so the description must compensate by explaining parameter semantics. It only indicates the node is located by ID and that any property can be updated, without explaining what x, y, url, file, text, color, label, width, height represent, or noting the required canvas_path. This adds minimal meaning beyond the raw schema.

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

Purpose5/5

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

The description clearly states a specific action ('Update'), resource ('canvas node'), and target scope ('any property', 'by ID'). It distinguishes this tool from siblings like add_canvas_node, remove_canvas_nodes, and update_canvas_edge by framing it as updating an existing node rather than adding or removing one.

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?

The phrase 'existing canvas node' implies use on nodes that already exist, but there is no explicit guidance about when to prefer this over add_canvas_node or remove_canvas_nodes. No alternatives are named, and no conditions or exclusions are provided, leaving the agent to infer routing 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.

update_frontmatterA
Idempotent

Merge key-value pairs into YAML frontmatter. Unlisted keys preserved. The .md extension is added automatically.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
propertiesYes

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already indicate the operation is idempotent and non-destructive. The description adds meaningful behavioral details: merging semantics, preservation of unlisted keys, and automatic extension handling. It does not fully specify overwrite behavior for listed keys, but the added detail is valuable.

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 concise sentences with the core action front-loaded and no filler. Every sentence contributes meaningful operational 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 core merge behavior is well covered, but the missing specification of the 'properties' string format is a significant invocation blocker. The simplicity of the tool partially offsets this, but the parameter format gap keeps it from being fully complete.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must compensate. It indicates that 'properties' holds key-value pairs, but does not explain the required serialization format (JSON, YAML string, line-delimited, etc.). The 'path' parameter is also only clarified by the note about the automatic .md extension.

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 ('merge') and resource ('YAML frontmatter'), and adds behavior ('Unlisted keys preserved', '.md extension is added automatically'). This clearly distinguishes it from sibling content and file operations.

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 this tool is for updating frontmatter keys while preserving others, but it does not explicitly state when to use it versus alternatives or when not to use it. Sibling tools like append_to_note are implicitly different, but no routing guidance is provided.

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

vault_index_statusA
Read-only

Check search index health and statistics.

ParametersJSON Schema
NameRequiredDescriptionDefault

No 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=true and destructiveHint=false, covering the safety profile. The description adds 'health and statistics' as the expected diagnostic content, but does not disclose additional behavioral details like response shape, cost, or relevance to reindexing. This is acceptable given the annotation coverage, but not exceptional.

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, front-loaded sentence with no filler: 'Check search index health and statistics.' Every word earns its place, and the structure is appropriately minimal for a no-input status tool.

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 diagnostic tool with annotations covering its safety profile, the description is largely complete. It could specify what statistics are returned or how health is measured, but the low complexity means the agent has enough to invoke the tool correctly.

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

Parameters4/5

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

The tool has zero parameters, so there is nothing for the description to explain about parameter meaning. Per the baseline for zero-parameter tools, this is a strong score; the description does not need to compensate for any undocumented inputs.

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 ('Check') with a specific resource ('search index health and statistics'), making the tool's purpose immediately clear. It is semantically distinct from sibling tools like search, which queries note content, and vault_reindex, which changes the index, so an agent can tell them apart without opening schemas.

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

Usage Guidelines2/5

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

The description gives no guidance on when to use this tool versus alternatives such as search or vault_reindex. It does not mention whether the agent should first run a health check before searching, or when the statistics would be useful, so the usage context is left entirely to inference.

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

vault_reindexA

Trigger incremental reindex for one note or the entire vault.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathNo

TDQS

A3.9/5.0
Behavior3/5

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

Annotations already indicate this is not read-only, not idempotent, and not destructive; the description adds that the reindex is 'incremental' and scoped. However, it does not disclose execution behavior such as whether the operation is async, what happens to stale entries, or what the return/confirmation looks like.

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 front-loaded sentence with no filler. It conveys action, scope, and parameter semantics in minimal space, appropriate for a one-parameter tool.

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?

For a simple tool with one optional parameter and annotations, the description is mostly adequate, but it omits practical details like path format, async behavior, and how to verify the reindex result. Since there is no output schema, some of that burden falls on the description.

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

Parameters4/5

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

Schema description coverage is 0%, so the description carries the parameter burden. It clarifies that the single `path` parameter selects one note while null/omission means the entire vault, which is essential. It does not specify the path format (relative path, note name, ID), so it stops short of a 5.

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

Purpose5/5

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

The description states a specific verb ('Trigger') and resource ('incremental reindex'), and clearly delimits scope: one note or the entire vault. This makes it easy to distinguish from sibling tools like vault_index_status or search.

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 scope guidance ('one note or the entire vault') implies when to use it, but there is no explicit condition like 'when the index is stale' and no comparison with alternatives such as vault_index_status. The usage context is present but left mostly implicit.

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. 28 tool updatesv0.2.1
    • First observedadd_canvas_edge
    • First observedadd_canvas_node
    • First observedappend_to_note
    • First observedcreate_canvas
    • First observedcreate_daily_note
    • First observedcreate_note
    • First observeddelete_note
    • First observedfind_broken_links
    • First observedfind_orphans
    • First observedget_backlinks
    • First observedget_daily_note
    • First observedget_graph_neighbors
    • First observedget_note
    • First observedget_outlinks
    • First observedget_tags
    • First observedlist_canvases
    • First observedlist_notes
    • First observedmove_note
    • First observedprepend_to_note
    • First observedread_canvas
    • First observedremove_canvas_edges
    • First observedremove_canvas_nodes
    • First observedsearch
    • First observedupdate_canvas_edge
    • First observedupdate_canvas_node
    • First observedupdate_frontmatter
    • First observedvault_index_status
    • First observedvault_reindex

TDQS

B3.3/5.0

Scored across 28 tools

Disambiguation4/5

Most tools target a distinct resource and action, but a few could be confused: search overlaps with list_notes for finding content, and get_graph_neighbors could be mistaken for a combined version of get_backlinks/get_outlinks. Overall, the descriptions are clear enough to separate the graph, note, and canvas operations.

Naming Consistency4/5

The dominant verb_noun pattern is consistent (create_note, move_note, delete_note, add_canvas_node, etc.), with minor deviations like bare 'search', 'vault_index_status' (noun_status), and singular/plural mismatches in canvas operations (update_canvas_node vs remove_canvas_nodes). These are readable and predictable.

Tool Count3/5

28 tools is on the heavy side for an MCP server, though the breadth is justified by covering notes, daily notes, link analysis, indexing, and canvases. It exceeds the typical well-scoped range and feels dense, but not bloated with near-duplicate functionality.

Completeness4/5

The note lifecycle is well-covered (create, read, update via append/prepend/frontmatter, move, delete), and link analysis plus canvas CRUD are thorough. Minor gaps exist: there is no in-place body editing or trash restore tool, and daily notes can only be created/read, not modified directly.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    An open-source MCP server that makes your Obsidian vault accessible from any AI client with hybrid search, read/write, and graph analysis capabilities.
    2 npm
    23
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    A lightweight MCP server that enables AI assistants to securely read, create, and modify notes in an Obsidian vault, with support for semantic search and web scraping.
    3,187 npm
    MIT