by jmilinovich
Provides an open-source MCP server that makes an Obsidian vault searchable and writable from any AI client, supporting hybrid BM25‑vector search, provenance tracking, and auto‑link discovery.
Grove offers a personal, self‑hosted MCP layer over a Git‑backed Obsidian vault. It exposes six core tools (query, get, multi_get, write_note, list_notes, vault_status) via a streamable HTTP endpoint, enabling AI clients such as Claude, ChatGPT, or Cursor to read, search, and write markdown notes while preserving full version history.
git clone https://github.com/jmilinovich/grove.git
cd grove
npm install
export GROVE_VAULT=/path/to/your/vault
export GROVE_API_KEY=$(openssl rand -hex 32) # bearer token for clients
export VOYAGE_API_KEY=YOUR_VOYAGE_KEY # embeddings on write
npx tsx src/server.ts
The server listens on http://127.0.0.1:8420/mcp. Point any MCP‑compatible client at that URL and include Authorization: Bearer <GROVE_API_KEY>.GROVE_VAULT=/path/to/vault ANTHROPIC_API_KEY=YOUR_KEY npx tsx src/discovery-worker.ts
get tool surfaces segment‑level authorship.vault_status returns health metrics, graph clusters, lifecycle digest, and performance counters.Q: Do I need a remote Git host? A: No. The vault is a local Git repository; all commits stay on your machine.
Q: Can I run Grove without authentication?
A: Yes, set GROVE_AUTH=none and bind the server to localhost only.
Q: What embeddings does Grove use?
A: Voyage AI (voyage-4-large) is used for on‑write embeddings; an API key is required.
Q: How is the discovery worker started?
A: It’s a separate process invoked with the same GROVE_VAULT and an Anthropic API key for the extract‑to‑link engine.
Q: Which clients are compatible? A: Any client that implements the Model Context Protocol (MCP), such as Claude, ChatGPT, Cursor, or custom MCP SDKs.
Q: Where are state files stored?
A: Discovery queue, provenance cache, and blame data reside in ~/.grove/state.db by default.
Open-source MCP server that makes your Obsidian vault searchable and writable from any AI client.
Six tools, one git-backed vault, single-user. Claude, ChatGPT, Cursor, or any MCP-compatible client connects and gets structured access — search, read, write-back, graph diagnostics. Your vault stays yours: markdown files in a git repo, versioned forever.
┌─────────────────────────────────────────────────────────┐
│ MCP client (Claude / Cursor / …) │
└──────────────────────┬──────────────────────────────────┘
│ MCP — Streamable HTTP + Bearer
▼
┌─────────────────────────────────────────────────────────┐
│ grove-server │
│ 6 tools · write queue · provenance · discovery │
└──────────────────────┬──────────────────────────────────┘
│
┌──────────┼──────────┐
▼ ▼ ▼
Hybrid Vault Discovery
Search (git) worker
BM25+Vec (extract → link)
About this repo. Grove was a hosted product 2026-04 → 2026-05. The repo you're looking at is the open-source cathedral that came out of it: a personal MCP layer over an Obsidian vault, single-user, self-host. The multi-tenant SaaS layer, autonomous-agent layer, encryption, trails, waitlist, and admin portal have all been stripped. See
RETROSPECTIVE.mdfor the full history.
| Tool | What it does |
|---|---|
query |
Hybrid BM25 + vector + title search with RRF fusion. Returns ranked snippets with URLs. |
get |
Read a note by path or title. Surfaces per-segment provenance (durable vs perishable voice). |
multi_get |
Batch read via glob or comma-separated paths. |
write_note |
Create / update / soft-delete / hard-delete / move a note. Single op or batch (atomic optional). |
list_notes |
List notes matching a pattern. Optional alias resolution. |
vault_status |
Health, history, diagnostics, graph, lifecycle digest, discovery state, perf counters. |
Every write is a git commit. Every commit can carry provenance trailers that the read path surfaces via blame so future readers know what's the user's standing thinking vs an AI's moment-in-time synthesis.
You need:
voyage-4-large)git clone https://github.com/jmilinovich/grove.git
cd grove
npm install
Set the env vars:
export GROVE_VAULT=/path/to/your/vault # absolute path to the git repo
export GROVE_API_KEY=$(openssl rand -hex 32) # your bearer token — keep secret
export VOYAGE_API_KEY=... # Voyage AI key for embeddings
Then start the server:
npx tsx src/server.ts
It listens on http://127.0.0.1:8420/mcp. Point any MCP client at that URL with Authorization: Bearer <GROVE_API_KEY>.
For purely local development you can disable auth:
GROVE_AUTH=none GROVE_VAULT=/path/to/vault npx tsx src/server.ts
Only do this when the listener is bound to localhost.
The discovery worker runs in the background and auto-wikilinks new notes by extracting entities from each write. It's a separate process:
GROVE_VAULT=/path/to/vault \
ANTHROPIC_API_KEY=... \
npx tsx src/discovery-worker.ts
If you don't run it, writes still work — they just don't get auto-linked. The discovery queue + cache live in ~/.grove/state.db and will resume when the worker comes back.
| Var | Required? | Default | Purpose |
|---|---|---|---|
GROVE_VAULT |
yes | $HOME/life |
Absolute path to the vault git repo |
GROVE_API_KEY |
yes (unless GROVE_AUTH=none) |
empty | Bearer token clients must send |
GROVE_AUTH |
no | bearer |
Set to none to disable auth (localhost only) |
GROVE_PORT |
no | 8420 |
HTTP listen port |
GROVE_STATE_DB |
no | ~/.grove/state.db |
SQLite state file (discovery queue, provenance, blame cache) |
GROVE_PUBLIC_BASE_URL |
no | grove://vault |
Prefix used when minting URLs returned by tool calls |
VOYAGE_API_KEY |
for embed-on-write | — | Voyage AI key |
ANTHROPIC_API_KEY |
for the discovery worker | — | Anthropic key for the extract→link engine |
GROVE_INTERNAL_TOKEN |
optional | — | Bearer for the /internal/post-sync-warmup cron hook |
src/
├── server.ts # MCP HTTP server, the 6 tools, bearer-auth gate
├── rest.ts # write / delete / move / batch handlers (git write-queue)
├── write-queue.ts # single-writer mutex per vault
├── hybrid-search.ts # BM25 + vector + RRF fusion over the QMD index
├── embed-single.ts # per-write embed → Voyage AI → QMD index
├── notes-validate.ts # frontmatter validation, hash, serialize/parse
├── provenance.ts # durable/perishable voice, commit trailers
├── blame.ts # per-segment authorship from git blame + trailers
├── discovery*.ts # extract → link engine (auto-wikilinking on write)
├── graph-health.ts # vault health metrics + flags
├── vault-graph.ts # wikilink graph + clusters
├── vault-stats.ts # cached stats for vault_status
├── vault-config.ts # detection + loading of the vault structure
└── db.ts # single SQLite state-db for discovery + provenance + blame
any except at untyped externals.node:http. No Express / Fastify.fetch + crypto.@modelcontextprotocol/sdk, better-sqlite3, zod, yaml).MIT. See LICENSE.
Please log in to share your review and rating for this MCP.
Explore related MCPs that share similar capabilities and solve comparable challenges
by exa-labs
Provides real-time web search capabilities to AI assistants via a Model Context Protocol server, enabling safe and controlled access to the Exa AI Search API.
by perplexityai
Enables Claude and other MCP‑compatible applications to perform real‑time web searches through the Perplexity (Sonar) API without leaving the MCP ecosystem.
by Aas-ee
Provides multi-engine web search and article/content retrieval through an MCP server, command‑line interface, and a reusable local daemon, all without requiring API keys or authentication.
by MicrosoftDocs
Provides semantic search and fetch capabilities for Microsoft official documentation, returning content in markdown format via a lightweight streamable HTTP transport for AI agents and development tools.
by elastic
Enables natural‑language interaction with Elasticsearch indices via the Model Context Protocol, exposing tools for listing indices, fetching mappings, performing searches, running ES|QL queries, and retrieving shard information.
by graphlit
Enables integration between MCP clients and the Graphlit platform, providing ingestion, extraction, retrieval, and RAG capabilities across a wide range of data sources and connectors.
by ihor-sokoliuk
Provides web search capabilities via the SearXNG API, exposing them through an MCP server for seamless integration with AI agents and tools.
by mamertofabian
Fast cross‑platform file searching leveraging the Everything SDK on Windows, Spotlight on macOS, and locate/plocate on Linux.
by spences10
Provides unified access to multiple search engines, AI response tools, and content processing services through a single Model Context Protocol server.
{
"mcpServers": {
"grove": {
"command": "npx",
"args": [
"tsx",
"src/server.ts"
],
"env": {
"GROVE_VAULT": "/path/to/your/vault",
"GROVE_API_KEY": "<YOUR_API_KEY>",
"VOYAGE_API_KEY": "<YOUR_VOYAGE_API_KEY>"
}
}
}
}claude mcp add grove npx tsx src/server.ts