Strong foundation with 19 well-named tools following verb_noun convention (list_, read_, search_, create_, append_, link_, rename_, find_, build_). All tools have descriptions (avg ~150 chars, within 10-1024 baseline). Input schemas present with type definitions and parameter descriptions. However, output schemas are not formally documented in the source, responses are inferred from code (e.g., _serialize wrapping). Error handling is minimal; no recovery guidance or actionable error messages visible. Missing tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite clear risk stratification (READ_ONLY, WRITE, REVERSIBLE). Some parameter descriptions could be more precise (e.g., 'modified_since' accepts both ISO and shorthand but lacks explicit format guidance).
Append ``content`` to the end of an existing note. Does NOT modify frontmatter.
Build a Map of Content. Static wikilinks by default; opt into Dataview.
Create a new note. Refuses to overwrite unless ``overwrite=True``. Routes through ``safe_write`` (round-trip + atomic + backup).
Return all notes that link to ``path``.
Community detection over the wikilink graph (Louvain).
Top notes by PageRank over the wikilink graph.
Surface orphan notes (zero in-degree, zero out-degree). With ``near_topic``, ranks orphans by dense-similarity to the topic.
Output schemas not formally documented. Responses are inferred from code (e.g., _serialize wrapping). LLMs cannot reliably predict return structure without explicit schema documentation.
Missing tool annotations (readOnlyHint, destructiveHint, idempotentHint). Tools are risk-stratified in comments (READ_ONLY, WRITE, REVERSIBLE) but not exposed to the MCP protocol, limiting agent safety reasoning.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 63 | 2026-07-28+ | v2 |
Find notes similar to a seed (path or free-text query). If ``seed`` matches a known note path, uses dense similarity against that note. Otherwise treats ``seed`` as a query and runs hybrid search.
Resolve the path to a daily note. Accepts 'today', 'yesterday', ISO, or 'Nd ago'.
Insert a wikilink from ``from_path`` to ``to_path``. Idempotent: if the link already exists, returns ``inserted=False``.
List daily notes within an inclusive date range.
List notes in the vault with optional filters. Returns lightweight summaries — path, title, modified mtime, size, tags. Body content is NOT included. Use ``read_note`` to retrieve a body. - ``folder``: vault-relative folder prefix (e.g. "Daily Notes"). - ``glob``: a pathlib glob pattern (e.g. "**/*RAG*.md"). - ``modified_since``: an ISO datetime OR shorthand ("7d", "24h", "90d"). - ``tag``: a tag name; matches the tag and its hierarchical descendants. - ``limit``: max results (default 1000).
Enumerate tags across the vault with exact + with-descendants counts.
Merge N tags into one.
Read the full content of a single note. Returns the full body. May contain sensitive material. Invoke only when the user has explicitly asked to see this note or when synthesis genuinely requires the full body. Prefer ``search_vault`` (which returns excerpts) for exploration.
Read multiple notes at once. Caps total returned characters. Paths exceeding the cap are returned in ``truncated`` so you can re-request selectively. Same data-sensitivity caveat as ``read_note``.
Rename a note and rewrite every reference to it across the vault. Aliases after ``|`` and subpaths after ``#`` are preserved byte-for-byte.
Rename a tag across the entire vault. Hierarchical descendants follow.
Hybrid (BM25 + dense) search over the vault. Returns ranked hits with paths, scores, and ~280-char excerpts. Bodies are NOT returned. Use ``read_note`` for full content of a specific hit.
No error handling or recovery guidance visible. Tools do not return actionable error messages (e.g., 'Invalid path: note not found. Try search_vault() first'). Agents cannot self-correct on failures.
Parameter format constraints not explicit. 'modified_since' accepts ISO datetime OR shorthand ('7d', '24h', '90d') but lacks formal regex/enum constraint. LLMs may pass invalid formats.
Pagination not implemented. list_notes, list_daily_notes, list_tags accept 'limit' but no offset/cursor. Large result sets risk context window exhaustion.