grounded-rag-mcp
An MCP server that gives any LLM host grounded, cited retrieval over your own documents — hybrid retrieval (BM25 + dense), cross-encoder reranking, citations, and a built-in eval harness.
Point it at a folder of documents. Your MCP host (Claude Desktop, an IDE, a custom agent) can then
searchandanswerover them — grounded in the real text, with citations, and an honest "not in the documents" path.
Why
Most RAG-over-MCP examples are toys. This one is built production-flavored:
- Hybrid retrieval — BM25 (exact terms) + dense (semantics), fused with Reciprocal Rank Fusion.
- Cross-encoder reranking — precision on the top candidates without blowing latency.
- Grounding + citations — answers cite their sources; if the answer isn't in the docs, it says so.
- Built-in eval — measure retrieval quality (recall@k, MRR, hit-rate), not just vibes.
- Local-first — the default path runs with no external services or API keys.
- Both transports — stdio and Streamable HTTP.
Status
🚧 Early development. Building in public, phase by phase (see PROJECT_REQUIREMENTS.md).
- Phase 0 — scaffold, packaging, CI
- Phase 1 — core retrieval (chunk → embed → BM25 + dense → RRF)
- Phase 2 — MCP server (stdio) with
ingest/search - Phase 3 — rerank + grounding +
answer(via MCP sampling) - Phase 4 — tests, types, docs, resource + prompt
- Phase 5 — Streamable HTTP transport +
evaluate_retrieval - Phase 6 — publish to PyPI
Install
pip install grounded-rag-mcp # lean, local-first default (no torch)
pip install "grounded-rag-mcp[st]" # + sentence-transformers for semantic embeddings & reranking
Tools
| Tool | What it does |
|---|---|
ingest_documents |
Chunk, embed, and index files or raw text into a named collection |
search |
Hybrid / dense / bm25 retrieval, optional rerank, per-stage scores |
answer |
Grounded, cited answer via MCP sampling; refuses when nothing is found |
list_collections |
List collections and chunk counts |
evaluate_retrieval |
hit_rate / MRR / recall@k on labeled cases |
Also exposes a resource (rag://collections) and a prompt (grounded_answer).
Use it with an MCP host (e.g. Claude Desktop)
Add to your host's MCP config:
{
"mcpServers": {
"grounded-rag": {
"command": "grounded-rag-mcp"
}
}
}
Or run it directly:
grounded-rag-mcp # stdio (default, for local hosts)
grounded-rag-mcp --http # Streamable HTTP on 127.0.0.1:8000 (remote / multi-client)
Use the retrieval engine as a Python library
from grounded_rag_mcp.collection import Collection
from grounded_rag_mcp.embeddings import HashingEmbedder
from grounded_rag_mcp.ingest import load_texts
from grounded_rag_mcp.config import RetrievalConfig
col = Collection("kb", HashingEmbedder(dim=512))
col.add(load_texts(["The refund policy allows returns within 30 days of purchase."]))
for hit in col.retrieve("refund policy", RetrievalConfig(top_k=1)):
print(hit.chunk.source, hit.score, hit.stage_scores)
Development
pip install -e ".[dev]"
ruff check . && ruff format --check . && mypy src && pytest -q
See docs/ARCHITECTURE.md, docs/BUILD_STORY.md, and PUBLISHING.md.
License
MIT © Chetan C
Metadata
Release files for grounded-rag-mcp 0.1.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 | Actions |
|---|---|---|---|---|
| grounded_rag_mcp-0.1.0.tar.gz | 34.1 kB | With provenance | Details for grounded_rag_mcp-0.1.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| grounded_rag_mcp-0.1.0-py3-none-any.whl | Python 3 | none | any | Details for grounded_rag_mcp-0.1.0-py3-none-any.whl |
Total release size: 56.3 kB
Release files / grounded_rag_mcp-0.1.0.tar.gz
| Download URL | grounded_rag_mcp-0.1.0.tar.gz |
|---|---|
| Size | 34.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
bc0c81522e0bc7eebe70bd6ffead216f743cae99b428c17f277f8201da50ad97
|
|
BLAKE2b-256 checksum How to use checksums |
28d0c9ed3ccdcb30ea3464cb20096dbd1a140aa8f013c0d55217889bc37a9084
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 Sep 8, 2026.
Transparency logRelease files / grounded_rag_mcp-0.1.0-py3-none-any.whl
| Download URL | grounded_rag_mcp-0.1.0-py3-none-any.whl |
|---|---|
| Size | 22.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
c9588d622a91514695e1b8a8b3b8b0d44ad1bf026cfa4ac5824e94bbea0e2600
|
|
BLAKE2b-256 checksum How to use checksums |
847e305c1c525c78cb88e059398462f5f746e3228ad03d57d9755a8402fe64f8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 Sep 8, 2026.
Transparency logSecurity for grounded-rag-mcp 0.1.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 grounded_rag_mcp-0.1.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 Sep 8, 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.