Qdrant RAG Build
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Qdrant RAG BuildUse setup wizard to create RAG collection from my PDFs, then run a hybrid search with citations."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Qdrant RAG Build
The Qdrant MCP server that builds a full RAG pipeline through conversation.
Unofficial, community-built — not affiliated with or endorsed by Qdrant.
The official Qdrant MCP server exposes 2 tools (qdrant-store, qdrant-find). Qdrant RAG Build exposes 33 tools across 6 namespaces — a production-grade RAG system managed entirely through an MCP conversation — plus a conversational setup wizard that takes a user from zero to a working, well-configured RAG collection in one chat, no documentation required.
Elevator pitch: "Connect your AI to Qdrant and have a production-grade RAG running in one conversation." Not another Qdrant wrapper — RAG-in-a-box via MCP.
Package: qdrant-rag-build-mcp · License: Apache-2.0 · Status: planning complete, implementation not started.
Table of contents
Related MCP server: RAG Knowledge Base MCP Server
1. Vision and market gap
Thesis: today, connecting an LLM to Qdrant via MCP gives you a toy semantic memory. No collection management, no file ingestion, no hybrid search, no rerank, no citations, no guided configuration. All of that exists in bespoke enterprise RAG systems — nobody has packaged it as an MCP server you install in one command.
Capability | Official Qdrant MCP | Qdrant RAG Build |
Tools | 2 ( | 33, organized in 6 namespaces |
Collection management | Implicit auto-create only | Create with presets, aliases, snapshots, payload indexes |
File ingestion | No — raw text only | PDF, DOCX, XLSX, PPTX, MD, HTML, CSV, TXT, URL, directories |
Chunking | No | Structural, per format, with configurable presets |
Search | Simple dense | Dense + sparse with RRF fusion, filters, rerank, MMR, multi-query |
Citations | No | Stable citation contract (doc, page/section, score) |
Guided setup | Environment variables | Conversational wizard that provisions everything |
Clients | stdio (local Claude) | stdio + remote HTTP — Claude Code, Claude Desktop, and claude.ai (v1); ChatGPT is v2 |
2. Locked decisions
Scope. Full retrieval + Qdrant management + very high-quality ingestion of common formats (PDF, DOCX, Excel, PPTX, MD, HTML, CSV, URL). Clean, RAG-optimal content is the project's signature.
Target clients. v1 is the full Claude family: Claude Code, Claude Desktop, and claude.ai (web). Code and Desktop are stdio, local, and close to one-click install (§3). claude.ai needs remote HTTP by protocol necessity (a browser can't spawn a local process) — but that's a modest addition, not a new category of work: the official SDK already speaks streamable HTTP, and v1 only needs a bearer token, not full OAuth 2.1 (§3), plus one deployment guide for reaching a public HTTPS URL. ChatGPT stays out of v1. Unlike claude.ai it requires Developer Mode (an explicit risk warning to accept) and a paid plan, with no free tier at all — friction that doesn't serve "prioritize Claude," so it's deferred to v2.
Project goal. An outstanding open-source tool: portfolio centerpiece and GitHub-authority engine. Documentation, CI, and DX quality are not optional — they are the product.
Out of scope (v1). PST/email ingestion, heavy OCR, NER/entity extraction, server-side LLM generation (the client is the LLM), a bespoke UI. Each exclusion is justified in §11.
3. Architecture
One Python binary, three clean layers. The MCP server is a thin facade; all logic lives in a testable core with no MCP dependency (which also unlocks a future CLI or SDK without touching anything).
flowchart LR
subgraph Clients
CC[Claude Code / Desktop<br/>stdio]
WEB[claude.ai<br/>HTTPS + bearer token]
end
subgraph QRB["Qdrant RAG Build"]
T[Transport<br/>stdio · streamable HTTP]
F[MCP facade<br/>33 tools · validation]
CORE[RAG core<br/>ingestion · retrieval · wizard]
EMB[Embeddings<br/>local fastembed · external APIs]
end
Q[(Qdrant<br/>local · cloud)]
CC --> T
WEB --> T
T --> F --> CORE
CORE --> EMB
CORE --> QTechnical decisions
Area | Decision | Why |
Language | Python 3.12 + | Mature RAG ecosystem; deep domain expertise; |
MCP framework | Official MCP SDK, | Same code serves stdio (Code, Desktop) and streamable HTTP (claude.ai); maintained by the MCP project itself. The SDK renamed |
Dense embeddings | Two local tiers via fastembed — | Both natively supported in fastembed today, zero extra dependency, multilingual. |
Sparse embeddings | BM25 / miniCOIL via fastembed | Hybrid search with no extra infrastructure; native fusion via the Qdrant Query API |
Rerank | Local cross-encoder via fastembed; Cohere Rerank and | Never assume a runtime "already has" rerank — a lesson paid for in production (§11) |
Parsing | PyMuPDF, python-docx, openpyxl, python-pptx, trafilatura | Fast, no system binaries, pip-installable on any OS |
Config | Versionable YAML profiles ( | The wizard writes profiles; users can edit, version, and share them |
Distribution | PyPI ( | Three real v1 install paths — |
Why the wizard is a state machine, not MCP elicitation. Elicitation support varies across MCP clients and SDK versions, including within the Claude family. A plain state machine driven by ordinary tools works identically everywhere, requires no special capability to be present, and carries over unchanged if v2 adds clients with different elicitation support. Locked regardless of transport scope.
v1 authentication decision. Full OAuth 2.1 for MCP (authorization server, PKCE, Dynamic Client Registration / Client ID Metadata Documents, issuer validation, refresh tokens) is real, multi-week engineering work with no budget in v1 — and claude.ai's own connector setup treats OAuth as an optional advanced field, not a requirement. v1 ships a static per-profile bearer token for the HTTP path: generated by the wizard, stored in the profile YAML, sent as
Authorization: Bearer <token>. stdio (Code, Desktop) needs no auth at all — it's a local process with no network exposure. Full OAuth 2.1 stays a documented v2 upgrade, revisited if/when ChatGPT (whose ecosystem leans harder on it) comes into scope.
Deployment model: one user, one server
MCP does not connect a server "to the AI" in the abstract — it connects to the client application that hosts the model (Claude Desktop, Claude Code, claude.ai). That client is what keeps the connection alive, hands the model the list of available tools, intercepts the model's tool-call decisions, and executes them against the server. To the end user this reads as "I'm talking to Claude and it manages my Qdrant" — a fair simplification — but the client, not the model, is what's actually wired to the server.
There is no shared/multi-tenant server in v1 scope. Each user runs their own server, and the same local process serves all three v1 clients:
Claude Code / Claude Desktop: the server runs as a local stdio child process on the user's own machine, launched by the client from its config. Real filesystem access, scoped to allowlisted directories — standard MCP stdio behavior, nothing this project has to build.
claude.ai: the same local process, exposed over HTTPS through a tunnel (
cloudflared) or a small always-on host (a $5 VPS, Fly.io, Railway) running the same Docker image — not a separate cloud deployment or a shared server. Filesystem access is identical to the local case when it's the user's own tunneled machine; only the transport reaching it differs. Available on every claude.ai plan, including Free (one connector).Consequence:
ingest_directory/ingest_filebehave the same across all three clients, as long as the user's own server (and, for claude.ai, the tunnel) is running. No file-upload machinery needed anywhere — the server always has direct disk access by construction.Installing it, once:
Claude Desktop: drag one
.mcpbfile into Settings → Extensions. Zero terminal.Claude Code:
claude mcp add qdrant-rag-build -- uvx qdrant-rag-build-mcp. One line.claude.ai: Settings → Connectors → Add, paste the server's HTTPS URL and bearer token. Needs the server (and tunnel, if using the laptop recipe) already running first — same as any remote MCP connector, by protocol necessity, not a choice this project made.
From there, the wizard makes configuring the RAG fully conversational — creating collections, choosing embeddings, ingesting documents, searching — with zero further technical steps, on any of the three.
v2: ChatGPT (deliberately still out)
ChatGPT needs the same remote-HTTP shape as claude.ai — nothing new there technically. What keeps it out of v1 is friction specific to ChatGPT itself: Developer Mode must be explicitly enabled (with a warning about running third-party code), and custom connectors require a paid plan (Plus/Pro/Business/Enterprise/Edu) — there is no ChatGPT Free path at all, unlike claude.ai's free-tier-inclusive connectors. None of that serves "prioritize Claude." v2 adds a ChatGPT-specific connector guide and, if it turns out to matter, revisits full OAuth 2.1 (ChatGPT's ecosystem leans harder toward it than claude.ai's does).
4. Tool catalog
The heart of the project. Six namespaces, predictable names, descriptions written for the LLM (when to use a tool, not just what it does). Every destructive tool requires explicit confirmation, and a global read-only mode exists.
Collections
Tool | What it does |
| Creates a collection with presets (dense, hybrid, multi-tenant); named vectors + sparse configured correctly by default |
| Inventory of all collections |
| Detail: schema, size, index config, optimization status |
| Two-step confirmation delete (exact name required as argument) |
| Aliases for zero-downtime reindexing (blue/green pattern) |
| Payload indexes for filters declared by the wizard or the user |
| Collection backup |
| Collection restore |
Ingestion
Tool | What it does |
| Direct text with metadata — the "semantic memory" use case of the official MCP, done properly |
| Single file (PDF, DOCX, XLSX, PPTX, MD, HTML, CSV, TXT); returns an ingestion quality report |
| Recursive batch with glob/exclusions; creates a job with queryable progress |
| Web page → clean main content (trafilatura), no boilerplate |
| Job progress: files done/failed/skipped, reconciled counters |
| Inventory by source document |
| Delete/re-ingest a single document without touching the rest |
Search
Tool | What it does |
| Dense semantic search with optional payload filters |
| Dense + sparse with native RRF fusion (Query API with prefetch) — the recommended default |
| Hybrid + cross-encoder over the top-N; maximum precision |
| Several reformulations (generated by the client LLM) fused into one ranking |
| Points similar to a given one |
| Recommendation with positive/negative examples (native Qdrant API) |
RAG context
Tool | What it does |
| The centerpiece: search + dedup + MMR + token budget → formatted context block with numbered citations, ready for the client LLM to answer with |
| Neighboring chunks of a result (previous/next in the same document) for continuity |
| Full source document (or a page/section range) behind a citation |
Wizard
Tool | What it does |
| Starts the setup session; returns the first question with options and a recommendation |
| Records the answer, validates it (does Qdrant respond? does the API key work?), returns the next question |
| Executes the agreed plan: collection + indexes + profile + smoke test; returns a final report |
| Lists saved profiles |
| Activates a saved profile (demo, work, project X…) |
Admin
Tool | What it does |
| Qdrant connectivity, embedding model loaded, version, active transport |
| Points, documents, disk size, distribution by source/type |
| Before ingesting: estimated chunk count, storage, embedding API cost if applicable |
| Effective configuration of the active profile (secrets masked) |
5. The conversational wizard
The differentiator. A state machine on the server: every tool call returns the next question with its options and a reasoned recommendation; the client's LLM relays it to the user naturally and passes the answer back. No elicitation, no dependency on any specific client — the conversation is the interface.
stateDiagram-v2
direction LR
[*] --> Discover
Discover --> Validate : setup_answer
Validate --> Discover : next question
Validate --> Summary : all answered
Summary --> Apply : user confirms
Apply --> SmokeTest
SmokeTest --> [*] : report + saved profileQuestion script (fixed order, recommendation on every step)
# | Question | What it decides |
1 | What are you putting into the RAG? (personal docs / team KB / technical docs / notes) | Chunking preset and payload schema |
2 | Where is your Qdrant? (local docker / Qdrant Cloud / don't have one yet) | Connection; if "don't have one," one-command docker instructions and re-validation |
3 | Local embeddings or API? (local fast / local quality / OpenAI / Cohere / Ollama) | Dense provider and speed/quality tier; API key validated on the spot if applicable |
4 | Corpus language(s)? | Confirms multilingual model choice and sparse analyzer |
5 | Hybrid search? (recommended: yes) | Sparse vector in the collection schema |
6 | Rerank? (local / API / no) | Cross-encoder and its latency cost, explained honestly |
7 | What filters will you use? (date, author, type, folder…) | Payload indexes created by default |
8 | Collection and profile name | Naming + profile file |
Wizard success definition. A user who has never seen Qdrant, in a conversation under 10 minutes, ends up with: a well-schematized collection, working embeddings, a saved profile, one example document ingested, and a test search returning cited results. The smoke test's final report is the proof — and a recording of that conversation is the README's cover.
6. Ingestion pipeline
The quality signature: clean, RAG-optimal content, per format, with a quality report on every ingestion. Never "dump whatever the parser spits out."
Format | Parser | Quality treatment |
PyMuPDF | Correct reading order, repeated header/footer detection and removal, tables converted to Markdown, text-quality pre-flight (valid-character ratio) before accepting a page | |
DOCX | python-docx | Heading hierarchy preserved as a metadata breadcrumb; structured lists and tables |
XLSX | openpyxl | Per sheet; data regions detected; rows serialized with their headers ("Product: X · Price: Y") — never raw CSV |
PPTX | python-pptx | Per slide: title + body + speaker notes |
MD / HTML | native / trafilatura | Chunked by headings; for web pages, main content only (no nav, cookies, footers) |
CSV / TXT | stdlib | CSV as header-labeled rows; TXT by paragraph with a token window |
Cross-cutting rules
Structure first, tokens second. Cut along document structure (section, sheet, slide) first, and only subdivide by token budget (with overlap) when a unit exceeds it. Every chunk carries a breadcrumb ("Manual › Chapter 3 › Installation").
Dedup by normalized content hash at the chunk level, plus per-document idempotency: re-ingesting a file updates it, never duplicates it.
Minimal, versioned citation contract. The citation payload (document, page/section, date, source) is a closed field set. Internal pipeline metadata never reaches the LLM's context — this project has twice paid for the bug where metadata bloat truncates the actual sources (§11).
Always report ingestion results. Chunks created, pages discarded for quality and why, duplicates detected. Transparency is part of quality.
Text sanitization (surrogates, control characters, broken encodings) before embedding — learned the hard way from real-world PST files.
7. Elite retrieval
Hybrid by default: dense (multilingual embeddings) + sparse (BM25/miniCOIL) with native RRF fusion via the Qdrant Query API (prefetch + fusion) — no extra infrastructure.
Optional rerank with a cross-encoder over the top-50 → top-N. Local via fastembed, or API (Cohere, llama.cpp's
/v1/rerank).MMR for diversity, reusing the vectors Qdrant already returns (
with_vectors=true). Never re-embed during retrieval — that mistake caused a real production OOM in this project's predecessor.First-class payload filters: date (well-bounded ranges, end-of-day inclusive in
lte), source, type, author — over indexes created by the wizard.get_contextas the flagship tool: orchestrates hybrid → rerank → MMR → token budget → formatted block with numbered citations [1][2]. Hard guarantee: only what actually made it into the context gets cited — never phantom sources.Generation stays on the client. The server never calls an LLM: it delivers the best possible context and the user's own model (Claude, GPT) writes the answer. This keeps the server cheap, fast, and free of mandatory third-party API keys.
8. Quality and evals
Golden corpus in the repo: 15–20 varied documents (PDF with tables, a real spreadsheet, a noisy web page) + ~50 questions with annotated relevant chunks.
Retrieval metrics in CI: recall@k, MRR, and nDCG over the golden corpus, with thresholds that break the build on regression. Dense vs. hybrid vs. hybrid+rerank published in the docs — the numbers sell the project.
Layered tests: unit tests for the core with no Qdrant dependency, integration tests against Qdrant in a container (testcontainers), and e2e tests of the MCP protocol using the SDK's test client. Torture files per format (scanned PDF, Excel with merged cells, garbage HTML).
Compatibility matrix verified per release: Claude Code, Claude Desktop, and claude.ai, documented with screenshots. ChatGPT joins this matrix in v2.
9. GitHub authority
For the portfolio goal, the repository is the product as much as the code. Launch checklist:
A README that converts. A recording of the wizard building a RAG in one real conversation (vhs/asciinema), a 3-line
uvxquickstart, badges (CI, coverage, PyPI, license), a comparison table against the official MCP, and published benchmarks.A landing page. A dedicated, polished static page — separate from the README and the docs site — with a hero, the comparison table against the official Qdrant MCP, the wizard demo recording, install CTAs for all three v1 clients, and F5's benchmark numbers. This is what the launch post and social links point to.
Documentation. An mkdocs-material site: a guide per client (Claude Code, Claude Desktop, claude.ai — including the bearer-token connector walkthrough), a cookbook ("RAG over your own docs," "team memory"), a complete reference for all 33 tools, public ADRs.
Visible engineering. CI with ruff + mypy strict + pytest + coverage, automated semver releases (release-please), CHANGELOG, issue/PR templates, CONTRIBUTING, Code of Conduct, GitHub Discussions enabled.
Distribution and launch. PyPI + Claude Desktop
.mcpbbundle + Docker image + compose stack (Qdrant included). Listed on the official MCP registry, Smithery, Glama, PulseMCP, and awesome-mcp-servers. Launch: a technical write-up + Show HN + r/LocalLLaMA + X, with the wizard recording as the hook.
10. Development phases
Side-project pace (evenings/weekends). Every phase ends in something demonstrable — never two phases open at once.
Phase | Focus | Duration | Definition of done |
F0 | Spec and skeleton | ~1.5 weeks | Repo + CI + package structure. JSON schemas for all 33 tools frozen and reviewed (design all 33 up front, even if implemented in later phases). ADRs for the §3 decisions. |
F1 | Qdrant core | ~2 weeks | Full collections namespace, |
F2 | Professional ingestion | ~3 weeks | All 8 formats with their quality treatment, structural chunking, dedup, jobs with progress, ingestion reports. A mixed folder of 100 real documents ingested cleanly, with a faithful report (reconciled counters) and idempotent re-ingestion. |
F3 | Elite retrieval | ~2 weeks | Hybrid RRF, rerank, MMR, filters, |
F4 | Wizard | ~2 weeks | State machine, live validation of every answer, |
F5 | Quality and observability | ~1.5 weeks | Eval suite in CI with thresholds, |
F6 | Launch | ~2.5 weeks | Full docs, a polished landing page, README with demo recording, PyPI + |
Total: ~14.5 weeks (~3.5 months) at a realistic side-project pace, with demonstrable milestones every two weeks to keep momentum.
11. Inherited lessons and risks
The quiet competitive advantage: this plan inherits errors already paid for in a real enterprise RAG system handling terabytes of data. Every lesson is baked into the design from day one, not patched in later.
Lesson paid for | How Qdrant RAG Build bakes it in |
MMR that re-embedded during retrieval caused a real production OOM | MMR always reuses the vectors Qdrant returns; embedding in the search path is forbidden |
Internal metadata bloated the payload until it truncated the actual sources (twice, for different reasons) | Closed, versioned citation contract; pipeline metadata never reaches the LLM's context |
Assumed the local runtime "had rerank" — it never worked, and the fallback hid it | Rerank is explicit per verifiable provider; |
Threads + fork in the same process → a real ingestion deadlock | Ingestion concurrency with a single model (async + worker process); never mix |
Jobs marked "completed" at 40% because the child process died silently | A job is only |
OCR would hang for 45s only to discard the document anyway | Cheap quality pre-flight before any expensive work; per-document time budgets |
NER quality turned into endless domain-specific whack-a-mole | NER is out of scope for v1 — a decision, not an oversight |
Open risks
Risk | Mitigation |
Scope creep — the temptation to rebuild the entire enterprise RAG | The "out of scope" list in §2 is contractual; any addition requires removing something else or justifying a v2 |
Remote-deployment friction for claude.ai (tunnel or always-on host is one more moving part than local stdio) | Local stdio (Code, Desktop) stays the happy path and needs zero of this; claude.ai's setup is one guided doc page, and it's the only remote client v1 needs — no Developer-Mode/paid-plan complexity, unlike ChatGPT |
Excluding ChatGPT narrows v1's audience to the Claude ecosystem | Deliberate trade-off, not an oversight: claude.ai already covers the "remote, no-install" audience on every plan including Free; ChatGPT's Developer-Mode-plus-paid-plan gate adds real friction without expanding v1's reach much further — revisit in v2 once the core is proven |
| v1 does not depend on it — uses |
MCP protocol or Qdrant Query API changes | Always-current official SDK; per-release compatibility matrix; thin facade = small surface for change |
33 tools saturate the client's context | Descriptions optimized for tool-choice conciseness; per-profile tool sets (e.g. hide admin tools in daily use) |
Abandonment from lack of time (risk #1 of every side project) | Phases of ≤3 weeks with a demo at the end; F1 alone is publishable as "the official MCP, but better" if everything else slips |
12. Name, license, and first step
Name: Qdrant RAG Build (package qdrant-rag-build-mcp) — chosen to stay close to this repository's own working name instead of an invented brand. Naming went through two earlier rounds: Quiver was dropped for colliding with the unrelated "Quiver Quantitative" MCP namespace (bolshchikov/quiver-mcp, pipeworx-io/mcp-quiver, jsconiers/quiver-quant-mcp); Vectorsmith was verified clean but overridden by an explicit preference to keep the name recognizable against the repo. That means accepting the trade-off the original plan had flagged — a "qdrant"-prefixed name can read as an official Qdrant project — mitigated by stating "unofficial, community-built" plainly in the README tagline and docs site. The literal slug qdrant-rag-mcp is already an active, unrelated project (ancoleman/qdrant-rag-mcp) and was deliberately avoided; qdrant-rag-build / qdrant-mcp-rag-build are verified clean on PyPI and GitHub (August 2026).
License: Apache-2.0 — same as Qdrant, with a patent grant, the license enterprises reading your profile expect to see.
First concrete step: F0 starts by writing the JSON schemas for all 33 tools before a single line of server code. The catalog in §4 is the spec; freezing it first avoids mid-flight redesigns and produces a publishable design document from week one.
References: qdrant/mcp-server-qdrant (official server, 2 tools) · fastembed PR #602 (bge-m3 support, open) · MCP Bundles (.mcpb) toolkit · Custom connectors using remote MCP (claude.ai) · v2 reading: ChatGPT Developer Mode, MCP and connectors in OpenAI
Plan v1.3 · locked 2026-08-24 · v1 covers the full Claude family (Code, Desktop, claude.ai — stdio + bearer-token HTTP); ChatGPT specifically deferred to v2 for its own Developer-Mode/paid-plan friction, not a technical constraint shared with claude.ai. Written with lessons learned from the IA_EmailsContext enterprise RAG project as a reference.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables RAG (Retrieval-Augmented Generation) capabilities with document processing, vector storage, and intelligent Q\&A using OpenAI embeddings and semantic search.
- FlicenseNot gradedqualityCmaintenanceEnables searching a knowledge base and asking grounded questions with hybrid retrieval, reranking, and cited answers.
- AlicenseNot gradedqualityCmaintenanceAutomated RAG pipeline optimization and serving. It interviews users, builds and evaluates candidate configurations on their data, and registers the best ones as a fleet queryable via MCP.MIT
- FlicenseNot gradedqualityCmaintenanceEnables document Q&A and knowledge retrieval through hybrid semantic and keyword search, with tools for document ingestion, chunking, summarization, PII redaction, and RAGAS-based evaluation.
Related MCP Connectors
Search your knowledge bases from any AI assistant using hybrid RAG.
A personal RAG database you build from chat, so AI creates work that sounds like you.
Long-term memory for AI assistants. Hybrid retrieval, query expansion, auto-topics.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/avaazquezz/RAG-Build'
If you have feedback or need assistance with the MCP directory API, please join our Discord server