| read_noteA | Returns { root, path, frontmatter, content }. Pass a relative path. Use list_directory first if unsure of the path. |
| write_noteA | Writes content to a note. Pass { path, content } and optionally frontmatter (object) and mode (overwrite|append|prepend, default overwrite). Returns { root, path, message }. Creates parent directories automatically. |
| patch_noteA | Replaces a string within a note. Pass { path, oldString, newString } and optionally replaceAll (boolean). Returns { root, path, replacements }. Read the note first to confirm the exact string. |
| delete_noteA | Deletes a note. Pass { path, confirmPath } where both must match exactly. Returns { root, path, success }. This is irreversible. |
| move_noteA | Moves or renames a note. Pass { oldPath, newPath }. Optional: overwrite (boolean), updateLinks (boolean, propagates [[wikilink]] renames). Returns { root, oldPath, newPath } and optionally linksUpdated. |
| read_multiple_notesA | Batch-reads up to 10 notes. Pass { paths: string[] }. Returns { root, results[] } where each result has path, note (or null), and optional error. |
| list_directoryA | Returns { root, path, entries[] }. Each entry has name, type (file|directory), and relative path. Omit path or pass "" to list the root. Blocked paths (.obsidian, .git, node_modules) are excluded automatically. |
| get_statsA | Returns { root, noteCount, totalBytes, recentFiles[] }. No arguments needed. Use this to verify connectivity and get an overview of the active directory. |
| switch_directoryA | Accepts { path } (absolute path). Rebuilds all services for the new root directory. Returns { root, switched: true } on success. Call get_stats after switching to verify. |
| get_frontmatterA | Returns { root, path, frontmatter } for a note. Reads only the YAML frontmatter block, not the body. |
| update_frontmatterA | Sets and/or removes frontmatter keys. Pass { path, fields?, remove?, merge? }. fields sets key-value pairs (null is a real value, pass-through to schema validation). remove is a list of keys to delete. merge (default true) merges with existing frontmatter; false replaces all fields. Returns { root, path, frontmatter }. |
| manage_tagsA | Add, remove, or list tags on a note. Pass { path, operation, tags? } where operation is add|remove|list. Handles both YAML tags arrays and inline #tags. Returns { root, path, tags, added?, removed? }. |
| search_notesA | Full-text BM25 search. Pass { query } and optionally scope (path prefix), searchContent (default true), searchFrontmatter (default false), limit. Returns { root, results[] } sorted by relevance, each with path, score, excerpt. |
| lint_noteB | Validates a note against its resolved schema. Pass { path }. Returns { root, path, pass, schema, checks[] }. Each check has name, pass, detail. Returns schema: null if no schema matches. |
| validate_folderA | Classifies and validates a folder. Pass { path }. Returns { root, summary, path, pass, folderType, schema, notes, structural }. Folder types: packet, superfolder, supplemental, unclassified. |
| validate_areaA | Recursively validates a subtree. Pass { path }. Returns { root, summaryText, path, pass, folders, summary }. Use for checking a section of the directory. |
| validate_allA | Validates the entire directory tree using the convention cascade. Optional verbose (default false) — when false, the response includes only folders/notes with actionable results. Returns { root, summaryText, pass, conventionSources, folders, summary }. Discovers _conventions.md notes and resolves folder schemas. |
| list_schemasA | Lists all loaded schemas. No arguments. Returns { root, schemas[] } where each schema has name, description, type (note|folder), and type-specific details. |
| create_noteA | Creates a new note with convention-aware defaults. Pass { path, content } and optionally frontmatter (overrides), noteSchema (explicit schema name). Resolves the applicable schema, applies its frontmatter template, merges overrides, writes the note, and lints it. Returns { root, path, frontmatter, lintResult }. Fails if the note already exists. |
| get_backlinksA | Finds all notes linking to a given note. Pass { path }. Returns { root, path, backlinks[] } where each backlink has sourcePath, link, line. |
| find_unlinked_mentionsA | Finds plain-text occurrences of a note's title that are not wikilinked. Pass { path }. Returns { root, path, mentions[] } with sourcePath, mentionText, line, column. |
| find_broken_linksA | Finds wikilinks pointing to non-existent notes. Optional { scope } path prefix. Returns { root, scope, brokenLinks[] } with sourcePath, link, line. |
| find_orphansA | Finds notes with no incoming wikilinks. Optional { scope } path prefix. Returns { root, scope, orphans[] } (array of relative paths). |
| find_bidirectional_mentionsA | Two-direction mention sweep for batch new-note operations. Pass { newNotes, terms?, scope? }. Returns { root, scope, existing_to_new[], new_to_existing[] }. existing_to_new lists plain-text mentions of new-note titles found inside existing notes. new_to_existing lists plain-text mentions of free terms found inside the new notes. If a free term equals a new-note stem, the title classification wins. |