
Qdrant MCP
io.github.avaazquezzPublished by GitHub account avaazquezzv2.12.0Updated Nov 5, 2026
The full Qdrant API as 58 MCP tools: plain-text semantic/BM25/hybrid search and a search advisor.
Overview
Wraps the Qdrant vector database API as 58 MCP tools, letting an assistant manage collections, points, payloads, snapshots and run vector, text and hybrid…
- What you can do
- Check connectivity and create, update, list, inspect or delete collections
- Insert, read, scroll, count and delete points, including plain-text upserts
- Run vector, semantic text, BM25 and hybrid queries, plus batch, grouped, recommend, discover and distance-matrix searches
- Edit payloads, create payload indexes and count facets, manage named vectors and batch operations
- Back up and restore collections or full storage via snapshots, and read telemetry, metrics and quotas
- Diagnose a collection and measure search recall and latency, with guided prompts for tuning and zero-downtime reindexing
- When to use it
- Useful when an assistant needs to work directly with a Qdrant deployment end to end — building and maintaining collections, tuning search quality, or querying vectors and text — rather than only storing and finding documents.
- Requirements
- Runs locally over stdio via uvx or pip (Python 3.12+), or as a Docker image or Claude Desktop bundle. Needs a reachable Qdrant server (v1.19.0+, v1.20.0 tested) via QDRANT_URL, or an embedded instance via QDRANT_LOCAL_PATH; QDRANT_API_KEY if the instance requires one. Semantic text search needs the embeddings extra and downloads models into FASTEMBED_CACHE_PATH. Network mode requires QDRANT_MCP_SHARED_SECRET.
Installation
In SourceWeft
- Open Qdrant MCP in the dashboard and add it to a workspace.
- Enable the server for the chats that should use its tools.
Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.
Other MCP clients
Follow the launch instructions in the repository.
README
Qdrant MCP
[PyPI version] [CI] [Python versions] [License: MIT]
A Model Context Protocol (MCP) server that exposes the full Qdrant
vector database API as tools — collection management, advanced hybrid search, payload and
vector editing, snapshots, and server observability. Not just store/find.
Table of Contents
- Overview
- Key Features
- Requirements
- Installation
- Quick Start
- Connecting to Claude
- Text Search
- Prompts
- Configuration Reference
- Available Tools
- Read-Only Mode
- Architecture
- Security
- Development
- Versioning & Changelog
- License
Overview
Qdrant MCP is a thin MCP server that wraps the Qdrant API
one-to-one: it registers a tool per Qdrant operation, validates the input with Pydantic, calls
the official qdrant-client SDK, and returns the result. It never parses documents and never
decides how to chunk text — it is not a RAG pipeline, on purpose. A client can bring its own
vectors, or — with the optional embeddings extra — send plain text and search by meaning or
by keywords (see Text Search).
That is what sets it apart from the official Qdrant MCP
server, which exposes exactly two tools
(store/find). This server covers the rest of Qdrant's surface — everything under
collections, points, search, payload, indexing, snapshots, and observability — so an LLM client
can manage a Qdrant deployment end to end, and query it in plain text too.
See ROADMAP.md for the full phase-by-phase design history, including every finding that shaped a decision (in Spanish).
Key Features
- Text search — semantic search with plain text (
query_text, embedded locally with fastembed using the model the collection declares), BM25 keyword search with stemming and stopwords (bm25_query, Qdrant 1.20, no embeddings needed), and both fused in one hybrid query. Upserts accepttexttoo. Works on collections built elsewhere once their model is declared. - Full collection & point lifecycle — create/update/delete collections, CRUD on points, scrolling, counting.
- Every Qdrant search mode — plain vector search over dense, sparse and multivectors,
hybrid search (RRF — optionally weighted — and DBSF fusion), nested multi-stage prefetch
(fuse dense+sparse, then rerank with a multivector), MMR diversity, custom score formulas
(payload boosts, recency and geo decay), ordering by a payload field, random sampling,
grouped queries, recommend, discover, and pairwise distance matrices. Search accuracy knobs
(
search_params,score_threshold, paging, timeouts) are accepted by every search tool. - Payload & vector editing — set/overwrite/delete/clear payload, payload indexes, facet counting, named (dense/sparse) vector management, ordered batch operations.
- Snapshots — per-collection and full-storage backup/restore.
- A search advisor —
qdrant_collection_doctorchecks a collection (status, index, memory, aliases, text setup) and answers each finding with the exact tool call that fixes it;qdrant_search_quality_evalmeasures recall@k of the approximate search against an exact one, and latency, for anysearch_paramsvariants — so tuning HNSW or quantization is judged by numbers, e.g. "quantized without rescoring: recall 0.97; with rescoring: 1.0". - Guided workflows — MCP prompts that walk a model through a whole task: tune a
collection's search (diagnose, measure, propose, wait for approval), rebuild a collection
without downtime, or add text search to an existing collection. In Claude Code they're slash
commands, e.g.
/mcp__qdrant__tune_search docs. The server also hands the model a short orientation (its MCPinstructions), built from the toolsets you enabled. - Aliases, reindexing & introspection — switch the collection a name points to without downtime, copy points between collections server-side (vectors never pass through the model), check shard layout and whether the optimizer has finished indexing, and profile the payload keys a collection actually has before writing a filter.
- Observability — telemetry, Prometheus metrics endpoint, resource quotas, self-diagnosed issues.
- Opt-in tool surface — the 58 tools are grouped into toolsets you enable explicitly, so a
client isn't handed all of them by default (only the 13-tool
coretoolset is on). - Read-only guard — one flag removes every mutating tool from the registry entirely.
- Easy on the model's context — the schemas the server advertises are compact (Qdrant's
verbose
Filterand configuration models are summarized, validation unchanged), so the default toolset costs ~47 KB of schema instead of ~150 KB;with_payloadcan name just the keys to return (["title", "url"]), since payload is most of what a model reads back; and a per-call result cap (QDRANT_MCP_MAX_LIMIT) stops one mistakenlimitfrom flooding the conversation. - Resilient by default — every Qdrant call goes through retry-with-backoff and returns Qdrant's own error message on failure, never a generic exception.
Requirements
- Python 3.12+
- Qdrant server v1.19.0 or newer; tested against v1.20.0. Two tools
(
qdrant_collection_vector_create/qdrant_collection_vector_delete) depend on an endpoint that returns404on older Qdrant servers (verified against v1.13.6 and v1.15.1) — everything else works on older versions. Tool descriptions state the behavior verified on v1.20.0, and say so where v1.19 differed (alias batches, MMR withoffset). Text search needs v1.16+ (it keeps the model in the collection's metadata), and its BM25 mode v1.20+.
Installation
PyPI
Docker
The image only makes sense with streamable-http — stdio needs a client to own the process's
stdin/stdout directly, which a detached container can't provide. The server binds
127.0.0.1 by default, so QDRANT_MCP_HTTP_HOST=0.0.0.0 is required for the port to be
reachable from outside the container. Images are published on every tagged release as
{version}, {major}.{minor}, and latest.
Claude Desktop bundle (.mcpb)
Download mcp-qdrant.mcpb from the latest release
and double-click it. Claude Desktop installs the server via uv (resolving dependencies on your
machine, no Python installation required) and prompts for Qdrant URL, API key, local path,
toolsets, and read-only mode through its own settings form — no JSON to edit.
Quick Start
Point the server at a local Qdrant instance over stdio and confirm it's reachable:
Once connected from an MCP client, a typical first exchange looks like:
qdrant_health_check— confirms the configured Qdrant instance is reachable before doing anything else.qdrant_collection_create—{"collection_name": "docs", "vector_size": 4, "distance": "Cosine"}.qdrant_points_upsert—{"collection_name": "docs", "points": [{"id": 1, "vector": [0.1, 0.2, 0.3, 0.4], "payload": {"title": "hello"}}]}.qdrant_query—{"collection_name": "docs", "query_vector": [0.1, 0.2, 0.3, 0.4], "limit": 5}.
The full parameter shape of every tool is described in its own MCP schema — an LLM client reads
those directly via tools/list; the table in Available Tools below is a
human-readable summary of the same data.
Connecting to Claude
Claude Desktop / Claude Code (local, stdio)
claude_desktop_config.json (Claude Desktop) or .mcp.json (Claude Code):
Or use the .mcpb bundle described in Installation — same
result, no JSON to edit.
Remote (streamable-http)
For a server reachable over the network (e.g. added as a custom connector in Claude.ai) with a
single, fixed backing Qdrant. QDRANT_MCP_SHARED_SECRET is required in this mode — the
server refuses to start as streamable-http without one, to avoid serving an unauthenticated
endpoint over the network (verified hands-on: an open streamable-http server is trivially
usable by anyone with the URL).
In Claude.ai (Customize → Connectors → Add custom connector, verified hands-on against a
real account): enter the server's HTTPS URL, then on the detected authentication screen choose
"None" and add a Request header — Authorization → Bearer <the same secret>.
(Authorization is used here because it's one of the two header names Claude.ai's
custom-connector UI accepts without requiring Anthropic's manual approval of a custom name.)
Text Search
Text search needs no extra configuration — the collection carries it. Its metadata records which model made each dense vector and which payload field holds the text, so every later query and upsert uses the same model (a query embedded with a different model would return plausible-looking nonsense with no error):
- New collection —
qdrant_collection_createwithtext_model(creates adensevector of the model's size and records it) and/ortext_language(adds a BM25 index on the text field: stemmed, accent-folded, stopwords removed). - Existing collection —
qdrant_collection_updatewithtext_models({"<vector>": "<model>"},""for the unnamed vector) declares the model its vectors were made with; the size is checked against the vector. For BM25, create atextpayload index with"scoring": true(and astemmer) on the text field withqdrant_payload_index_create. - Write —
qdrant_points_upsertwith{"id": 1, "text": "..."}instead of a vector: one text is one point, nothing is split. - Query —
qdrant_querywithquery_text(semantic),bm25_query(keywords), or both asprefetchstages fused with"rrf"(hybrid).
Guard rails: a text longer than the model reads (128 tokens, ~500 characters, for the multilingual
MiniLM) is refused instead of silently cut — split it into several points; models that need
query/document prefixes (e5, nomic, ...) aren't offered, since fastembed doesn't add them; a
collection with points won't switch a vector to a different model (null in text_models
removes a wrong declaration first); and text into a collection whose vectors have no declared
model is refused rather than stored without a vector. BM25 with a language needs a Qdrant server —
the embedded local mode only ranks default-tokenized indexes.
Semantic search needs the embeddings extra (the Docker image and the .mcpb bundle include it);
BM25 needs Qdrant 1.20 but no extra. Models are downloaded on first use into
FASTEMBED_CACHE_PATH — set it to a persistent directory (the Docker image uses /models, so
mount a volume there) to download once.
Prompts
Guided workflows the user starts; each is offered only when the tools it uses are enabled and the server isn't read-only. In Claude Code they're slash commands with positional arguments.
Example: /mcp__qdrant__tune_search docs.
Configuration Reference
All configuration is via environment variables, read once at startup — a misconfiguration fails immediately instead of surfacing later as a confusing tool error.
¹ QDRANT_URL and QDRANT_LOCAL_PATH are mutually exclusive; if neither is set, the client
falls back to the qdrant-client SDK's own default of localhost:6333.
Available Tools
Tools are grouped into toolsets, enabled via QDRANT_MCP_TOOLSETS (comma-separated). Only
core is enabled by default — the rest are explicit opt-ins, so a client isn't handed every
tool at once:
core— collection and point CRUD, plusqdrant_queryand theqdrant_health_checksmoke test. Enough for a fully working MCP on its own.search— everything beyond plain vector search: batched/grouped queries, recommend, discover, and pairwise distance matrices.payload— payload editing and indexing, named-vector management, ordered batch point operations.snapshots— collection and full-storage backup/restore.observability— telemetry, metrics, quotas, and self-diagnosed issues.admin— collection aliases, per-collection shard layout and optimizer progress, composite operations that keep the data on the server (copying points between collections — the missing half of a zero-downtime reindex — and profiling the payload keys a collection really has), and the advisor: a collection doctor and a search-quality evaluation. Everything here works on a single node; distributed-cluster administration (shard keys, resharding) is out of scope — see ROADMAP.md, Fase 5 and Fase 12.
The table below is generated directly from the live tool registry — run
uv run python scripts/gen_tools_doc.py after adding or changing a tool to keep it in sync
(CI fails the build if it drifts).
Read-Only Mode
Setting QDRANT_MCP_READ_ONLY=1 removes every tool whose destructiveHint isn't explicitly
false (i.e. anything that isn't readOnlyHint=true) from the registry itself — a client
calling tools/list never sees them, rather than seeing them and having calls rejected. This is
the mechanism to hand an LLM client safe, read-only access to a Qdrant deployment: point it at
your database, set the flag, and there is no code path left for it to write anything.
Architecture
- Single shared client. One
AsyncQdrantClientis built once at startup and closed over by every tool. - One registration choke point. Every tool module calls into a single
ToolRegistry, which is where the toolset filter and the read-only guard are both enforced — a tool can't bypass either by registering itself differently. - Resilience. Every Qdrant call is wrapped with
tenacity-based retry and backoff (theqdrant-clientSDK itself only exposes a timeout, not retries), and translated into an MCPToolErrorcarrying Qdrant's own error message instead of a generic failure — so "collection not found" reads as exactly that. stdio-safe logging. All logging goes tostderr, configured before the MCP server object is even constructed — writing tostdoutunder thestdiotransport would corrupt the JSON-RPC message framing.
Security
- Mandatory authentication for
streamable-http. The server refuses to start withoutQDRANT_MCP_SHARED_SECRET— verified hands-on that an unauthenticated instance is trivially usable by anyone with the URL. The bearer token is compared in constant time. - No server-side request forgery through snapshot restores.
qdrant_snapshot_recovermakes the Qdrant server itself fetchlocation, so it only acceptsfile://paths,QDRANT_URL's own origin and the origins listed inQDRANT_MCP_SNAPSHOT_ALLOWED_ORIGINS— not, say, a cloud metadata endpoint on your internal network. - No blind retries of writes. A call is retried only when the request never reached Qdrant (connection refused, connect timeout). A timeout after sending is reported as "may have been applied" instead of being repeated, so a slow write can't run twice.
- Input validation everywhere. Every tool's input is a Pydantic model — malformed input is rejected with a structured error before it reaches the Qdrant SDK.
- Read-only guard.
QDRANT_MCP_READ_ONLYremoves every mutating tool from the registry — see Read-Only Mode.
Development
If you add or change a tool, regenerate the table in Available Tools rather than hand-editing it:
Versioning & Changelog
This project follows Semantic Versioning. See CHANGELOG.md for release notes and ROADMAP.md for the phased design history behind each version.
License
Source: README.md at commit fdabeab
Tools
0Version history
4- v2.12.0LatestNov 5, 2026
- v2.8.0Nov 4, 2026
- v2.6.0Oct 20, 2026
- v1.0.1Sep 16, 2026
Score
50% of the applicable checks met
How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.
- Reached in the last 30 days25 pts
Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.
- Auth declared10 pts
Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.
- Tools listed15 pts
Answer tools/list without a credential, or ship a package that starts in a sandbox without one.
- DescriptionRequired15 pts
- Logo10 pts
- Documentation15 pts
- License10 pts