mcp-trove-crunchtools
Self-hosted local file indexing MCP server with semantic search. Index any local directory (pCloud ~/AutoSync/, rclone mounts, ~/Documents/, anything) and search over the contents using hybrid vector + keyword search.
Features
- Hybrid search — Combines semantic vector similarity with FTS5 keyword matching
- Multiple file formats — PDF, DOCX, Markdown, plain text, source code
- Local-first — No cloud services, no per-seat fees, your data stays on your machine
- Lightweight embeddings — Uses fastembed (ONNX runtime) instead of PyTorch (~22MB vs ~2GB)
- Incremental indexing — SHA-256 checksum-based change detection
- Background mode —
--indexCLI mode for systemd timer automation
Install
uvx (recommended)
uvx mcp-trove-crunchtools
pip
pip install mcp-trove-crunchtools
Container
podman run -v trove-data:/data -v ~/Documents:/docs:ro quay.io/crunchtools/mcp-trove
Claude Code Integration
claude mcp add mcp-trove-crunchtools -- uvx mcp-trove-crunchtools
Tools (10)
Search (2)
| Tool | Description |
|---|---|
trove_search |
Hybrid semantic + FTS5 search. Returns ranked chunks with file paths, scores, and content. |
trove_similar |
Find files similar to a given indexed file using its average embedding. |
Index Management (3)
| Tool | Description |
|---|---|
trove_index |
Index a specific file or directory. Skips unchanged files (checksum-based). |
trove_reindex |
Force re-index ignoring checksums. If no path given, reindexes everything. |
trove_remove |
Remove a file or directory from the index. |
Status (5)
| Tool | Description |
|---|---|
trove_status |
Index statistics: total files, chunks, disk usage, model info. |
trove_list |
List indexed files with metadata (size, type, chunk count). |
trove_get_chunks |
Show the text chunks for a specific indexed file. |
trove_log |
Activity log of indexing runs: start/finish times, file counts, errors. Persisted in SQLite, survives container crashes. |
trove_quality |
Per-file error tracking from indexing runs: which files failed, why, and whether a later index resolved it. |
Environment Variables
| Variable | Default | Description |
|---|---|---|
TROVE_DB |
~/.local/share/mcp-trove/trove.db |
SQLite database path |
TROVE_PATHS |
(none) | Directories to index in background mode, separated by : (; on Windows) |
TROVE_INDEX_WORKERS |
20 |
Concurrent embedding workers |
TROVE_INDEX_BATCH |
50 |
Files per indexing batch |
TROVE_EMBEDDING_MODEL |
BAAI/bge-small-en-v1.5 |
fastembed model name |
TROVE_EXCLUDE_PATTERNS |
*.iso,*.zip,... |
Glob patterns to skip |
TROVE_CHUNK_SIZE |
1000 |
Characters per text chunk |
TROVE_CHUNK_OVERLAP |
200 |
Overlap between chunks |
TROVE_PDF_MAX_PAGES |
5 |
Pages indexed from the start of each PDF, enough to tell what the document is about while keeping memory flat on large manuals; 0 or negative indexes every page |
TROVE_MAX_TEXT_CHARS |
5000000 |
Characters of extracted text kept per file; the rest is dropped with a warning so one huge document cannot flood a batch with chunks; must be positive, other values fall back to the default with a warning |
TROVE_VISION_MAX_CALLS_PER_RUN |
3000 |
Vision API calls one index run may make; images and videos past it are deferred to the next run, not failed. 0 means no limit |
TROVE_VISION_PDF_SCANS |
false |
Caption the first page of scanned PDFs through the vision backend. Sends an image of the page to the provider, so it is opt-in |
TROVE_VISION_FALLBACK_MODEL |
(none) | OpenRouter only: a second model tried when the first is rate limited. Unset by default, since the usual fallback costs more |
TROVE_REQUIRE_MOUNT |
(none) | Mount point the index paths live on. --index checks it is mounted and answers a listing within 30 s before indexing, and fails the run otherwise |
TROVE_MAX_EXTRACT_TIMEOUTS |
5 |
Timed-out file extractions after which a run aborts as a hung source |
TROVE_BACKUP_DIR |
<db dir>/backups |
Where --index keeps a daily VACUUM INTO copy of the database |
TROVE_BACKUP_KEEP |
3 |
Daily database copies kept; 0 disables backups |
TROVE_STATUS_FILE |
<db dir>/last_run.json |
Summary of the last --index run, for monitoring |
TROVE_VISION_BACKEND |
none |
Vision captioning backend: gemini, openai, openrouter, ollama, or none to disable |
TROVE_VISION_MODEL |
per backend | Vision model. Defaults to gemini-2.5-flash, gpt-4o-mini, google/gemini-3.1-flash-lite (openrouter) or llava depending on the backend; empty when disabled |
TROVE_VISION_PROMPT |
(see below) | Caption prompt sent with each image |
TROVE_VISION_TIMEOUT |
120 |
Seconds allowed per vision API call |
Image and video captioning is off until TROVE_VISION_BACKEND is set. The
openrouter backend reads OPENROUTER_API_KEY_FILE or OPENROUTER_API_KEY,
handles video as well as images, and only routes to zero-retention providers. The
default caption prompt is:
Generate a concise caption for this image suitable for search indexing. Include: what you see, location if identifiable, time of day, any readable text or signs.
Background Indexing
Set up a systemd timer to keep your index fresh:
TROVE_PATHS=~/Documents:~/AutoSync mcp-trove-crunchtools --index
An --index run is built to be left alone:
- Each file is stored in one transaction, so a run killed part way (OOM, reboot) leaves no half-indexed file behind.
- Before indexing, it runs
PRAGMA quick_check, keeps a daily backup, marks runs abandoned for more than 12 hours asaborted, and probesTROVE_REQUIRE_MOUNT. - A path aborts instead of indexing when its file count falls below half of its last completed run (an unmounted source looks like deleted files), or when extractions keep timing out (a hung source).
trove_reindexon the path overrides the file-count check. - The exit code is
0only when every path completed with no more than 10% of its files failing. Any other outcome exits1, so the systemd unit fails visibly.TROVE_STATUS_FILErecords what happened, path by path. - The database records its embedding model and refuses to open under a different one, because vectors from two models cannot be searched together.
- Vision captions are cached by file content (SHA-256) and vision model, so a renamed or copied photo reuses its caption. A cached caption is kept while its content is indexed and for 90 days after. A file that failed permanently, or 5 times transiently, is not retried until it changes;
trove_reindexon its path retries it. - With
TROVE_VISION_PDF_SCANS=true, a PDF whose first 5 pages hold under 20 characters of text (a scan) has its first page captioned through the vision backend, under the same budget and cache. It is off by default because it sends an image of the page to the vision provider. trove_reindexwith no path re-reads every file, so it requiresforce=true. Cached captions are reused unlessTROVE_VISION_MODELchanged.
License
AGPL-3.0-or-later
Metadata
Release files for mcp-trove-crunchtools 0.11.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| mcp_trove_crunchtools-0.11.0.tar.gz | 266.0 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| mcp_trove_crunchtools-0.11.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 321.7 kB
Release files / mcp_trove_crunchtools-0.11.0.tar.gz
| Download URL | mcp_trove_crunchtools-0.11.0.tar.gz |
|---|---|
| Size | 266.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
e3ac6f919986223ca8b63c0aab3170d449286b3f1f349b43eaa85db65fd5b39f
|
|
BLAKE2b-256 checksum How to use checksums |
9f3a2395ad349dca1bea90214a827248738013b0ee1526e4b76206008221505f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 25, 2026.
Transparency logRelease files / mcp_trove_crunchtools-0.11.0-py3-none-any.whl
| Download URL | mcp_trove_crunchtools-0.11.0-py3-none-any.whl |
|---|---|
| Size | 55.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
e44e6812c7e96430d0c81b71a9e6ec80ca2edfa1f768513a2908802cb9dd0d4a
|
|
BLAKE2b-256 checksum How to use checksums |
691f78788f848141a7c89100da38dc0e6142e381530727e0ad85e1b7898070b0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 25, 2026.
Transparency logSecurity for mcp-trove-crunchtools 0.11.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for mcp_trove_crunchtools-0.11.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 25, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.