append_note
Append text to a note body without touching the frontmatter. Safe for meeting notes, daily logs, and append-only workflows.
Search and edit an Obsidian vault straight off disk — no plugin, no running Obsidian, about 2 KB per search.
LABSCO SUMMARY
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.
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
USE CASES
Hand the question to the context pack and get excerpts, backlinks and neighbouring notes inside a single byte budget.
Search full text with fuzzy matching, then read only the section that matched.
Filter on frontmatter properties, tag, folder and modified time — which drafts moved this week, what is due.
Resolve the daily note from the vault's own configuration, creating it from the template if it does not exist, then append.
Read the outline, then patch that section by heading or block reference without touching the rest of the file.
Move the note or rename the heading and have every reference across the vault rewritten to match.
Read the backlinks from the reverse index with their source lines, and the note's own outgoing links.
Replace inside the body — regex if you need it — with a dry run first, and frontmatter untouched.
Counted once with only startup setup. Other versions, modes or optional credentials may expose a different list.
append_noteAppend text to a note body without touching the frontmatter. Safe for meeting notes, daily logs, and append-only workflows.
append_periodic_noteAppend text to a periodic note (daily, weekly, monthly, quarterly, or yearly). Preserves existing frontmatter exactly. Creates the note first (from template if configured) when createIfMissing is true (default).
context_packAssemble everything needed to ANSWER a natural-language question in one call, under a strict byte budget (default 2048): ranked excerpts, linked neighbor notes (backlinks/outlinks) with one-line summaries, and follow-up source paths. Use search to locate notes and query_notes for metadata filters; use context_pack when you want answer-ready context without multiple round-trips. Empty excerpts with confidence "none" or "low" means the vault lacks coverage — do not infer content.
create_noteCreate a new note at a vault-relative path. Optionally sets frontmatter and body content. Parent directories are created automatically. Fails if the note already exists unless overwrite is true (prevHash may guard the overwrite).
delete_noteDelete a note. By default it is moved to the vault .trash/ folder (recoverable by moving it back); pass permanent: true to remove it outright.
get_backlinksReturn every note that links to the target note, with the source line and an optional excerpt. Results come from the pre-built reverse-link index so this is a fast, pure index lookup. Sort order: source path ascending.
get_linksReturn all outgoing wikilinks and embeds from a note. Each link is marked resolved (with target path) or unresolved. Duplicate targets are de-duplicated; results sorted by line number.
get_periodic_noteGet the path and existence status of a periodic note (daily, weekly, monthly, quarterly, or yearly) for a given date. Reads folder/format config from .obsidian/daily-notes.json (daily) or the periodic-notes plugin data.json. Optionally creates the note from the configured template if it is missing.
list_notesList notes, optionally filtered by folder prefix or tag.
list_tagsList all tags in the vault with usage counts. Supports substring filtering, minimum count threshold, and sort order. Nested tags (e.g. area/work) include a parent field.
move_noteMove or rename a note to a new vault-relative path, rewriting wikilinks and markdown links in other notes that point at it so nothing breaks (links inside fenced code blocks are left alone). Parent directories at the destination are created automatically. Fails if the destination already exists unless overwrite is true.
outline_noteReturn a note's structure — heading tree with offsets, block-reference anchors, and frontmatter key list — without returning any prose. Use this before section reads or patches to discover what sections exist at a fraction of the cost of reading the full note.
patch_frontmatterSet, update, or delete frontmatter keys without reordering existing keys or changing quote style. Pass null as a value to delete a key.
patch_noteSurgically edit a section of a note — targeted by heading or block reference — without rewriting the whole file. Operations: append (add after section), prepend (add after heading line), replace (swap section content). Frontmatter is never touched.
query_notesStructured metadata query — filter notes by frontmatter key/value predicates, tag, folder, modified time, and size. Returns compact rows (path + title by default; opt into more via select), not note content. Use this instead of search when filtering by properties rather than text.
read_noteRead a note or a span of it — by heading section, block reference, or line range. Returns structured JSON with the content, bytes returned, total note size, and a contentHash to pass as prevHash to edit tools for compare-and-swap. Use search or outline_note first to find the right path and section names.
rename_headingRename a heading in a note and rewrite every [[note#heading]] wikilink and embed across the vault so references keep working — aliases preserved, fenced code blocks left alone. Served from the warm backlink index, no vault scan. Heading matching is case-insensitive; with duplicate headings the first match wins, mirroring Obsidian link resolution.
replace_in_noteFind and replace text within a note body. Supports literal and regex search, case sensitivity, whole-word matching, and a replacement limit. Frontmatter is never touched. Use dryRun to preview matches before writing.
searchFull-text search across the vault. Returns ranked excerpts (~200 chars) — not full notes — to minimise context usage. Supports fuzzy matching and prefix search.
BEFORE YOU INSTALL
19 tools when we connected. SEEKSTONE_READ_ONLY=1 removes the nine write tools, leaving 10, and SEEKSTONE_WRITE_PATHS limits writes to globs you allow. search gains semantic and hybrid modes only with SEEKSTONE_SEMANTIC=1 and the model downloaded.
npx on PATH
All 4 documented clients run the server on your machine.
CONTEXT COST
Rated by the size of the 19 tool definitions that ride along on every turn, not by how many there are
INSTALLATION
npx -y seekstone{
"mcpServers": {
"seekstone": {
"command": "npx",
"args": [
"-y",
"seekstone"
],
"env": {
"SEEKSTONE_VAULT": "<YOUR_SEEKSTONE_VAULT>"
}
}
}
}claude mcp add seekstone --env SEEKSTONE_VAULT=<YOUR_SEEKSTONE_VAULT> -- npx -y seekstone{
"servers": {
"seekstone": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"seekstone"
],
"env": {
"SEEKSTONE_VAULT": "<YOUR_SEEKSTONE_VAULT>"
}
}
}
}