Vector Toolbox MCP
Vector Toolbox MCP is a vector-database MCP server; the provided schema exposes a full Pinecone tool surface (plus a status tool) for building, populating, searching and administering indexes.
Index lifecycle — create an index by declaring its immutable schema (
dense_fields,sparse_fields,text_fields) or attach a hosted embedding model (pinecone_create_index_for_model); list, describe, inspect capabilities, reconfigure deletion protection/tags/read capacity, delete.Namespaces — list, describe, create and delete namespaces; sample metadata shapes; index stats and per-namespace record counts.
Writing — upsert documents (optionally embedded on the way in) or raw vectors via the Vectors API; partial updates by id or filter; delete by ids, filter or whole namespace; purge TTL-expired records.
Reading — fetch records by id/filter without ranking; list record ids with optional prefix.
Search —
text(BM25),query_string(Lucene),dense,sparse,hybrid(client-side RRF or weighted fusion) andauto, all validated against the live schema first; plus integrated-inference search with server-side reranking, single-request dense+sparse hybrid via the Vectors API, and standalonepinecone_rerank.Embeddings — pluggable providers (pinecone, openai, cohere, huggingface) for dense and sparse vectors; embed text without storing it; list hosted embedding/reranking models.
Safety rails — pre-flight validation of field names, vector width, batch size and
top_k; destructive tools requireconfirm=true; TTL via avtb_expires_atmetadata convention;VTB_READ_ONLYdisables writes.Diagnostics —
vectortoolbox_statusreports backends, default embedding provider and read-only mode.
(Note: the README also documents Chroma and Weaviate backends, but this schema only exposes the Pinecone tools and the status tool.)
Allows generating dense embeddings through OpenAI's embedding models for use in vector storage and search operations.
Click on "Deploy 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., "@Vector Toolbox MCPSearch the 'kb' namespace for 'refund policy' using hybrid search"
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.
Vector Toolbox MCP
One MCP server, many vector databases — the same idea as Google's MCP Toolbox for databases, applied to vector stores. Pinecone, Chroma, Weaviate and Qdrant are wired up; the tool surface, backend contract and embedding layer are built so Milvus or pgvector slot in behind the same shape.
Built against the Pinecone Python SDK v10 — the Documents API with declared
field schemas, not the older dimension/metric index model.
Quick start
You need uv (or Docker). Add this to your MCP client's config and restart it:
{
"mcpServers": {
"vector-toolbox": {
"command": "uvx",
"args": ["--from", "vector-toolbox-mcp[chroma]", "vector-toolbox-mcp"],
"env": { "PINECONE_API_KEY": "pcsk_..." }
}
}
}Or let the installer find the config file, keep your other servers, and use absolute paths for you:
uvx --from vector-toolbox-mcp vector-toolbox-install claude-desktop # or: antigravity, cursorChroma needs no account — its default store is a local folder
(~/.vector-toolbox/chroma). Pinecone needs PINECONE_API_KEY. Full options:
Install and connect.
Related MCP server: @dotlab-hq/vector-store-mcp
Install and connect
Way to run | Best for | Command the client launches |
uvx (PyPI) | Most people |
|
Docker, stdio | No Python on the machine |
|
Docker, HTTP | One shared server, several clients or machines | client connects to |
Source checkout | Developing the server |
|
Extras pick optional dependencies: chroma, weaviate, qdrant, openai, cohere,
local (sentence-transformers — large), or all (everything but local).
Pinecone support is always included. Example: vector-toolbox-mcp[chroma,weaviate].
Configuration
Everything is an environment variable — set them in the client config's env
block, in a .env file, or with -e for Docker. The full list with comments is
in .env.example. The ones most people touch:
Variable | Default | Purpose |
| — | Pinecone backend |
|
| Chroma default client: |
|
| Where the persistent Chroma store lives |
| — | Chroma Cloud |
|
| Weaviate default client: |
|
| Self-hosted Weaviate |
| — | Weaviate Cloud |
|
| Default embedder ( |
| — | Those embedders |
|
|
|
|
|
|
|
| HTTP listener |
| — | Require |
| — | Host headers to accept on HTTP (DNS-rebinding protection) |
A .env is found, in order: --env-file / VTB_ENV_FILE, a source checkout's
root, ~/.config/vector-toolbox/.env, the working directory. Real environment
variables always win. Command-line flags: vector-toolbox-mcp --help.
Claude Desktop
Config file: macOS ~/Library/Application Support/Claude/claude_desktop_config.json,
Windows %APPDATA%\Claude\claude_desktop_config.json (Settings → Developer →
Edit Config opens it).
vector-toolbox-install claude-desktop # uvx
vector-toolbox-install claude-desktop --mode docker
vector-toolbox-install claude-desktop --mode source # from a checkoutor paste one of examples/claude-desktop/ — uvx.json,
docker.json, source.json. Then quit Claude Desktop completely (Cmd+Q on
macOS, Exit from the tray on Windows) and reopen it.
macOS: "spawn uvx ENOENT". Apps started from the Dock don't get your shell's
PATH. Use the absolute path fromwhich uvxascommand(the installer does this for you).
Claude Desktop's config file only launches local servers. To use a remote HTTP deployment, add its URL as a custom connector in Claude's settings instead.
Claude Code
claude mcp add vector-toolbox -e PINECONE_API_KEY=pcsk_... -- uvx --from 'vector-toolbox-mcp[chroma]' vector-toolbox-mcp
claude mcp add --transport http vector-toolbox http://localhost:8000/mcp --header "Authorization: Bearer $VTB_AUTH_TOKEN"Google Antigravity
Antigravity (IDE, 2.0 and CLI) reads ~/.gemini/config/mcp_config.json, or
.agents/mcp_config.json inside a workspace. In the IDE: agent panel … →
MCP Servers → Manage MCP Servers → View raw config.
vector-toolbox-install antigravity # uvx, local
vector-toolbox-install antigravity --mode http --url http://localhost:8000/mcp --token-env VTB_AUTH_TOKENExamples: examples/antigravity/mcp_config.json
(local) and mcp_config.remote.json
(remote — note Antigravity's key is serverUrl, not url). Refresh the server
list after editing.
Cursor and VS Code
Cursor: ~/.cursor/mcp.json or .cursor/mcp.json in a project —
vector-toolbox-install cursor, or see examples/cursor/mcp.json.
VS Code: .vscode/mcp.json uses a servers key and can prompt for secrets —
see examples/vscode/mcp.json.
Docker
The image ghcr.io/salindahulangamuwa/vector-toolbox-mcp (linux/amd64 and
arm64) runs as a non-root user with /data as its volume: the persistent Chroma
store and Chroma's embedding-model cache live there.
stdio — the client starts a container per session (see
examples/claude-desktop/docker.json):
docker run -i --rm -e VTB_TRANSPORT=stdio -e PINECONE_API_KEY \
-v vector-toolbox-data:/data ghcr.io/salindahulangamuwa/vector-toolbox-mcpHTTP — one long-running server, any number of clients:
export VTB_AUTH_TOKEN=$(python3 -c "import secrets; print(secrets.token_urlsafe(32))")
docker run -d --name vector-toolbox -p 127.0.0.1:8000:8000 \
-e VTB_AUTH_TOKEN -e PINECONE_API_KEY -v vector-toolbox-data:/data \
ghcr.io/salindahulangamuwa/vector-toolbox-mcp
curl http://127.0.0.1:8000/health # {"status": "ok", ...}Clients connect to http://127.0.0.1:8000/mcp with
Authorization: Bearer $VTB_AUTH_TOKEN.
Compose — docker-compose.yml runs the HTTP server
with secrets from .env; --profile chroma adds a Chroma server alongside it:
cp .env.example .env # fill in keys and VTB_AUTH_TOKEN
docker compose up -d
docker compose --profile chroma up -dBuild it yourself with docker build -t vector-toolbox-mcp .
(--build-arg EXTRAS=chroma,openai,cohere,local to include sentence-transformers).
Exposing HTTP beyond localhost: set
VTB_AUTH_TOKEN, put TLS in front (Caddy, nginx, a cloud load balancer), and setVTB_ALLOWED_HOSTSto your domain. The server prints a warning if it binds to a public address without a token. See SECURITY.md.
From source
git clone https://github.com/SalindaHulangamuwa/VectorToolBoxMCP.git && cd VectorToolBoxMCP
uv venv && uv pip install -e ".[chroma]"
cp .env.example .env # optional; read automatically from here
python scripts/handshake_check.py .venv/bin/vector-toolbox-mcp # proves MCP works over stdio
.venv/bin/vector-toolbox-install claude-desktop --mode sourceIf it does not show up
Symptom | Cause |
Server missing from the client | The client was reloaded, not fully restarted |
|
|
Every call errors | Keys not reaching the server — call |
Only read tools work |
|
| Add the |
| Add the |
| Add the |
Weaviate "not reachable" | Both ports must be open: HTTP (8080) and gRPC (50051) |
HTTP returns 401 | Missing or wrong |
Running the command by hand shows start-up errors the client hides. It then waits silently for JSON-RPC on stdin — that is normal.
Why the schema comes first
In current Pinecone an index declares a schema of searchable fields, and the schema decides which searches that index can ever answer:
Field type | Enables |
| semantic search |
| learned lexical search (SPLADE-style) |
| BM25 and Lucene query strings |
The schema is immutable. Adding a signal later means creating a new index and reindexing. Because of that, every search tool in this server checks the request against the live schema before going to the network, and a mismatch comes back as an explanation ("index X has no FTS field; it supports dense, vectors_api") rather than an HTTP 400.
pinecone_index_capabilities is the tool that reports this.
The five index/search recipes
# | Setup | Create with | Search with |
1 | Single text field — keyword only (FTS) |
|
|
2 | Multi-field FTS |
|
|
3 | Dense + FTS |
|
|
4 | Multi-signal — dense + sparse + FTS | all three lists |
|
5 | Sparse + dense hybrid, single-vector index | one dense + one sparse field, no text |
|
Multi-field FTS is several clauses, not one
A text clause names exactly one field. Scoring across body and summary
means two clauses in a single request, which Pinecone combines with equal
weight — there is no per-clause weight parameter. The toolbox builds those
clauses for you from fields, and field_queries lets each field carry its own
query text. Weighting across text fields is only reachable through
query_string boosts (title:(x)^3 OR body:(x)) or by running the fields
separately and fusing with mode="hybrid".
One thing worth knowing about hybrid
Pinecone's Documents API accepts several text / query_string clauses in one
request, but a dense_vector or sparse_vector clause must stand alone. So a
true multi-signal search is several requests fused client-side. This server does
that with Reciprocal Rank Fusion by default (score-scale agnostic — BM25 scores
and cosine similarities are not comparable), with fusion="weighted" and
weights={"dense": 2, "text": 1} available when you want to bias a signal.
Recipe 5 is the exception: on a single-vector index the Vectors API scores a dense
and a sparse vector together in one server-side request. That is what
pinecone_query_vectors is for.
TTL — read this before relying on it
Pinecone has no server-side record expiry. Rather than pretend otherwise, the toolbox implements TTL as an explicit convention:
a record written with
ttl_secondscarriesvtb_expires_at(epoch seconds) as ordinary metadata; a record written without one carries nothing extra;searches exclude lapsed records by default, using
{"$or": [{"vtb_expires_at": {"$exists": false}}, {"vtb_expires_at": {"$gt": now}}]}— the$existshalf is what stops records with no TTL (including any written outside this server) from being hidden;pinecone_purge_expiredactually deletes lapsed records — it is the only thing that reclaims storage. Run it on a schedule if TTL matters to you.
The field name is not cosmetic: Pinecone rejects any field starting with _
or $ — _ is reserved for _id and _score, $ for filter operators — and
one invalid field fails the entire upsert request. _expires_at would have
broken every write.
Embeddings are pluggable
Storing vectors is decoupled from producing them. Any tool that needs an embedding
takes embed_provider / embed_model / embed_dimension, falling back to
VTB_EMBED_PROVIDER / VTB_EMBED_MODEL.
Provider | Dense | Sparse | Install |
| ✅ | ✅ | included |
| ✅ | — |
|
| ✅ | — |
|
| ✅ | — |
|
Documents that already carry a vector are left alone, so pre-computed and generated vectors can be mixed in one upsert. Vector width is checked against the schema before anything is sent.
There is also the fully hosted route: pinecone_create_index_for_model attaches a
Pinecone embedding model to the index, and pinecone_search_records embeds the
query server-side. No provider needed on this side.
Constraints the toolbox checks for you
Each of these fails an entire request server-side, so they are validated before the call goes out, with a message naming the offender:
Constraint | Enforced where |
At most 1 |
|
Field names unique, ≤64 bytes, never | create + every upsert |
Every document needs an |
|
One bad document fails the whole batch — so all offenders are reported at once |
|
≤1000 documents per request | batching |
| every search |
A | every search |
Other documented limits worth designing around: 40 KB metadata per record, 2 MB
per document, 100 KB and 10,000 tokens per FTS field, 10,000 values per $in,
128 tokens per $match_* operator.
Filter operators. Metadata: $eq $ne $gt $gte $lt $lte $in $nin $exists $and $or $not. On FTS fields additionally $match_phrase, $match_all,
$match_any. Lucene (query_string) supports boolean operators, phrases, phrase
slop, boosting, phrase prefix and regex — but not fuzzy matching.
Multi-tenancy. Use one namespace per tenant rather than a metadata filter
over a shared namespace: query cost scales with namespace size, so filtering
user_id across 100 GB costs 100× what querying a 1 GB namespace does.
Eventual consistency. A read immediately after a write may not see it. The live smoke test polls rather than assuming.
Tools
Index lifecycle — pinecone_create_index, pinecone_create_index_for_model,
pinecone_list_indexes, pinecone_describe_index, pinecone_index_capabilities,
pinecone_configure_index, pinecone_delete_index
Namespaces — pinecone_list_namespaces, pinecone_describe_namespace,
pinecone_create_namespace, pinecone_delete_namespace,
pinecone_sample_metadata, pinecone_describe_index_stats
Writing — pinecone_upsert_documents, pinecone_upsert_vectors,
pinecone_update_documents, pinecone_update_vector, pinecone_delete_records,
pinecone_purge_expired
Reading — pinecone_fetch_records, pinecone_list_record_ids
Search — pinecone_search (text / query_string / dense / sparse / hybrid / auto),
pinecone_search_records (integrated inference), pinecone_query_vectors
(Vectors API), pinecone_rerank
Utilities — pinecone_embed, pinecone_list_models, vectortoolbox_status
Chroma — clients: chroma_create_client, chroma_list_clients,
chroma_remove_client, chroma_heartbeat · collections:
chroma_list_embedding_functions, chroma_create_collection,
chroma_get_collection, chroma_list_collections, chroma_modify_collection,
chroma_configure_collection, chroma_delete_collection, chroma_count,
chroma_peek, chroma_fork_collection · records: chroma_add,
chroma_update, chroma_upsert, chroma_conditional_transaction,
chroma_delete · reading: chroma_query, chroma_get,
chroma_full_text_search, chroma_validate_filter, chroma_sample_metadata
Weaviate — clients: weaviate_create_client, weaviate_list_clients,
weaviate_remove_client, weaviate_heartbeat, weaviate_list_modules ·
collections: weaviate_list_collections, weaviate_get_collection_config,
weaviate_collection_capabilities, weaviate_create_collection,
weaviate_update_collection, weaviate_add_to_collection,
weaviate_delete_collection · tenants: weaviate_list_tenants,
weaviate_create_tenants, weaviate_update_tenants, weaviate_delete_tenants ·
objects: weaviate_insert_objects, weaviate_upsert_objects,
weaviate_update_object, weaviate_delete_objects, weaviate_add_references ·
reading: weaviate_fetch_objects, weaviate_hybrid_search,
weaviate_semantic_search, weaviate_keyword_search, weaviate_aggregate,
weaviate_validate_filter
Qdrant — clients: qdrant_create_client, qdrant_list_clients,
qdrant_remove_client, qdrant_heartbeat · collections:
qdrant_list_collections, qdrant_get_collection,
qdrant_collection_capabilities, qdrant_create_collection,
qdrant_update_collection, qdrant_delete_collection, qdrant_manage_aliases,
qdrant_add_vector, qdrant_delete_vector, qdrant_create_payload_index,
qdrant_delete_payload_index · points: qdrant_upsert_points,
qdrant_update_vectors, qdrant_delete_vectors, qdrant_set_payload,
qdrant_delete_payload, qdrant_delete_points, qdrant_retrieve_points,
qdrant_scroll_points, qdrant_count_points, qdrant_facet · search:
qdrant_search, qdrant_hybrid_search, qdrant_text_search,
qdrant_recommend, qdrant_discover, qdrant_distance_matrix,
qdrant_validate_filter
Destructive tools (pinecone_delete_index, pinecone_delete_namespace,
delete_all, pinecone_purge_expired, chroma_delete_collection,
chroma_delete with delete_all, weaviate_delete_collection,
weaviate_delete_tenants, weaviate_delete_objects with delete_all,
qdrant_delete_collection, qdrant_delete_vector, qdrant_delete_points with
delete_all) require
confirm=true. Setting
VTB_READ_ONLY=true disables every write tool.
Chroma
The second backend. Chroma's model is smaller than Pinecone's — a collection is one embedding space, and each record is an id, an embedding, an optional document string, flat metadata and an optional URI. There is no field schema; what you choose up front is the embedding route and the index config.
Install the extra (it is optional so a Pinecone-only setup stays lean):
uv pip install --python .venv/bin/python -e '.[chroma]'Clients
Every chroma_* tool takes client (default "default"). Create more with
chroma_create_client and use them side by side:
| What it is | Settings |
| In-memory; gone on restart. All ephemeral clients in the process share one store | — |
| Local directory |
|
| Self-hosted server ( |
|
| Chroma Cloud | key from |
The default client is built from VTB_CHROMA_CLIENT (default persistent)
the first time a tool needs it. API keys are never accepted as tool arguments —
only the name of an environment variable — so they stay out of transcripts.
Embedding: two routes, chosen per collection
Chroma embedding function —
embedding_function={"name": "openai", "kwargs": {"model_name": "text-embedding-3-small", "api_key_env_var": "OPENAI_API_KEY"}}. Chroma embeds documents andquery_textsitself and persists the config with the collection.chroma_list_embedding_functionslists the ~30 built-ins.Toolbox embedder —
toolbox_embedder={"provider": "openai", "model": …, "dimension": …}: the same providers the Pinecone tools use. This server embeds and sends plain vectors; the choice is recorded in the collection's metadata (vtb_embed_*) so later writes and queries embed the same way.
With neither, Chroma's default function (all-MiniLM-L6-v2, 384 dims) is used
and downloads an ~80 MB ONNX model on first use. Records that already carry
an embedding are never re-embedded.
Index configuration
HNSW (single-node: ephemeral, persistent, most self-hosted) | SPANN (Chroma Cloud / distributed) | |
Fixed at creation |
|
|
Tunable later ( |
|
|
space is l2 (default), ip or cosine — pick cosine for most text
models. Single-node Chroma silently ignores a SPANN config, so the toolbox
refuses one on an ephemeral/persistent client rather than let it pass.
Writes — what Chroma does silently, surfaced
Chroma behaviour | What the toolbox reports |
|
|
|
|
|
|
Mixed "some records have embeddings, some don't" fails | caught up front, or gaps filled when |
Records can be passed as Chroma's parallel columns (ids, documents,
embeddings, metadatas, uris) or as records=[{"id", "document", …}].
Metadata is flat: scalars or non-empty, single-type arrays ({"genres": ["action", "drama"]}). update merges metadata; a key set to null is removed.
Conditional transactions
chroma_conditional_transaction is optimistic read-check-write: the checks are
read inside a transaction, the writes are buffered, and the commit only lands if
the records read are unchanged. Checks can require a record to exist / not
exist, hold specific metadata values (compare-and-swap), hold an exact
document, or a filter to match between min_count and max_count records.
Conflicts are retried up to max_retries.
Chroma's limits are validated before anything runs: one collection, at most one
write per id, deletes by explicit id only, reads via get only. This needs a
chromadb release with Collection.conditional() — 1.5.9 (current on PyPI
when this was written) does not have it, so the tool refuses unless you pass
allow_non_atomic=true (same checks then writes, no isolation, reported as
atomic: false).
Query, get and results shape
chroma_query— nearest neighbours; a batch ofquery_textsorquery_embeddings, each with its ownn_resultslist.chroma_get— by id and/or filter, paged withlimit/offset, no ranking.includepicks what comes back:documents,metadatas,embeddings,uris, plusdistancesfor queries. Ids always come back.output="rows"(default) returns one object per record, nearest first, withsimilarity = 1 − distanceadded on cosine/ip collections.output="columns"returns Chroma's native column-major shape (ids[q][i]for queries,ids[i]for get);"both"returns both.
Metadata filtering and full-text search
| |
Comparison |
|
Inclusion |
|
Arrays |
|
Logical |
|
| |
Substring |
|
Regex |
|
Logical |
|
chroma_validate_filter shows exactly what will be sent. Forgiving spellings
are rewritten ({} → no filter, several keys → $and, several operators on one
field → $and, one-item $and → the item); real mistakes — a bare list
instead of $in/$contains, $exists, $not, null — come back as
explanations. chroma_sample_metadata reports each key's type (str[] marks
array metadata) and the operators that fit.
chroma_full_text_search builds where_document from term lists
(contains, not_contains, regex, not_regex, match="all"|"any"). On its
own it is a filter — matches come back unranked. Add query_text to combine
with document search: the text filter restricts a vector query, so you get
semantic ranking over only the documents that contain your terms.
Weaviate
The third backend. A Weaviate collection is closer to a table than a bag of vectors: typed properties, one or more named vectors (each with its own vectorizer module and index), a BM25 inverted index, cross-references to other collections, and optional multi-tenancy (an isolated shard per tenant).
uv pip install --python .venv/bin/python -e '.[weaviate]'Compared with Weaviate's own MCP server
Weaviate's built-in MCP server exposes four tools. Each has an equivalent here, and the toolbox covers the rest of the lifecycle around them:
Built-in tool | Here | What's added |
|
| compact summary by default ( |
|
| counts per status; create / activate / deactivate / offload / delete tenants |
|
| same options ( |
|
| replace or merge; stable ids from a key property; batch errors reported per object |
— |
| near-text / near-vector / near-object, BM25 with boosts, sorted and cursor-paged fetch, counts and statistics |
— |
| full collection lifecycle, validated before it reaches the server |
— |
| writes with schema checks, filter deletes with dry-run |
— |
| several Weaviates at once, module discovery, filter checking |
Write tools follow the same VTB_READ_ONLY switch as every other backend
(the built-in server's equivalent is MCP_SERVER_WRITE_ACCESS_ENABLED).
Clients
| What it is | Settings |
| A server on this machine (Docker, binary) |
|
| Any self-hosted server | HTTP and gRPC host, port and TLS set separately |
| Weaviate Cloud |
|
| The client downloads and runs Weaviate itself (Linux, macOS) |
|
Weaviate's model modules (text2vec-openai, generative-cohere, …) need the
provider's key on each request. Any provider key in the environment
(OPENAI_API_KEY, COHERE_API_KEY, VOYAGEAI_API_KEY, JINAAI_API_KEY,
MISTRAL_API_KEY, ANTHROPIC_API_KEY, …) is forwarded as the matching
X-…-Api-Key header. Only header names are ever shown.
Quick local server:
docker run -d -p 8080:8080 -p 50051:50051 -e DEFAULT_VECTORIZER_MODULE=none \
cr.weaviate.io/semitechnologies/weaviate:1.37.0or docker compose --profile weaviate up -d with this repo's compose file.
Vectors: Weaviate's modules or the toolbox's embedders
Each named vector picks a vectorizer when the collection is created:
A Weaviate module (
text2vec-openai,text2vec-cohere, …): Weaviate embedssource_propertieson write and query text on search (near_text).weaviate_list_modulesshows what this server has; asking for a module it lacks fails before creation, with the list.none(self-provided): you supply vectors, or let the toolbox embed. On writes,embed_source="body"embeds that property withembed_provider/embed_model(defaultVTB_EMBED_*). On searches, text queries against a self-provided vector are embedded the same way and sent asnear_vector, so semantic and hybrid search work without a vectorizer module.
Objects written without a value for a self-provided vector are reported: vector search would never find them.
Writes — what Weaviate does silently, surfaced
Weaviate behaviour | What the toolbox does |
Auto-schema adds any unknown property (so | refuses unknown property names unless |
A batch insert succeeds even when some objects fail | returns |
Re-inserting an existing uuid fails that object |
|
Data calls on a multi-tenant collection without a tenant fail | refuses up front and lists the tenants |
Collection names are case-sensitive | a near-miss gets a "did you mean" |
id_from="sku" derives a deterministic UUID from a property, so loading the
same records twice updates rather than duplicates.
Filters
filters takes Weaviate's native where format — the one its REST API, docs
and built-in MCP server use — or the Mongo-style operators the Chroma and
Pinecone tools use. Both compile to the same query:
{"operator": "And", "operands": [
{"path": ["year"], "operator": "GreaterThanEqual", "valueInt": 2020},
{"path": ["tags"], "operator": "ContainsAny", "valueTextArray": ["ai"]}]}{"year": {"$gte": 2020}, "tags": {"$in": ["ai"]}}Native | Mongo-style |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Paths can be a property, id, _creationTimeUnix, _lastUpdateTimeUnix,
len(prop), count(refProp), or ["refProp", "TargetCollection", "prop"] to
filter through a cross-reference. Property names and value types are checked
against the collection's schema before sending; weaviate_validate_filter shows
the normalised form.
Collection settings
Set at creation | Change later ( | |
Properties | name, type, tokenization, filterable / searchable / range indexes | descriptions; add new ones ( |
Named vectors | vectorizer + source properties, index type ( | HNSW |
Inverted index | BM25 | BM25, stopwords |
Multi-tenancy | on / off, auto-creation, auto-activation | auto-creation, auto-activation |
Replication | factor | factor, async replication |
Qdrant
The fourth backend. Qdrant stores points: an id (unsigned integer or UUID), one or more named vectors — dense, sparse or multi-vector — and a free-form JSON payload. Every search is a variant of one Query API, which is why hybrid search, rescoring, recommendations and discovery compose so freely.
uv pip install --python .venv/bin/python -e '.[qdrant]'Clients
| What it is | Settings |
| Self-hosted Qdrant (Docker, binary, Kubernetes) |
|
| Qdrant Cloud | cluster |
| Embedded, on-device storage, no server — the Qdrant Edge idea |
|
| Embedded, in memory | — |
Embedded clients suit notebooks, tests and small data. Server-only features — BM25 inference, quantization, real HNSW, payload indexes, aliases, facets, the distance matrix — say so plainly when asked for there.
docker run -d -p 6333:6333 -p 6334:6334 qdrant/qdrantor docker compose --profile qdrant up -d with this repo's compose file.
Creating a collection
qdrant_create_collection covers the collection side of Qdrant's docs in one
call, validated against Qdrant's own models before anything is sent:
{
"name": "articles",
"vectors": [
{"name": "dense", "size": 1536, "distance": "cosine",
"embedder": {"provider": "openai", "model": "text-embedding-3-small"}},
{"name": "dense_small", "size": 256, "hnsw": {"m": 16},
"embedder": {"provider": "openai", "model": "text-embedding-3-small"}},
{"name": "colbert", "size": 128, "multivector": true, "hnsw": {"m": 0}}
],
"sparse_vectors": [{"name": "bm25", "bm25": {"language": "english"}}],
"quantization": {"type": "binary", "encoding": "two_bits", "query_encoding": "scalar8bits"},
"multitenancy": {"tenant_field": "org"},
"payload_indexes": [
{"field": "published", "type": "datetime"},
{"field": "body", "type": "text", "stemmer": "english", "phrase_matching": true}
],
"on_disk_payload": true,
"optimizers": {"indexing_threshold": 0}
}Docs topic | Here |
Vectors | named dense vectors with |
Storage |
|
Indexing |
|
Quantization |
|
Multitenancy |
|
Bulk upload |
|
BM25 / inference |
|
Matryoshka models | the same model on several vectors at different |
raw_config accepts Qdrant's REST create-collection body instead, for anything
the arguments don't cover. Later changes go through qdrant_update_collection,
qdrant_add_vector / qdrant_delete_vector and qdrant_manage_aliases
(atomic alias switches for zero-downtime rebuilds).
How text becomes vectors
The toolbox records, in the collection's metadata, which embedder fills each dense vector and which sparse vectors are BM25. After that, plain text works everywhere a vector does:
writes:
text_source="body"embeds that payload field into every such vector;searches: a text
querygoes to the right embedder for the vector searched;qdrant_hybrid_searchwith justqueryruns one branch per embeddable vector and fuses them (RRF by default).
A collection built elsewhere can be taught its embedders with
qdrant_update_collection(set_embedders=...).
Writes — what Qdrant does silently, surfaced
Qdrant behaviour | What the toolbox does |
Upsert overwrites an existing id without a word | reports |
Ids must be unsigned integers or UUIDs | rejects other strings up front; |
A point written without a vector is never found by vector search | counted in a |
Wrong vector size or name fails the whole batch | checked per point, with the vector's size and the names that exist |
Filters on unindexed payload work but scan | listed in |
Nothing stops a query from reading every tenant |
|
Search
Tool | Docs topic |
| nearest neighbours by text, vector or point id; |
| prefetch branches + |
| BM25-ranked when there is a BM25 vector; full-text payload match ( |
| explore: recommendations (average vector, best score, sum scores), discovery and context search, sampled similarity pairs |
| filter-only reads, |
Filters take Qdrant's native must / should / must_not form or the
Mongo-style operators shared with the other backends
({"year": {"$gte": 2020}, "tag": {"$in": ["ai"]}}); $text, $phrase,
$text_any, $geo, $values_count, $nested, $is_null, $has_vector and
{"id": {"$in": [...]}} cover the Qdrant-specific conditions.
qdrant_validate_filter shows the native form.
Tests
.venv/bin/pytest # Pinecone mocked; Chroma and Qdrant in-memory; Weaviate / Qdrant live tests run when reachable
.venv/bin/ruff check src tests
.venv/bin/python scripts/smoke_test.py # live; needs PINECONE_API_KEYThe live smoke test creates a scratch index prefixed vtb-smoke-, exercises each
of the five recipes, and deletes it again.
tests/test_weaviate_live.py runs against a real Weaviate when one answers on
localhost:8080 (or VTB_TEST_WEAVIATE=host:http_port:grpc_port) and is skipped
otherwise. It only touches collections prefixed VtbTest.
tests/test_qdrant_live.py does the same for Qdrant on http://localhost:6333
(or VTB_TEST_QDRANT=<url>), touching only collections prefixed vtb_test_.
Contributing
Adding a backend, a tool or a fix: see CONTRIBUTING.md. Security reports: SECURITY.md. Changes: CHANGELOG.md.
License
Available Tools
28 toolspinecone_configure_indexA
Change an index's deletion protection, tags or read capacity.
The field schema is immutable - a new signal (a sparse field, an FTS field) means creating a new index and reindexing.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | ||
| index | Yes | ||
| read_capacity | No | ||
| deletion_protection | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It usefully discloses that field schema is immutable and that schema changes require a new index plus reindexing, which is real behavioral context. However, it says nothing about permissions, whether the change is a merge or full replace of tags, whether omitted/null parameters mean 'leave unchanged', or whether the operation is reversible.
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, front-loaded with the mutable surface, followed by the immutability constraint. Every sentence carries information and there is no boilerplate.
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?
An output schema exists, so return values need not be described. The description is adequate on purpose and mutability boundaries, but for a mutation tool with zero annotation coverage and 0% schema description coverage it leaves key call-time questions unanswered: partial-update semantics for omitted parameters, tag merge vs replace, and any permission requirements.
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. It does map three of the four parameters to plain-language names (deletion protection, tags, read capacity) and the fourth (index) is self-evident. But it gives no format or semantics for the opaque read_capacity object, no meaning for null values, and no indication of how tags are applied, leaving real ambiguity.
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 names a specific verb (change/configure) and resource (an index) and enumerates the mutable fields: deletion protection, tags, read capacity. It also distinguishes itself from create_index by stating the field schema is immutable, so an agent can route a schema change elsewhere. It stops short of naming a sibling tool explicitly, but the mutability boundary does most of the differentiation work.
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 a clear when-to-use (adjust deletion protection, tags, read capacity) and a when-not-to-use plus the alternative action (a new signal means creating a new index and reindexing). What is missing is any prerequisite or permission context and whether read_capacity changes take effect immediately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pinecone_create_indexA
Create a Pinecone index by declaring its searchable fields.
The schema decides which searches the index can ever answer, and it cannot be changed afterwards - so decide up front:
dense_fields-> semantic search. Dimension must match the embedding model you will use.sparse_fields-> learned lexical search (SPLADE-style).text_fields-> BM25 full-text search and Lucene query strings.
Recipes matching the five common setups:
Keyword search only, one field:
text_fields=[{"name": "body"}]Multi-field FTS:
text_fields=[{"name": "body"}, {"name": "summary"}]Dense + FTS in one index:
dense_fields=[{"name": "embedding", "dimension": 1024}]plustext_fields=[{"name": "body"}]Multi-signal (dense + sparse + FTS): all three lists populated.
Sparse + dense hybrid over the Vectors API: exactly one dense and one sparse field, no text fields.
Limits enforced before the call is sent: at most one dense_vector
field and at most one sparse_vector field per index, up to 100
full-text string fields. Field names must be unique, at most 64 bytes,
and must not start with _ (reserved for _id / _score) or
$ (reserved for filter operators).
Only searchable fields go in the schema. Ordinary metadata is indexed for filtering automatically the first time it appears on a record; declaring it here is rejected by the API.
Args:
name: 1-45 chars, lowercase alphanumerics and hyphens.
pod: Pod deployment instead of managed serverless, e.g.
{"environment": "us-east-1-aws", "pod_type": "p1.x1", "replicas": 1, "shards": 1}.
read_capacity: {"mode": "OnDemand"} or
{"mode": "Dedicated", "dedicated": {...}}.
deletion_protection: "enabled" blocks deletion until switched back.
tags: Up to 20 key/value pairs.
cmek_id: Customer-managed encryption key id.
timeout: Seconds to wait for readiness; -1 returns immediately.
| Name | Required | Description | Default |
|---|---|---|---|
| pod | No | ||
| name | Yes | ||
| tags | No | ||
| cloud | No | ||
| region | No | ||
| cmek_id | No | ||
| timeout | No | ||
| text_fields | No | ||
| dense_fields | No | ||
| read_capacity | No | ||
| sparse_fields | No | ||
| deletion_protection | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does so well: it warns the schema 'cannot be changed afterwards', states limits enforced before the call (at most one dense and one sparse field, up to 100 text fields, name uniqueness/64-byte/no-underscore-or-dollar rules), and notes that ordinary metadata is auto-indexed and must not be declared here. These are exactly the destructive/constraint facts an agent needs before invoking a create operation.
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: the immutability warning and schema-decision framing are front-loaded, recipes are enumerated, and limits are stated as a compact rule with a dedicated Args section. A few lines (e.g. the full fifth recipe) could be trimmed, but nearly every sentence 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 12-parameter creation tool with an output schema present, the description covers the critical decision surface: what the schema means, what cannot be changed later, hard limits, and per-argument semantics. It leaves cloud/region undocumented and says nothing about authentication or provisioning latency beyond the timeout hint, but overall it is sufficient to call the 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?
Top-level schema description coverage is 0%, so the description must compensate, and it does for most parameters: name (1-45 chars, lowercase/hyphens), pod (with a concrete example), read_capacity, deletion_protection, tags, cmek_id, and timeout (-1 returns immediately). It omits cloud and region, which appear in the schema without any explanation, leaving a small but real 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 opening sentence gives a specific verb and resource ('Create a Pinecone index') and narrows scope with 'by declaring its searchable fields'. It is immediately clear what the tool does and what its central input is, though it never explicitly distinguishes itself from the sibling pinecone_create_index_for_model, leaving that differentiation to inference.
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 five numbered 'recipes' give concrete when-to-use guidance for each search mode (keyword-only, multi-field FTS, dense+FTS, multi-signal, hybrid), which maps configurations directly onto use cases. What is missing is explicit routing guidance versus sibling tools such as create_index_for_model or configure_index, so the agent must infer which creation path to take.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pinecone_create_index_for_modelB
Create an index with a hosted embedding model attached.
Pinecone embeds text_field on write and embeds queries on read, so
no embedding provider is needed on this side. Read it back with
pinecone_search_records. The model cannot be changed later.
Args:
model: Hosted model, e.g. "llama-text-embed-v2",
"multilingual-e5-large", "pinecone-sparse-english-v0".
text_field: Record field holding the raw text to embed.
filterable_fields: e.g. {"genre": {"filterable": true}}.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| tags | No | ||
| cloud | No | ||
| model | No | llama-text-embed-v2 | |
| metric | No | ||
| region | No | ||
| timeout | No | ||
| dimension | No | ||
| text_field | No | chunk_text | |
| read_capacity | No | ||
| read_parameters | No | ||
| write_parameters | No | ||
| filterable_fields | No | ||
| deletion_protection | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations, so the description carries the burden and it does disclose one important trait: 'The model cannot be changed later.' It also explains where embedding happens (write and read). However, it omits other operational traits an agent needs for a 14-param mutation tool — creation latency/async behavior, permissions, cost, and what the 13 undocumented parameters do.
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?
Front-loaded one-line purpose followed by rationale and a compact Args block; no filler sentences. The Args items largely repeat the schema keys, but given the schema has no descriptions at all, restating them is not waste.
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?
An output schema exists so return values need no explanation, but the description leaves the definition materially incomplete for a 14-parameter index-creation tool with 0% schema coverage and no annotations. Eleven parameters are undocumented, and there is no guidance on required vs optional choices such as cloud, region, or metric.
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 coverage is 0% across 14 parameters, yet the Args section documents only model, text_field, and filterable_fields. The example values for model are genuinely helpful, but name, cloud, region, metric, dimension, read_capacity, tags, timeout, deletion_protection and others get no semantic explanation anywhere, so most of the parameter surface stays opaque.
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?
Specific verb+resource with a differentiating qualifier: 'Create an index with a hosted embedding model attached.' This cleanly separates it from the sibling pinecone_create_index, and it names pinecone_search_records as the read path, so an agent can place it without opening a schema.
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?
Usage is implied rather than stated: 'Pinecone embeds text_field on write and embeds queries on read, so no embedding provider is needed on this side' tells the agent why to pick this variant, and 'Read it back with pinecone_search_records' routes the follow-up. But it never explicitly contrasts with pinecone_create_index or says when-not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pinecone_create_namespaceB
Create an empty namespace. Upserting to a new namespace also creates it.
| Name | Required | Description | Default |
|---|---|---|---|
| index | Yes | ||
| namespace | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It discloses that the created namespace is empty, but says nothing about idempotency when the namespace already exists, required permissions, error behavior, or whether the operation is reversible.
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, the core action front-loaded first and the useful upsert caveat second. Neither sentence is filler and there is no 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?
An output schema exists, so return values need not be explained, and the tool is simple (2 required params). However, with no annotations and undocumented parameters, the description leaves idempotency and parameter constraints unspecified, making it only minimally sufficient.
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 two parameters (index, namespace) have 0% schema description coverage, yet the description never mentions either one. It neither clarifies whether the namespace name must be unique within the index nor whether the index must pre-exist, so it fails to compensate for the coverage 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?
States a specific verb and resource ('Create an empty namespace'), which is unambiguous and distinct from siblings like pinecone_list_namespaces or pinecone_delete_namespace. It does not explicitly contrast itself with the closest sibling, pinecone_upsert_vectors, beyond the implicit note about upsert 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?
'Upserting to a new namespace also creates it' tells the agent it may not need this tool if data will be written anyway, which is genuine when-not guidance. It stops short of stating when an explicitly empty namespace is required (e.g., pre-provisioning), so it is clear context without full exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pinecone_delete_indexA
Delete an index and everything in it. Requires confirm=true.
| Name | Required | Description | Default |
|---|---|---|---|
| index | Yes | ||
| confirm | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose the two most important traits: the operation is destructive and cascades to all contained data, and it is gated behind an explicit confirm flag. It stops short of saying the deletion is irreversible or what permissions are needed.
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, zero filler, with the destruction scope stated first and the safety prerequisite second. Nothing could be removed without losing meaning.
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?
An output schema exists, so return values need not be explained, and the description covers scope and the confirm gate. For a destructive, non-annotated tool it would ideally also note irreversibility or permission requirements, but the essentials for correct invocation are present.
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; it does for the critical parameter by stating confirm=true is required (the schema only shows a boolean defaulting to false, which is misleading on its own). The 'index' parameter receives no elaboration, but its meaning is self-evident from the name.
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 ('Delete an index') plus the cascading scope ('and everything in it'), which distinguishes it from sibling deletions like pinecone_delete_namespace or pinecone_delete_records. It does not, however, explicitly name an alternative or state when this deletion is preferred over those siblings.
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 one concrete precondition ('Requires confirm=true'), which is genuine usage guidance for the highest-risk parameter. It offers no guidance on when to choose this tool versus the other deletion tools (namespace, records, purge_expired) or what state must exist beforehand.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pinecone_delete_namespaceB
Delete a namespace and every record in it. Requires confirm=true.
| Name | Required | Description | Default |
|---|---|---|---|
| index | Yes | ||
| confirm | No | ||
| namespace | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description must carry the full behavioral burden. It does disclose the destructive scope and the mandatory confirm=true guard, which is genuinely useful, but omits irreversibility, permission requirements, and cascading effects on the index.
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 tight sentences, front-loaded with the action and scope, with the confirmation gate second. Nothing is wasted.
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?
An output schema exists so return values need no explanation, but this is a destructive, unannotated mutation tool whose two required parameters are semantically undocumented and whose irreversibility is unstated. It falls short of what an agent needs to invoke it safely.
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 for all three parameters. It only explains confirm=true; the required index and namespace parameters are left completely undefined in both schema and 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?
States a specific verb+resource (delete namespace) and clarifies the scope ('and every record in it'), which is more precise than the bare name. It does not, however, differentiate itself from close siblings like pinecone_delete_records or pinecone_delete_index.
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 no when-to-use guidance, no exclusions, and no routing to alternatives such as deleting individual records or purging expired data. Only the mechanical confirm requirement is stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pinecone_delete_recordsB
Delete records by id, by metadata filter, or clear a namespace.
delete_all=true requires confirm=true.
| Name | Required | Description | Default |
|---|---|---|---|
| ids | No | ||
| index | Yes | ||
| filter | No | ||
| confirm | No | ||
| namespace | Yes | ||
| delete_all | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses the important confirm-required guard for delete_all, which is real behavioral value, but omits that deletion is irreversible, whether ids/filter/delete_all are mutually exclusive, and any permission requirements.
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, front-loaded with the resource and modes, with the confirm constraint in its own paragraph. Nothing is wasted, though the extreme brevity leaves gaps for a 6-parameter destructive tool.
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?
An output schema exists, so return values need no explanation. For a destructive, unannotated, 6-parameter tool at 0% schema coverage, however, the description should say more about irreversibility and parameter mutual exclusivity than it does.
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% across 6 parameters, so the description must compensate. It explains what ids, filter, and delete_all mean and clarifies the confirm coupling, but leaves index unexplained and does not state whether the id/filter/delete_all paths are alternatives.
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 (delete) and resource (records) and enumerates the three deletion modes (by id, by metadata filter, clear namespace). It implicitly differentiates from pinecone_delete_namespace and pinecone_purge_expired, but does not name the boundary explicitly, so it stops short of the top score.
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 when each mode applies by listing them, and adds the guard that delete_all requires confirm=true. It gives no guidance on choosing between ids vs filter vs delete_all, nor when to reach for a sibling such as delete_namespace instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pinecone_describe_indexA
Full server-side description of one index: schema, deployment, status, host.
| Name | Required | Description | Default |
|---|---|---|---|
| index | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It discloses the fields returned and that the description is server-side, implying a read-only inspection, but does not state that the operation is non-mutating, whether it can fail for missing indexes, or any rate/permission constraints. An output schema exists, which reduces the need to enumerate return values in prose.
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?
One front-loaded sentence with a colon list of returned content. No filler, every phrase 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?
Given the tool is a single-parameter read with an existing output schema, the description covers what the agent needs to select and invoke it. The only missing pieces are parameter semantics and explicit routing against siblings such as describe_index_stats.
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% for the single 'index' parameter, so the description should clarify whether this is a name, ID, or qualified identifier. It does not. Baseline 3 for a one-parameter tool with an output schema, but it leaves a real 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?
States a specific verb (describe) and resource (index), and enumerates what is returned: schema, deployment, status, host. This distinguishes it from nearby siblings like pinecone_describe_index_stats (metrics) or pinecone_index_capabilities (feature availability).
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?
Implied usage from the verb 'describe' – an agent knows this is the lookup tool for one index – but there is no explicit when-to-use versus pinecone_list_indexes or pinecone_describe_index_stats, and no statement of prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pinecone_describe_index_statsC
Record counts, dimension and per-namespace breakdown for an index.
| Name | Required | Description | Default |
|---|---|---|---|
| index | Yes | ||
| namespace | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It doesn't state that this is a read-only operation, whether it requires specific permissions, or whether the count is eventually consistent. For a stats tool with zero annotation coverage, this is thin.
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?
A single eleven-word sentence with no waste, front-loaded with the returned data. Efficient, though a bit terse for a stats tool that could explain scoping.
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?
An output schema exists, so return values needn't be explained. However, with no annotations, no output schema info in the description, and 0% schema param coverage, the definition leaves gaps for a mutation-adjacent (non-readOnly-declared) tool.
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 should explain the parameters. It mentions per-namespace breakdown, which loosely implies the optional namespace scoping, but doesn't clarify required vs optional or the default behavior. Partial compensation only.
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 resource (index stats) and enumerates the retrieved data (record counts, dimension, per-namespace breakdown). Distinguishable from pinecone_describe_index (configuration) and pinecone_describe_namespace, though neither sibling is explicitly named.
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 when-to-use context, no prerequisite guidance, and no mention of the adjacent describe_index/pinecone_describe_namespace tools. The agent must infer usage from the description alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pinecone_describe_namespaceC
Describe one namespace: record count and metadata.
| Name | Required | Description | Default |
|---|---|---|---|
| index | Yes | ||
| namespace | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It implies a read operation and briefly states the return contents, but says nothing about permissions required, behavior when the namespace doesn't exist (error vs empty), or rate limits.
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?
A single tight sentence with the resource and return contents front-loaded and zero filler. It is efficient, though arguably under-specified rather than optimally concise.
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?
An output schema exists, so return values need not be described, and the one-line summary is technically accurate. However, with two entirely undocumented parameters and no annotations, the definition leaves real gaps for an agent invoking it.
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% and both required parameters ('index' and 'namespace') are undocumented in the schema. The description does not explain the relationship between index and namespace or supply any format/syntax detail to compensate.
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 ('Describe') and resource ('one namespace') and even names the primary return contents (record count and metadata). An agent can distinguish it from list/delete namespace siblings, though it doesn't explicitly contrast with pinecone_list_namespaces or pinecone_describe_index_stats.
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 when-to-use guidance, no prerequisites, and no mention of alternatives such as pinecone_list_namespaces or pinecone_describe_index_stats. The agent must infer the read/inspection use case from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pinecone_embedC
Generate embeddings without storing them - useful for dimension checks.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | dense | |
| model | No | ||
| texts | Yes | ||
| provider | No | ||
| dimension | No | ||
| input_type | No | passage |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so the description carries full behavioral burden. It does disclose the key behavioral trait — embeddings are not persisted — but omits provider/model selection behavior, default model implications, rate limits, or whether the call is free. This is significant for a 6-param call with provider/model choices.
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?
Single front-loaded sentence with zero filler. Efficient and immediately scannable.
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?
An output schema exists, so return-value explanation isn't needed. But with 0% schema description coverage, 6 parameters, and no annotations, the description is too thin to guide correct invocation — an agent can't tell how provider/model/dimension interact or what defaults produce.
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 coverage is 0% and there are 6 parameters, including provider/model/dimension/kind/input_type enums that critically affect the embedding produced. The description adds no parameter meaning at all — not even which provider defaults apply or what 'dimension' overrides.
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 clear verb+resource ('Generate embeddings') and adds a distinctive scope qualifier ('without storing them') that separates it from incidental embedding during upsert/query. However, it doesn't name a sibling alternative (e.g., upsert_vectors or query_vectors) to fully disambiguate.
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?
Only a hint of when it's useful ('dimension checks'). No explicit when-to-use vs alternatives (e.g., use query_vectors when you also need search results, or upsert_vectors when you need persistence). An agent has to infer usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pinecone_fetch_recordsB
Fetch records by id or filter, without ranking them.
include_fields=["*"] returns every field; omitting it returns all
available fields for a document fetch.
| Name | Required | Description | Default |
|---|---|---|---|
| ids | No | ||
| index | Yes | ||
| limit | No | ||
| filter | No | ||
| namespace | Yes | ||
| include_fields | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses that results are unranked and explains include_fields' '*' behavior versus omission, but omits read/write safety, pagination/limit behavior, authentication, and filter semantics.
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, front-loaded with the core action and followed by a focused field-inclusion note. There is little waste, though 'for a document fetch' is slightly redundant.
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 tool has six parameters with no schema descriptions and no annotations, and an output schema. While return values are covered by the output schema, the input contract is barely described, leaving an agent without needed details on filter format, limit semantics, or required index/namespace usage.
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% for six parameters. The description clarifies the special '*' value and default behavior for include_fields, but leaves index, namespace, ids, limit, and filter undocumented, so it only partially compensates.
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 (Fetch) and resource (records), plus the retrieval modes (by id or filter) and a key differentiator (without ranking them). It stops short of naming the sibling search tool, so an agent must infer the contrast, but the scope is clear.
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 phrase 'without ranking them' implies the scenario where ranking is unnecessary, but there is no explicit when-to-use guidance, no named alternatives (e.g., pinecone_search_records), and no prerequisites. Usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pinecone_index_capabilitiesA
Report which searches an index can answer, and with which fields.
Call this before searching an index you did not create in this session.
It names the dense / sparse / full-text fields, the dimension each
dense field expects, and the list of valid mode values for
pinecone_search.
| Name | Required | Description | Default |
|---|---|---|---|
| index | Yes | ||
| refresh | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the behavioral burden. It discloses what information is returned (fields, dimensions, modes), which is useful, but does not mention whether the call is read-only, whether it caches results, what the refresh parameter does, or any side effects. The 'refresh' parameter is only implied by the description's silence, leaving a notable gap for a metadata-inspection tool.
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 three concise sentences, front-loaded with the core action and immediately followed by the critical usage precondition. Every sentence adds value and there is no 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?
Given that the tool has an output schema, the description need not detail return values, and it appropriately focuses on what capabilities are reported. However, the lack of any explanation for the 'refresh' parameter and the absence of behavioral details for an unannotated tool leave minor gaps. The description is largely complete for an agent to use it 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%, and neither parameter has an enum or explanation. The description mentions 'index' implicitly but does not explain the required index parameter's format (name or ID), nor does it clarify the optional 'refresh' parameter's behavior (e.g., whether it forces re-introspection or bypasses a cache). With low schema coverage, the description should compensate but does not.
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 (Report) and resource (index capabilities), and explicitly enumerates what is reported: dense/sparse/full-text fields, expected dimensions, and valid mode values. This distinguishes it from siblings like pinecone_describe_index and pinecone_describe_index_stats, which likely report structural or statistical information rather than search capabilities.
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 when-to-use guidance: 'Call this before searching an index you did not create in this session.' This tells the agent the exact context for invoking the tool. It does not name a direct alternative or exclusion (e.g., when to prefer pinecone_describe_index instead), but the guidance is precise enough for the intended workflow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pinecone_list_indexesB
List every index in the project, with the search modes each supports.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. 'List' implies a read-only operation, but nothing is said about pagination, result limits, permissions, or rate behavior. The added clause about search modes is content detail, not behavioral trait.
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?
One sentence, front-loaded verb and resource, with the scope qualifier trailing. No waste.
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 list tool with an output schema that documents the return shape, the description is sufficient to understand what comes back. It could still note whether the listing is paginated or bounded, but overall it is complete enough.
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 takes zero parameters, so there is nothing for the description to disambiguate. Baseline 4 applies; the description correctly implies the listing is project-wide with no filters.
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+resource ('List every index in the project') and adds scope detail about the search modes included. It is clearly distinct from siblings like create_index or delete_index, but does not explicitly name a sibling it differs from (e.g. describe_index).
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 when-to-use guidance, no prerequisites, and no mention of alternatives such as pinecone_describe_index or pinecone_index_capabilities for per-index detail. The agent must infer the context entirely.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pinecone_list_modelsC
List the hosted embedding and reranking models Pinecone offers.
| Name | Required | Description | Default |
|---|---|---|---|
| model_type | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It does not say the operation is read-only/side-effect-free, whether authentication is required, or whether results are static or account-specific. For a discovery call, this leaves meaningful gaps.
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?
A single tight sentence, front-loaded with the verb and resource. No waste, though it is arguably too terse to carry the needed context.
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?
An output schema exists, so return-value explanation is not required, and this is a simple zero-required-param listing tool. Still, the description omits the optional model_type filter and any usage context, leaving it barely adequate rather than 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% and the single optional model_type parameter is never mentioned by name. However, the phrase 'embedding and reranking models' implicitly maps to the embed/rerank enum values, giving partial semantic coverage of the filter.
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 (List) and resource (hosted embedding and reranking models Pinecone offers), which is unambiguous and distinct from every sibling tool. It lacks any explicit sibling routing, though none is really needed since no other tool lists models.
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?
There is no guidance on when to call this versus alternatives (e.g., pinecone_embed, pinecone_rerank, pinecone_index_capabilities), nor any mention of prerequisites such as needing a configured API key. The agent must infer the context entirely.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pinecone_list_namespacesB
List the namespaces in an index, with record counts where available.
| Name | Required | Description | Default |
|---|---|---|---|
| index | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. 'List' implies a read-only, non-destructive operation and it discloses that record counts are returned 'where available', which is useful partial output context, but it says nothing about permissions, pagination, or limits on a potentially large namespace set.
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?
One front-loaded sentence with zero filler. The subject and scope come first, and the qualifier 'where available' is the only additional detail, which is worth keeping.
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?
An output schema exists, so return-value explanation is not required, and the single-parameter invoke is simple. What is missing is routing context relative to the many sibling namespace and index tools, leaving the agent to guess when this is the right call.
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 coverage is 0% and the single 'index' parameter is undocumented in the schema, so the description must compensate. However, the parameter name 'index' is largely self-explanatory and the description implies the scope ('in an index'), so the gap is minor rather than severe.
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 (List) and resource (namespaces) scoped to an index, which distinguishes it from siblings like pinecone_describe_namespace and pinecone_create_namespace. It does not explicitly name those alternatives, 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?
There is no guidance on when to use this versus pinecone_describe_namespace, pinecone_describe_index_stats, or pinecone_list_indexes. The agent must infer that this is for enumerating namespaces without additional detail.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pinecone_list_record_idsC
List record ids in a namespace, optionally filtered by id prefix.
| Name | Required | Description | Default |
|---|---|---|---|
| index | Yes | ||
| limit | No | ||
| prefix | No | ||
| namespace | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. 'List' implies a safe read, but the description discloses nothing about pagination (a limit param with default 100 exists), sort order, or the fact that only ids (not metadata/vectors) are returned. For an annotation-free tool this leaves meaningful gaps.
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?
A single well-formed sentence with the resource front-loaded and the optional behavior qualified inline. No filler or redundancy; the terseness is an under-specification issue rather than a conciseness one.
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?
An output schema exists, so return values needn't be explained, which helps. But the description is thin for a 4-parameter tool: the required 'index' argument is unmentioned and there are no annotations, leaving the agent to infer key invocation details.
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. It covers namespace (scoping) and prefix (filter), but omits the required 'index' parameter entirely and never explains 'limit' semantics. Two of four parameters, including a required one, remain undocumented.
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 (list) and resource (record ids) with scope (in a namespace) and filter behavior (by id prefix). This implicitly distinguishes it from pinecone_fetch_records (which returns full records) and the namespace/index listing tools. However, it never explicitly names or contrasts a sibling.
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?
There is no when-to-use guidance, no prerequisites, and no alternatives named. The agent must infer that this is for lightweight id enumeration versus fetching full records. Only implied usage is present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pinecone_purge_expiredA
Permanently delete records whose TTL has lapsed. Requires confirm=true.
Searches already hide expired records; this is what actually frees the storage. Run it on a schedule if you rely on TTL.
| Name | Required | Description | Default |
|---|---|---|---|
| index | Yes | ||
| confirm | No | ||
| namespace | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and discloses several important traits: the deletion is permanent, confirm=true is required, searches only hide expired records, and the operation actually frees storage. It does not cover permissions, reversibility, or error behavior, but the core destructive semantics and confirmation requirement are clearly stated.
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 action, then immediately states the confirmation requirement, then adds operational context. Every sentence is short and earns its place, with no filler or repetition.
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 tool with no annotations and 0% schema description coverage, the description covers the operation's purpose, permanence, and confirm requirement well, and an output schema exists so return values need not be explained. However, it leaves the index and namespace parameters entirely unexplained, which is a meaningful gap given the lack of schema descriptions.
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 explain parameter meaning. It does explain the critical confirm=true requirement, but it says nothing about the required index or namespace parameters, leaving two of three parameters semantically undocumented.
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: 'Permanently delete records whose TTL has lapsed.' It also distinguishes this TTL-based purge from search behavior, which merely hides expired records. This lets an agent differentiate it from generic record deletion and search operations.
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 clearly says when to use the tool: when you rely on TTL and need storage actually freed, and recommends running it on a schedule. It also contrasts it with searches, which already hide expired records. However, it does not explicitly mention when not to use it or name the delete_records sibling as an alternative for non-TTL deletion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pinecone_query_vectorsA
Vectors API query - the true single-request dense+sparse hybrid.
On a single-vector index holding both a dense and a sparse vector per
record, passing both here has Pinecone do the hybrid scoring server
side, rather than the client-side fusion pinecone_search uses for
schema indexes.
Pass query instead of vectors to have them embedded here first, or
id to search by an existing record.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | ||
| index | Yes | ||
| query | No | ||
| top_k | No | ||
| filter | No | ||
| vector | No | ||
| namespace | Yes | ||
| embed_model | No | ||
| sparse_model | No | ||
| sparse_vector | No | ||
| embed_provider | No | ||
| include_values | No | ||
| embed_dimension | No | ||
| exclude_expired | No | ||
| sparse_provider | No | ||
| include_metadata | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose real behavior: server-side hybrid scoring, and that a `query` string is embedded inside this call before searching. However it is silent on many behavioral traits implied by 16 params — embedding provider/model requirements, filter semantics, top_k default, and the include_metadata/exclude_expired toggles — all left for the agent to infer.
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?
Three front-loaded sentences; the core distinction against `pinecone_search` comes first and the input-mode shortcuts last. Some jargon ("client-side fusion", "true single-request") adds density without much payoff, but nothing is padded.
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?
An output schema exists, so return values need not be described. For a 16-param retrieval tool with zero schema coverage and no annotations, the description nails the input-mode logic but leaves the bulk of parameters and the embedding-requirement side-effects undocumented — adequate but with clear 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 must compensate, and it does explain the critical mutually-exclusive input modes (vector vs query vs id) plus the dense+sparse pairing. But it covers only a handful of the 16 params; filter, top_k, embed/sparse model/provider, embed_dimension, include_values, include_metadata, and exclude_expired get no semantic guidance anywhere.
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 names a specific verb and resource (query vectors) and sharpens it with the differentiator that matters: dense+sparse hybrid scoring done server-side in one request. It explicitly contrasts with the sibling `pinecone_search`, so an agent can route between them without opening either schema.
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 states the selecting condition clearly: use this on a single-vector index holding both a dense and sparse vector per record, because Pinecone fuses server-side rather than the client-side fusion `pinecone_search` uses. It also gives the three input modes (vector, query, id). No exclusions against the other search siblings (`pinecone_search_records`), so a 4 rather than 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pinecone_rerankA
Rerank a candidate list with a hosted cross-encoder.
Use it as a second stage: retrieve widely with pinecone_search
(top_k 50-100), then rerank down to the handful you actually want.
Args:
documents: [{"id": "d1", "text": "..."}].
rank_fields: Which field the reranker reads, default ["text"].
| Name | Required | Description | Default |
|---|---|---|---|
| model | No | bge-reranker-v2-m3 | |
| query | Yes | ||
| top_n | No | ||
| documents | Yes | ||
| rank_fields | No | ||
| return_documents | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It discloses the hosted nature of the cross-encoder and its role as a re-scoring stage, which is useful context beyond the structured fields, but says nothing about cost, latency, or behavior on malformed/missing documents.
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?
Front-loads purpose then usage in two tight sentences, followed by a short Args block. The Args block only covers two of six parameters, so it is slightly unbalanced, but no sentence is wasted.
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?
An output schema exists so return values need not be described. However, with no annotations and four undocumented parameters (notably top_n and return_documents), the description is not complete enough for an agent to call this correctly without guessing.
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. It documents the documents shape ({"id", "text"}) and rank_fields default, but leaves model, top_n (how many to keep), query, and return_documents unexplained — a meaningful gap for a 6-param tool.
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 (rerank) and resource (candidate list), plus the mechanism (hosted cross-encoder). It also names the sibling it complements (pinecone_search), so an agent can place it in the pipeline without 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?
Explicitly prescribes when to use it: as a second stage after retrieving widely with pinecone_search (top_k 50-100), then reranking down to a handful. Both the alternative and the selecting condition are stated, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pinecone_sample_metadataA
Sample records from a namespace and describe the metadata shape.
Returns each field observed, its types, how many of the sampled records carried it, and up to three example values - enough to write a correct filter without dumping the namespace into the conversation.
| Name | Required | Description | Default |
|---|---|---|---|
| index | Yes | ||
| namespace | Yes | ||
| sample_size | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden, and it does disclose meaningful output traits: per-field types, carry counts, and up to three example values, plus the bounded nature of the result. It stops short of saying whether the sample is random or what sampling costs, but the core behavior is well conveyed.
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?
Front-loaded with the verb and scope, then a compact clause explaining the return shape. No wasted sentences, though the prose is slightly more expansive than strictly needed given an output schema exists.
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 sampling tool with an output schema and no annotations, the essentials are present: what is sampled, what comes back, and why it is bounded. Missing only operational caveats such as sampling randomness or any performance/scope limits.
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 should compensate for all three parameters, but it only alludes to 'namespace' and the act of sampling. It never explains index, namespace (scope vs. selection), or sample_size's effect on cost and result fidelity.
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: sample records from a namespace and describe the metadata shape. This clearly differentiates it from siblings like pinecone_fetch_records and pinecone_list_record_ids, which retrieve data rather than describe its shape.
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 phrase 'enough to write a correct filter without dumping the namespace into the conversation' gives a clear use context: learn the metadata schema cheaply before filtering. It does not, however, name an explicit alternative or state when not to use it (e.g. versus describe_namespace).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pinecone_searchA
Search an index, validating the request against its schema first.
Modes, and what each needs from the schema:
text- BM25. A text clause names exactly one field, so scoring across several fields sends one clause per field in a single request and Pinecone combines them with equal weight (there is no per-clause weight). Passfieldsto choose them, or omit it to use every FTS field.field_queriesgives each field its own query text, e.g.{"body": "disappointing", "summary": "Disappointing"}.query_string- Lucene syntax, which targets fields inside the query itself:title:(quantum) OR body:(machine AND learning). SupportsAND/OR/NOT,+/-, grouping, phrases"...", phrase slop"..."~2, boostingterm^2, phrase prefix"mach lear"*and regexbody:/mach.*/. Fuzzy matching (~1on a single term) is not supported.dense- semantic search.queryis embedded with the configured provider unless you passvectoryourself.sparse- learned lexical search over a sparse vector field.hybrid- every signal the index has, run separately and fused client-side. A dense or sparse clause must be the only clause in its request, so this is one request per signal merged with Reciprocal Rank Fusion (fusion="weighted"plusweights={"dense": 2, "text": 1}to bias one signal).auto- the richest mode the index supports.
filter narrows candidates before ranking and is deterministic, not
a scoring signal. Metadata operators: $eq $ne $gt $gte $lt $lte $in $nin $exists $and $or $not. On FTS-enabled string fields you also get
$match_phrase, $match_all and $match_any (at most 128
tokens each) - which is how you rank by vector while requiring an
exact term.
include_fields defaults to every stored field. Pass a narrower list
to keep responses small, or [] for ids and scores only.
top_k may be 1-10000.
Records whose TTL has lapsed are excluded by default; records written without a TTL are never hidden.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | auto | |
| index | Yes | ||
| query | No | ||
| top_k | No | ||
| fields | No | ||
| filter | No | ||
| fusion | No | rrf | |
| vector | No | ||
| weights | No | ||
| namespace | Yes | ||
| dense_field | No | ||
| embed_model | No | ||
| sparse_field | No | ||
| sparse_model | No | ||
| field_queries | No | ||
| sparse_vector | No | ||
| embed_provider | No | ||
| include_fields | No | ||
| embed_dimension | No | ||
| exclude_expired | No | ||
| sparse_provider | No | ||
| candidate_multiplier | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full disclosure burden and does so well: it states that filter is deterministic pre-ranking rather than a scoring signal, that TTL-expired records are excluded by default while records without TTL are never hidden, the top_k bounds (1-10000), the include_fields default, and that invalid requests are validated against the schema first. It does not cover error behavior or result ordering beyond fusion details, keeping it short of a 5.
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?
Long but front-loaded and tightly organized: purpose first, then a mode-by-mode breakdown, then filtering, then output sizing. Nearly every sentence carries operational detail with little filler, though the density borders on documentation rather than a tool description.
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?
An output schema exists, so return values need not be explained, and the description does address TTL, filtering, sizing, and mode selection. Still, for a 22-parameter tool with zero schema-level documentation, the undocumented embedding and sparse-vector parameters leave real gaps an agent cannot resolve from the definition alone.
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% across 22 parameters, so the description must compensate and only partially does: it explains mode, fields, field_queries, filter operators, include_fields, top_k, fusion, weights, vector, and exclude_expired. Many parameters (index, namespace, dense_field, embed_model/provider/dimension, sparse_field/model/provider, sparse_vector, candidate_multiplier) receive no semantic explanation anywhere.
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 ('Search an index') and then enumerates the search modes it supports, which tells an agent what capability it covers. However, it never distinguishes itself from close siblings such as pinecone_search_records or pinecone_query_vectors, which appear to overlap heavily with the dense/sparse/hybrid modes described here.
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 rich *intra-tool* routing guidance (when to choose text vs query_string vs dense vs hybrid, and that 'auto' picks the richest supported mode), which is genuinely useful. But it offers no guidance on when to call this tool at all versus the sibling search/query/rerank/embed tools, so alternative selection is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pinecone_search_recordsA
Search an integrated-inference index - Pinecone embeds the query.
Only for indexes created with pinecone_create_index_for_model.
Optional server-side reranking: pass rerank_model (e.g.
"bge-reranker-v2-m3") and rerank_fields.
match_terms constrains sparse retrieval to records containing
specific terms, e.g. {"strategy": "all", "terms": ["refund"]}
(sparse indexes on pinecone-sparse-english-v0 only).
| Name | Required | Description | Default |
|---|---|---|---|
| index | Yes | ||
| query | Yes | ||
| top_k | No | ||
| fields | No | ||
| filter | No | ||
| namespace | Yes | ||
| match_terms | No | ||
| rerank_model | No | ||
| rerank_top_n | No | ||
| rerank_fields | No | ||
| exclude_expired | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It usefully discloses that embedding happens server-side, that reranking is optional and server-side, and that match_terms only applies to sparse indexes on pinecone-sparse-english-v0. However it says nothing about read-only vs mutating semantics, pagination, or how top_k/exclude_expired behave at runtime.
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?
Front-loads the defining constraint in the first sentence, then adds only the non-obvious feature notes. The parenthetical examples earn their space; there is little filler, though the structure is a bit fragmented across short paragraphs.
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?
An output schema exists so return values need not be explained, and the distinctive inference/rerank/sparse behavior is covered. For an 11-parameter tool with zero schema descriptions and no annotations, though, several required and optional parameters go unexplained, leaving gaps an agent must guess at.
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% across 11 parameters, so the description must compensate and partially does: it explains the query (auto-embedded), rerank_model/rerank_fields (with a concrete model example), and match_terms (with a full JSON example and its index-type restriction). It leaves index, namespace, top_k, fields, filter, rerank_top_n, and exclude_expired entirely undocumented in both schema and 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?
States a specific verb+resource ('Search an integrated-inference index') and immediately scopes it: Pinecone embeds the query, so this differs from vector-passing search. The restriction to indexes created with pinecone_create_index_for_model further distinguishes it. It stops short of explicitly naming which sibling (e.g. pinecone_query_vectors or pinecone_search) it should be chosen over.
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?
Gives a clear precondition ('Only for indexes created with pinecone_create_index_for_model') and conditional usage for reranking and match_terms. It does not name the alternative tool to use when the index was not created that way, so the routing is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pinecone_update_documentsB
Partially update documents - by id, or by filter across many at once.
Args:
documents: Per-record updates, each with _id and the fields to
change.
filter: Update every document matching this filter instead.
set_fields: Fields to set on all matched documents.
remove_fields: Field names to strip.
| Name | Required | Description | Default |
|---|---|---|---|
| index | Yes | ||
| filter | No | ||
| documents | No | ||
| namespace | Yes | ||
| set_fields | No | ||
| remove_fields | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It doesn't state required permissions, whether updates are reversible, partial-update semantics (merge vs replace), conflict behavior, or the effect on unspecified fields. For a mutation tool with zero annotation coverage this is a significant gap.
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 first sentence efficiently front-loads the dual update modes, and the Args block is terse. Minor redundancy in restating field semantics, but overall efficient and well-structured.
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 no annotations, a mutation tool, 0% schema coverage, and required parameters undocumented, the description should do more. An output schema exists so return values needn't be explained, but the mutation behavior and required-parameter semantics are left ambiguous.
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, and it does explain five of six parameters (documents, filter, set_fields, remove_fields). However, the required parameters 'index' and 'namespace' are completely undocumented, leaving critical scope information missing.
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 ('partially update') and resource ('documents'), and distinguishes two update modes: by id or by filter. It is clearer than siblings like upsert_documents or update_vector, though it doesn't explicitly name a sibling to avoid.
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 implies when to use each mode ('by id, or by filter across many at once') but offers no prerequisites, no exclusions, and no explicit comparison to alternatives like upsert_documents or delete_records. Usage context is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pinecone_update_vectorC
Update one record's vector values or metadata via the Vectors API.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| index | Yes | ||
| values | No | ||
| namespace | Yes | ||
| set_metadata | No | ||
| sparse_values | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It says the operation updates a record but does not disclose whether it is destructive, idempotent, requires index/namespace to exist, what happens if the id is missing, or whether metadata is merged versus replaced. This is a significant gap for a mutation tool.
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?
A single efficient sentence with no wasted words and the verb and resource front-loaded. It is concise but under-informative rather than overly verbose.
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 no annotations, 0% parameter coverage, and no description coverage of the six parameters or mutation semantics, the description is too thin for a state-mutating tool. An output schema exists, so return values needn't be explained, but the missing behavioral and parameter detail leaves the definition incomplete.
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 descriptions of all six parameters are absent. The description briefly implies 'values' and 'metadata' are updatable but does not mention 'index', 'namespace', 'id', 'set_metadata', or 'sparse_values', nor does it clarify merge-vs-replace semantics for set_metadata. It therefore fails to compensate for the 0% coverage.
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 (update) and resource (one record's vector values or metadata) and specifies the API surface (Vectors API). It does not explicitly distinguish itself from pinecone_update_documents, which presumably updates document-level records, leaving mild 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?
No when-to-use guidance, no prerequisites, and no mention of alternatives despite close siblings like pinecone_update_documents, pinecone_upsert_vectors, and pinecone_upsert_documents. The agent must infer usage from the tool name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pinecone_upsert_documentsA
Upsert records, optionally embedding them on the way in.
Each document needs a unique _id. Fields declared in the index
schema are searched; every other field is stored and indexed for
filtering automatically.
Embedding is plug-and-play. Pass embed_source_field naming the text
field to embed and the toolbox fills every dense and sparse field the
schema declares, using embed_provider/embed_model (defaults come
from VTB_EMBED_PROVIDER / VTB_EMBED_MODEL). A document that already
carries a vector for a field is left alone, so you can mix pre-computed
and generated vectors in one call. The vector width is checked against
the schema before anything is sent.
Validated before sending, because Pinecone fails an entire upsert if
any one document is invalid: each document needs a unique _id and
at least one schema field (a metadata-only document is rejected), and
no field name may start with _ or $. Requests are split at
1000 documents.
TTL is implemented by this server, not by Pinecone: ttl_seconds
stamps a vtb_expires_at epoch on each record, searches exclude
lapsed records by default, and pinecone_purge_expired reclaims the
storage. Records written without a TTL carry no extra field and are
never hidden by that filter.
Args:
documents: e.g. [{"_id": "d1", "body": "...", "category": "tech", "year": 2026}].
embed_source_field: Field whose text becomes the vector(s).
dense_field / sparse_field: Target schema fields when the index
declares more than one.
ttl_seconds: Lifetime in seconds. Omit for no expiry.
batch_size: Documents per request when batching.
| Name | Required | Description | Default |
|---|---|---|---|
| index | Yes | ||
| documents | Yes | ||
| namespace | Yes | ||
| batch_size | No | ||
| dense_field | No | ||
| embed_model | No | ||
| ttl_seconds | No | ||
| sparse_field | No | ||
| sparse_model | No | ||
| embed_provider | No | ||
| embed_dimension | No | ||
| sparse_provider | No | ||
| embed_source_field | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden and does so richly: server-side TTL semantics with the vtb_expires_at stamp, automatic embedding fill with provider/model env defaults, per-document validation before sending, the 1000-document split, and vector-width pre-checks. This is exactly the beyond-schema behavior an agent needs.
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?
Front-loaded with purpose and mechanics, then structured Args. It is dense but mostly earns its length; the 'unique _id' requirement is stated twice (prose and Args), a minor 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?
An output schema exists so return values need not be explained, and the description covers validation, embedding, TTL, and batching well. It falls short only on index/namespace requirements for a mutation tool with no annotations.
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% for 13 params, so the description must compensate. It documents documents, embed_source_field, dense_field/sparse_field, ttl_seconds, batch_size, and touches embed_provider/embed_model defaults, but leaves index, namespace, embed_dimension, sparse_model, and sparse_provider unexplained.
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 (upsert) and resource (documents/records) and clarifies the embedding option in the opening line. It implicitly distinguishes itself from pinecone_upsert_vectors by operating on documents, but never explicitly names a sibling to route between them.
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?
Usage is implied through detailed mechanics (when a vector is present, when TTL is set) rather than explicit when-to-use/when-not guidance. An agent must infer that this is for full records rather than raw vectors, and no alternative tool is named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pinecone_upsert_vectorsA
Upsert through the legacy Vectors API - raw values plus metadata.
Use this for single-vector indexes where you want a dense and a sparse
vector on the same record, which is what makes the one-request hybrid
query in pinecone_query_vectors possible.
Args:
vectors: [{"id": "v1", "values": [...], "sparse_values": {"indices": [...], "values": [...]}, "metadata": {"category": "tech"}}].
ttl_seconds: Stamps _expires_at into each record's metadata.
| Name | Required | Description | Default |
|---|---|---|---|
| index | Yes | ||
| vectors | Yes | ||
| namespace | Yes | ||
| batch_size | No | ||
| ttl_seconds | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses the TTL side effect ('_expires_at' stamped into metadata) and the legacy-API nature, but omits upsert semantics (overwrite vs merge), auth/permission needs, batching behavior tied to batch_size, and failure modes for a mutation tool.
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?
Front-loaded with the core purpose, then rationale, then arg notes; each part largely earns its place. Slightly loose in the 'Args' block, but no real 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?
An output schema exists so return values need not be explained. Coverage of the key input is partial: the vectors format and ttl_seconds are covered, but index, namespace, and batch_size are undocumented, leaving gaps for a 5-parameter mutation tool.
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. It usefully documents the vectors payload shape (id/values/sparse_values/metadata example) and the ttl_seconds side effect, but leaves index, namespace, and especially batch_size (with its default of 100) entirely unexplained.
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 (upsert) and resource (vectors) and pins down the mechanism: 'legacy Vectors API - raw values plus metadata'. This implicitly distinguishes it from pinecone_upsert_documents by framing it as raw-vector based, though it never names that sibling explicitly.
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?
Gives a concrete condition for use: single-vector indexes where you need a dense and sparse vector on the same record to enable the one-request hybrid query. Clear context, but no explicit exclusions or named alternatives (e.g., when to prefer pinecone_upsert_documents or pinecone_update_vector).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vectortoolbox_statusA
Report configuration: backends, default embedding provider, read-only mode.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. 'Report' implies a read-only, non-mutating operation, which is helpful, but the description does not explicitly confirm that no state is changed, nor does it mention authentication or rate-limit 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, front-loaded sentence with no filler. Every phrase contributes to identifying the tool's output content.
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-argument status tool with an output schema, the description is largely complete: it names the configuration categories returned. It stops short of explaining operational context, but the output schema covers return values and the tool's simplicity limits missing detail.
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 there are no parameter semantics for the description to clarify. The schema is empty and coverage is 100%; the baseline score for a parameterless tool is 4.
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: 'Report configuration.' It further scopes the report to backends, default embedding provider, and read-only mode. It is clear what the tool does, though it does not explicitly differentiate itself from the sibling Pinecone 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 no guidance on when to use this tool versus alternatives. It does not mention prerequisites, context, or exclusions. The purpose is implied, but usage is left entirely to inference.
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.
28 tool updates
v0.1.0- First observed
pinecone_configure_index - First observed
pinecone_create_index - First observed
pinecone_create_index_for_model - First observed
pinecone_create_namespace - First observed
pinecone_delete_index - First observed
pinecone_delete_namespace - First observed
pinecone_delete_records - First observed
pinecone_describe_index - First observed
pinecone_describe_index_stats - First observed
pinecone_describe_namespace - First observed
pinecone_embed - First observed
pinecone_fetch_records - First observed
pinecone_index_capabilities - First observed
pinecone_list_indexes - First observed
pinecone_list_models - First observed
pinecone_list_namespaces - First observed
pinecone_list_record_ids - First observed
pinecone_purge_expired - First observed
pinecone_query_vectors - First observed
pinecone_rerank - First observed
pinecone_sample_metadata - First observed
pinecone_search - First observed
pinecone_search_records - First observed
pinecone_update_documents - First observed
pinecone_update_vector - First observed
pinecone_upsert_documents - First observed
pinecone_upsert_vectors - First observed
vectortoolbox_status
TDQS
Scored across 28 tools
Several overlapping clusters exist: pinecone_search, pinecone_search_records, and pinecone_query_vectors all perform retrieval, and pinecone_describe_namespace, pinecone_describe_index_stats, pinecone_describe_index, and pinecone_index_capabilities have partially overlapping reporting purposes. The very detailed descriptions do help an agent choose correctly, but the boundaries between the search tools and the describe tools are not immediately obvious from the names alone.
Nearly all tools follow a consistent pinecone_verb_noun pattern (pinecone_create_index, pinecone_delete_records, pinecone_list_namespaces). The exceptions are pinecone_index_capabilities (noun phrase, no verb) and vectortoolbox_status (different prefix and concatenated without a separating underscore), which are minor deviations rather than a broken convention.
At 28 tools this is heavy for a single MCP server and sits above the comfortable 3-15 range. Most tools do earn their place given the breadth of the vector-DB admin surface (index, namespace, record, search, embedding, rerank), but the count is borderline and a few describe/capabilities tools could plausibly be merged.
Coverage is thorough: index lifecycle (create, create_for_model, list, describe, capabilities, configure, delete), namespace lifecycle, record CRUD (upsert documents/vectors, update, fetch, list ids, delete, purge expired), multiple search modes, embeddings, rerank, model listing, and server status. No obvious gaps for the stated vector-toolbox purpose.
Maintenance
Related MCP Connectors
Remote ChromaDB vector database MCP server with streamable HTTP transport
MCP server for building and testing AI agents with multi-model experimentation and insights.
Cross-vendor AI memory over MCP. One semantic store, readable and writeable from every MCP client.
MCP server for OnceAsk, the AI-native current-address layer for people and agents.
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 npm-
- AlicenseAqualityDmaintenanceMCP server for OpenAI Vector Store API, managing vector stores, files, file batches, and semantic search.2112 npmMIT
- AlicenseNot gradedqualityAmaintenanceMCP server for Milvus vector database enabling vector search, text search, and hybrid search operations.Apache 2.0
- AlicenseNot gradedqualityDmaintenanceEnables integrating RAG into AI agents via MCP server, supporting multiple vector database technologies.11MIT