Skip to content
Julian S.
All work
2026Solo — engineering

Obsidian MCP

An MCP server that lets an assistant search and edit my notes without the vault ever leaving the machine

An assistant answering a question by reading a note out of the vault through the MCP server, with the source file path shown above the answer

The problem

A vault of notes is only worth as much as your ability to find things in it, and Obsidian's built-in search is strictly keyword — it finds the word you typed, not the thing you meant. Handing the whole vault to a hosted assistant would solve the finding problem by creating a worse one, since those are my notes and they would be sitting on somebody else's disk.

The approach

The vault sits behind a typed MCP tool surface — read, write, structure, graph, history — and the index is a single SQLite file: FTS5 with BM25 for keyword hits, sqlite-vec for semantic ones, embeddings computed on the machine with a multilingual e5 model so no note text goes out over the wire. A chokidar watcher keeps the index honest when I edit in Obsidian directly. Every write is committed to a git journal inside the vault, which is what turns undo from a hope into an actual tool. Interactive clients authenticate over OAuth 2.1 with discovery, dynamic client registration and PKCE; cron jobs use scoped personal access tokens instead.

The result

Runs as a Windows service behind Caddy with automatic TLS, and it is what my assistant talks to whenever it needs something out of my notes. 138 commits over about a week of evenings, which is roughly how long it takes to learn that the hard part of an MCP server is the auth, not the tools.

What mattered

  • Keyword and vector search live in one SQLite file — no separate vector database to run
  • Embeddings run locally, and if the model fails to load search degrades to keyword rather than going down
  • Every write is journaled to git, so undo is a tool the assistant can call
  • OAuth 2.1 with dynamic client registration, plus scoped tokens for clients that cannot do a login flow