Hybrid retrieval is the day-to-day win: embeddings at markdown-heading granularity fused with keyword ranking, so you get the passage rather than the document. The graph side is what you cannot do by hand — rank the hubs, find the note bridging two topics, trace a link path between two ideas. When an agent edits, run edit_note with dryRun and apply the preview by ID; that is the version of write access worth granting.
A standalone local server over a folder of markdown. It keeps a SQLite index with chunk-level embeddings and a link graph, so it can answer both 'find the passage about X' and 'which notes hold this vault together'.
- search in three modes: hybrid by default, fusing semantic and full-text ranks through reciprocal rank fusion; semantic for paraphrased or abstract questions; fulltext when you know the exact phrase exists
- read_note in brief mode (title, metadata and linked-note titles) or full mode, which reports truncated: true when the body ran past maxContentLength — 2000 characters unless you raise it
- list_notes filtered by directory prefix or frontmatter tag, with unresolved wiki-link stubs excludable
- Graph analytics the Obsidian UI does not offer: connections up to N hops with an optional subgraph, link paths between two notes, Louvain-detected theme clusters, and notes ranked by influence (densely-linked hubs) or bridging (notes joining otherwise separate clusters)
- Writing with a safety net: create_note with frontmatter, edit_note across six modes including append, prepend and a fuzzy replace_window, and a dry-run preview you apply by ID afterwards — previews expire after 5 minutes and fail if the file changed underneath
- link_notes adds a wiki-link with a sentence explaining the connection and records the edge so the analytics pick it up
- move_note rewrites inbound wiki-links in place — bare links, aliases, embeds, and heading or block suffixes all handled; delete_note requires confirm: true
- reindex re-embeds changed notes, prunes orphan stubs and reruns community detection, with a resolution knob for cluster granularity; index_status reports the model, the counts and why the last reindex ran
- With the companion Obsidian plugin installed and Obsidian open on the same vault: the note currently on screen with cursor and selection, Dataview DQL queries, and evaluation of an Obsidian Bases .base file
Node 20 or higher, and VAULT_PATH pointing at the vault — or any folder of .md files, since it reads from disk and Obsidian itself is optional. Everything else has a default: DATA_DIR for the SQLite index and embedding cache, EMBEDDING_PRESET (english, on bge-small-en-v1.5) or EMBEDDING_MODEL for a specific checkpoint, and EMBEDDING_PROVIDER choosing local transformers or a running Ollama at OLLAMA_BASE_URL. Run it with npx -y obsidian-brain@latest server. First boot downloads a ~34 MB embedding model and indexes the vault, so tools can take 30-60 seconds to appear; later boots are immediate. The three Obsidian-live tools additionally need the companion plugin and Obsidian running against the same vault.
Build from source — clone the repository and build it, then point your client at the binary
