Two calls set this apart from the usual local-RAG setup. The dry run tells you what a scan would pull in and why it would skip the rest, which is the check you want before pointing anything at a home directory — dangerous root scans are blocked outright. And after a search, fetching the surrounding chunks or pages means a citation can be verified against the real file instead of trusted. The store stays in a local directory, not a hosted vector database.
A multimodal RAG server that indexes local files with Google's gemini-embedding-2-preview model into a ChromaDB store that never leaves your machine. Unlike text-only local search, one query reaches across modalities; PDFs are rendered page by page as images for the embedding model while extracted text is kept for citations.
- Indexing of a local folder into the store, with wildcard ignore patterns — `index_directory`
- A dry run that shows what would be indexed, grouped by modality and skip reason, before the scan happens — `preview_directory`
- Semantic search with compact filters for scope, path prefix, item type, extension and modality, so a query can be pinned to one folder or one file type — `search_my_documents`
- Neighbouring chunk or page context for a result you already have, for citing the original correctly — `get_result_context`
- Index maintenance: list the indexed roots, sync to pick up new, updated and deleted files with ghost-vector cleanup, and remove a directory — `list_indexed_directories`, `sync_indexed_directories`, `remove_directory_from_index`
- A resource exposing live vector-store statistics — `gemini://database-stats`
A free Gemini API key from Google AI Studio, supplied as `GEMINI_API_KEY`. Python 3.11 or newer and `uv`, since the documented path is `uvx --from git+https://github.com/AlaeddineMessadi/gemini-embedding-2-mcp-server.git@v1.2.1 gemini-embedding-2-mcp` — pin the release tag for a stable install, omit it to track main. The index lives at `~/.gemini_mcp_db`. A Dockerfile is included; mount that directory as a volume so the store survives restarts.
