
Qdrant MCP
io.github.avaazquezz由 GitHub 帳號 avaazquezz 發布v2.12.0更新於 Nov 5, 2026
The full Qdrant API as 58 MCP tools: plain-text semantic/BM25/hybrid search and a search advisor.
概覽
把 Qdrant 向量資料庫 API 包裝成 58 個 MCP 工具,讓助理管理集合、資料點、payload、快照,並執行向量、文字與混合檢索。
- 可以做什麼
- 檢查連線狀態,建立、更新、列出、檢視或刪除集合
- 寫入、讀取、分頁、計數與刪除資料點,支援直接寫入純文字
- 執行向量、語意文字、BM25 與混合查詢,以及批次、分組、推薦、探索與距離矩陣檢索
- 編輯 payload、建立 payload 索引、統計 facet 值,並管理具名向量與批次操作
- 透過快照備份與還原單一集合或整個儲存,讀取遙測、指標與配額
- 診斷集合、量測檢索召回率與延遲,並提供調校與零停機重建的引導式提示詞
- 適用情境
- 適合需要讓助理端到端操作 Qdrant 部署的情境,例如建置與維護集合、調校檢索品質,或對向量與文字進行查詢,而不只是存放與尋找文件。
- 執行需求
- 透過 uvx 或 pip 以 stdio 在本機執行(需 Python 3.12+),也可使用 Docker 映像或 Claude Desktop 安裝包。需要可連線的 Qdrant 伺服器(v1.19.0 以上,已於 v1.20.0 測試),以 QDRANT_URL 指定,或以 QDRANT_LOCAL_PATH 使用嵌入式執行個體;執行個體需要時提供 QDRANT_API_KEY。語意文字檢索需安裝 embeddings 附加元件,模型會下載到 FASTEMBED_CACHE_PATH。網路模式必須設定 QDRANT_MCP_SHARED_SECRET。
安裝
在 SourceWeft 中
- 開啟 儀表板中的 Qdrant MCP,將其新增到工作區。
- 為需要使用其工具的對話啟用該服務。
Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。
其他 MCP 客戶端
參照 儲存庫 中的啟動說明。
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
來源:README.md,提交 fdabeab
工具
0版本歷史
4- v2.12.0最新Nov 5, 2026
- v2.8.0Nov 4, 2026
- v2.6.0Oct 20, 2026
- v1.0.1Sep 16, 2026
評分
已滿足適用檢查項的 50%
該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。
- 近 30 天內可連通25 分
請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。
- 已宣告認證方式10 分
請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。
- 已列出工具15 分
請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。
- 描述必需15 分
- 圖示10 分
- 文件15 分
- 授權條款10 分