lake-of-vectors
Lake of Vectors
Local semantic search over your personal knowledge bases. Index Obsidian notes, SQLite databases, plaintext, and Notion/Confluence (not supported yet) files into ChromaDB, exposed to Claude via an MCP server.
Features
Multiple Publishers: Crawl Markdown directories, SQLite tables, and plaintext files
Semantic Search: Find relevant content by meaning, not just keywords
Local Vectors: Runs entirely on your machine with sentence-transformers
OpenAI Support: Optional OpenAI embeddings if preferred
MCP Server: Integrates directly with Claude Code for seamless querying
Installation
uv pip install -e .Configuration
Copy the example config and adjust paths for your sources:
mkdir -p ~/.config/lake-of-vectors
cp config.example.yaml ~/.config/lake-of-vectors/config.yamlEdit ~/.config/lake-of-vectors/config.yaml:
sources:
- type: markdown
name: my-notes
path: ~/obsidian-vault/Notes/
- type: sqlite
name: knowledge-db
path: ~/knowledge.db
table: notes
content_column: body
metadata_columns: [title, tags]
- type: plaintext
name: misc-notes
path: ~/notes/
embedding:
backend: local
model: all-MiniLM-L6-v2Source Types
Type | Description |
| Recursive crawl of |
| Query a SQLite table with content and metadata columns |
| Recursive crawl of |
Embedding Backends
Local (default): Uses
all-MiniLM-L6-v2via sentence-transformers. No API key needed.OpenAI: Uses
text-embedding-3-smallor another OpenAI model. Requiresapi_keyin config.
embedding:
backend: openai
model: text-embedding-3-small
api_key: sk-...Usage
Sync your sources
lake sync # Sync all sources
lake sync --source my-notes # Sync only one source
lake sync --rebuild # Delete and re-embed everythingCheck status
lake statusStart the MCP server
lake serveClaude Code Integration
Register as a global MCP server using the Claude Code CLI:
claude mcp add -s user lake-of-vectors $(pwd)/.venv/bin/lake serveThe -s user scope makes it available in all sessions. Restart Claude Code after running.
Qwen Code Integration
Register as a global MCP server using the Qwen Code CLI:
qwen mcp add -s user lake-of-vectors $(pwd)/.venv/bin/lake serveThe -s user scope makes it available in all sessions. Restart Qwen Code after running.
To scope it to a single project instead, add a .mcp.json file in the project root:
{
"mcpServers": {
"lake-of-vectors": {
"command": "lake",
"args": ["serve"]
}
}
}Add to your CLAUDE.md:
When answering security questions or searching your personal knowledge, always use lake-of-vectors semantic_search first.CLI Commands
Command | Description |
| Sync all configured sources into ChromaDB |
| Sync a specific source |
| Delete all vectors and re-sync everything |
| Remove stale collections not in current config |
| Preview what would be pruned without deleting |
| Start the MCP server (stdio mode) |
| Show sync status for all sources |
Data
ChromaDB vectors are stored at:
~/.local/share/lake-of-vectors/chromadbArchitecture
┌──────────────────────────────────────────────────────────────────┐
│ lake-of-vectors │
│ │
│ ┌─────────────┐ ┌──────────────────┐ ┌──────────────────┐ │
│ │ Publishers │──▶│ Sync Engine │──▶│ ChromaDB │ │
│ │ │ │ │ │ (on-disk) │ │
│ │ • Markdown │ │ • Chunking │ │ │ │
│ │ • SQLite │ │ • Content hash │ │ one collection │ │
│ │ • Plaintext │ │ diffing │ │ per source │ │
│ └─────────────┘ │ • Embedding │ └────────┬─────────┘ │
│ │ • ChromaDB upsert│ │ │
│ └──────────────────┘ │ │
│ │ │
│ ┌─────────────────────┐ ┌──────────────────┐ │ │
│ │ Embedding Backends │ │ MCP Server │◀───┘ │
│ │ │ │ (stdio) │ │
│ │ • Local │ │ │ │
│ │ (sentence- │ │ • semantic_search│ │
│ │ transformers) │ │ • list_sources │ │
│ │ • OpenAI API │ └──────────────────┘ │
│ └─────────────────────┘ │
│ │
│ CLI: lake sync | lake serve | lake prune | lake status │
└──────────────────────────────────────────────────────────────────┘ License
MIT