seekstone
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| SEEKSTONE_VAULT | Yes | Absolute path to your Obsidian vault. | |
| SEEKSTONE_LOG_FILE | No | Absolute path; when set, JSON-line logs are appended here (size-rotated). | |
| SEEKSTONE_LOG_LEVEL | No | Log level: error | warn | info (default) | debug. | |
| SEEKSTONE_WATCH_POLL | No | Set to '1' to stat-poll for changes instead of native OS events. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| searchA | Full-text search across the vault. Returns ranked excerpts (~120 chars, tunable) — not full notes — to minimise context usage. Supports fuzzy matching and prefix search; with SEEKSTONE_SEMANTIC=1, mode "semantic"/"hybrid" searches by meaning via a local embedding model. |
| query_notesA | Structured 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. |
| context_packA | Assemble 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. Retrieval is lexical by default: for a question phrased in words the note itself may not use, pass mode "hybrid" or "semantic", and scope with folder/tag exactly as in search. 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; with folder or tag set, "none" can also mean the filter excluded every match, which totalMatches distinguishes. |
| read_noteA | Read 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. |
| read_notesA | Read up to 20 notes (or spans of them) in one call instead of repeated read_note calls, e.g. the top hits from search, query_notes, list_notes, or get_backlinks. Each item takes the same options as read_note and returns the same fields, in request order. budgetBytes (default 16384) caps the total note text: when the notes exceed it, each is cut to a fair share, marked truncated: true, and keeps noteBytes, so read the rest with read_note. A failing item (missing path, unknown section) returns its own error without failing the batch. contentHash is always the whole file's hash, usable as prevHash. |
| list_notesC | List notes, optionally filtered by folder prefix or tag. |
| list_tagsA | List 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. |
| list_tasksA | List Markdown checkbox tasks as compact structured rows (path, line, state, text, nearest heading) — vault-wide or scoped by note, folder, tag, or modified time. Defaults to open tasks. Custom markers like "/" are single-char states. Rows feed straight into update_task; use this instead of searching for "- [ ]" or reading whole notes. |
| create_noteA | Create 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_noteA | Delete a note. By default it is moved to the vault .trash/ folder (recoverable by moving it back); pass permanent: true to remove it outright. |
| move_noteA | Move 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. |
| rename_headingA | Rename 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. |
| append_noteA | Append text to a note body without touching the frontmatter. Safe for meeting notes, daily logs, and append-only workflows. |
| patch_frontmatterA | Set, update, or delete frontmatter keys without reordering existing keys or changing quote style. Pass null as a value to delete a key. |
| outline_noteA | Return 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_noteA | Surgically 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. |
| get_backlinksA | Return 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_linksA | Return 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. |
| resolve_noteA | Resolve a note reference — a wikilink target, bare note name, path without extension, or frontmatter alias — to canonical vault-relative path(s). Each match carries provenance (path | basename | relpath | alias); matches[0] is exactly what a wikilink with that target resolves to, and ambiguous: true means more than one note matched. Empty matches means the reference resolves to nothing (didYouMean then lists close names). Returns paths only — resolve first, then read_notes. Pure index lookup. |
| replace_in_noteA | Find 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. |
| get_periodic_noteA | Get 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. |
| append_periodic_noteA | Append 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). |
| update_taskA | Set the state of one Markdown checkbox identified by path + line (from list_tasks), rewriting exactly one character — the rest of the file, frontmatter included, stays byte-identical. Pass expectText to guard against the line having changed, and prevHash for full compare-and-swap. Setting the current state again is a success no-op. |
| list_writesA | List recent writes from the journal — every write tool records the pre-image of each file it touches, so any of them can be reverted with undo_write. Returns compact metadata rows (seq, timestamp, tool, paths, undoable), never note content. |
| undo_writeA | Revert a journaled write: restores every file it touched to its byte-identical pre-write state (a multi-file move or heading rename is restored whole; a delete is restored even if it was permanent). Defaults to the most recent undoable write. Refuses with undo_conflict if a file changed since that write, unless force: true. The undo is itself journaled — undo it to redo. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 25 tools
Most tools have crisply distinct purposes, and descriptions actively steer selection (query_notes 'use this instead of search when filtering by properties', context_pack 'use search to locate notes'). The residual overlaps — read_note vs read_notes, append_note vs patch_note's append op vs append_periodic_note, search vs query_notes vs context_pack — are explained but still require reading the descriptions to pick correctly.
Uniform snake_case with a verb-first pattern (list_*, get_*, read_*, create_*, move_*, update_*, patch_*, append_*, delete_*, rename_*) used consistently across notes, tasks, links, periodic notes, and the write journal. The only bare-verb tools (search, undo_write) are self-explanatory and don't break the pattern.
25 tools sits at the heavy end of the range for an Obsidian vault server. Several are convenience variants of one another (read_note/read_notes, search/query_notes/context_pack, append_note/patch_note/append_periodic_note, get_periodic_note), so the surface is broader than strictly necessary even though each tool maps to a real workflow.
Strong lifecycle coverage: read/create/append/move/delete, section and frontmatter patching, full-text and metadata search, task listing/state changes, backlinks/outlinks, periodic notes, and a journaled undo system that covers reverts of every write. Minor gaps remain — no folder-level operations (create/move/delete folders, listing folder structure), no batch multi-note edits, and no template listing despite template-based creation.