io.github.avaazquezz/mcp-qdrant
This server exposes a full Qdrant vector database API as MCP tools for collection management, point CRUD, search, payload/vector editing, snapshots, and observability.
Health & collection management: health check, create/list/info/update/delete/exists collections
Point operations: upsert, get, delete, scroll, count points
Search modes: plain vector search, hybrid search (RRF/DBSF fusion), batch/grouped queries, recommend, discover, distance matrices
Payload & vectors: set/overwrite/delete/clear payload, payload indexes/facets, add/remove named vectors, batch atomic updates, update/delete vectors
Snapshots: create/list/delete/recover collection snapshots and full-storage snapshots, plus download URLs
Observability: telemetry, Prometheus metrics URL, quotas get/set, list/clear detected issues
Operational flexibility: opt-in toolsets, read-only mode, stdio or streamable-http transport, and bring-your-own-Qdrant mode
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@io.github.avaazquezz/mcp-qdrantfind similar documents to 'MCP server setup' in the docs collection"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Qdrant MCP
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 returns404on 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-qdrantDocker
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:latestThe image only makes sense with streamable-http — stdio needs a client to own the process's
stdin/stdout directly, which a detached container can't provide. The server binds
127.0.0.1 by default, so QDRANT_MCP_HTTP_HOST=0.0.0.0 is required for the port to be
reachable from outside the container. Images are published on every tagged release as
{version}, {major}.{minor}, and latest.
Claude Desktop bundle (.mcpb)
Download mcp-qdrant.mcpb from the latest release
and double-click it. Claude Desktop installs the server via uv (resolving dependencies on your
machine, no Python installation required) and prompts for Qdrant URL, API key, local path,
toolsets, and read-only mode through its own settings form — no JSON to edit.
Quick Start
Point the server at a local Qdrant instance over stdio and confirm it's reachable:
QDRANT_URL=http://localhost:6333 mcp-qdrantOnce connected from an MCP client, a typical first exchange looks like:
qdrant_health_check— confirms the configured Qdrant instance is reachable before doing anything else.qdrant_collection_create—{"collection_name": "docs", "vector_size": 4, "distance": "Cosine"}.qdrant_points_upsert—{"collection_name": "docs", "points": [{"id": 1, "vector": [0.1, 0.2, 0.3, 0.4], "payload": {"title": "hello"}}]}.qdrant_query—{"collection_name": "docs", "query_vector": [0.1, 0.2, 0.3, 0.4], "limit": 5}.
The full parameter shape of every tool is described in its own MCP schema — an LLM client reads
those directly via tools/list; the table in Available Tools below is a
human-readable summary of the same data.
Connecting to Claude
Claude Desktop / Claude Code (local, stdio)
claude_desktop_config.json (Claude Desktop) or .mcp.json (Claude Code):
{
"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-qdrantIn Claude.ai (Customize → Connectors → Add custom connector, verified hands-on against a
real account): enter the server's HTTPS URL, then on the detected authentication screen choose
"None" and add a Request header — Authorization → Bearer <the same secret>.
(Authorization is used here because it's one of the two header names Claude.ai's
custom-connector UI accepts without requiring Anthropic's manual approval of a custom name.)
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-qdrantTwo 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, noBearerprefix (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.
Recommended setup: one MCP deployment, one Qdrant per project
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.
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.
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/storageAll data for that project lives in
./qdrant_storage, on your own server — the MCP deployment never stores or sees it beyond relaying each request.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.
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 |
| — | No¹ | URL of your Qdrant instance, e.g. |
| — | No | API key for |
| — | No¹ | Path to an embedded/on-disk Qdrant instance, instead of a URL. |
|
| No | Removes every tool not marked read-only from the registry. See Read-Only Mode. |
|
| No |
|
|
| No | Comma-separated list of toolsets to register. See Available Tools. |
| — | Required for | Bearer token clients must send in the |
|
| No | Bind host for |
|
| No | Bind port for |
|
| 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, plusqdrant_queryand theqdrant_health_checksmoke test. Enough for a fully working MCP on its own.search— everything beyond plain vector search: batched/grouped queries, recommend, discover, and pairwise distance matrices.payload— payload editing and indexing, named-vector management, atomic batch point operations.snapshots— collection and full-storage backup/restore.observability— telemetry, metrics, quotas, and self-diagnosed issues.adminis 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. SettingQDRANT_MCP_TOOLSETS=adminis 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 |
|
| ✅ | ❌ | ✅ | Confirm the configured Qdrant instance is reachable and responding. |
|
| ❌ | ❌ | ❌ | Create a collection: either a single unnamed vector ( |
|
| ✅ | ❌ | ✅ | List every collection name in the configured Qdrant instance. |
|
| ✅ | ❌ | ✅ | Return full config and status of one collection. |
|
| ❌ | ❌ | ✅ | Update optimizer/HNSW/collection/vector params on an existing collection. |
|
| ❌ | ✅ | ✅ | Delete a collection and all its points; a no-op if it doesn't exist. |
|
| ✅ | ❌ | ✅ | Check whether a collection exists, without raising if it doesn't. |
|
| ❌ | ✅ | ✅ | Insert or replace points (id + vector + payload) in a collection. |
|
| ✅ | ❌ | ✅ | Retrieve points by id; unknown ids are simply omitted, not an error. |
|
| ❌ | ✅ | ✅ | Delete points by id list or by payload filter — exactly one of the two. |
|
| ✅ | ❌ | ✅ | Page through all points in a collection, optionally filtered. |
|
| ✅ | ❌ | ✅ | Count points in a collection, optionally matching a filter. |
|
| ✅ | ❌ | ✅ | Vector similarity search, with optional hybrid search over multiple prefetch stages. |
|
| ✅ | ❌ | ✅ | Run multiple independent queries against one collection in a single round trip — same query shapes as |
|
| ✅ | ❌ | ✅ | Vector query grouped by a payload field, up to |
|
| ✅ | ❌ | ✅ | 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. |
|
| ✅ | ❌ | ✅ | Run multiple independent recommend queries against one collection in a single round trip. |
|
| ✅ | ❌ | ✅ | Recommend query grouped by a payload field, up to |
|
| ✅ | ❌ | ✅ | 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. |
|
| ✅ | ❌ | ✅ | Run multiple independent discover queries against one collection in a single round trip. |
|
| ✅ | ❌ | ✅ | Pairwise distance matrix between a random sample of points: for each of |
|
| ✅ | ❌ | ✅ | Same distance matrix as |
|
| ❌ | ❌ | ✅ | Merge fields into the payload of selected points — exactly one of |
|
| ❌ | ✅ | ✅ | Replace the entire payload of selected points with |
|
| ❌ | ✅ | ✅ | Delete specific payload keys from selected points — exactly one of |
|
| ❌ | ✅ | ✅ | Wipe the entire payload of selected points, keeping their vectors — exactly one of |
|
| ✅ | ❌ | ✅ | Count distinct values of a payload field across the collection (or a filtered subset) — e.g. how many points per |
|
| ❌ | ❌ | ✅ | Create a payload index on |
|
| ❌ | ✅ | ✅ | Delete the payload index on |
|
| ❌ | ❌ | ✅ | Add a new named vector (dense or sparse) to a collection that already has points, without touching them. |
|
| ❌ | ✅ | ✅ | Remove a named vector (dense or sparse) from a collection — points keep their other vectors and payload. |
|
| ❌ | ✅ | ❌ | Run multiple point operations (upsert, delete, set/overwrite/delete/clear payload, update/delete vectors) atomically against one collection, in the order given. |
|
| ❌ | ✅ | ✅ | Replace the vector(s) of existing points by id — leaves their payload untouched. |
|
| ❌ | ✅ | ✅ | Remove specific named vectors from selected points, keeping their payload and other vectors — exactly one of |
|
| ❌ | ❌ | ❌ | Create a snapshot of one collection's current state. |
|
| ✅ | ❌ | ✅ | List the snapshots stored for one collection. |
|
| ❌ | ✅ | ✅ | Delete a collection snapshot, freeing its disk space on the server — does not touch the live collection. |
|
| ❌ | ✅ | ✅ | Overwrite |
|
| ✅ | ❌ | ✅ | 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. |
|
| ❌ | ❌ | ❌ | Create a snapshot of the whole storage (every collection and server config), not just one collection. |
|
| ✅ | ❌ | ✅ | List the full-storage snapshots stored on the server. |
|
| ❌ | ✅ | ✅ | Delete a full-storage snapshot, freeing its disk space. |
|
| ✅ | ❌ | ✅ | Confirm a full-storage snapshot exists and return where to fetch it from — same caveat as |
|
| ✅ | ❌ | ✅ | Server-wide telemetry: build info, per-collection stats, request counters, memory and hardware usage. |
|
| ✅ | ❌ | ✅ | 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 |
|
| ✅ | ❌ | ✅ | Current server-wide resource quotas (memory/disk limits) and actual usage. |
|
| ❌ | ❌ | ✅ | Update server-wide resource quotas. |
|
| ✅ | ❌ | ✅ | List the issues Qdrant has detected about its own configuration (e.g. a heavily-filtered field with no payload index). |
|
| ❌ | ✅ | ✅ | 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 (theqdrant-clientSDK itself only exposes a timeout, not retries), and translated into an MCPToolErrorcarrying Qdrant's own error message instead of a generic failure — so "collection not found" reads as exactly that.stdio-safe logging. All logging goes tostderr, configured before the MCP server object is even constructed — writing tostdoutunder thestdiotransport would corrupt the JSON-RPC message framing.BYO mode's indirection. In
QDRANT_MCP_BYOmode, the "client" every tool holds is a proxy that reads the real, per-callerAsyncQdrantClientout of a context variable set by request middleware — see Bring your own Qdrant for the full mechanism.
Security
Mandatory authentication for the personal
streamable-httpmode. The server refuses to start withoutQDRANT_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-keylive 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 installuv 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
Available Tools
13 toolsqdrant_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": {}}}
| Name | Required | Description | Default |
|---|---|---|---|
| vectors | No | ||
| distance | No | Cosine | |
| metadata | No | ||
| vector_size | No | ||
| sparse_vectors | No | ||
| collection_name | Yes | ||
| strict_mode_config | No | ||
| quantization_config | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| config | Yes | Current statistics and configuration of the collection |
| status | Yes | Current statistics and configuration of the collection |
| warnings | No | Warnings related to the collection |
| points_count | No | Approximate number of points (vectors + payloads) in collection. Each point could be accessed by unique id. |
| update_queue | No | Update queue info |
| payload_schema | Yes | Types of stored payload |
| segments_count | Yes | Number of segments in collection. Each segment has independent vector as payload indexes |
| optimizer_status | Yes | Current statistics and configuration of the collection |
| indexed_vectors_count | No | Approximate 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
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.
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.
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.
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.
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.
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_deleteADestructiveIdempotent
Delete a collection and all its points; a no-op if it doesn't exist.
Example: {"collection_name": "docs"}
| Name | Required | Description | Default |
|---|---|---|---|
| collection_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| deleted | Yes |
TDQS
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.
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.
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.
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.
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.
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_existsARead-onlyIdempotent
Check whether a collection exists, without raising if it doesn't.
Example: {"collection_name": "docs"}
| Name | Required | Description | Default |
|---|---|---|---|
| collection_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| exists | Yes |
TDQS
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.
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.
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.
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.
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.
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_infoARead-onlyIdempotent
Return full config and status of one collection.
Fails with a clear error if the collection doesn't exist.
Example: {"collection_name": "docs"}
| Name | Required | Description | Default |
|---|---|---|---|
| collection_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| config | Yes | Current statistics and configuration of the collection |
| status | Yes | Current statistics and configuration of the collection |
| warnings | No | Warnings related to the collection |
| points_count | No | Approximate number of points (vectors + payloads) in collection. Each point could be accessed by unique id. |
| update_queue | No | Update queue info |
| payload_schema | Yes | Types of stored payload |
| segments_count | Yes | Number of segments in collection. Each segment has independent vector as payload indexes |
| optimizer_status | Yes | Current statistics and configuration of the collection |
| indexed_vectors_count | No | Approximate 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
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.
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.
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.
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.
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.
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_listARead-onlyIdempotent
List every collection name in the configured Qdrant instance.
Example: {}
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| collections | Yes |
TDQS
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.
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.
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.
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.
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.
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_updateAIdempotent
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}}
| Name | Required | Description | Default |
|---|---|---|---|
| hnsw_config | No | ||
| vectors_config | No | ||
| collection_name | Yes | ||
| collection_params | No | ||
| optimizers_config | No | ||
| strict_mode_config | No | ||
| quantization_config | No | ||
| sparse_vectors_config | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| config | Yes | Current statistics and configuration of the collection |
| status | Yes | Current statistics and configuration of the collection |
| warnings | No | Warnings related to the collection |
| points_count | No | Approximate number of points (vectors + payloads) in collection. Each point could be accessed by unique id. |
| update_queue | No | Update queue info |
| payload_schema | Yes | Types of stored payload |
| segments_count | Yes | Number of segments in collection. Each segment has independent vector as payload indexes |
| optimizer_status | Yes | Current statistics and configuration of the collection |
| indexed_vectors_count | No | Approximate 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
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.
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.
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.
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.
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.
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_checkARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | |
| collection_count | No |
TDQS
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.
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.
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.
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.
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.
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_countBRead-onlyIdempotent
Count points in a collection, optionally matching a filter.
Example: {"collection_name": "docs"}
| Name | Required | Description | Default |
|---|---|---|---|
| exact | No | ||
| count_filter | No | ||
| collection_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | Number of points which satisfy the conditions |
TDQS
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.
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.
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.
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.
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.
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_deleteADestructiveIdempotent
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"}}]
}}
| Name | Required | Description | Default |
|---|---|---|---|
| ids | No | ||
| points_filter | No | ||
| collection_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | |
| operation_id | No | Sequential number of the operation |
TDQS
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.
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.
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.
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.
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.
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_getBRead-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]}
| Name | Required | Description | Default |
|---|---|---|---|
| ids | Yes | ||
| with_payload | No | ||
| with_vectors | No | ||
| collection_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| points | Yes |
TDQS
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.
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.
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.
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.
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.
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_scrollARead-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}
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| offset | No | ||
| with_payload | No | ||
| with_vectors | No | ||
| scroll_filter | No | ||
| collection_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| points | Yes | |
| next_page_offset | Yes |
TDQS
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.
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.
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.
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.
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.
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_upsertADestructiveIdempotent
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"}}
]}
| Name | Required | Description | Default |
|---|---|---|---|
| points | Yes | ||
| collection_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | |
| operation_id | No | Sequential number of the operation |
TDQS
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.
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.
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.
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.
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.
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_queryARead-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}
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| using | No | ||
| fusion | No | ||
| prefetch | No | ||
| lookup_from | No | ||
| query_filter | No | ||
| query_vector | No | ||
| with_payload | No | ||
| with_vectors | No | ||
| collection_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| points | Yes |
TDQS
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.
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.
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.
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.
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.
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.
13 tool updates
v1.1.1- First observed
qdrant_collection_create - First observed
qdrant_collection_delete - First observed
qdrant_collection_exists - First observed
qdrant_collection_info - First observed
qdrant_collection_list - First observed
qdrant_collection_update - First observed
qdrant_health_check - First observed
qdrant_points_count - First observed
qdrant_points_delete - First observed
qdrant_points_get - First observed
qdrant_points_scroll - First observed
qdrant_points_upsert - First observed
qdrant_query
TDQS
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.
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.
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.
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
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
Your org's AI agents, tasks, runs, search, and brain files as MCP tools and resources.
Shared, governed long-term memory for AI agents across tools and sessions via MCP and REST.
MCP-first toolbox for agents: KV storage, auth, queue, and utility tools. Free in early access.
The OpenRouter for tools. One MCP connection gives any AI agent 254 hosted tools, pay per call.
471
Related MCP Servers
- FlicenseNot gradedqualityNot gradedmaintenanceEnables 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-
- FlicenseNot gradedqualityDmaintenanceEnables interaction with Qdrant vector database for storing, searching, and managing vectors with automatic text embedding.1-
- AlicenseNot gradedqualityDmaintenanceProvides MCP tools to interact with Milvus vector database, enabling vector search, text search, hybrid search, and collection management.1Apache 2.0
- FlicenseNot gradedqualityCmaintenanceEnables 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
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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