vault-rag-mcp
Uses Google Gemini embeddings for vectorizing query and document text.
Semantic search across an Obsidian vault, including glossary lookup and note retrieval.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@vault-rag-mcp Search my vault for notes on react hooks"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
vault-rag-mcp
MCP server for semantic search in an Obsidian Second Brain vault, using a self-hosted Qdrant vector store and Google Gemini embeddings.
Architecture
Claude Code <-> vault-rag MCP server (stdio)
|-> Google Gemini gemini-embedding-001 (native 3072d)
|-> Qdrant `vault_chunks` collection (3072d, Cosine distance)Part of a hybrid RAG architecture:
Indexation: n8n (remote) + Google Gemini API
Local queries: This MCP server + Google Gemini API
Web chat: n8n Vault Chat (AI Agent + Gemini native) or Chat Hub (HTTP pipeline)
Bulk index: Script using Gemini
gemini-embedding-001
Same model (gemini-embedding-001, native 3072d) everywhere ensures vector compatibility.
Vectors are stored at native 3072 dimensions (float32) with Cosine distance.
Asymmetric task types: RETRIEVAL_DOCUMENT for indexing, RETRIEVAL_QUERY for search.
Related MCP server: mcp-obsidian-local
Tools
Tool | Description |
| Semantic search across the entire vault (query, limit, para_folder, note_type) |
| Search within glossary definitions (3_Resources/definitions/) |
| Retrieve full content of a note by file path |
Prerequisites
Python >= 3.11
uv package manager
Google API key (for Gemini embeddings)
Qdrant instance with a
vault_chunkscollection (created automatically on first index)
Setup
# Clone and install
cd ~/Projects/vault-rag-mcp
uv sync
# Configure environment
cp .env.example .env
# Edit .env with your Google API key and Qdrant credentialsEnvironment variables
Variable | Description | Default |
| Qdrant instance URL (HTTPS requires the | (required) |
| Qdrant API key | (required) |
| Google AI API key | (required) |
| Gemini embedding model |
|
Usage
As MCP server (Claude Code)
Add to your project's .mcp.json:
{
"mcpServers": {
"vault-rag": {
"command": "uv",
"args": ["run", "--directory", "/path/to/vault-rag-mcp", "vault-rag-mcp"],
"env": {
"QDRANT_URL": "https://your-qdrant-instance.example.com",
"QDRANT_API_KEY": "your-qdrant-api-key",
"GOOGLE_API_KEY": "your-google-api-key",
"EMBEDDING_MODEL": "gemini-embedding-001"
}
}
}
}Restart Claude Code to activate. Then use the tools directly in conversation.
Bulk indexation
Script to index an entire Obsidian vault via Google Gemini:
uv run python scripts/bulk_index.py /path/to/vault [--force]Options:
--force: Re-index all files, ignoring file_hash cache
The script:
Walks the vault, skips
.obsidian/,templates/,.trash/, files > 500 KBParses YAML frontmatter (type, tags, PARA folder)
Chunks by H2 sections, splits oversized chunks (> 2000 chars)
Embeds via Google Gemini in batches of 50 (task_type=RETRIEVAL_DOCUMENT)
Upserts to Qdrant with a SHA256 file_hash payload for incremental re-runs
After initial bulk indexation, incremental updates are handled by n8n via Gemini API.
Project structure
vault-rag-mcp/
├── pyproject.toml # uv + hatch build config
├── .env.example # Environment template
├── src/
│ └── vault_rag_mcp/
│ ├── __init__.py
│ ├── server.py # MCP server (FastMCP, stdio) — 3 tools
│ ├── embeddings.py # Google Gemini embedding client (native 3072d)
│ └── qdrant_store.py # Qdrant client + collection operations
├── scripts/
│ └── bulk_index.py # Bulk indexation via Google Gemini
└── n8n-workflows/ # n8n workflow definitions
├── vault-rag-github-indexation.json
└── vault-rag-chat-hub.jsonQdrant collection
Collection vault_chunks — vectors at 3072 dimensions, Cosine distance. Each point carries:
content— chunk textfile_path— relative path from vault rootchunk_index— position within filepara_folder— PARA folder (1_Projects, 2_Areas, etc.)note_type— frontmatter type (memo, glossary, howto, etc.)file_hash— SHA256 for change detectionmetadata— tags, type, para_folder
Point IDs are deterministic UUID5 values derived from file_path::chunk_index.
Payload indexes: file_path (keyword), para_folder (keyword), note_type (keyword), chunk_index (integer).
Tech stack
MCP SDK:
mcp[cli]withFastMCP(stdio transport)Embeddings: Google Gemini
gemini-embedding-001via thegoogle-genaiSDK (native 3072d, multilingual, 2048 token/text)Vector DB: Qdrant (self-hosted) —
vault_chunkscollection, 3072d Cosine distanceBuild: uv + hatch
Available Tools
3 toolsget_noteA
Retrieve the full content of a specific note by its file path.
Args: file_path: Path relative to vault root (e.g. '3_Resources/definitions/p/powerflex.md')
Inputs: file_path (required). Returns: result
search_glossaryB
Search the glossary (1878 term definitions in 3_Resources/definitions/).
Args: query: Term or concept to look up (works in French and English) limit: Maximum number of results (default 5)
Inputs: query (required), limit. Returns: result
search_vaultA
Search the vault semantically. Returns the most relevant notes.
Args: query: Natural language search query (works in French and English) limit: Maximum number of results (default 10) para_folder: Filter by PARA folder (1_Projects, 2_Areas, 3_Resources, 4_Archives) note_type: Filter by note type (memo, glossary, howto, meeting-note, etc.)
Inputs: query (required), limit, note_type, para_folder. Returns: result
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 3 tools
Each tool has a clearly distinct purpose: retrieving a specific note by path, searching the glossary, and performing semantic search across the vault. No overlap in functionality.
All tool names follow the consistent verb_noun pattern with snake_case: 'get_note', 'search_glossary', 'search_vault'. No deviations.
With 3 tools, the set is on the lower end but appropriate for a read-only RAG server. It covers the essential retrieval operations without being too sparse.
The tool set covers all core retrieval needs (exact note lookup, glossary search, semantic vault search). Minor gaps exist, such as listing available folders or note types, but filters in search_vault mitigate this.
Maintenance
Related MCP Connectors
Hosted MCP server for Obsidian Sync vaults: read, search, edit notes. Not affiliated with Obsidian.
1Personal knowledge base MCP server with semantic search, auto-categorization, metadata extraction
Self-hosted AI workspace: semantic RAG document search, long-term memory, and AI chat via MCP.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceMCP server that indexes Obsidian notes and enables hybrid search (full-text, fuzzy, semantic) for AI assistants to find and read notes.1,272 npm121MIT
- FlicenseNot gradedqualityNot gradedmaintenanceLocal MCP server to access Obsidian vault via the obsidian-local-rest-api, with semantic search and project memory using Ollama embeddings.-
- AlicenseNot gradedqualityDmaintenanceSelf-hosted MCP server that provides embedding-powered semantic search with graph context over Obsidian vaults, supporting multiple vaults, local embeddings, and a web dashboard.MIT
- AlicenseNot gradedqualityDmaintenanceA read-only MCP server that enables semantic search of your Obsidian vault using Smart Connections embeddings, with path validation and security.43 npm3MIT