Skip to main content
Glama
avaazquezz

io.github.avaazquezz/mcp-qdrant

by avaazquezz

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
QDRANT_URLNoThe URL of the Qdrant server. Required if not using QDRANT_LOCAL_PATH or QDRANT_MCP_BYO.
QDRANT_API_KEYNoOptional API key for authenticating to Qdrant.
QDRANT_MCP_BYONoSet to '1' to enable public bring-your-own-Qdrant mode. Mutually exclusive with QDRANT_URL and QDRANT_LOCAL_PATH.
QDRANT_LOCAL_PATHNoPath to a local Qdrant storage directory. Use exactly one of QDRANT_URL or QDRANT_LOCAL_PATH.
QDRANT_MCP_TOOLSETSNoComma-separated list of toolsets to enable. Defaults to 'core'. Available toolsets: core, search, payload, snapshots, observability.core
QDRANT_MCP_HTTP_HOSTNoHost interface for the streamable-http server. Example: '0.0.0.0'.
QDRANT_MCP_READ_ONLYNoSet to 'true' to enable read-only mode. Defaults to 'false'.false
QDRANT_MCP_TRANSPORTNoTransport mode. Defaults to 'stdio'. Use 'streamable-http' for remote deployment.stdio
QDRANT_MCP_SHARED_SECRETNoRequired when QDRANT_MCP_TRANSPORT is 'streamable-http' and QDRANT_MCP_BYO is not set.

Instructions

Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.

This server publishes no instructions, or was last inspected before Glama recorded them.

Capabilities

Features and capabilities supported by this server

Protocol revision2025-11-25

CapabilityDetails
tools
{
  "listChanged": false
}
prompts
{
  "listChanged": false
}
resources
{
  "subscribe": false,
  "listChanged": false
}

Tools

Functions exposed to the LLM to take actions

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

    Example: {}
    
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}
    

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

TDQS

A3.9/5.0

Scored across 13 tools

Disambiguation4/5

Most tools have clearly distinct scopes: collection lifecycle, point CRUD, querying, and health checks are separated cleanly. A few boundaries are slightly fuzzy, especially qdrant_query with order_by/sample versus qdrant_points_scroll with order_by, and qdrant_points_get by id versus querying by point id, but the descriptions make the intended use reasonably clear.

Naming Consistency5/5

All tools follow a predictable qdrant_* snake_case convention with resource-oriented names such as qdrant_collection_create and qdrant_points_upsert. The few non-resource names like qdrant_query and qdrant_health_check still fit the same overall pattern.

Tool Count5/5

The set has 13 tools, which is well-scoped for a Qdrant MCP server. Each tool covers a distinct collection, point, query, or health operation without obvious redundancy.

Completeness4/5

The surface covers the core Qdrant lifecycle: collection list/create/update/delete/exists/info, point get/delete/upsert/scroll/count, query, and health. Minor gaps remain around payload index management, aliases/snapshots, and partial payload updates, but core workflows are covered.

Maintenance

ActivityActive
ResponsivenessNo issues