The whole design is about what comes back: a broad search returns about 2.0 KB at 10,000 notes because the result is ranked excerpts, and query_notes answers "which draft notes changed this week?" straight from frontmatter in a few hundred bytes instead of a search-then-read loop. Reading the vault from disk behind a warm in-process index is what makes it quick — 6.2 ms warm at 10,000 notes in the project's own published benchmark — and means Obsidian never has to be open. On the write side, deletes land in .trash/ and every write tool accepts prevHash, so a concurrent edit fails loudly rather than disappearing.
An Obsidian server that reads the vault from the filesystem and keeps a warm full-text index in process, so neither the Obsidian app nor its Local REST API plugin needs to be running. Searches return ranked excerpts instead of whole notes, and the write tools edit sections rather than rewriting files.
- Full-text search with fuzzy and prefix matching, returning ranked excerpts of roughly 200 characters rather than whole notes
- Structured metadata queries — frontmatter key/value predicates, tag, folder, modified time and size — answered as compact rows
- A context pack that assembles ranked excerpts, linked neighbour notes and backlinks for one question inside a byte budget, 2048 by default
- A note read whole, or just a heading section, a block reference, or a line range
- A note's outline — heading tree with offsets, block anchors, frontmatter keys — with no prose at all, for deciding what to read next
- Backlinks from a pre-built reverse-link index with their source lines, and a note's outgoing links marked resolved or unresolved
- Notes created, appended to, and patched section by section instead of rewritten whole
- Frontmatter keys set, changed or deleted without reordering the others or changing quote style
- Find and replace inside a note body, literal or regex, with a dry run available and frontmatter left alone
- A note moved or renamed with every wikilink and markdown link pointing at it rewritten across the vault, and a heading renamed with each [[note#heading]] reference updated
- Deletes that go to the vault's .trash/ by default, with permanent as the explicit opt-out
- prevHash on all nine write tools: a note that changed since you read it produces a hash_conflict error carrying the current hash rather than a silent overwrite
- Daily, weekly, monthly, quarterly and yearly periodic notes resolved from the vault's own config, created from its template and appended to
- Tags listed with usage counts, substring filtering and a minimum-count threshold, nested tags carrying their parent
Node.js 22 or newer, and the absolute path to your vault in SEEKSTONE_VAULT. npx -y seekstone init reads Obsidian's own vault registry to find it and writes the config for Claude Desktop, Claude Code, Cursor or VS Code; the .mcpb bundle installs into Claude Desktop with no Node needed at all. On startup it walks the vault and builds an in-memory index — a few seconds for thousands of notes — then keeps it live as you edit. Nothing leaves the machine. Semantic search is opt-in and takes a one-time model download of about 30 MB, after which it runs offline.
One command — npx -y seekstone
