The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Gnosis MCP listing page.
Stop pasting files into context. Your AI agent searches your local docs instead.
5–10× fewer tokens per lookup. 92 % Hit@5 on real dev docs. Zero cloud dependencies.
Quick Start · Documentation · Tools · Configuration · Full Reference
Ingest docs → Search with highlights → Stats overview → Serve to AI agents
search_docs returns ranked, highlighted excerpts — typically 300–800 tokensgnosis-mcp eval), and a chunk-size sweep showing where the quality plateau actually sits.Full side-by-side vs Context7 / docs-mcp-server / mcp-local-rag: gnosismcp.com#compare.
pip install and goGNOSIS_MCP_RRF_K.[reranking] extra with a 22M-param ONNX model. Off by default. Test on your own corpus before enabling — the bundled MS-MARCO reranker hurts dev-doc retrieval in our measurements.ingest-git).md .txt .ipynb .toml .csv .json + optional .rst .pdfrelates_to frontmatter creates a navigable document graphgnosis-mcp ingest --prune removes chunks whose source file was deleted. --wipe for a full reset before re-ingest.gnosis-mcp eval prints Hit@K / MRR / Precision@K in one command, against a bundled fixed fixture setFast. 8.7 ms mean MCP round-trip. Hybrid search p50 < 30 ms on a 700-doc corpus. Keyword QPS scales from 9,463 @ 100 docs to 471 @ 10,000 docs (full numbers).
Finds the right answer. On 558 real dev docs with 25 hand-written golden queries: Hit@5 = 0.92, nDCG@10 = 0.87, MRR = 0.79. On BEIR SciFact (5,183 docs, public retrieval benchmark): nDCG@10 = 0.671 — within 1 % of the Lucene BM25 baseline.
Tokens saved. Each search_docs call returns 200–500 tokens of on-point snippets instead of the 3,000–15,000 tokens a full-file Read would have cost. Track your own with gnosis-mcp savings (v0.12.0+) — the ledger writes to search_access_log on every call and aggregates per tool per --days N:
Typical compression runs 10–60× depending on corpus coverage and query specificity — verify on yours. access_log is on by default; GNOSIS_MCP_ACCESS_LOG=false opts out.
The same ledger answers the other question — what is this corpus being asked, and where does it come up empty — with gnosis-mcp usage (v0.17.4+): calls, the queries that matched nothing, which documents are served most, which have never been served, and which clients are doing the asking.
Reproducible. gnosis-mcp eval runs a bundled retrieval-quality harness locally in one second — but it ingests nine hardcoded sample documents into a temporary database and answers ten bundled queries, so it returns the same numbers for every corpus and is a smoke test, not a measurement of your docs. To score your own corpus, run python tests/bench/bench_real_corpus.py --corpus <docs-root> --golden <golden.jsonl> (the numbers above come from tests/bench/golden-knowledge.jsonl). tests/bench/*.py reproduce every number. Methodology: docs/benchmarks.md.
Rerankers stay off by default. The bundled MS-MARCO cross-encoder drops nDCG@10 by 27 points on dev-docs and adds 400× latency; BGE-reranker-v2-m3 drops it 31 points at 2400×. Test on your corpus before enabling — full write-up: bench-experiments-2026-04-18.
That's it. Your AI agent can now search your docs.
Connect your client — see llms-install.md for copy-paste JSON snippets for Claude Code, Claude Desktop, Cursor, Zed, opencode, Windsurf, VS Code, JetBrains, Cline, and any other MCP client.
Re-organized your docs? gnosis-mcp ingest ./docs --prune re-ingests and removes any DB chunk whose source file no longer exists. --wipe resets the entire index first. Or run gnosis-mcp prune ./docs --dry-run to preview what would be deleted. Pruning only touches documents this root is responsible for: crawled URLs and generated documents (git history) are left alone unless --include-crawled / --include-generated says otherwise.
Want semantic search? Add local embeddings — no API key needed:
Test it before connecting to an editor:
Then wire it into the clients you actually use — one command, no paths to edit:
setup resolves the command path for the machine it runs on instead of the one the README
assumed, and each block it installs is marker-delimited so re-running rewrites it in place. Where
a client does not read the server's own MCP instructions, it also installs the short rule that
gives the agent a reason to prefer gnosis over reading files — a mounted server nobody calls is
the silent failure mode. doctor is the check for that: it reads the access log and tells you
whether a client has really called the server. Details:
docs/cli.md.
gnosis-mcp check is the gate: it exits 0 only when the backend started and the schema the
server needs is present, and it names whatever is missing before exiting 1. Keyword search needs
SQLite FTS5, which is compiled into your Python's SQLite rather than guaranteed by it — check
reports it as FTS5: ready. Anything else: docs/troubleshooting.md.
Multi-arch image, ~140 MB, ships with local ONNX embeddings + REST:
Or use the committed docker-compose.yaml:
Images tagged :latest, :<version>, :<version-minor>, :main, :sha-<sha>. Production
recipes — systemd, reverse proxy, security checklist, upgrades — are in
docs/deployment.md.
Canonical index — every topic is one hop away: docs/overview.md.
The handful most readers need:
GNOSIS_MCP_* env varsAlso in docs/: REST API · embeddings service · how we measure search · reranker experiments · releasing.
Gnosis MCP exposes nine tools and three resources over MCP. Your AI agent calls these automatically when it needs information from your docs:
| Tool | What it does | Mode |
|---|---|---|
search_docs | Search by keyword or hybrid semantic+keyword | Read |
get_doc | Retrieve a full document by path | Read |
get_related | Find linked/related documents (multi-hop, relation type filtering) | Read |
search_git_history | Search indexed git commit history | Read |
get_context | Usage-weighted context summary | Read |
get_graph_stats | Knowledge graph topology: orphans, hubs, relation distribution | Read |
upsert_doc | Create or replace a document | Write |
delete_doc | Remove a document and its chunks | Write |
update_metadata | Change title, category, tags | Write |
The six read tools are always advertised. The three write tools require GNOSIS_MCP_WRITABLE=true — without it they are withdrawn from tools/list entirely, so a read-only client is never handed a tool it cannot call.
| Resource URI | Returns |
|---|---|
gnosis://docs | All documents — path, title, category, chunk count |
gnosis://docs/{path} | Full document content |
gnosis://categories | Categories with document counts |
With embeddings configured, search_docs fuses keyword and semantic results with Reciprocal Rank Fusion and returns a highlight field carrying the matched terms in <mark> tags — that is what keeps a lookup at a few hundred tokens instead of a full file. get_context is the session-start tool: it ranks documents by how often they are actually retrieved, unless GNOSIS_MCP_ACCESS_LOG=false turns tracking off.
Full reference — every parameter, return shape, error, and the graph relation types (related, content_link, git_co_change, git_ref, plus the typed frontmatter edges): docs/tools.md.
Nothing required for SQLite — zero config works. Override via GNOSIS_MCP_* env vars. The four most-asked:
| Variable | Default | Description |
|---|---|---|
GNOSIS_MCP_DATABASE_URL | SQLite auto | PostgreSQL URL (backend auto-detects) or SQLite file path |
GNOSIS_MCP_WRITABLE | false | Enable upsert_doc / delete_doc / update_metadata |
GNOSIS_MCP_EMBED_PROVIDER | unset | local turns on hybrid search (needs [embeddings] extra); or openai / ollama / custom |
GNOSIS_MCP_API_KEY | unset | Optional Bearer auth for every REST endpoint except /health |
The remaining 45 — chunking, search limits, RRF, reranking, crawl, webhooks, column overrides, logging — are documented in docs/config.md.
Backend selection is automatic: set GNOSIS_MCP_DATABASE_URL to a postgresql:// URL and it uses PostgreSQL; leave it unset and it uses SQLite at ~/.local/share/gnosis-mcp/docs.db. Override with GNOSIS_MCP_BACKEND=sqlite|postgres. PostgreSQL setup — gnosis-mcp[postgres], gnosis-mcp init-db, CREATE EXTENSION IF NOT EXISTS vector, then gnosis-mcp embed — is in docs/overview.md.
Semantic search is the one optional add-on most setups want. Local ONNX is the recommended path: zero config, no API key, ~23 MB quantized model (MongoDB/mdbr-leaf-ir, Apache 2.0) auto-downloaded on first run.
Remote providers work the same way via gnosis-mcp embed --provider openai (needs GNOSIS_MCP_EMBED_API_KEY) or --provider ollama. Model choices, dimensions, the OpenAI-compatible POST /v1/embed service, and pre-computed vectors for your own pipeline: docs/embeddings-service.md · docs/config.md.
MCP Registry (feeds VS Code MCP gallery and GitHub Copilot) · PyPI · mcp.so · Glama · cursor.directory
| File | Purpose |
|---|---|
llms.txt | Quick overview — what it does, tools, config |
llms-full.txt | Complete reference in one file |
llms-install.md | Step-by-step installation guide |
All tests run without a database. Keep it that way.
Good first contributions: new embedding providers, export formats, ingestion for new file types (via optional extras). Open an issue first for larger changes.
If Gnosis MCP saves you time, consider sponsoring the project.