| qdrant_health_checkA | Confirm the configured Qdrant instance is reachable and responding. Never raises to the caller: a health check that raises on the exact
condition it exists to detect defeats its own purpose. Connection
failures are logged and reported in the result's ok/error fields
instead, so a client renders them without a tool-call error round-trip.
|
| qdrant_collection_createA | Create 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. sparse_vectors
defines sparse (keyword-style) vectors at creation time.
quantization_config (scalar/product/binary) and
strict_mode_config apply to the whole collection. `hnsw_config` and `optimizers_config` set the index and optimizer
parameters from the start (they can also be changed later with
`qdrant_collection_update`); `on_disk_payload=true` keeps payloads
on disk instead of in RAM, which can only be chosen here.
Fails with a clear error if a collection with this name already exists.
Example (simple): {"collection_name": "docs", "vector_size": 4, "distance": "Cosine"}
Example (hybrid): {"collection_name": "docs", "vectors": {
"dense": {"size": 4, "distance": "Cosine"}
}, "sparse_vectors": {"sparse": {}}}
Example (multitenant index, payload on disk): {"collection_name": "docs",
"vector_size": 4, "hnsw_config": {"m": 0, "payload_m": 16},
"on_disk_payload": true}
|
| qdrant_collection_listA | List every collection name in the configured Qdrant instance. |
| qdrant_collection_infoA | Return full config and status of one collection. Fails with a clear error if the collection doesn't exist.
Example: {"collection_name": "docs"}
|
| qdrant_collection_updateA | Update optimizer/HNSW/collection/vector params on an existing
collection. Only the fields you pass are changed; omitted ones keep their current
value. `quantization_config="disabled"` turns quantization off.
`vectors_config`/`sparse_vectors_config` only **adjust** named
vectors that already exist (HNSW/quantization/index tuning) — they
cannot add a new one; use `qdrant_collection_vector_create` for
that, or this fails with Qdrant's own "Not existing vector name"
error. Fails with a clear error if the collection doesn't exist.
Example: {"collection_name": "docs", "optimizers_config": {"indexing_threshold": 10000}}
|
| qdrant_collection_deleteA | Delete a collection and all its points; a no-op if it doesn't exist. Example: {"collection_name": "docs"}
|
| qdrant_collection_existsA | Check whether a collection exists, without raising if it doesn't. Example: {"collection_name": "docs"}
|
| qdrant_points_upsertA | Insert or replace points (id + vector + payload) in a collection. `vector` matches the collection's vector config: a plain list for a
single unnamed vector; a list of lists for an unnamed multivector;
or a dict keyed by vector name for named vectors, where each value
is a dense list, a multivector, or a sparse vector
(`{"indices": [...], "values": [...]}`).
`update_mode` makes the write conditional: `insert_only` never
overwrites an existing id, `update_only` never creates a new one
(default `upsert` does both). `update_filter` only overwrites existing
points whose current payload matches the filter. `wait=false`
returns before the write is applied.
Fails with a clear error if the collection doesn't exist.
Example: {"collection_name": "docs", "points": [
{"id": 1, "vector": [0.1, 0.2, 0.3, 0.4], "payload": {"city": "ny"}}
]}
Example (named dense + sparse): {"collection_name": "docs", "points": [
{"id": 1, "vector": {"dense": [0.1, 0.2, 0.3, 0.4],
"sparse": {"indices": [1, 7], "values": [0.5, 0.2]}}}
]}
|
| qdrant_points_getB | Retrieve points by id; unknown ids are simply omitted, not an error. Fails only if the collection itself doesn't exist.
Example: {"collection_name": "docs", "ids": [1, 2]}
|
| qdrant_points_deleteA | Delete points by id list or by payload filter — exactly one of the two. Deleting an id that doesn't exist is not an error (Qdrant treats it as
a no-op); this only fails if the collection itself is missing, or if
you provide zero or both selectors.
Example (by id): {"collection_name": "docs", "ids": [1, 2]}
Example (by filter): {"collection_name": "docs", "points_filter": {
"must": [{"key": "city", "match": {"value": "ny"}}]
}}
|
| qdrant_points_scrollA | Page through all points in a collection, optionally filtered. Pass the returned `next_page_offset` as `offset` to fetch the next
page; `null` means there are no more pages. `limit` is capped per call
by the server's QDRANT_MCP_MAX_LIMIT (1000 by default).
`order_by` sorts by a payload field instead of by id: a key, or
`{"key": ..., "direction": "asc"|"desc", "start_from": value}`; the key
needs a payload range index (integer, float or datetime). Paging works
differently then: `offset` is rejected, and `next_page_offset` is always
`null` even when more points remain — to continue, repeat the call with
`start_from` set to the last value you received (points tied on that
value are returned again, so de-duplicate by id).
Example: {"collection_name": "docs", "limit": 50}
Example (newest first): {"collection_name": "docs", "limit": 20,
"order_by": {"key": "created_at", "direction": "desc"}}
|
| qdrant_points_countC | Count points in a collection, optionally matching a filter. Example: {"collection_name": "docs"}
|
| qdrant_queryA | Search a collection with Qdrant's unified Query API: vector
similarity, hybrid fusion, multi-stage reranking, MMR diversity,
payload-based score formulas, ordering by a payload field, or random
sampling. Exactly one query mode is required:
- `query_vector` — nearest points to a dense vector, a multivector (list
of vectors), a sparse vector (`{"indices": [...], "values": [...]}`),
or a point id whose stored vector is reused. It must match the vector
selected with `using`. Add `mmr` (`diversity` 0..1,
`candidates_limit`) to re-order the nearest candidates for diversity:
set `candidates_limit` well above `limit` (it defaults to `limit`,
which leaves MMR nothing to choose from), and don't page an MMR query
with `offset` — it is applied inside the `limit` re-ranked results
(`offset` 1 with `limit` 2 returns one point); raise `limit` instead.
- `fusion` + 2+ `prefetch` stages — combine retrieval strategies:
`"rrf"` (Reciprocal Rank Fusion), `"dbsf"` (Distribution-Based Score
Fusion), or `{"method": "rrf", "weights": [2, 1], "k": 60}` for RRF
with one weight per stage (a count that doesn't match the stages is
rejected by Qdrant).
- `formula` — rescore the results of `prefetch` stages (required: a
formula without prefetch is rejected). `{"expression": ..., "defaults":
{...}}`. An expression is a number; a variable (`"$score"` is the
prefetch score, any other string is a payload key); a payload
condition (e.g. `{"key": "city", "match": {"value": "sf"}}`, worth 1
if it matches, else 0); or exactly one operator object: `{"sum":
[...]}`, `{"mult": [...]}`, `{"neg": e}`, `{"abs": e}`, `{"div":
{"left": e, "right": e}}`, `{"sqrt": e}`, `{"pow": {"base": e,
"exponent": e}}`, `{"exp": e}`, `{"ln": e}`, `{"log10": e}`,
`{"geo_distance": {"origin": {"lat": .., "lon": ..}, "to":
"payload.key"}}`, `{"datetime": "2026-01-01T00:00:00Z"}`,
`{"datetime_key": "payload.key"}`, and the decays `{"exp_decay" |
"gauss_decay" | "lin_decay": {"x": e, "target": e, "scale": number,
"midpoint": number}}`. A payload key a point lacks needs a value in
`defaults`, or Qdrant rejects the query.
- `order_by` — sort by a payload field instead of by similarity: a key
or `{"key": ..., "direction": "asc"|"desc", "start_from": value}`.
The key needs a payload range index (integer, float or datetime).
- `sample: "random"` — random points.
A `prefetch` stage is itself a `query_vector` query or a `fusion` of
its own nested `prefetch` stages, so pipelines nest: fuse dense+sparse
in one stage, then rerank with a multivector. `using` selects a named
vector; `lookup_from` resolves `query_vector` from a point id in
another collection.
Tuning: `search_params` (`hnsw_ef`, `exact` for brute force,
`quantization`: `ignore`/`rescore`/`oversampling`, `indexed_only`,
`acorn`), `score_threshold` (drop weaker hits), `limit` + `offset`
(paging; `limit` is capped per call by the server's QDRANT_MCP_MAX_LIMIT,
1000 by default — page with `offset` for more), `timeout_seconds`
(server-side), and `consistency` (a replica count, or
`"majority"`/`"quorum"`/`"all"`; only meaningful on a replicated
deployment). Fails with a clear error if the collection doesn't exist.
Example (plain): {"collection_name": "docs", "query_vector": [0.1, 0.2, 0.3, 0.4],
"limit": 5}
Example (hybrid): {"collection_name": "docs", "fusion": "rrf", "prefetch": [
{"query_vector": [0.1, 0.2, 0.3, 0.4], "using": "dense", "limit": 20},
{"query_vector": {"indices": [1, 7], "values": [0.5, 0.2]}, "using": "sparse",
"limit": 20}
], "limit": 5}
Example (diverse results): {"collection_name": "docs", "query_vector": [0.1, 0.2, 0.3, 0.4],
"mmr": {"diversity": 0.5, "candidates_limit": 50}, "limit": 5}
Example (boost one city): {"collection_name": "docs", "prefetch": [
{"query_vector": [0.1, 0.2, 0.3, 0.4], "limit": 50}
], "formula": {"expression": {"sum": ["$score",
{"mult": [0.5, {"key": "city", "match": {"value": "sf"}}]}]}}, "limit": 5}
Example (cheapest first): {"collection_name": "docs", "order_by": {"key": "price",
"direction": "asc"}, "limit": 5}
|