MCP server for Obsidian vaults — read, write, search, and surgically edit notes, tags, and frontmatter via the Local REST API plugin. STDIO or Streamable HTTP.
Drift inferred · capture-to-capture
No drift recorded — single capability capture; advisories appear once its surface changes.
tools
-
caseSensitive
when false, match case-insensitively
-
flexibleWhitespace
substitute any run of whitespace in search with \s+. Literal mode only — has no effect when useRegex: true (express it directly).
-
jsonlogic
JSONLogic tree evaluated against path, content, frontmatter.<key>, tags, and stat.{ctime,mtime,size}; custom glob and regexp operators
-
obsidian_append_to_note
Append content to a note. Without section, creates the file if missing. With section, appends to a specific heading, block, or frontmatter field (file must exist).
-
obsidian_delete_note
Permanently delete a note. Elicits human confirmation when the client supports it.
-
obsidian_execute_command
Execute an Obsidian command-palette command by ID. Opt-in via OBSIDIAN_ENABLE_COMMANDS=true.
-
obsidian_get_note
Read a note as raw content, full structured form (content + frontmatter + tags + stat, with optional outgoing links), structural document map, or a single section.
-
obsidian_list_commands
List Obsidian command-palette commands, optionally filtered by nameRegex on display name. Opt-in via OBSIDIAN_ENABLE_COMMANDS=true (paired with obsidian_execute_command).
-
obsidian_list_notes
List notes and subdirectories under a vault path. Recursive walk (default depth 2, max depth 20; 1000-entry cap) with optional extension and nameRegex filters.
-
obsidian_list_tags
List every tag found across the vault with usage counts, including hierarchical parents. Optional nameRegex post-filters the result set.
-
obsidian_manage_frontmatter
Atomic get / set / delete on a single frontmatter key.
-
obsidian_manage_tags
Add, remove, or list tags. Defaults to the frontmatter tags: array; location: 'inline' or 'both' opts into mutating the note body.
-
obsidian_open_in_ui
Open a file in the Obsidian app UI, with failIfMissing and newLeaf toggles.
-
obsidian_patch_note
Surgical append / prepend / replace against a heading, block reference, or frontmatter field.
-
obsidian_replace_in_note
Body-wide search-replace inside a single note. Literal or regex matching with whole-word, whitespace-flexible, and case-sensitivity options; supports capture-group replacement.
-
obsidian_search_notes
Search the vault by text, JSONLogic, or BM25-ranked Omnisearch (when the plugin is reachable). Results paginate via opaque cursors.
-
obsidian_write_note
Create a note, replace a single section in place, or — with overwrite: true — clobber an existing file. Refuses whole-file writes against an existing path by default.
-
omnisearch
BM25-ranked search via the community [Omnisearch](https://github.com/scambier/obsidian-omnisearch) plugin. Supports quoted phrases, -exclusion, path: / ext: filters, typo tolerance, and PDF + OCR cove
-
replaceAll
when false, only the first match is replaced
-
text
substring match with surrounding context windows. contextLength controls characters of context per side of each match (default 100; bump it for more context per hit). Optional pathPrefix filter (text
-
useRegex
treat search as an ECMAScript regex. With useRegex: true, the replacement honors $1 / $& capture-group references.
-
wholeWord
wrap the pattern in \b…\b; works in both literal and regex modes
analyzed v3.2.7 · analyzer v18 · 8h ago
skills & prompt files 2
- agent-rulespackage/AGENTS.md
- agent-rulespackage/CLAUDE.md
shell / exec 1
- shell package/dist/services/obsidian/obsidian-service.js :477
return exec();
network 1
- net package/dist/services/obsidian/obsidian-service.js :9
import { Agent, fetch as undiciFetch } from 'undici';
declared dependencies 13
- @cyanheads/mcp-ts-core@^0.10.6
- @types/js-yaml@^4.0.9
- js-yaml@^4.2.0
- pino-pretty@^13.1.3
- undici@^8.4.1
- zod@^4.4.3
- @biomejs/biome@^2.4.16
- @types/node@^25.9.3
- depcheck@^1.4.7
- ignore@^7.0.5
- tsc-alias@^1.8.17
- typescript@^6.0.3
- vitest@^4.1.8