Changelog

Shipping, continuously.

Every Seekstone release, straight from GitHub — this page rebuilds automatically on each publish. Current version: v0.18.0.

v0.18.0

Latest

Minor Changes

  • 5ff12c1: One-click semantic search (SHA-309): every release now ships a second MCP Bundle, seekstone-semantic.mcpb, with the local embedding model packed inside the extension and semantic search enabled out of the box — no terminal, no Node.js, and nothing downloaded at runtime. The model ships as sub-cap shards (Claude Desktop rejects any packed file over ~108KB) that the server reassembles into the standard cache location at boot, verified against the same pinned SHA-256 hashes fetch-model uses; the zero-network guarantee is unchanged and now also covers the reassembly path in no-network.test.ts.

Patch Changes

  • e1da45b: fix(semantic): pair the embedding cache's manifest with the binary it describes, so a manifest left beside another build's binary is rejected instead of mapping every note to another note's vectors. Existing caches are invalidated once by the version bump and re-embedded on next boot.
  • f02995d: docs: republish the benchmark figures on the fixture-v2 baseline (SHA-322) — 5.2 ms warm keyword search and ~26 ms shipped semantic search at 10k notes, obsidian-tc at ~514× — and check every published number in CI against the committed benchmarks.json, generated from the harness baselines.
View on GitHub

v0.17.2

Patch Changes

  • f095146: Bump transitive qs to 6.16.0 (via @modelcontextprotocol/sdk → express), resolving GHSA-4mjr-xmp4-gh2g (DoS via attacker-controlled isBuffer) and GHSA-x5fp-wj9c-mxmx (array-limit bypass via bracket-key comma parsing).
  • d75c9d8: Cold index build no longer quadratic on link-heavy vaults. resolveLink used to scan every indexed note for each non-exact wikilink target, making backlink indexing O(links × notes) — ~17 minutes on a 10k-note vault with 131k links. Loose resolution now goes through basename/path lookup maps built once per index build (and once per watcher event), bringing that same build to seconds. Resolution precedence is unchanged (exact → +.md → basename → path-without-extension); ambiguous targets (duplicate basenames) now resolve deterministically to the lexicographically smallest note path instead of depending on index insertion order.
View on GitHub

v0.17.1

Patch Changes

  • 9670b2a: chore: bump picomatch to ^4.0.7
  • fe96c45: chore: bump zod to ^4.5.4
View on GitHub

v0.17.0

Minor Changes

  • fdb0a61: Structured audit logging. Set SEEKSTONE_AUDIT_FILE and every write-tool call — successful or refused — appends one JSON-line record: tool, vault-relative paths, sha-256 before/after (the same values read_note returns as contentHash, so records are verifiable against the vault), outcome (ok, hash_conflict, undo_conflict, policy_denied, error), duration, and op metadata such as replacement counts, link-rewrite counts, or the .trash/ destination. When the write journal is on, each record carries the journal seq it committed, so a row indexes straight into list_writes / undo_write. Records never contain note content, frontmatter values, or search queries (frontmatter records list key names only), so the file is safe to share. Records are fsync'd after the vault write commits; the file rotates to <file>.1 past SEEKSTONE_AUDIT_MAX_SIZE (default 10 MB); an unwritable audit path fails boot, and a failed append reports the call as a structured audit_failed error rather than a clean success. Documented as Write-Safety guarantee 10 with jq recipes in the README.
  • 76d8fdd: Semantic and hybrid search now rerank the top-50 candidates with a static late-interaction MaxSim stage: per query token, the max cosine over the winning chunk's token vectors (IDF-weighted over the candidate set) is fused with the stage-1 score. Recovers discriminating terms that mean-pooling dilutes — dev-split semantic hit@5 70.4% → 85.2% with lexical routing untouched, no new dependencies, and no embedding-cache format change. Core gains maxsimScore/maxsimScoreAll/maxsimScoreTokens, candidateSetIdf, and per-token vector access (TokenEmbedder) on the Model2Vec loader.
  • 45f0bc7: Opt-in bigger embedding model for semantic search. npx -y seekstone fetch-model --model potion-retrieval-32M downloads the 512-dim potion-retrieval-32M model (~129 MB, SHA-256-verified like the default), and SEEKSTONE_SEMANTIC_MODEL=potion-retrieval-32M selects it at boot. On the committed 10k-note benchmark it lifts description-style queries noticeably over the shipped potion-base-8M at roughly 2× the (still tens-of-milliseconds) query latency. The default stays potion-base-8M; per-vault embedding caches are keyed on model id + dimension, so switching models re-embeds cleanly and switching back reuses the existing cache. An unknown model id is a clear boot/fetch error; a selected-but-not-fetched model gets the existing actionable error naming the exact fetch command.
  • 9aeb027: Every write is now reversible. Before any write tool changes a byte, it journals the pre-image of every file it is about to touch under <vault>/.seekstone/history/ (content-addressed, fsync'd before the write commits). Two new tools: list_writes lists the journal (seq, timestamp, tool, paths, undoable — metadata only) and undo_write restores a write byte-for-byte — a multi-file move_note or rename_heading is restored whole (the note and every link rewrite), and a delete_note is restored even if it was permanent: true. An undo after an external edit is refused with a structured undo_conflict unless force: true (the clobbered state is journaled first, so nothing is lost); undo is itself journaled, so undo_write({ seq }) on an undo entry redoes it. New env vars: SEEKSTONE_HISTORY=0 disables the journal, SEEKSTONE_HISTORY_MAX_SIZE (default 50 MB) and SEEKSTONE_HISTORY_MAX_ENTRIES (default 1000) cap retention — evicted entries stay listed as undoable: false. .seekstone/ is excluded from indexing and search like .trash/; add it to your vault's .gitignore. Tool count is now 21 (11 read, 10 write); read-only mode keeps list_writes and removes undo_write.

Patch Changes

  • f01db39: SemanticStore accepts a chunk-pooling strategy (default unchanged: max); the returned excerpt span is always the note's best chunk regardless of pooling. No behavior change for users — the SHA-313 dev-split eval found no pooling that improved retrieval without a matching loss, so the shipped ranking is untouched (writeup committed under the harness baseline reports).
View on GitHub

v0.16.0

Minor Changes

  • 4f9bdfc: SEEKSTONE_WATCH_POLL=1 no longer stat-polls every file in the vault every 50ms — that hardcoded interval could pin ~20–25% of a CPU core per running instance on the network/WSL/9p mounts polling exists for (#280, reported by @phizz82). The default poll interval is now 10s (binary files 20s), and a new SEEKSTONE_WATCH_POLL_INTERVAL env var (milliseconds) tunes it. Note this only affects how quickly external edits are picked up under polling mode — seekstone's own writes still update the index immediately, and native (non-polling) watching is unchanged.
View on GitHub

v0.15.2

Patch Changes

  • f5d6925: Fix Windows breaking basename wikilink resolution, backlinks, and path lookups for notes in subdirectories (#268). The vault scan stored platform-native path.relative() output as the index key, so on Windows a nested note was keyed Projects\Core.md while wikilink resolution, the file watcher, and MCP client paths all assume forward slashes — [[Core]] never resolved, get_backlinks returned zero, and every path-keyed tool lookup missed. Index keys are now forward-slash vault-relative paths on every platform.
View on GitHub

v0.15.1

Patch Changes

  • dd883a9: Fix the .mcpb extension crashing at startup (ERR_MODULE_NOT_FOUND: chunk-*.js). tsup's ESM code splitting (default-on) emitted separate chunk files for the dynamic import() introduced with semantic search in 0.15.0, and the mcpb pipeline only ships the sharded index.js — the chunks were silently dropped, so the installed extension died on launch. Both builds now set splitting: false, and build-mcpb.mjs fails loudly if the build ever emits more than one file.
  • ea89043: The npm package description now owns both search latencies precisely: single-digit-ms keyword search and ~14 ms local semantic search (previously the unqualified "single-digit-ms search", which was no longer accurate for semantic mode).
  • 2a8adfd: The search tool's advertised schema now matches its behavior: the long-documented excerptLength option (20–2000 characters, default 120) is exposed in the MCP input schema so clients can actually discover and use it, and the tool description's excerpt-size figure is corrected from ~200 to ~120 characters. Search's mode now also appears in info-level logs' safe metadata. The no-network guarantee test additionally proves the semantic subsystem — index build, cache persistence, and semantic/hybrid queries — runs fully offline.
View on GitHub

v0.15.0

Minor Changes

  • c34c9e9: Local semantic search, opt-in and fully offline. With SEEKSTONE_SEMANTIC=1, the search tool gains mode: "semantic" (meaning-based search — a description like "instrument that measures wind speed" finds the Anemometer note even when no words match) and mode: "hybrid" (exact-title lookups stay lexical, everything else goes semantic). Powered by an in-process Model2Vec embedding model downloaded once via the new seekstone fetch-model subcommand — the running server never touches the network, keeping the zero-network guarantee intact. The vault embeds in the background at boot and is cached per-vault (keyed by content hash) so restarts are instant; the file watcher re-embeds changed notes incrementally. Semantic hits return the same lean ranked-excerpt payloads, with excerpts drawn from the matching passage rather than the note head. On the 10k-note benchmark vault, semantic mode answers description-style queries at 70% hit@5 vs lexical's 30%, at ~14 ms warm.
View on GitHub

v0.14.0

Minor Changes

  • 37c395d: Complete compare-and-swap coverage: every write tool now participates. move_note and delete_note accept an optional prevHash guarding the source note — a stale hash fails with the structured hash_conflict error before anything is moved or deleted, so you never destroy content you haven't seen. Every mutating result now returns a contentHash: move_note returns the hash of the (unchanged) bytes at the new path, delete_note the hash of the deleted content (byte-identical to the .trash/ copy when recoverable), and replace_in_note returns the unchanged hash on dry runs and zero-match calls — so chained edits never need a re-read. The write-safety harness's cas-conflict op now also drives the move and delete guards.
View on GitHub

v0.13.1

Patch Changes

  • 87dc5b2: Advertise explicit MCP safety annotations for every tool so clients can distinguish read-only, additive, destructive, idempotent, and closed-world operations.
View on GitHub

v0.13.0

Minor Changes

  • e722330: New write tool rename_heading (19 tools): 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 and block refs (#^id) left alone, same-note anchors ([[#heading]]) included. Referencing notes come off the warm backlink index (no vault scan). Heading matching is case-insensitive and first-match-wins, mirroring Obsidian link resolution. Supports the optional prevHash compare-and-swap guard, and reports links/notes rewritten plus any notes skipped by SEEKSTONE_WRITE_PATHS.

Patch Changes

  • 4b2f3a2: YAML-aware frontmatter link extraction: wikilinks split across lines by scalar folding (hand edits, other tools, or files written by pre-0.12.1 versions) now extract correctly into the backlink index, get_links, and context_pack. The frontmatter block is parsed as YAML and its string values walked, instead of regexing raw lines; malformed frontmatter falls back to the previous per-line behavior. Links inside multi-line scalars are attributed to the line where the scalar begins, and YAML keys are no longer scanned for links.
View on GitHub

v0.12.2

Patch Changes

  • 1ad6028: Documentation accuracy sweep: npm description now says 18 tools; replace_in_note is correctly documented as replacing all occurrences by default (literal/regex, whole-word, limit, dry-run); compare-and-swap docs name the six participating edit tools; SEEKSTONE_LOG_MAX_SIZE added to the configuration tables; SECURITY.md rewritten for recoverable deletes, the full 8-tool write surface, read-only mode, and write scoping; llms.txt and REGISTRIES.md updated to current benchmark claims. No code changes.
  • e2c5926: Harden the vault sandbox: path containment now uses a single shared guard (resolveVaultPath) with a proper separator-boundary check, replacing 13 inline startsWith checks that accepted paths escaping into sibling directories whose names share the vault's prefix (e.g. vault /home/u/vault + path ../vault-backup/x.md). The vault root is also normalized with resolve() at startup so a relative or trailing-slash SEEKSTONE_VAULT can't weaken the boundary, and absolute-path inputs are now contained instead of concatenated.
View on GitHub

v0.12.1

Patch Changes

  • d24cb4d: Refresh the npm-facing README to current messaging: 18 tools (adds query_notes and context_pack to the tables), recoverable .trash/ deletes, compare-and-swap edits, the Write-Safety Contract, SEEKSTONE_READ_ONLY / SEEKSTONE_WRITE_PATHS configuration, and current benchmark numbers replacing the retired pre-launch figures. No code changes.
  • 8286529: Stop folding long frontmatter scalars. create_note and patch_frontmatter passed no lineWidth to the YAML serializer, so values past 80 columns were wrapped across lines with a trailing \. The output is valid YAML and round-trips, but link extraction runs per line, so a wikilink split that way became invisible to the backlink index, get_links and context_pack — a patch touching one key could silently drop a link declared under another.
View on GitHub

v0.12.0

Minor Changes

  • 2642435: Add context_pack — one-call, byte-budgeted context assembly for answering a question about the vault. Returns ranked excerpts (with inline scalar frontmatter), backlink/outlink neighbor notes with one-line summaries, and overflow source refs for follow-up reads, all hard-capped at a caller-set byte budget (default 2048, never exceeded). Replaces the search → read → get_backlinks round-trip loop with a single payload, and reports explicit totalMatches + confidence so an empty or thin pack is never mistaken for coverage.

Patch Changes

  • 3961616: Bump picomatch from 2.3.2 to 4.0.5 (write-path glob matching; call-site API unchanged).
View on GitHub

v0.11.1

Patch Changes

  • d428aa3: Bump @modelcontextprotocol/sdk from 1.29.0 to 1.30.0.
View on GitHub

v0.11.0

Minor Changes

  • 543a5d9: Guarded writes: read_note (and every mutating tool) now returns a contentHash (sha-256 of the note's disk bytes), and the edit tools — append_note, patch_note, patch_frontmatter, replace_in_note, append_periodic_note, plus create_note with overwrite: true — accept an optional prevHash for compare-and-swap: if the note changed since it was read, the write fails with a structured hash_conflict error carrying the current hash instead of silently discarding the concurrent edit. Returned hashes chain, so multi-step edits need no re-reads. All write paths now also go through one shared crash-safe temp-file+rename helper — previously only patch_note and replace_in_note wrote atomically.
  • 3e9d25c: Recoverable deletes: delete_note now moves the note to the vault's .trash/ folder (Obsidian-compatible, restore by moving it back) instead of permanently removing it; name collisions get a timestamp suffix, and the tool result says where the note went. Pass permanent: true for the old unlink behavior. Also fixes a gap where a deleted note's outgoing links stayed registered in the backlink index.
View on GitHub

v0.10.0

Minor Changes

  • fd1e03a: Read-only mode and write-path scoping. SEEKSTONE_READ_ONLY=1 unregisters the 8 write tools from the tool list (and rejects them at dispatch if called anyway — get_periodic_note's createIfMissing side-effect is also neutralized). SEEKSTONE_WRITE_PATHS takes comma-separated vault-relative globs (e.g. journal/**,inbox/*.md) and restricts writes to matching paths. Both are enforced at the dispatch layer plus a shared assertWritable check in every write handler, so a new tool can't forget the check.
  • e6092c3: Link-aware moves: move_note now rewrites wikilinks, embeds, and relative/vault-absolute markdown links in other notes that pointed at the moved note, so a move or rename no longer orphans it in the graph. Links that still resolve after the move (unchanged, unambiguous basename) are left byte-identical; aliases, #fragments, embed prefixes, and %20/<...> encodings are preserved; fenced code blocks are skipped. The tool reports how many links in how many notes were updated, rewriteLinks: false restores the old move-only behavior, and referencing notes outside SEEKSTONE_WRITE_PATHS are skipped and reported rather than blocking the move. Also fixes a pre-existing gap where the moved note's own outgoing links stayed registered in the backlink index under its old path.

Patch Changes

  • b82c6ef: seekstone init now errors on an unknown --client value instead of silently configuring Claude Desktop — agents running the one-prompt install get a clear failure they can relay. Docs gain a copy-pasteable agent install prompt (README + llms.txt), and llms.txt catches up to the 17-tool surface (adds query_notes).
  • 227fe6c: seekstone init --help (and -h) now prints the init subcommand's usage — its --vault, --client, and --write flags — instead of ignoring the flag and running the init flow (vault auto-detection). Help flags after init were previously swallowed by init's own argument parsing.
View on GitHub

v0.9.1

Patch Changes

  • ac99ba5: Watcher teardown is now awaitable: stop() returns chokidar's close promise instead of fire-and-forgetting it, so embedders and tests can wait for the watcher (and its polling timers) to fully shut down. Also deflakes CI: the harness's copyVault scratch destinations are created atomically with mkdtemp (the old millisecond-timestamp naming could collide under parallel test workers), and the watcher tests self-heal missed single-create polling ticks on Windows.
  • a8414b8: npm description now matches the README wedge: no plugin, no running Obsidian app, filesystem-direct with single-digit-ms search and ~2 KB payloads across 17 tools. Replaces the stale pre-benchmark-refresh "575×" phrasing.
View on GitHub

v0.9.0

Minor Changes

  • aa0a6c3: seekstone init --client vscode — auto-detect your vault and print or (with --write) create/merge the workspace .vscode/mcp.json for GitHub Copilot in VS Code, handling VS Code's config quirks (servers key instead of mcpServers, explicit "type": "stdio"). Same additive merge + backup behavior as the other client writers. init now also resolves relative --vault paths to absolute before writing any client config, so the spawned server always finds the vault regardless of the client's working directory.
View on GitHub

v0.8.0

Minor Changes

  • 0bb43fc: seekstone init --client cursor — auto-detect your vault and print or (with --write) patch ~/.cursor/mcp.json, with the same additive merge + backup behavior as the Claude Desktop writer. Cursor joins Claude Desktop and Claude Code as a first-class documented client.
  • 04271ed: New query_notes tool — a second search mode alongside full-text search. Filter notes by frontmatter key/value predicates (eq, ne, contains, exists, missing, gt/gte/lt/lte), tag, folder, modified time, and size, with sort, field selection, and limit. Returns compact rows (path + title by default; opt into frontmatter keys or mtime/size/tags via select) — never note content — so a full 10k-note vault scan costs ~350 bytes of context.
View on GitHub

v0.7.2

Patch Changes

  • 8c5ddb7: Add npm keywords for the adjacent discovery clusters Seekstone was absent from: claude-code, second-brain, chatgpt, cursor, connect-claude-to-obsidian, mcp-server.
View on GitHub

v0.7.1

Patch Changes

  • cdf659a: Consolidate on the canonical npm name seekstone. The obsidian-mcp-seekstone discoverability alias is deprecated: its README is now a migration notice, and all install docs point at npx -y seekstone. Existing alias installs keep working. This is the alias's final release.
View on GitHub

v0.7.0

Minor Changes

  • a61612c: feat(search): slim the search payload below mcpvault, add a tunable excerpt length

    search results are now leaner with no loss of usable information: the response is minified, score is rounded to 2 decimals, and title/tags are omitted when redundant (title equals the path basename) or empty — both remain optional on each hit. A new excerptLength parameter (default 120, min 20 / max 2000) lets callers trade match context for an even smaller payload.

    On the committed 10k-note fixture this drops the mean search payload to ~2 KB, making seekstone the smallest payload of every benchmarked Obsidian MCP server (below mcpvault at every vault size) while staying the fastest on latency.

View on GitHub

v0.6.3

Patch Changes

  • 0a192cc: fix(mcpb): shard the bundle under Claude Desktop's ~108KB per-file install cap

    The .mcpb one-click install silently broke as of v0.4.0: Claude Desktop's local install preview rejects a bundle if any single file exceeds ~108KB, and the fully-bundled dist/index.js is ~1.7MB. The bundle is now split into <95KB shards that a small loader reassembles at startup, so the install dialog appears again. A build-time guard fails the build if any packed file exceeds the cap.

View on GitHub

v0.6.1

Patch Changes

  • d1a7fb1: Bump chokidar from 4.x to 5.x (bundled dependency — no API surface change for consumers).
  • 3bafa80: Bump zod from 3.x to 4.x (bundled dependency — no API surface change for consumers).
  • d2ac3d5: Fix watcher silently dropping all events on Windows when the vault path contains 8.3 short names (e.g. RUNNER~1). chokidar's followSymlinks: true expands short paths to long form via realpath(), causing relative() to produce .. segments that the dot-directory filter incorrectly matched. Now resolves the vault root via realpathSync at startup so path comparisons are consistent.
  • 2cda8b8: Bound replace_in_note's find parameter to 1000 chars at the schema boundary, capping the size of any caller-supplied pattern in regex: true mode (ReDoS / self-DoS guard). Also converts an internal new RegExp(constant.source) in the link extractor to a direct regex literal — behavior-neutral, removes a per-line allocation, and clears a Codacy non-literal-RegExp false positive.
  • 2d9588f: Add a process-level unhandledRejection guard to the server entrypoint. A stray unhandled promise rejection now logs to stderr and the long-lived stdio session stays up (preserving the in-memory index) instead of crashing the user's MCP session. uncaughtException is intentionally left to Node's default crash behaviour.
View on GitHub

v0.6.0

Minor Changes

  • dd136ae: Add get_periodic_note and append_periodic_note tools for filesystem-direct access to daily, weekly, monthly, quarterly, and yearly periodic notes. Reads folder/format/template config from .obsidian/daily-notes.json and the periodic-notes plugin data.json with moment.js-compatible date tokens. No running Obsidian required.

Patch Changes

  • 0d7e2d1: Add HTML reporter to server vitest coverage config so --coverage runs generate an interactive report at coverage/index.html.
  • 95c6f0b: Sync manifest.json version to 0.5.0 (was left at 0.3.0 after changeset release) and ignore the mcp-publisher binary from git.
View on GitHub

v0.5.0

Minor Changes

  • c430b48: Add replace_in_note tool — literal and regex find/replace within a note body. Supports case-insensitive matching (default), whole-word boundaries, capture-group backreferences in regex mode, a replacement limit, and a dry-run preview mode. Frontmatter is never touched.

Patch Changes

  • c3d3cda: Fix serverInfo.version in MCP handshake — was hardcoded to "0.1.0" instead of using the build-time version constant. MCP clients that surface server metadata now see the correct version.
View on GitHub

v0.4.1

Patch Changes

  • 3e47cd8: Fix serverInfo.version in MCP handshake — was hardcoded to "0.1.0" instead of using the build-time version constant. MCP clients that surface server metadata now see the correct version.
View on GitHub

v0.4.0

Minor Changes

  • 3ec5e67: Add five new tools, read_note range selectors, and Claude Code init support

    New tools:

    • list_tags — lists every tag across the vault with per-tag note counts
    • outline_note — returns the heading structure of a note as a nested tree
    • patch_note — replaces a specific section of a note's body without rewriting the whole file
    • get_links — returns all wikilinks and embeds in a note with resolved vault-relative paths and line numbers
    • get_backlinks — returns all notes that link to a given note, with line numbers and optional excerpts; backed by a reverse-link index built at startup and maintained incrementally by the file watcher

    read_note range selectors:

    Three new optional selectors narrow the response to a sub-region of the note: section (by heading name), block (by block reference ^id), and lines ({ from, to }). Only one selector may be used per call. The response includes a span: { charStart, charEnd } field for the selected range.

    seekstone init — Claude Code support:

    seekstone init --client code --write now auto-writes the MCP config directly into Claude Code's settings file, with the same timestamped-backup safety as the Desktop variant.

Patch Changes

  • 3ec5e67: Fix watcher ignored-path guard and MCPB bundle crash

    • Watcher: guard against empty relative paths in the ignored callback. Paths that resolved to an empty string (e.g. the vault root itself during chokidar's initial scan) could be evaluated incorrectly, risking file events being missed on some configurations.
    • MCPB: fully bundle all dependencies to fix an Error: require('process') is not supported crash on ESM environments. Also improves the vault picker description and bumps the bundle to manifest v0.4.
View on GitHub

v0.3.0

Minor Changes

  • f6f6770: Auto-detect the Obsidian vault in seekstone init

    When --vault is omitted and SEEKSTONE_VAULT is not set, seekstone init now reads Obsidian's own vault registry (obsidian.json) to find known vaults automatically. One vault → auto-selected and validated. Multiple vaults → lists them numbered with a --vault re-run hint. Registry missing/malformed → falls back to the existing "pass --vault" guidance.

  • f2c6d7c: Ship Seekstone as a one-click MCP Bundle (MCPB)

    Adds a seekstone.mcpb build artifact that lets non-developers install Seekstone in Claude Desktop with a double-click and a vault directory picker — no terminal, no JSON editing required. The bundle packages dist/index.js and manifest.json into a 15 KB zip. CI attaches it to every GitHub Release.

    The npx -y seekstone path is unchanged.

View on GitHub

v0.2.2

Patch Changes

  • 26267bd: Add mcpName field required by the official MCP registry for package ownership verification.
View on GitHub

v0.2.1

Patch Changes

  • 326ccf3: Add the mcp-name package field (io.github.shaqmughal/seekstone) so the package can be verified and listed in the official MCP registry.
View on GitHub

v0.2.0

Minor Changes

  • 6a15f9a: Add CLI conveniences for setup and inspection:

    • seekstone init — validate an Obsidian vault and print the Claude config to paste, or patch the Claude Desktop config in place with --write (creates a timestamped backup and never touches your other MCP servers). Supports --vault, --client desktop|code.
    • seekstone --version and seekstone --help.
View on GitHub

v0.1.0

Minor Changes

  • d0a6a98: Initial public release of the Seekstone MCP server — a filesystem-direct Obsidian vault server with low context-tax.

    • Reads the vault directly from disk (no Obsidian app or Local REST API plugin required), returning small payloads instead of multi-megabyte responses.
    • 8 tools over stdio: search, read_note, list_notes, create_note, delete_note, move_note, append_note, patch_frontmatter.
    • In-memory MiniSearch full-text index, kept in sync by a cross-platform (chokidar) file watcher; SEEKSTONE_WATCH_POLL=1 for network drives / WSL.
    • Structured leveled logging to stderr with an opt-in JSON-lines file (SEEKSTONE_LOG_LEVEL, SEEKSTONE_LOG_FILE); never writes to stdout.
    • Runs on macOS, Linux, and Windows (Node.js ≥ 22). Install with npx -y seekstone.
View on GitHub