v3.0.0 — Node.js MCP Server

Your markdown vault, AI-native

Local MCP server for Obsidian and plain-markdown vaults. NVIDIA nemotron-3-embed-1b semantic search, pure-JS int8 vector store, OKF frontmatter, wikilinks, persistent memory, live file watcher.

View on GitHub Read docs

Claude Code config — add to ~/.claude.json

"mdv-mcp": {
  "command": "npx",
  "args": ["-y", "@chirag127/mdv-mcp", "--vault", "C:/path/to/notes"],
  "env": { "NVIDIA_API_KEY": "nvapi-..." }
}
// No key? TF-IDF fallback — works without any API.

What it does

One MCP server, 16 tools, zero cloud dependencies.

Hybrid semantic search

NVIDIA nemotron-3-embed-1b (2048-dim) embeddings merged with TF-IDF via reciprocal-rank fusion. Falls back to TF-IDF if no key.

💾

Pure-JS int8 vector store

On-disk JSON index with int8 quantization — no Python, no FAISS, no server. Just Node.js and a file.

📂

Folder-scoped

Set vault via --vault CLI arg, MCP roots capability, VAULT_ROOT env, or cwd. Clear precedence, validated at startup.

🧠

Persistent memory

Save decisions, insights, and session conclusions. Retrieve them across sessions. Stored locally in .mdv-cache/memories.json.

📋

OKF v0.2 frontmatter

Detect, validate, and enrich Open Knowledge Format frontmatter. Infers type, title, description, tags from content. Apply with apply: true.

👀

Live file watcher

Chokidar watches the vault for adds/changes/deletes. Index stays current without manual reindex.

MCP tools

16 tools registered on the server.

ToolDescription
vault_searchHybrid semantic + keyword search, ranked results with snippets
vault_readRead a file — frontmatter, body, format detection, wikilinks
vault_writeCreate or overwrite a file; auto re-indexes
vault_deleteDelete a file and its index entry
vault_listList markdown files, optional subdir filter
vault_tagsAggregate all tags by frequency
vault_backlinksFind files linking to a given file
vault_frontmatterRead parsed YAML frontmatter only
vault_statsIndex status, vault root, embedding mode
vault_reindexForce incremental re-embed sync
vault_rememberSave persistent memory (decision/insight/todo/bug)
vault_recallRetrieve past memories by query/project/type
vault_memory_statsMemory store statistics
vault_memory_archiveArchive a memory by ID
vault_formatOKF validation + enrichment (apply=true writes back)
vault_wikilinksExtract + resolve [[wikilinks]]

Vault targeting

Precedence from highest to lowest.

PrioritySourceExample
1--vault <path> CLI argnpx @chirag127/mdv-mcp --vault /my/notes
2MCP roots capabilityClient sends roots at initialize
3VAULT_ROOT env varVAULT_ROOT=/my/notes in .env
4cwdWorking directory when server starts