Skip to main content
Glama
avaazquezz

io.github.avaazquezz/mcp-qdrant

by avaazquezz

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

Related MCP server: Qdrant MCP Server

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 generates embeddings, never parses documents, and never decides how to chunk text — it is not a RAG system, on purpose. Whatever an LLM client wants to store or query, it brings its own vectors.

That focus is also what sets it apart from the official Qdrant MCP server, which exposes exactly two tools (store/find) and does embed documents for you. 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, not just push and pull memories through a narrow interface.

See ROADMAP.md for the full phase-by-phase design history, including every finding that shaped a decision (in Spanish).

Key Features

  • Full collection & point lifecycle — create/update/delete collections, CRUD on points, scrolling, counting.

  • Every Qdrant search mode — plain vector search, hybrid search (RRF/DBSF fusion with prefetch stages), grouped queries, recommend, discover, and pairwise distance matrices.

  • Payload & vector editing — set/overwrite/delete/clear payload, payload indexes, facet counting, named (dense/sparse) vector management, atomic batch operations.

  • Snapshots — per-collection and full-storage backup/restore.

  • Observability — telemetry, Prometheus metrics endpoint, resource quotas, self-diagnosed issues.

  • Opt-in tool surface — tools are grouped into toolsets you enable explicitly, so a client isn't handed 60+ overlapping tools by default.

  • Read-only guard — one flag removes every mutating tool from the registry entirely.

  • Bring-your-own-Qdrant mode — run a public endpoint with no database of your own; every caller supplies their own Qdrant, isolated by construction, protected by an SSRF guard.

  • 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. Two tools (qdrant_collection_vector_create/qdrant_collection_vector_delete) depend on an endpoint that returns 404 on older Qdrant servers (verified against v1.13.6 and v1.15.1) — everything else works on older versions, but v1.19.0+ is the only version this project tests against.

Installation

PyPI

# Run without installing (recommended for Claude Desktop/Code configs)
uvx mcp-qdrant

# Or install into your environment
pip install mcp-qdrant

Docker

docker run --rm -p 8000:8000 \
  -e QDRANT_URL=http://host.docker.internal:6333 \
  -e QDRANT_MCP_TRANSPORT=streamable-http \
  -e QDRANT_MCP_HTTP_HOST=0.0.0.0 \
  -e QDRANT_MCP_SHARED_SECRET=<a long random secret> \
  ghcr.io/avaazquezz/qdrant-mcp:latest

The image only makes sense with streamable-httpstdio 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:

QDRANT_URL=http://localhost:6333 mcp-qdrant

Once connected from an MCP client, a typical first exchange looks like:

  1. qdrant_health_check — confirms the configured Qdrant instance is reachable before doing anything else.

  2. qdrant_collection_create{"collection_name": "docs", "vector_size": 4, "distance": "Cosine"}.

  3. qdrant_points_upsert{"collection_name": "docs", "points": [{"id": 1, "vector": [0.1, 0.2, 0.3, 0.4], "payload": {"title": "hello"}}]}.

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

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

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

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

Bring your own Qdrant (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 (unlike the personal-instance mode above, which uses the same header for a shared secret).

  • 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 — see Security for what the SSRF guard rejects.

How it works, under the hood: every tool resolves its Qdrant client lazily, at call time, rather than once at startup. In BYO mode that client is a BYOQdrantClientProxy that reads the real AsyncQdrantClient from a contextvars.ContextVar, set per-request by the auth middleware — so none of the tool implementations need to know BYO mode exists. Clients are pooled in a bounded LRU cache (256 entries, keyed by URL + API key) so repeat callers don't pay a fresh TLS handshake on every call, with a 15-second grace period before an evicted client is closed so an in-flight request is never cut off mid-call.

This is the most common way to run this project: deploy the MCP once, in BYO mode, as a long-lived service — then, for each new project, spin up your own Qdrant and point a connector at it, without ever touching the MCP deployment again.

  1. Deploy the MCP once, self-hosted (e.g. Docker behind a reverse proxy with TLS), in BYO mode as shown above. This never changes between projects.

  2. Per project, run your own Qdrant with docker-compose, protected with its own API key (QDRANT__SERVICE__API_KEY — Qdrant's own auth, unrelated to this server):

    services:
      qdrant:
        image: qdrant/qdrant:latest
        restart: unless-stopped
        environment:
          QDRANT__SERVICE__API_KEY: ${QDRANT_API_KEY}
        volumes:
          - ./qdrant_storage:/qdrant/storage

    All data for that project lives in ./qdrant_storage, on your own server — the MCP deployment never stores or sees it beyond relaying each request.

  3. Expose that Qdrant under its own public HTTPS domain (e.g. via Traefik/Let's Encrypt) — the SSRF guard rejects private/internal addresses, so it must be reachable from the public internet, not just from inside your server's Docker network.

  4. Add one connector per project, pointing at the same MCP deployment but with different headers:

    • Claude.ai: a separate custom connector per project — Authorization = that project's Qdrant URL, x-api-key = its API key.

    • Claude Code (.mcp.json, remote HTTP server with custom headers):

      {
        "mcpServers": {
          "qdrant-project-x": {
            "type": "http",
            "url": "https://your-mcp.example.com/mcp",
            "headers": {
              "Authorization": "https://qdrant-project-x.example.com",
              "x-api-key": "${QDRANT_PROJECT_X_API_KEY}"
            }
          }
        }
      }

Adding a project is then just a new docker-compose up for its Qdrant plus a new connector — the MCP deployment itself is never redeployed or restarted.

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.

Variable

Default

Required

Purpose

QDRANT_URL

No¹

URL of your Qdrant instance, e.g. http://localhost:6333 or a Qdrant Cloud URL.

QDRANT_API_KEY

No

API key for QDRANT_URL, if your instance requires one.

QDRANT_LOCAL_PATH

No¹

Path to an embedded/on-disk Qdrant instance, instead of a URL.

QDRANT_MCP_READ_ONLY

false

No

Removes every tool not marked read-only from the registry. See Read-Only Mode.

QDRANT_MCP_TRANSPORT

stdio

No

stdio (local, for Claude Desktop/Code) or streamable-http (network).

QDRANT_MCP_TOOLSETS

core

No

Comma-separated list of toolsets to register. See Available Tools.

QDRANT_MCP_SHARED_SECRET

Required for streamable-http unless BYO²

Bearer token clients must send in the Authorization header.

QDRANT_MCP_HTTP_HOST

127.0.0.1

No

Bind host for streamable-http. Use 0.0.0.0 in a container.

QDRANT_MCP_HTTP_PORT

8000

No

Bind port for streamable-http.

QDRANT_MCP_BYO

false

No

Enables bring-your-own-Qdrant mode.

¹ 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. ² In BYO mode the shared secret is optional — it adds an extra anti-bot gate on top of the per-caller isolation BYO already provides, rather than protecting shared data. BYO mode also requires QDRANT_MCP_TRANSPORT=streamable-http and is mutually exclusive with QDRANT_URL/QDRANT_LOCAL_PATH (there is nothing "backing" to point at).

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, plus qdrant_query and the qdrant_health_check smoke 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, atomic batch point operations.

  • snapshots — collection and full-storage backup/restore.

  • observability — telemetry, metrics, quotas, and self-diagnosed issues.

  • admin is a reserved toolset name with no registered tools — cluster/shard administration was scoped out (see ROADMAP.md, Fase 5): its most useful capability, real resharding, only exists on Qdrant Cloud, and the rest only matters for a distributed deployment. Setting QDRANT_MCP_TOOLSETS=admin is valid but registers nothing.

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

Tool

Toolset

Read-only

Destructive

Idempotent

Description

qdrant_health_check

core

Confirm the configured Qdrant instance is reachable and responding.

qdrant_collection_create

core

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.

qdrant_collection_list

core

List every collection name in the configured Qdrant instance.

qdrant_collection_info

core

Return full config and status of one collection.

qdrant_collection_update

core

Update optimizer/HNSW/collection/vector params on an existing collection.

qdrant_collection_delete

core

Delete a collection and all its points; a no-op if it doesn't exist.

qdrant_collection_exists

core

Check whether a collection exists, without raising if it doesn't.

qdrant_points_upsert

core

Insert or replace points (id + vector + payload) in a collection.

qdrant_points_get

core

Retrieve points by id; unknown ids are simply omitted, not an error.

qdrant_points_delete

core

Delete points by id list or by payload filter — exactly one of the two.

qdrant_points_scroll

core

Page through all points in a collection, optionally filtered.

qdrant_points_count

core

Count points in a collection, optionally matching a filter.

qdrant_query

core

Vector similarity search, with optional hybrid search over multiple prefetch stages.

qdrant_query_batch

search

Run 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_groups

search

Vector query grouped by a payload field, up to group_size hits per group — e.g. the best-matching chunks per source document.

qdrant_recommend

search

Find 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_batch

search

Run multiple independent recommend queries against one collection in a single round trip.

qdrant_recommend_groups

search

Recommend query grouped by a payload field, up to group_size hits per group.

qdrant_discover

search

Rank 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_batch

search

Run multiple independent discover queries against one collection in a single round trip.

qdrant_distance_matrix_pairs

search

Pairwise 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_offsets

search

Same 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_set

payload

Merge fields into the payload of selected points — exactly one of ids/points_filter.

qdrant_payload_overwrite

payload

Replace the entire payload of selected points with payload — exactly one of ids/points_filter.

qdrant_payload_delete

payload

Delete specific payload keys from selected points — exactly one of ids/points_filter.

qdrant_payload_clear

payload

Wipe the entire payload of selected points, keeping their vectors — exactly one of ids/points_filter.

qdrant_payload_facet

payload

Count distinct values of a payload field across the collection (or a filtered subset) — e.g. how many points per city.

qdrant_payload_index_create

payload

Create a payload index on field_name, speeding up filters that use it.

qdrant_payload_index_delete

payload

Delete the payload index on field_name.

qdrant_collection_vector_create

payload

Add a new named vector (dense or sparse) to a collection that already has points, without touching them.

qdrant_collection_vector_delete

payload

Remove a named vector (dense or sparse) from a collection — points keep their other vectors and payload.

qdrant_points_batch_update

payload

Run multiple point operations (upsert, delete, set/overwrite/delete/clear payload, update/delete vectors) atomically against one collection, in the order given.

qdrant_vectors_update

payload

Replace the vector(s) of existing points by id — leaves their payload untouched.

qdrant_vectors_delete

payload

Remove specific named vectors from selected points, keeping their payload and other vectors — exactly one of ids/points_filter.

qdrant_snapshot_create

snapshots

Create a snapshot of one collection's current state.

qdrant_snapshot_list

snapshots

List the snapshots stored for one collection.

qdrant_snapshot_delete

snapshots

Delete a collection snapshot, freeing its disk space on the server — does not touch the live collection.

qdrant_snapshot_recover

snapshots

Overwrite collection_name with the state captured in a snapshot — everything written since that snapshot is lost.

qdrant_snapshot_download

snapshots

Confirm 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_create

snapshots

Create a snapshot of the whole storage (every collection and server config), not just one collection.

qdrant_storage_snapshot_list

snapshots

List the full-storage snapshots stored on the server.

qdrant_storage_snapshot_delete

snapshots

Delete a full-storage snapshot, freeing its disk space.

qdrant_storage_snapshot_download

snapshots

Confirm 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_telemetry

observability

Server-wide telemetry: build info, per-collection stats, request counters, memory and hardware usage.

qdrant_metrics_prometheus

observability

Return 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_get

observability

Current server-wide resource quotas (memory/disk limits) and actual usage.

qdrant_quotas_set

observability

Update server-wide resource quotas.

qdrant_issues_list

observability

List the issues Qdrant has detected about its own configuration (e.g. a heavily-filtered field with no payload index).

qdrant_issues_clear

observability

Clear all accumulated issues.

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 AsyncQdrantClient (or, in BYO mode, a proxy — see below) is built once at startup and closed over by every tool. Tools resolve it lazily at call time rather than caching anything from it at registration.

  • 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 (the qdrant-client SDK itself only exposes a timeout, not retries), and translated into an MCP ToolError carrying Qdrant's own error message instead of a generic failure — so "collection not found" reads as exactly that.

  • stdio-safe logging. All logging goes to stderr, configured before the MCP server object is even constructed — writing to stdout under the stdio transport would corrupt the JSON-RPC message framing.

  • BYO mode's indirection. In QDRANT_MCP_BYO mode, the "client" every tool holds is a proxy that reads the real, per-caller AsyncQdrantClient out of a context variable set by request middleware — see Bring your own Qdrant for the full mechanism.

Security

  • Mandatory authentication for the personal streamable-http mode. The server refuses to start without QDRANT_MCP_SHARED_SECRET — verified hands-on that an unauthenticated instance is trivially usable by anyone with the URL.

  • SSRF protection in BYO mode. Since a BYO deployment connects to whatever URL an untrusted public caller supplies — from a host that may also run other services on internal networks — every URL is checked before use: only http/https, DNS-resolved, and rejected if any resolved address is private, loopback, link-local, or the cloud metadata address. This check re-resolves on every request rather than caching a prior result, specifically to defeat DNS rebinding.

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

  • No secrets at rest, no secrets logged. BYO mode holds no long-lived credentials; API keys passed via x-api-key live only as long as their pooled client connection.

Development

git clone https://github.com/avaazquezz/Qdrant-MCP.git
cd Qdrant-MCP
uv sync --dev
uv run pre-commit install
uv run ruff check .            # lint
uv run ruff format --check .   # formatting
uv run mypy .                  # type checking (strict)
uv run pytest                  # unit tests
uv run pytest -m integration   # integration tests — needs a running Qdrant (CI runs one as a Docker service)

If you add or change a tool, regenerate the table in Available Tools rather than hand-editing it:

uv run python scripts/gen_tools_doc.py          # regenerate
uv run python scripts/gen_tools_doc.py --check  # verify, no changes (what CI runs)

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

MIT

Available Tools

13 tools
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.

    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": {}}}
    
ParametersJSON Schema
NameRequiredDescriptionDefault
vectorsNo
distanceNoCosine
metadataNo
vector_sizeNo
sparse_vectorsNo
collection_nameYes
strict_mode_configNo
quantization_configNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
configYesCurrent statistics and configuration of the collection
statusYesCurrent statistics and configuration of the collection
warningsNoWarnings related to the collection
points_countNoApproximate number of points (vectors + payloads) in collection. Each point could be accessed by unique id.
update_queueNoUpdate queue info
payload_schemaYesTypes of stored payload
segments_countYesNumber of segments in collection. Each segment has independent vector as payload indexes
optimizer_statusYesCurrent statistics and configuration of the collection
indexed_vectors_countNoApproximate number of indexed vectors in the collection. Indexed vectors in large segments are faster to query, as it is stored in a specialized vector index.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, the description discloses key behavioral traits: the "exactly one of the two" vector definition requirement, collection-wide application of quantization/strict-mode configs, and failure on duplicate collection names. This adds meaningful operational context that the annotations alone do not provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but well-organized: it front-loads the core creation modes, clarifies important constraints, and provides two practical examples. Every sentence contributes useful information without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is largely complete for a complex creation tool with a rich schema and annotations: it covers the two vector modes, sparse vectors, quantization, strict mode, and failure behavior. The only notable omission is the `metadata` parameter, but overall an agent has enough guidance to select and invoke this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With schema description coverage at 0%, the description takes on the burden of explaining parameters, and it does so well for the central ones: vector_size/distance, vectors, sparse_vectors, quantization_config, and strict_mode_config. It does not mention `metadata` or explicitly describe `collection_name`, but its examples and structural explanation cover the most decision-critical parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's action and object: "Create a collection" and then precisely distinguishes the two supported vector configurations. It differentiates itself from read/update/delete sibling tools by focusing on creation semantics and even notes the failure condition of recreating an existing collection.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context on when to use this tool and how to choose between unnamed and named vector configurations. It does not explicitly contrast with sibling tools like qdrant_collection_update when a collection already exists, but the "Fails with a clear error if a collection with this name already exists" note effectively implies that precondition.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

qdrant_collection_deleteA
DestructiveIdempotent

Delete a collection and all its points; a no-op if it doesn't exist.

    Example: {"collection_name": "docs"}
    
ParametersJSON Schema
NameRequiredDescriptionDefault
collection_nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
deletedYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false. The description adds value by specifying that it deletes not only the collection but also all its points, and that it is a no-op if the collection does not exist. This goes beyond the annotation flags by detailing the scope and idempotent outcome, which helps the agent predict the effect. No contradiction is present.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences plus a code example, with zero fluff. It front-loads the core behavior (delete and scope), states idempotency, and gives a concrete example. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter destructive tool, this description is complete. It covers the action, scope, idempotency, and an example. Given that an output schema exists, the return format does not need to be explained in the description. The annotations cover safety, and the tool's purpose is unmistakable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With schema description coverage at 0%, the description must compensate, and it does so with a clear example: {'collection_name': 'docs'}. The parameter name itself (collection_name) and its title (Collection Name) are already self-explanatory, and the example demonstrates the expected string format. This adds meaning beyond the schema's basic type and title.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Delete' and the resource 'a collection and all its points', which is specific and unambiguous. It also distinguishes itself from sibling tools like qdrant_collection_create or qdrant_collection_update by its destructive nature. The idempotency note ('no-op if it doesn't exist') further clarifies the exact behavior.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description does not explicitly mention alternatives or when-not-to-use, but it conveys that the operation is safe to call regardless of existence (no-op if absent). This provides enough context to decide when to invoke it, and the clear verb 'delete' leaves little ambiguity about its purpose. However, it could explicitly state that this is the tool to permanently remove collections, versus other tools like update or list.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

qdrant_collection_existsA
Read-onlyIdempotent

Check whether a collection exists, without raising if it doesn't.

    Example: {"collection_name": "docs"}
    
ParametersJSON Schema
NameRequiredDescriptionDefault
collection_nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
existsYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false. The description adds a meaningful behavioral guarantee beyond annotations: it will not raise when the collection is absent. This is useful for an agent deciding how to handle negative results.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences with an embedded example; every line earns its place. The core behavior is front-loaded and no filler is present.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter, read-only existence check, the combination of annotations, output schema, and description fully covers what an agent needs to call it correctly. The non-raising behavior and example fill the important gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description's example {'collection_name': 'docs'} compensates by demonstrating the expected parameter format. The single parameter is self-explanatory from its name, and the example confirms usage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Check whether a collection exists') and adds a distinctive behavioral detail ('without raising if it doesn't'). This makes it clearly distinguishable from siblings like qdrant_collection_info and qdrant_collection_list.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly scopes use to existence checks, and the non-raising behavior clarifies the typical use case. It does not explicitly name alternatives or exclusion criteria, but the context is unambiguous for a simple boolean existence check.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

qdrant_collection_infoA
Read-onlyIdempotent

Return full config and status of one collection.

    Fails with a clear error if the collection doesn't exist.

    Example: {"collection_name": "docs"}
    
ParametersJSON Schema
NameRequiredDescriptionDefault
collection_nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
configYesCurrent statistics and configuration of the collection
statusYesCurrent statistics and configuration of the collection
warningsNoWarnings related to the collection
points_countNoApproximate number of points (vectors + payloads) in collection. Each point could be accessed by unique id.
update_queueNoUpdate queue info
payload_schemaYesTypes of stored payload
segments_countYesNumber of segments in collection. Each segment has independent vector as payload indexes
optimizer_statusYesCurrent statistics and configuration of the collection
indexed_vectors_countNoApproximate number of indexed vectors in the collection. Indexed vectors in large segments are faster to query, as it is stored in a specialized vector index.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, openWorld, idempotent, and non-destructive behavior. The description adds value beyond those by stating that the tool fails with a clear error when the collection does not exist, which is useful behavioral context an agent cannot infer from annotations alone.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short and well-structured: main purpose first, then failure behavior, then a concrete example. Every sentence contributes useful information with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter, read-only info tool with an output schema and comprehensive annotations, the description covers the necessary invocation details. The failure case is explicitly disclosed, and the example makes the parameter usage clear.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but there is only one parameter and the example {'collection_name': 'docs'} demonstrates its shape. The description partially compensates for the missing schema documentation, though it does not explain allowed values, naming constraints, or format expectations beyond the parameter title.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Return') and a specific resource ('full config and status of one collection'), clearly distinguishing it from siblings like qdrant_collection_exists and qdrant_collection_list. The singular 'one collection' removes ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool is for retrieving details about a single existing collection, but it does not explicitly state when to prefer it over qdrant_collection_exists, qdrant_collection_list, or qdrant_health_check. The failure case is mentioned, which helps set expectations, but no alternatives or exclusion conditions are given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

qdrant_collection_listA
Read-onlyIdempotent

List every collection name in the configured Qdrant instance.

    Example: {}
    
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
collectionsYes

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds only a minor detail—that it lists names specifically—which is slightly beyond the annotation title 'List Qdrant collections' but does not disclose anything about return format, pagination, or error behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that states the action and scope without any wasted words. It is appropriately sized for a simple listing operation, and the core action is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter listing tool with an existing output schema (which presumably describes the returned list of names), the description is complete enough. It clearly states what is returned (collection names) and the context (configured instance). No additional caveats are necessary.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the description does not need to explain any parameter semantics. According to the calibration, a baseline of 4 is appropriate for 0-parameter tools; the description adds no negative value here.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action (List) and the resource (collection names) in the configured Qdrant instance. It distinguishes itself from siblings like qdrant_collection_info (which likely provides details) and qdrant_collection_exists (which checks existence) by focusing on listing names only.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. It does not mention that this tool is appropriate for getting an overview of collections by name, nor does it indicate that qdrant_collection_info or qdrant_collection_exists should be used for more specific needs.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

qdrant_collection_updateA
Idempotent

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}}
    
ParametersJSON Schema
NameRequiredDescriptionDefault
hnsw_configNo
vectors_configNo
collection_nameYes
collection_paramsNo
optimizers_configNo
strict_mode_configNo
quantization_configNo
sparse_vectors_configNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
configYesCurrent statistics and configuration of the collection
statusYesCurrent statistics and configuration of the collection
warningsNoWarnings related to the collection
points_countNoApproximate number of points (vectors + payloads) in collection. Each point could be accessed by unique id.
update_queueNoUpdate queue info
payload_schemaYesTypes of stored payload
segments_countYesNumber of segments in collection. Each segment has independent vector as payload indexes
optimizer_statusYesCurrent statistics and configuration of the collection
indexed_vectors_countNoApproximate number of indexed vectors in the collection. Indexed vectors in large segments are faster to query, as it is stored in a specialized vector index.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, the description discloses important behavioral traits: partial-update semantics ('Only the fields you pass are changed; omitted ones keep their current value'), the special 'disabled' value for quantization_config, and the constraint that vectors_config/sparse_vectors_config can only adjust existing vectors. It also discloses failure modes for both missing collections and non-existent vector names. This is rich, actionable behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose, then adds only high-value semantic context, failure modes, and an example. There is no filler, repetition of schema, or unnecessary prose. Every sentence earns its place, and the example is compact and illustrative.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's high complexity, the description covers the essential operational semantics, the key constraint about vector names, the special quantization value, the error condition for missing collections, and a realistic example. The output schema exists, so not describing return values is acceptable. An agent has enough information to select and invoke this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries real weight here. It adds crucial meaning: partial updates, quantization_config='disabled', and the difference between adjusting and adding vectors. It also provides a concrete example using collection_name and optimizers_config. However, it does not explicitly call out strict_mode_config or enumerate every top-level parameter, leaning on the nested schema definitions for those details.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Update optimizer/HNSW/collection/vector params on an existing collection.' It clearly differentiates this update tool from creation/read/delete tools by emphasizing 'existing collection' and explicitly noting it cannot add new vectors. This is far beyond a tautology and gives an agent a precise mental model.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use context: update parameters on an existing collection. It also gives a clear when-not-to-use and alternative: vectors_config/sparse_vectors_config cannot add new vectors; use qdrant_collection_vector_create instead. It additionally warns that the tool fails if the collection does not exist, which helps the agent decide whether a create tool is needed first.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

qdrant_health_checkA
Read-onlyIdempotent

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.
    
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
errorNo
collection_countNo

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnly/ idempotent annotations, the description explicitly discloses a key behavioral trait: it never raises to the caller and instead reports connection failures in ok/error fields. This is valuable, non-obvious information that materially affects how an agent interprets results.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: the first sentence states the core purpose, and the second explains the crucial error-handling behavior. Every sentence earns its place without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, read-only health check with an output schema, the description fully covers what an agent needs: purpose, safety profile via annotations, and the non-raising error behavior. Nothing important is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the schema fully covers parameter semantics. The baseline of 4 applies; no parameter documentation is needed, and the description instead focuses on behavior, which is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Confirm the configured Qdrant instance is reachable and responding.' It clearly distinguishes this tool from the collection and point operation siblings, which address different concerns.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description makes clear that the tool is for confirming connectivity and responsiveness of the Qdrant instance, which provides strong usage context. It does not explicitly discuss when to avoid it or name alternatives, but none of the sibling tools serve this health-check role.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

qdrant_points_countB
Read-onlyIdempotent

Count points in a collection, optionally matching a filter.

    Example: {"collection_name": "docs"}
    
ParametersJSON Schema
NameRequiredDescriptionDefault
exactNo
count_filterNo
collection_nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYesNumber of points which satisfy the conditions

TDQS

B3.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint true, idempotentHint true, and destructiveHint false, covering the safety profile. The description adds that the filter is optional and gives a minimal example, but it does not disclose behavior around the 'exact' parameter, performance cost, or what happens when the collection does not exist.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is one compact sentence plus a minimal example, with no filler or redundant explanation. The action and resource are front-loaded, and every element earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only point-counting tool with a complex filter schema and an output schema, the description is minimally adequate. It captures the core operation and filter optionality, but it omits the meaning of 'exact' and any collection-existence or performance caveats, so it is not fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, but it only notes that a filter is optional and shows a collection_name example. The non-obvious 'exact' boolean parameter is left completely unexplained, which is a significant gap for correct invocation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific action and resource: 'Count points in a collection, optionally matching a filter.' This distinguishes it from retrieval siblings such as points_get, points_scroll, and query, though it never names an alternative, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given about when to use this tool versus alternatives like qdrant_points_scroll, qdrant_query, or qdrant_collection_info. 'Optionally matching a filter' implies a use case, but there are no explicit conditions, exclusions, or alternative routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

qdrant_points_deleteA
DestructiveIdempotent

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"}}]
    }}
    
ParametersJSON Schema
NameRequiredDescriptionDefault
idsNo
points_filterNo
collection_nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusYes
operation_idNoSequential number of the operation

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotation's destructive/idempotent hints, the description adds valuable behavior: deleting a nonexistent id is a no-op and the only failure modes are a missing collection or zero/both selectors. It does not spell out that a filter deletes all matching points, but annotations already cover the destructive profile.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose, and every subsequent sentence adds meaningful constraint or failure-mode detail. The two examples are compact and directly illustrate both supported selector modes.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive delete tool with a complex filter schema and an output schema present, the description covers the essential selector exclusivity, example payloads, and failure cases. A minor gap is not explicitly stating that a filter selection deletes all matching points, though that is strongly implied.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage for the parameters, the description compensates by explaining the two selectors, requiring exactly one, and providing concrete JSON examples for both ids and points_filter. collection_name is shown in examples but not independently described; the rich Filter schema fills in the remaining structure.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description leads with a specific verb and resource: 'Delete points by id list or by payload filter'. It also scopes the operation with 'exactly one of the two', which clearly distinguishes the two deletion modes and separates it from sibling read/upsert tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear operational context and constraints (exactly one selector, needs an existing collection) but never names alternatives or says when not to use this tool, such as preferring qdrant_collection_delete for whole-collection deletion. Usage is therefore implied rather than explicitly contrasted with siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

qdrant_points_getB
Read-onlyIdempotent

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]}
    
ParametersJSON Schema
NameRequiredDescriptionDefault
idsYes
with_payloadNo
with_vectorsNo
collection_nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
pointsYes

TDQS

B3.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, and non-destructive behavior. The description adds valuable behavioral context beyond annotations: unknown IDs are silently omitted rather than raising errors, and the only failure mode is a missing collection. This is useful for an agent predicting edge-case outcomes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: the main action and key behavioral caveat appear in the first line, followed by a failure condition and a concrete example. Every sentence adds information without filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the rich annotations and existing output schema, the description covers the key behaviors an agent needs: retrieval semantics, missing-ID handling, and failure mode. The only gap is the under-documented optional parameters, but those are simple booleans with clear names and defaults, so the overall picture is reasonably complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. The example documents collection_name and ids, but with_payload and with_vectors are never mentioned, leaving their semantics entirely to their titles and defaults. The required parameters are illustrated, but optional parameters are neglected.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves points by ID, which distinguishes it from query/scroll/list siblings. The behavior note ('unknown ids are simply omitted') further clarifies the operation's scope. It does not explicitly name sibling alternatives, so it falls just short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool is for fetching specific points by ID but provides no guidance on when to choose this over qdrant_query, qdrant_points_scroll, or other siblings. There is no comparison, exclusion, or alternative mention.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

qdrant_points_scrollA
Read-onlyIdempotent

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.

    Example: {"collection_name": "docs", "limit": 50}
    
ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
offsetNo
with_payloadNo
with_vectorsNo
scroll_filterNo
collection_nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
pointsYes
next_page_offsetYes

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover safety characteristics such as readOnlyHint, idempotentHint, and destructiveHint=false. The description adds the key behavioral contract around pagination, including the meaning of `next_page_offset` and the null termination condition, which goes beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: purpose, pagination rule, then a concrete example. There is no filler, and the example earns its place by showing a minimal valid invocation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 6-parameter tool with a rich filter schema, the description covers the core scrolling mechanism and optional filtering, and an output schema exists to clarify return values. Still, it omits guidance on payload/vector inclusion parameters and does not address ordering or scan behavior, leaving noticeable gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description needed to compensate. It partially does by explaining `offset`, showing `collection_name` and `limit` in an example, and noting the `scroll_filter` via 'optionally filtered.' However, `with_payload`, `with_vectors`, and the full filter construction are left undocumented by the description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific action and resource: 'Page through all points in a collection, optionally filtered.' This clearly distinguishes the tool from sibling operations like point lookup, counting, or vector search, since it emphasizes bulk scanning and pagination.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides a clear pagination loop: pass the returned `next_page_offset` as `offset`, and treat `null` as the end of pages. This implies when the tool should be used, but it does not explicitly name alternatives or state when not to use, e.g., versus `qdrant_points_get` or `qdrant_query`.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

qdrant_points_upsertA
DestructiveIdempotent

Insert or replace points (id + vector + payload) in a collection.

    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"}}
    ]}
    
ParametersJSON Schema
NameRequiredDescriptionDefault
pointsYes
collection_nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusYes
operation_idNoSequential number of the operation

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and readOnlyHint=false, so the description's 'replace' aligns. The description adds the failure mode if collection is missing. The nested PointInput schema description further clarifies that embedding inference variants are not accepted, which is useful beyond annotations. No contradictions with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a brief opening sentence, a one-line error note, and a compact example. Every sentence earns its place. The front-loaded purpose makes it easy to scan. No redundancy or fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present (per context) and annotations covering idempotency and destructiveness, the description doesn't need to explain return values. It covers the core action, error behavior, and provides an example. Minor omissions like vector dimension validation are not critical for a typical upsert call. Overall quite complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The main description doesn't detail each parameter, but the example shows the expected structure for collection_name and points. The nested schema description explains that id is a plain integer/string, vector is an array, and payload is optional. This adds meaning beyond the raw types, though it doesn't fully cover all edge cases (e.g., vector dimension requirements).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a clear verb ('Insert or replace') and resource ('points') with specific components (id, vector, payload). It includes a concrete example that distinguishes it from sibling tools like qdrant_points_get or qdrant_points_delete. The purpose is immediately obvious and unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for writing/updating points. It mentions an error if the collection doesn't exist, which implicitly guides the agent to ensure the collection exists (e.g., via qdrant_collection_exists or create). However, it doesn't explicitly state alternatives or when not to use this tool. Clear context but no explicit exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

qdrant_queryA
Read-onlyIdempotent

Vector similarity search, with optional hybrid search over multiple prefetch stages.

    Pass `query_vector` (a literal vector, or a point id to reuse an
    existing point's vector) for a plain nearest-vector query, or
    `fusion` + 2+ `prefetch` stages to combine multiple retrieval
    strategies via Reciprocal Rank Fusion (`fusion="rrf"`) or
    Distribution-Based Score Fusion (`fusion="dbsf"`) — exactly one of
    `query_vector`/`fusion` is required. `using` selects a named vector;
    `lookup_from` resolves `query_vector` from a point id in another
    collection instead of the current one. 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": [0.5, 0.5], "using": "sparse", "limit": 20}
    ], "limit": 5}
    
ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
usingNo
fusionNo
prefetchNo
lookup_fromNo
query_filterNo
query_vectorNo
with_payloadNo
with_vectorsNo
collection_nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
pointsYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare read-only/idempotent/non-destructive behavior. The description adds substantial behavioral detail beyond that: the exactly-one requirement, the 'one level only' prefetch restriction, lookup_from cross-collection resolution, and error-on-missing-collection behavior. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but well-structured: a summary sentence, parameter semantics, an error note, then two concrete examples. Every sentence adds value, and the examples make complex hybrid usage concrete. Appropriate length for a tool with this many parameters.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity, the description is remarkably complete: both invocation modes, fusion options, prefetch semantics, the exactly-one constraint, and failure behavior are all covered. The output schema and annotations fill the remaining gaps. Only the lack of sibling-tool comparison is a minor omission, and that is a usage-guideline nuance rather than a completeness failure.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With top-level schema description coverage at 0%, the description carries a heavy burden and does much of the work: it explains query_vector (literal or point id), fusion algorithms, prefetch stages, using, and lookup_from. It doesn't explicitly define limit, with_payload, with_vectors, query_filter, or collection_name, though several are self-evident or documented in the schema's $defs. A solid but not total compensation for the schema gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a precise verb and resource: 'Vector similarity search, with optional hybrid search over multiple prefetch stages.' This leaves no doubt about the tool's function and immediately distinguishes it from sibling collection-management and point-scroll tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear context for when to use plain query_vector mode vs hybrid fusion+prefetch mode, including the 'exactly one of query_vector/fusion is required' rule and two full examples. However, it never explicitly names alternative sibling tools (e.g., qdrant_points_scroll) or states when not to use this tool, so it falls just short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 13 tool updatesv1.1.1
    • First observedqdrant_collection_create
    • First observedqdrant_collection_delete
    • First observedqdrant_collection_exists
    • First observedqdrant_collection_info
    • First observedqdrant_collection_list
    • First observedqdrant_collection_update
    • First observedqdrant_health_check
    • First observedqdrant_points_count
    • First observedqdrant_points_delete
    • First observedqdrant_points_get
    • First observedqdrant_points_scroll
    • First observedqdrant_points_upsert
    • First observedqdrant_query

TDQS

A3.9/5.0
Disambiguation5/5

Each tool targets a distinct resource and action: collection lifecycle, point operations, health, and query. Tools like collection_exists, collection_info, and collection_list are clearly differentiated by what they return and when they fail.

Naming Consistency4/5

The qdrant_ prefix and snake_case naming are consistent, with clear collection_ and points_ grouping. qdrant_health_check and qdrant_query deviate slightly from the verb_noun resource pattern but remain predictable.

Tool Count5/5

13 tools is a well-scoped set for a Qdrant server: collection CRUD plus point upsert/get/delete/scroll/count/query. Each tool earns its place and nothing feels redundant.

Completeness3/5

Core collection and point lifecycles are covered, including create, read, update, delete, and query. However, qdrant_collection_update explicitly references a qdrant_collection_vector_create tool that is not present, which is a notable gap and a dead end for adding named vectors to existing collections.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    Not graded
    maintenance
    Enables AI assistants to perform semantic search, manage vectors, and interact with Pinecone vector databases through standardized MCP tools. Supports querying, upserting, deleting vectors and monitoring database statistics for knowledge base operations.
    4
    -
  • A
    license
    Not graded
    quality
    D
    maintenance
    Provides MCP tools to interact with Milvus vector database, enabling vector search, text search, hybrid search, and collection management.
    1
    Apache 2.0
  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables RAG (Retrieval-Augmented Generation) with tools for vector search, document access, and OpenAI integration, plus MySQL storage and file system operations via MCP.
    -

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/avaazquezz/Qdrant-MCP'

If you have feedback or need assistance with the MCP directory API, please join our Discord server