Odel
Qdrant MCP

Qdrant MCP

Local
@avaazquezzPythonMITUpdated 6 days ago

MCP server that wraps the Qdrant vector database API as tools.

Qdrant-MCP

MCP server that wraps the Qdrant vector database API as tools. See ROADMAP.md.

Tools

Generated from the live tool registry — run uv run python scripts/gen_tools_doc.py after adding or changing a tool.

ToolToolsetRead-onlyDestructiveIdempotentDescription
qdrant_health_checkcoreConfirm the configured Qdrant instance is reachable and responding.
qdrant_collection_createcoreCreate a collection: either a single unnamed vector (vector_size + distance), or one or more named vectors (vectors, each a full VectorParams — size, distance, and optionally its own multivector_config for ColBERT-style multi-vectors or quantization_config) — exactly one of the two.
qdrant_collection_listcoreList every collection name in the configured Qdrant instance.
qdrant_collection_infocoreReturn full config and status of one collection.
qdrant_collection_updatecoreUpdate optimizer/HNSW/collection/vector params on an existing collection.
qdrant_collection_deletecoreDelete a collection and all its points; a no-op if it doesn't exist.
qdrant_collection_existscoreCheck whether a collection exists, without raising if it doesn't.
qdrant_points_upsertcoreInsert or replace points (id + vector + payload) in a collection.
qdrant_points_getcoreRetrieve points by id; unknown ids are simply omitted, not an error.
qdrant_points_deletecoreDelete points by id list or by payload filter — exactly one of the two.
qdrant_points_scrollcorePage through all points in a collection, optionally filtered.
qdrant_points_countcoreCount points in a collection, optionally matching a filter.
qdrant_querycoreVector similarity search, with optional hybrid search over multiple prefetch stages.
qdrant_query_batchsearchRun multiple independent queries against one collection in a single round trip — same query shapes as qdrant_query (plain vector or fusion+prefetch hybrid search), one per list item.
qdrant_query_groupssearchVector query grouped by a payload field, up to group_size hits per group — e.g. the best-matching chunks per source document.
qdrant_recommendsearchFind points similar to a set of positive examples and dissimilar to a set of negative ones (vectors or point ids) — Qdrant's recommendation API.
qdrant_recommend_batchsearchRun multiple independent recommend queries against one collection in a single round trip.
qdrant_recommend_groupssearchRecommend query grouped by a payload field, up to group_size hits per group.
qdrant_discoversearchRank points by how well they fit a target within positive/negative context pairs (vectors or point ids) — Qdrant's discovery search, a finer-grained alternative to recommend.
qdrant_discover_batchsearchRun multiple independent discover queries against one collection in a single round trip.
qdrant_distance_matrix_pairssearchPairwise distance matrix between a random sample of points: for each of sample points, its limit closest neighbors among that same sample — returned as a flat list of (a, b, score) pairs.
qdrant_distance_matrix_offsetssearchSame distance matrix as qdrant_distance_matrix_pairs, in a column-oriented shape (offsets into a shared id list + a parallel score array) — more compact for large samples.
qdrant_payload_setpayloadMerge fields into the payload of selected points — exactly one of ids/points_filter.
qdrant_payload_overwritepayloadReplace the entire payload of selected points with payload — exactly one of ids/points_filter.
qdrant_payload_deletepayloadDelete specific payload keys from selected points — exactly one of ids/points_filter.
qdrant_payload_clearpayloadWipe the entire payload of selected points, keeping their vectors — exactly one of ids/points_filter.
qdrant_payload_facetpayloadCount distinct values of a payload field across the collection (or a filtered subset) — e.g. how many points per city.
qdrant_payload_index_createpayloadCreate a payload index on field_name, speeding up filters that use it.
qdrant_payload_index_deletepayloadDelete the payload index on field_name.
qdrant_collection_vector_createpayloadAdd a new named vector (dense or sparse) to a collection that already has points, without touching them.
qdrant_collection_vector_deletepayloadRemove a named vector (dense or sparse) from a collection — points keep their other vectors and payload.
qdrant_points_batch_updatepayloadRun multiple point operations (upsert, delete, set/overwrite/delete/clear payload, update/delete vectors) atomically against one collection, in the order given.
qdrant_vectors_updatepayloadReplace the vector(s) of existing points by id — leaves their payload untouched.
qdrant_vectors_deletepayloadRemove specific named vectors from selected points, keeping their payload and other vectors — exactly one of ids/points_filter.
qdrant_snapshot_createsnapshotsCreate a snapshot of one collection's current state.
qdrant_snapshot_listsnapshotsList the snapshots stored for one collection.
qdrant_snapshot_deletesnapshotsDelete a collection snapshot, freeing its disk space on the server — does not touch the live collection.
qdrant_snapshot_recoversnapshotsOverwrite collection_name with the state captured in a snapshot — everything written since that snapshot is lost.
qdrant_snapshot_downloadsnapshotsConfirm a collection snapshot exists and return where to fetch it from — this tool does not transfer the (potentially huge) snapshot file itself; download it yourself (e.g. curl) from the returned url.
qdrant_storage_snapshot_createsnapshotsCreate a snapshot of the whole storage (every collection and server config), not just one collection.
qdrant_storage_snapshot_listsnapshotsList the full-storage snapshots stored on the server.
qdrant_storage_snapshot_deletesnapshotsDelete a full-storage snapshot, freeing its disk space.
qdrant_storage_snapshot_downloadsnapshotsConfirm a full-storage snapshot exists and return where to fetch it from — same caveat as qdrant_snapshot_download: this tool does not transfer the file itself.
qdrant_telemetryobservabilityServer-wide telemetry: build info, per-collection stats, request counters, memory and hardware usage.
qdrant_metrics_prometheusobservabilityReturn the URL where Qdrant serves Prometheus-format metrics — this tool does not fetch the metrics themselves (they're plain text, not JSON); point your Prometheus scraper at the returned url instead.
qdrant_quotas_getobservabilityCurrent server-wide resource quotas (memory/disk limits) and actual usage.
qdrant_quotas_setobservabilityUpdate server-wide resource quotas.
qdrant_issues_listobservabilityList the issues Qdrant has detected about its own configuration (e.g. a heavily-filtered field with no payload index).
qdrant_issues_clearobservabilityClear all accumulated issues.

Configuration

Environment variables: QDRANT_URL, QDRANT_API_KEY, QDRANT_LOCAL_PATH (exactly one of QDRANT_URL/QDRANT_LOCAL_PATH), QDRANT_MCP_READ_ONLY, QDRANT_MCP_TRANSPORT (stdio default, or streamable-http), QDRANT_MCP_TOOLSETS (comma-separated; default core only — opt in to search, payload, snapshots, observability explicitly), QDRANT_MCP_BYO (see below — mutually exclusive with QDRANT_URL/QDRANT_LOCAL_PATH).

Claude Desktop / Claude Code (local, stdio)

claude_desktop_config.json (Claude Desktop) or .mcp.json (Claude Code):

{
  "mcpServers": {
    "qdrant": {
      "command": "uvx",
      "args": ["mcp-qdrant"],
      "env": {
        "QDRANT_URL": "http://localhost:6333",
        "QDRANT_MCP_TOOLSETS": "core,search"
      }
    }
  }
}

Or double-click the .mcpb bundle attached to a release — Claude Desktop prompts for the same settings through its own UI, no JSON to edit.

Remote (streamable-http) — e.g. a custom connector in Claude.ai

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).

QDRANT_URL=http://localhost:6333 \
QDRANT_MCP_TRANSPORT=streamable-http \
QDRANT_MCP_HTTP_HOST=0.0.0.0 \
QDRANT_MCP_SHARED_SECRET=<a long random secret> \
mcp-qdrant

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 headerAuthorizationBearer <the same secret>.

Public "bring your own Qdrant" instance (QDRANT_MCP_BYO)

A streamable-http deployment can run with no backing Qdrant of its own — every caller supplies their own Qdrant instance (their own Qdrant Cloud account, their company's self-hosted Qdrant, whatever) per request, instead of using one the operator hosts and pays for. Isolation between callers is automatic — each one talks to their own database — so there's no shared secret, no per-user account, and no data at rest on this server.

QDRANT_MCP_BYO=1 \
QDRANT_MCP_TRANSPORT=streamable-http \
QDRANT_MCP_HTTP_HOST=0.0.0.0 \
mcp-qdrant

Two request headers, reused for a different purpose than their name suggests — verified hands-on that Claude.ai's custom-connector "Request headers" UI rejects made-up header names outright unless Anthropic has approved them, so this reuses two pre-approved ones instead of inventing X-Qdrant-Url/X-Qdrant-Api-Key:

  • Authorization (required) — your Qdrant URL, e.g. https://xyz.cloud.qdrant.io:6333. Sent verbatim, no Bearer prefix needed.
  • x-api-key (optional) — your Qdrant API key, if your instance needs one.

In Claude.ai: Add custom connector → authentication "None" → add both as Request headers. Your Qdrant must be reachable from the public internet — an SSRF guard rejects any URL that resolves to a private/internal/loopback address.