Couchbase MCP Server
This server connects an AI agent to a Couchbase cluster (read-only by default) so it can inspect, query and diagnose it in natural language.
Cluster & connection health — check server configuration/status offline (
get_server_configuration_status), test credentials against the cluster, ping services for live reachability and latency (get_cluster_health_and_services, with optional bucket andservice_typesfiltering), and read the SDK's cached connection diagnostics without network I/O.Explore the data model — list buckets, scopes and collections, and infer a collection's schema via
INFER(get_schema_for_collection).Read documents (KV) — fetch a document by ID, or use sub-document lookups to get only specific paths, check path existence, or count array/object elements without transferring the whole document.
Run queries — execute SQL++ scoped to a bucket and scope, with
named_parametersfor safe parameter binding (data-modifying statements are blocked in the default read-only mode).Analyze query plans & indexes — generate and evaluate EXPLAIN plans, get Index Advisor recommendations, and list indexes with their definitions, status and vector-index flags.
Diagnose query performance — surface the longest-running, most frequent, largest-response and largest-result-count queries, plus queries using a primary index, not using a covering index, or not selective, all from
system:completed_requests.
Write tools (upsert/insert/replace/delete documents, create/drop scopes, collections and indexes, FTS and vector writes) are not loaded here because read-only mode is on; set CB_MCP_READ_ONLY_MODE=false to enable them.
Allows LLMs to interact with Couchbase clusters to query collections, retrieve document structures, perform CRUD operations on documents, and run SQL++ queries on specified scopes.
Enables running the MCP server as a containerized application with configurable environment variables for Couchbase settings.
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., "@Couchbase MCP Servershow me the top 5 users by activity from the users collection"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Couchbase MCP Server
Couchbase MCP Server is a self-hosted Model Context Protocol (MCP) server that connects AI agents and assistants — Claude, Cursor, Windsurf, VS Code Copilot, JetBrains AI Assistant and any other MCP client — to data in Couchbase Server clusters, on Capella or self-managed, and in self-managed Operational Insights clusters. An agent can inspect your cluster, explore schemas, run SQL++, full-text and vector queries, read and write documents, and diagnose query and cluster performance in natural language.
It is read-only by default, supports STDIO and Streamable HTTP (with OAuth 2.1), and is distributed on PyPI and Docker Hub. Enterprise support is available by licensing Couchbase AI Data Plane, which also entitles use and enterprise support of Couchbase Agent Memory and Couchbase Agent Catalog.
Full documentation: docs.couchbase.com/mcp-server
Table of Contents
Related MCP server: Couchbase MCP Server
Why Couchbase MCP Server
Safe by default — write tools are not loaded and data-modifying queries are blocked unless you set
CB_MCP_READ_ONLY_MODE=false; individual tools can also be disabled or gated behind user confirmation.Couchbase Server and Operational Insights — the operational server connects to Couchbase Capella or a self-managed Couchbase Server cluster with the same configuration; the Operational Insights server connects to self-managed Operational Insights clusters.
RBAC-aware — tool controls guide the LLM; the Couchbase user's role-based access control remains the authoritative security boundary.
Production transports — STDIO for local desktop clients, or Streamable HTTP with optional OAuth 2.1 (any JWKS-publishing IdP: Auth0, Okta, Keycloak, Entra, Cognito, …), health checks and audit logging for shared deployments. The operational server can also run multiple workers to use more CPU cores.
Any MCP client — tested with Claude Desktop, Cursor, Windsurf, VS Code and JetBrains AI Assistant/Junie.
Once connected, you can ask things like:
"What buckets, scopes and collections do I have, and what's the schema of the
orderscollection?""Find the 10 most recent documents in
userswherestatus = 'active'.""What are the 5 slowest queries in the last hour, and are any of them missing a covering index?"
"Is this cluster healthy, and which services are running?"
"Insert a new document into
productswith these fields: …" (requiresCB_MCP_READ_ONLY_MODE=false)
Choosing a Server
This package ships two MCP servers. Each one is started by its own subcommand, connects to a different kind of cluster, and has its own tools. Pick the one that matches your cluster, follow its section for setup and tools, then use Common Configuration for the settings both share. To use both, register each as a separate server in your MCP client.
Use it with | A Couchbase cluster (Capella or self-managed) | A self-managed Operational Insights cluster (not available on Capella) |
Subcommand |
|
|
Connection string |
| HTTP(S) URL, e.g. |
Credential variables |
|
|
Tools | 52 — cluster health, schema, KV, SQL++, indexes, full-text and vector search, query performance | 13 — schema, SQL++ (sync and async), indexes, exports |
Default HTTP port |
|
|
Default log file |
|
|
The subcommand is optional for the operational server today — a bare
couchbase-mcp-serverstarts it — but naming it keeps your configuration unambiguous. Options go after the subcommand:couchbase-mcp-server operational --transport=http. Check the installed version withuvx couchbase-mcp-server --version.
Operational Server
The operational server connects to a Couchbase cluster on Capella or self-managed Couchbase Server, using the couchbase Python SDK.
Operational Quick Start
You need a running Couchbase cluster — the Capella free tier is the quickest way to get one (you can import a sample dataset) — and an MCP client. Add one of these configurations to your client (see Client Setup for where each client keeps it). If the client already has other servers, add couchbase to the existing mcpServers object.
From PyPI with uvx (requires uv and Python 3.10+):
{
"mcpServers": {
"couchbase": {
"command": "uvx",
"args": ["couchbase-mcp-server", "operational"],
"env": {
"CB_CONNECTION_STRING": "couchbases://connection-string",
"CB_USERNAME": "username",
"CB_PASSWORD": "password"
}
}
}
}With Docker (requires only Docker):
{
"mcpServers": {
"couchbase": {
"command": "docker",
"args": [
"run", "--rm", "-i",
"-e", "CB_CONNECTION_STRING=couchbases://connection-string",
"-e", "CB_USERNAME=username",
"-e", "CB_PASSWORD=password",
"couchbase/mcp-server:latest", "operational"
]
}
}
}git clone https://github.com/couchbase/mcp-server-couchbase.git{
"mcpServers": {
"couchbase": {
"command": "uv",
"args": [
"--directory", "path/to/cloned/repo/mcp-server-couchbase/",
"run", "src/mcp_server.py", "operational"
],
"env": {
"CB_CONNECTION_STRING": "couchbases://connection-string",
"CB_USERNAME": "username",
"CB_PASSWORD": "password"
}
}
}
}path/to/cloned/repo/mcp-server-couchbase/ is the path to your clone — keep the trailing slash. After pulling updates, run uv sync to update dependencies.
Operational Connection and Authentication
Use either a username and password or a client certificate (mTLS). If both are set, the certificate is used.
Environment Variable | CLI Argument | Description |
|
| Connection string to the cluster. Required |
|
| Basic authentication |
|
| mTLS authentication |
|
| Root certificate for a self-signed/untrusted server certificate (not needed for Capella) |
{
"mcpServers": {
"couchbase": {
"command": "uvx",
"args": ["couchbase-mcp-server", "operational"],
"env": {
"CB_CONNECTION_STRING": "couchbases://connection-string",
"CB_CLIENT_CERT_PATH": "/path/to/client-certificate.pem",
"CB_CLIENT_KEY_PATH": "/path/to/client.key"
}
}
}
}Operational Tools
Write tools (marked ✏️) are not loaded while read-only mode is on, the default. Tools marked 🖥️ use admin REST endpoints that Capella does not expose: they need self-managed Couchbase Server 7.6+ and are not registered on Capella connections.
Cluster setup and health
Tool | Description |
| Server status and configuration without connecting to the cluster: read-only mode, disabled/confirmation-required tools, OAuth, logging and audit counters |
| Check the cluster credentials by connecting to the cluster |
| Cluster health and running services, optionally filtered via |
| The SDK's cached connection diagnostics, without active network probing |
| Cluster statistics over a historic time window (stats-range endpoint) |
| Tasks running right now — rebalance, compaction, XDCR, index build. Needs |
| Per-node health: service topology, membership, orchestrator and a health rollup. Needs |
| A bucket's (or every bucket's) configuration and live state — quotas, eviction, replicas, durability, storage, compaction. Needs |
| The system event log (config changes, failovers, rebalances, restarts), windowed with |
| Look up exact input values other tools need (e.g. every metric name for |
Data model and schema discovery
Tool | Description |
| List all buckets in the cluster |
| List all scopes in a bucket |
| List all collections in a scope (requires the Query service) |
| List all scopes and collections in a bucket |
| Infer the structure of a collection |
| Create a scope in a bucket (Server 7.6+ and Capella) |
| Create a collection in an existing scope (Server 7.6+ and Capella) |
| Delete a scope and all its collections — permanent |
| Delete a collection and all its documents — permanent |
Document (KV) operations
Tool | Description |
| Get a document by ID |
| Read specific paths, existence checks or counts without fetching the whole document |
| Upsert a document by ID |
| Insert a new document (fails if it exists) |
| Replace an existing document (fails if it doesn't exist) |
| Delete a document by ID |
| Modify paths in an existing document (upsert, insert, replace, remove, array ops, counters) |
Query and indexing
Tool | Description |
| Run a SQL++ query scoped to a bucket and scope — use collection names directly ( |
| Generate and evaluate an EXPLAIN plan: metadata, extracted plan and findings |
| Index Advisor recommendations for a SQL++ query |
| List indexes with definitions, filterable by bucket/scope/collection/name; flags vector indexes ( |
| Per-index size, fragmentation, scan traffic and lag, per node — finds pressure and unused indexes |
| Create a scalar, Hyperscale vector or Composite vector GSI index ( |
| Deprecated — use |
| Build all deferred indexes on a collection |
| Drop a GSI index (scalar or vector) |
Full-text search (FTS)
Requires Couchbase Server 7.6+ and the Search service. Scope-level and cluster-level (legacy) indexes are both supported: pass bucket_name and scope_name together for scope-level, or omit both.
Tool | Description |
| List Search indexes — cluster-level, per bucket, or per scope |
| Full definition of one Search index (mappings, analyzers, plan params) |
| Run any non-vector FTS query from its raw JSON body; |
| Create or update a Search index, including vector field mappings. Updates trigger a full rebuild — pass the current |
| Drop a Search index — permanent |
Vector search
Both tools embed plain query text with the model configured under Embedding Providers. Available on self-managed Couchbase Server and Capella.
Tool | Description |
| Similarity search against a GSI vector index (Server 8.0+) via |
| Search-service vector search (Server 7.6+) against a named index. |
Query performance analysis
Tool | Description |
| Longest-running queries by average service time |
| Most frequently executed queries |
| Queries with the largest response sizes |
| Queries with the largest result counts |
| Queries using a primary index |
| Queries not using a covering index |
| Queries whose scans — secondary index, primary index or sequential — return far more documents than the final result |
Query service health 🖥️
These call the Query service's own admin REST API on every query node.
Tool | Description |
| Query-engine health: request rate, active/queued requests, memory, GC, uptime. Needs |
| Queries executing right now across all query nodes. Needs |
| Cancel an in-flight query by request ID. Needs Full Admin or Cluster Admin |
Tools disabled automatically on Capella
The 🖥️ tools reach Couchbase through admin REST endpoints that Capella does not expose. When every host in CB_CONNECTION_STRING ends in .cloud.couchbase.com, the server does not register them and reports them alongside your own disabled tools in get_server_configuration_status and the startup log. SDK-based tools such as get_cluster_health_and_services and get_client_connectivity_report stay available.
Tool | Endpoint it needs |
| Management REST ( |
| Management REST ( |
| Management REST ( |
| Management REST, plus per-node endpoints |
| Management REST ( |
| Index Service REST (each indexer's |
| Query service REST ( |
| Query service REST ( |
| Query service REST ( |
Embedding Providers
run_vector_query and run_vector_search embed query text with the provider set in CB_MCP_EMBEDDING_MODEL_PROVIDER. This is optional: without it the server starts normally and both tools stay registered, but calling them returns an error explaining what to set.
| Required | Optional | Notes |
|
| — | Capella Model Service. |
|
|
| Set the endpoint to use an OpenAI-compatible local server (Ollama, vLLM, LM Studio) |
|
|
| |
|
|
| |
|
|
| Amazon Titan embedding models (e.g. |
"env": {
"CB_CONNECTION_STRING": "couchbases://connection-string",
"CB_USERNAME": "username",
"CB_PASSWORD": "password",
"CB_MCP_EMBEDDING_MODEL_PROVIDER": "openai",
"CB_MCP_EMBEDDING_MODEL": "text-embedding-3-small",
"CB_MCP_EMBEDDING_MODEL_API_KEY": "sk-..."
}All Options
The Operational Insights server accepts the same options, except that it has its own connection settings and no CB_MCP_EMBEDDING_MODEL_* options.
Environment Variable | CLI Argument | Description | Default |
|
| Connection string to the Couchbase cluster | Required |
|
| Username with access to required buckets for basic authentication | Required (or Client Certificate and Key needed for mTLS) |
|
| Password for basic authentication | Required (or Client Certificate and Key needed for mTLS) |
|
| Path to the client certificate file for mTLS authentication | Required if using mTLS (or Username and Password required) |
|
| Path to the client key file for mTLS authentication | Required if using mTLS (or Username and Password required) |
|
| Path to server root certificate for TLS if server is configured with a self-signed/untrusted certificate. This will not be required if you are connecting to Capella | |
|
| Prevent all data modifications (KV, Query, scope/collection management, index management, and FTS index management). When enabled, write tools are not loaded. |
|
|
| Transport mode: |
|
|
| Host for HTTP/SSE transport modes |
|
|
| Port for HTTP/SSE transport modes |
|
|
| Number of server worker processes for the |
|
|
| Handle each HTTP request without per-session state. Only honored with |
|
|
| Tools to disable (see Disabling Tools) | None |
|
| Tools that require explicit user confirmation before execution via MCP elicitation (see Requiring confirmation) | None |
|
| Logging level for the MCP server: |
|
|
| Comma-separated log destinations: |
|
|
| Base path for per-level log files (only used when the |
|
|
| Global maximum size in MB per log file before it rotates, inherited by every level unless overridden. |
|
|
| Deprecated — use | Unset |
|
| Rotation size in MB for the ERROR log file; overrides | Inherits |
|
| Rotation size in MB for the WARNING log file; overrides | Inherits |
|
| Rotation size in MB for the INFO log file; overrides | Inherits |
|
| Rotation size in MB for the DEBUG log file; overrides | Inherits |
|
| Rotated backup files kept per-level log file (excluding the live file), applied to every level unless overridden. |
|
|
| Rotated backups kept for the ERROR log file; overrides the global count for ERROR | Inherits |
|
| Rotated backups kept for the WARNING log file; overrides the global count for WARNING | Inherits |
|
| Rotated backups kept for the INFO log file; overrides the global count for INFO | Inherits |
|
| Rotated backups kept for the DEBUG log file; overrides the global count for DEBUG | Inherits |
|
| JWKS endpoint of the identity provider used to verify bearer JWTs. Enables OAuth when set with the issuer and audience (see OAuth 2.1 Authorization) | None |
|
| Expected JWT | None |
|
| Expected JWT | None |
|
| JWT signing algorithm: one of |
|
|
| Public base URL of this server. When set, publishes RFC 9728 Protected Resource Metadata so PRM-aware clients can discover the IdP | None |
|
| Override the OAuth scope label treated as 'read' access (advertised in PRM and matched against the token's |
|
|
| Override the OAuth scope label treated as 'write' access; same semantics as the read label |
|
|
| Enable audit logging — a separate sink from the |
|
|
| Comma-separated audit destinations: |
|
|
| Path to the audit log file. Required when | None |
|
| Maximum size in MB the live audit file may reach before it rotates. |
|
|
| Age the live audit file may reach before it rotates, as |
|
|
| Rotated backups retained per audit file, excluding the live file. Backups are gzipped. |
|
|
| Record tool argument values in the audit log. Off by default — there is no redaction in this release, so enabling it writes arguments verbatim, including full document bodies |
|
|
| Audit events to suppress: comma-separated numeric event ids (e.g. | None |
|
| Embedding provider for | None |
|
| Model name/ID for the configured embedding provider | None |
|
| API key for the configured provider. Not used by | None |
|
| Base URL override (an OpenAI-compatible local server, or a Capella Model Service deployment's own URL — required when | None |
|
| AWS access key ID, | None |
|
| AWS secret access key, | None |
|
| AWS region, | None |
Operational Insights Server
The operational-insights server connects to self-managed Operational Insights clusters. Operational Insights is a real-time analytical database (RT-OLAP) for real-time apps and operational intelligence. The server is not available for Capella. It uses the couchbase-operational-insights SDK. It runs as its own process, separate from the operational server.
CB_OPERATIONAL_INSIGHTS_CONNECTION_STRING is an HTTP(S) URL, not a couchbase:// connection string — e.g. http://localhost:8095, or https://<host>:18095 over TLS. This is the most common misconfiguration.
Operational Insights Quick Start
From PyPI with uvx:
{
"mcpServers": {
"couchbase-operational-insights": {
"command": "uvx",
"args": ["couchbase-mcp-server", "operational-insights"],
"env": {
"CB_OPERATIONAL_INSIGHTS_CONNECTION_STRING": "http://localhost:8095",
"CB_OPERATIONAL_INSIGHTS_USERNAME": "Administrator",
"CB_OPERATIONAL_INSIGHTS_PASSWORD": "password"
}
}
}
}With Docker:
{
"mcpServers": {
"couchbase-operational-insights": {
"command": "docker",
"args": [
"run", "--rm", "-i",
"-e", "CB_OPERATIONAL_INSIGHTS_CONNECTION_STRING=http://host.docker.internal:8095",
"-e", "CB_OPERATIONAL_INSIGHTS_USERNAME=Administrator",
"-e", "CB_OPERATIONAL_INSIGHTS_PASSWORD=password",
"couchbase/mcp-server:latest", "operational-insights"
]
}
}
}From source, use the operational source configuration with operational-insights as the last argument and the variables above.
Operational Insights Connection and Authentication
Environment Variable | CLI Argument | Description |
|
| Endpoint URL (HTTP/HTTPS). Required |
|
| Username |
|
| Password |
|
| Root certificate (PEM) for a self-signed/untrusted server certificate |
|
| Client certificate for mTLS — PEM (with a key) or a PKCS#12 bundle ( |
|
| Private key (PEM) for the client certificate. Leave unset for PKCS#12 |
|
| Password for an encrypted key or PKCS#12 bundle |
|
| Maximum query result size in bytes. Unset means no limit. When set, reading stops at the budget and the response reports |
All common configuration applies, with these differences from the operational server:
The default port is
8001and the default log file ismcp_server_operational_insights.log, so both servers can run side by side.Only one worker is supported (
CB_MCP_WORKERS=1), because async query handles live in process memory.It has no
CB_MCP_EMBEDDING_MODEL_*options.
Operational Insights Tools
All names except get_server_configuration_status are prefixed operational_insights_, so both servers can be registered in one client without collisions. The write tool (marked ✏️) is not loaded while read-only mode is on, the default.
Tool | Description |
| Same tool as on the operational server |
| List databases |
| List scopes in a database |
| List collections (datasets) in a scope |
| Infer a collection's JSON schema by sampling |
| List secondary indexes from |
| EXPLAIN a SQL++ statement without running it |
| Run SQL++ and return rows, up to the result size limit; can export instead. Read-only mode is enforced server-side |
| Start a query and return a |
| Poll an async query; returns rows (or the export destination) when ready |
| Free a finished async query's results |
| Stop a still-running async query (allowed in read-only mode) |
| Create a secondary index via |
Async queries follow a start → poll → discard-or-cancel flow: operational_insights_run_query_async returns a query_handle, operational_insights_get_async_query_results is polled until ready, then operational_insights_discard_async_query_results frees the results, or operational_insights_cancel_async_query stops a query still running.
Exporting large results
Instead of returning rows, operational_insights_run_query_sync and operational_insights_run_query_async can wrap the statement in COPY ... TO and write the rows to external object storage. Pass all three of copy_to_link (an existing link created with CREATE LINK ... TYPE S3), copy_to_bucket and copy_to_path, plus optionally copy_to_format (json, the default, or parquet). The tool then returns a confirmation with no rows:
{
"success": true,
"exported": true,
"destination": {"link": "s3Link", "bucket": "my-exports", "path": "exports/run1", "format": "json"},
"message": "Results were written to my-exports/exports/run1 as json. ..."
}A partial destination is rejected rather than silently returning rows.
The sync tool waits for the whole upload; prefer the async tool for large exports.
Exports are blocked in read-only mode (they write to external storage), so they need
CB_MCP_READ_ONLY_MODE=falseor a token withcouchbase-mcp:write.csvis not offered, because it needs an explicit output schema that can't be inferred from an arbitrarySELECT.
Common Configuration
These settings work the same way for both servers. Every option can be set as an environment variable or as a CLI flag after the subcommand.
Safety Controls
Three layers, from broadest to narrowest. Use them together — but remember that none of them replaces RBAC.
The database user's RBAC permissions are the authoritative security control. For example, disablingupsert_document_by_id and delete_document_by_id does not stop run_sql_plus_plus_query from running INSERT/UPDATE/DELETE/MERGE — only read-only mode or missing RBAC permissions do. Give the server's database user only the permissions it needs.
Read-only mode
CB_MCP_READ_ONLY_MODE (default true) is the single switch for writes:
true— the write tools marked ✏️ in each server's tool list are not loaded, and queries that modify data or structure are blocked.false— write tools are loaded and modifying queries are allowed.
Disabling tools
CB_MCP_DISABLED_TOOLS removes tools from discovery entirely. It accepts a comma-separated list or a path to a file with one tool name per line (# starts a comment):
CB_MCP_DISABLED_TOOLS="upsert_document_by_id,delete_document_by_id"
# or
CB_MCP_DISABLED_TOOLS=/path/to/disabled_tools.txt# disabled_tools.txt
# Write operations
upsert_document_by_id
delete_document_by_id
# Index advisor
get_index_advisor_recommendationsOn Capella, the operational server also disables some admin tools automatically.
Requiring confirmation (elicitation)
CB_MCP_CONFIRMATION_REQUIRED_TOOLS asks the user to confirm before a listed tool runs, using MCP elicitation. It takes the same comma-separated or file formats as disabled tools:
CB_MCP_CONFIRMATION_REQUIRED_TOOLS="delete_document_by_id,replace_document_by_id"If the client supports elicitation, the user is prompted before the tool runs.
If it doesn't, the tool runs without confirmation, for backward compatibility.
Confirmation needs an MCP session, so it cannot be combined with stateless HTTP (
CB_MCP_STATELESS_HTTP=trueorCB_MCP_WORKERSabove 1). The server refuses to start with that combination.
Transports
Transport | Use for | Endpoint |
| One local client that launches the server as a subprocess | — |
| Several clients sharing one server; supports OAuth and health checks, and workers on the operational server |
|
| Deprecated by the MCP spec — use |
|
Set the transport with CB_MCP_TRANSPORT, the bind address with CB_MCP_HOST (default 127.0.0.1) and the port with CB_MCP_PORT (each server's default port when unset). Without OAuth, the HTTP endpoint is unauthenticated.
uvx couchbase-mcp-server operational \
--connection-string='<couchbase_connection_string>' \
--username='<database_username>' \
--password='<database_password>' \
--transport=httpThen point your client at the URL:
{
"mcpServers": {
"couchbase-http": {
"url": "http://localhost:8000/mcp"
}
}
}Multiple workers
One process uses at most about one CPU core. --workers N (CB_MCP_WORKERS) runs N processes behind the same host and port; the number of available cores is a good starting point. Workers are supported by the operational server only. With more than one worker:
The
httptransport is required, and the server runs in stateless HTTP mode, because a client's requests can reach different workers. You can also set--stateless-http=trueon a single worker, for example behind a load balancer without sticky sessions.Confirmation-required tools cannot be used.
Each process writes its own log files, named with host and process id (
mcp_server.<host>.<pid>.info.log) — one set for the supervisor and one per worker.
Health check
In HTTP mode, GET /health returns {"status": "ok", "server": "<server>"} on the MCP port. It is a liveness check: it does not connect to the cluster (so a cluster outage doesn't restart healthy containers), needs no authentication even with OAuth enabled, and is served by every worker. See Docker for probe examples.
OAuth 2.1 Authorization
With --transport=http, either server can act as an OAuth 2.1 resource server, validating bearer JWTs against your identity provider's JWKS. It works with any OAuth 2.1/OIDC provider that publishes a JWKS, and does not issue tokens or manage users. OAuth settings are ignored on stdio.
OAuth turns on only when all three of
CB_MCP_OAUTH_JWT_JWKS_URI,CB_MCP_OAUTH_JWT_ISSUERandCB_MCP_OAUTH_JWT_AUDIENCEare set; setting only some fails at startup.CB_MCP_OAUTH_MCP_BASE_URLadditionally publishes RFC 9728 Protected Resource Metadata so clients can discover the authorization server.Access is gated by two scopes in the token's
scope/scpclaim:couchbase-mcp:read(read tools) andcouchbase-mcp:write(write tools). Full access needs both. Rename them withCB_MCP_OAUTH_SCOPE_READ_LABEL/CB_MCP_OAUTH_SCOPE_WRITE_LABELif your IdP can't emit these labels. Both servers use the same labels, so one IdP configuration covers both.
uvx couchbase-mcp-server operational \
--connection-string='<couchbase_connection_string>' \
--username='<database_username>' \
--password='<database_password>' \
--transport=http \
--oauth-jwks-uri='https://auth.example.com/.well-known/jwks.json' \
--oauth-issuer='https://auth.example.com/' \
--oauth-audience='couchbase-mcp-server' \
--oauth-mcp-base-url='<public_base_url_of_this_server>'See the OAuth documentation for IdP setup.
Logging
Each server logs to stderr at info level by default.
CB_MCP_LOG_LEVEL—off,error,warning,info(lifecycle events and tool calls) ordebug.CB_MCP_LOG_SINKS—stderr,file, or both. Withfile, one rotating file per level is written next toCB_MCP_LOG_FILE(mcp_server.info.log,mcp_server.error.log, …).Rotation and retention —
CB_MCP_LOG_ROTATION_MAX_SIZE_MB(default 1 MB) andCB_MCP_LOG_RETENTION_BACKUP_COUNT(default 1) apply to every level; override per level withCB_MCP_LOG_<LEVEL>_ROTATION_MAX_SIZE_MB/CB_MCP_LOG_<LEVEL>_RETENTION_BACKUP_COUNT. Invalid sizes fall back to the default with a startup warning.CB_MCP_LOG_MAX_BYTESis deprecated.Config snapshot — with the
filesink, a JSON record of the environment and redacted server config is written tomcp_server_config.log.jsonon every start, for support.
# Debug logging to stderr and rotating per-level files
uvx couchbase-mcp-server operational --log-level=debug --log-sinks=stderr,fileYour MCP client usually also captures the server's stderr — see Client Setup for where. Details: logging documentation.
Auditing
Audit logging records who did what, and whether it was allowed — separate from the operational logs, which record what went wrong. The MCP server is the only layer that can answer this for an agent: every request reaches the cluster as a single database user, and decisions such as a scope denial, a read-only block or a declined confirmation never reach the cluster at all.
Auditing is off by default. Turn it on with CB_MCP_AUDIT_LOG_ENABLED=true; it writes to stderr unless you set CB_MCP_AUDIT_LOG_SINKS=file and CB_MCP_AUDIT_LOG_FILE_PATH.
# 90 days of daily, gzipped audit files
uvx couchbase-mcp-server operational --audit-log-enabled=true \
--audit-log-sinks=file --audit-log-file-path=/var/log/cb-mcp/audit.log \
--audit-log-rotation-interval=1d --audit-log-rotation-max-size-mb=0 \
--audit-log-retention-max-backups=90Records are JSON Lines using the same field vocabulary as Couchbase Server and Sync Gateway:
{"id":61522,"name":"document write","description":"A document write operation was requested through a tool","timestamp":"2026-09-29T09:14:22.418Z","real_userid":{"domain":"oauth","user":"agent-svc-7"},"server":{"version":"1.0.2","host":"mcp-01"},"cid":"9f2c...","outcome":"success","tool_name":"upsert_document_by_id","required_scope":"write","ks":"travel-sample.inventory.airline","cb_userid":"mcp_service"}Identity —
real_useridis the caller:oauth(the token subject),local(the OS user, on stdio) oranonymous(HTTP without OAuth, which warns at startup).Correlation —
cidgroups every record from one request, and is sent as the SQL++client_context_id, so it joins exactly with Couchbase Server'sclientContextId. There is deliberately no session identifier.Events — a fixed, numbered catalogue (lifecycle, initialize, token rejected, scope denied, read-only block, confirmation declined/skipped, and a read/write pair per tool category). The full catalogue ships as
descriptor.jsonin the package. The operational server uses block0xF000(61440), Operational Insights0x10000(65536), and both share0xE000(57344) for core events.Filtering —
CB_MCP_AUDIT_LOG_DISABLED_EVENTSsuppresses read events by numeric id (e.g.61490,61491). Write and security events cannot be disabled.Rotation — by size (
CB_MCP_AUDIT_LOG_ROTATION_MAX_SIZE_MB, default 10) and age (CB_MCP_AUDIT_LOG_ROTATION_INTERVAL, default1d), whichever comes first;0switches either off. Rotated files are timestamped and gzipped; the live file stays plain text fortail -f.Per-process files — host and pid are inserted into the name (
audit.log→audit.<host>.<pid>.log), so concurrent processes never share a file.Retention is per file —
CB_MCP_AUDIT_LOG_RETENTION_MAX_BACKUPS(default 10) bounds one file's backups. Each new process writes a new file and nothing prunes old ones, so size the volume or sweep oldaudit.*.log*files.Fail-open — if the file can't be written, the server keeps serving and counts dropped records;
get_server_configuration_statusreportswritten/dropped/write_errors.Tool arguments — recorded only with
CB_MCP_AUDIT_LOG_TOOL_ARGS=true, which warns at startup. There is no redaction in this release, so arguments, including full document bodies, are written verbatim.
Client Setup
Each client needs a server configuration from the operational or Operational Insights quick start in its own configuration location. The examples below use the operational server.
Open the configuration file (see the MCP quickstart guide):
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.json
Add the server under
mcpServersand restart Claude Desktop.
Logs: macOS ~/Library/Logs/Claude, Windows %APPDATA%\Claude\Logs. See the MCP troubleshooting guide.
Go to Cursor Settings > Tools & Integrations > MCP Tools (see Cursor's MCP docs), or use the one-click Install in Cursor link — then replace the placeholder connection string and credentials.
Add the configuration under
mcpServersand save.Refresh the MCP servers list to check that
couchbaseis enabled.
Logs: in the bottom panel, open Output and select Cursor MCP.
Open Command Palette > Windsurf MCP Configuration Panel, or Windsurf Settings > Advanced > Cascade > Model Context Protocol (MCP) Servers (see Windsurf's MCP docs).
Click Add Server > Add custom server, paste the configuration and save.
Refresh the server list to check that
couchbaseis enabled.
VS Code uses servers as the top-level key instead of mcpServers. Put the configuration in .vscode/mcp.json for a workspace, or run MCP: Open User Configuration for all workspaces (see VS Code's MCP docs):
{
"servers": {
"couchbase": {
"command": "uvx",
"args": ["couchbase-mcp-server", "operational"],
"env": {
"CB_CONNECTION_STRING": "couchbases://connection-string",
"CB_USERNAME": "username",
"CB_PASSWORD": "password"
}
}
}
}Saving the file starts the server; use the Running | Stop | n Tools actions above it to manage it.
Logs: run MCP: List Servers, pick couchbase, then Show Output.
Install the AI Assistant or Junie plugin.
Go to Settings > Tools > AI Assistant (or Junie) > MCP Server, click +, add the configuration and click Apply.
Hover over the server's status to see its tools.
Logs: Help > Show Log in Finder (Explorer) > mcp > couchbase.
Docker
Prebuilt images are published to Docker Hub as couchbase/mcp-server, and the server is listed in the Docker MCP Catalog. Configure the container with the same environment variables as above. See the Docker Hub page (DOCKER.md) for tags, volumes and health-check examples.
Running over HTTP — note that the server must bind to 0.0.0.0 to be reachable from outside the container:
docker run --rm \
-e CB_CONNECTION_STRING='<couchbase_connection_string>' \
-e CB_USERNAME='<database_user>' \
-e CB_PASSWORD='<database_password>' \
-e CB_MCP_TRANSPORT=http \
-e CB_MCP_HOST=0.0.0.0 \
-p 8000:8000 \
couchbase/mcp-server:latest operationalIf Couchbase runs on your host machine, use
couchbase://host.docker.internalas the connection string (see Docker networking). Use--network=<your_network>to join another container's network.Append
operational-insightsinstead ofoperationalto run the Operational Insights server (port8001).
docker build -t mcp/couchbase-src ../build.sh [image-name] builds with the same arguments as CI — it sets the GIT_COMMIT_HASH and BUILD_DATE build args and tags the image latest and <short-commit> (default name mcp/couchbase-src). To build with the labels by hand:
docker build --build-arg GIT_COMMIT_HASH=$(git rev-parse HEAD) \
--build-arg BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ') \
-t mcp/couchbase-src .
# Check the labels
docker inspect --format='{{json .Config.Labels}}' mcp/couchbase-src:latestTroubleshooting
Check the connection string, username/password or certificate paths.
For Capella, make sure the cluster allows connections from the machine running the server.
Make sure the database user can access at least one bucket.
If the client can't find
uv/uvx, put the absolute path incommand.When running from source, check the repository path in the configuration, and run
uv syncafter pulling updates.Call
get_server_configuration_statusto see the configuration the server actually resolved, and check your client's logs (see Client Setup).
FAQ
How do I connect Claude Desktop to Couchbase? Add the quick start configuration to claude_desktop_config.json and restart Claude Desktop — see Client Setup.
Can I use this with Couchbase Capella? Yes, with the operational server: the same configuration works for Capella and self-managed clusters, though a few admin tools are only available on self-managed clusters (see Tools). The Operational Insights server is for self-managed Operational Insights clusters only.
Is it safe to let an AI agent write to my database? By default, no write tools are loaded and modifying SQL++ is blocked. If you enable writes, you can still disable individual tools or require confirmation — but your Couchbase user's RBAC permissions remain the real security boundary. See Safety Controls.
Do I need to know SQL++? No. Ask in plain English and the assistant writes the SQL++ for run_sql_plus_plus_query. It can also explain a query plan or ask the Index Advisor for recommendations.
STDIO, Streamable HTTP or SSE? STDIO for a single local client. Streamable HTTP to share one server between clients, with OAuth. SSE is deprecated. See Transports.
Is this officially supported by Couchbase? Yes, with a Couchbase AI Data Plane license. Without one, Couchbase engineers help on a best-effort basis through GitHub issues. See Support Policy.
Contributing
Contributions are welcome — bug fixes, features and documentation. To report a bug or ask for help, open a GitHub issue.
See CONTRIBUTING.md for development setup, linting, testing, project structure and workflow. To get started:
git clone https://github.com/couchbase/mcp-server-couchbase.git
cd mcp-server-couchbase
uv sync --extra dev
uv run pre-commit install
./scripts/lint.shIntegration tests run against a live cluster. Export CB_CONNECTION_STRING, CB_USERNAME, CB_PASSWORD and optionally CB_MCP_TEST_BUCKET; the Operational Insights tests also use CB_OPERATIONAL_INSIGHTS_CONNECTION_STRING / _USERNAME / _PASSWORD and are skipped when those are unset. Then run:
uv run --extra dev pytest tests/integration -vUsage Data, LLM Risks and Support Policy
Usage Data Collection
This product automatically collects usage and performance data (such as product name and version) and browser information (such as IP address) (collectively, "Usage Data"). Couchbase uses Usage Data, along with other data you may provide to Couchbase (such as your user name or email address), to develop and improve our products as well as inform our sales and marketing programs. We do not access or collect any data you store in Couchbase products. We use Usage Data to understand aggregate usage patterns and make our products more useful to you. For more information on how Couchbase collects, protects, and processes information, please refer to the Couchbase Privacy Policy viewable at https://www.couchbase.com/privacy-policy.
Risks Associated with LLMs
The use of large language models and similar technology involves risks, including the potential for inaccurate or harmful outputs.
Couchbase does not review or evaluate the quality or accuracy of such outputs, and such outputs may not reflect Couchbase's views.
You are solely responsible for determining whether to use large language models and related technology, and for complying with any license terms, terms of use, and your organization's policies governing your use of the same.
Support Policy
Couchbase MCP Server is open source and maintained by Couchbase engineers. How you get help depends on how you use it:
Community use — report bugs, ask questions and request features by opening a GitHub issue. Couchbase engineers monitor the repository and respond on a best-effort basis, with no response-time commitment. The Couchbase support portal cannot help with community use.
Enterprise support — available by licensing Couchbase AI Data Plane, which also covers Couchbase Agent Memory and Couchbase Agent Catalog. Licensed customers get help through their usual Couchbase Support channels.
Thank you for using and contributing to the project!
Available Tools
22 toolsexplain_sql_plus_plus_queryARead-only
Generate and evaluate an EXPLAIN plan for a SQL++ query. It provides information about the execution plan for the query.
The EXPLAIN statement is run in the specified scope in the specified bucket. It returns query metadata along with an extracted plan and plan evaluation.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| scope_name | Yes | ||
| bucket_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already indicate readOnlyHint=true, and the description confirms it runs the EXPLAIN statement and returns metadata, but adds no additional behavioral insights beyond the obvious.
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 concise, three sentences, front-loaded with purpose, and contains no extraneous information.
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?
While the output schema exists and the description mentions return values, the lack of parameter descriptions and usage context lowers completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description fails to explain the parameters beyond mentioning 'specified scope' and 'bucket', leaving their purposes ambiguous.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it generates and evaluates an EXPLAIN plan for SQL++ queries, distinguishing it from the sibling 'run_sql_plus_plus_query' which executes queries.
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 use for analyzing execution plans but lacks explicit guidance on when to use this tool versus executing the query directly, nor does it mention alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_buckets_in_clusterARead-only
Get the names of all the accessible buckets in the cluster.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=true and description adds that only 'accessible' buckets are returned. This is consistent and provides basic behavioral context beyond the annotation.
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 sentence, 8 words, directly states purpose. No wasted words, front-loaded with the key action.
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 has no parameters, an output schema exists, and the description mentions 'names', the description is complete for an agent to understand the tool's function and expected output.
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 has zero parameters with 100% coverage, so the description does not need to add parameter details. The description adds no parameter info, which is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool 'Get the names of all the accessible buckets in the cluster', specifying the resource (buckets), scope (accessible in the cluster), and output (names). It distinguishes from sibling tools like get_scopes_in_bucket and get_collections_in_scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for listing all accessible buckets, but does not explicitly mention when to use versus alternatives or provide conditions for use. With 19 siblings, more explicit guidance would improve clarity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_cluster_diagnostics_reportARead-only
Check whether the client's connections were already broken, and for how long.
Unlike get_cluster_health_and_services (which actively pings each service right now), this reports the SDK's own cached connection state without performing any network I/O. It's cheap enough to call frequently, but it's only as fresh as the last time the SDK actually talked to each node — it won't proactively detect a service that just went down if nothing has touched it since. Use get_cluster_health_and_services instead when you need a live, right-now reachability check; there's also no way to filter this report to specific services the way that tool's ping can, since no I/O means nothing to filter.
For each known endpoint, reports which service it belongs to, its remote/local addresses, connection state, and last_activity — how long it's been since that connection last saw traffic. Also reports an overall online/degraded/offline cluster state.
This call makes no request to the server at all, so it needs no specific RBAC role beyond whatever the initial cluster connection already required — unlike an active ping, it isn't gated on KV/Query/Search or Cluster Admin privileges.
Returns:
Diagnostics report with per-endpoint connection state and overall cluster state
| 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?
Annotations provide readOnlyHint=true, and the description adds substantial behavioral context beyond that: it performs no network I/O, is only as fresh as the last SDK contact, will not proactively detect a just-down service, and requires no additional RBAC role. This gives the agent a clear picture of what the call does and does not 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?
The description is front-loaded with purpose and well-organized into behavioral context, output contents, and permission notes. However, the final 'Returns' bullet largely repeats the prior paragraph's description of per-endpoint and cluster state, adding 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?
The description covers purpose, freshness/staleness caveats, the sibling alternative, permissions, filtering limitations, and output contents. With an output schema present and zero parameters, nothing an agent needs to select or invoke this tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and the schema is an empty object with 100% coverage, so the baseline of 4 applies. The description correctly explains that no filtering is possible because no I/O occurs, which is the only parameter-like nuance an agent needs to understand.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific check—whether client connections were already broken and for how long—and clearly states the tool's core behavior: reporting the SDK's cached connection state. It explicitly contrasts this with get_cluster_health_and_services, so an agent can immediately distinguish the two tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says the tool is cheap and appropriate for frequently checking cached connection state, and directs the agent to use get_cluster_health_and_services instead when a live, right-now reachability check is needed. It also notes the filtering limitation relative to that sibling, leaving no ambiguity about when each tool should be chosen.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_cluster_health_and_servicesARead-only
Check whether the cluster is reachable right now, and where it's broken.
This actively pings (see caveat below) the cluster's services and reports, per service:
Whether it responded and how long it took (latency)
Which node/endpoint answered, and any error if it didn't
Scope: cluster-level vs bucket-level ping
If bucket_name is omitted, this pings at the cluster level. This covers more services in one call, but whether the key-value (KV) service is included depends on the Couchbase Server version — it may be silently skipped.
If bucket_name is provided, this pings from the perspective of that bucket instead. This guarantees the KV service is covered for that bucket, but the result is scoped to that one bucket only — ping again per bucket_name to cover a multi-bucket cluster.
service_types optionally restricts which services get pinged. Valid values: "key_value", "query", "search", "analytics", "view", "management", "eventing". Omit to ping every service. An unrecognized value returns an error response instead of raising.
Caution — this is somewhat invasive: unlike a passive connection-state check, ping performs a live network round-trip to every targeted service. Prefer a narrow service_types filter, and avoid calling this in tight loops or high-frequency polling.
Returns:
Cluster health status with service-level connection details and latency measurements
| Name | Required | Description | Default |
|---|---|---|---|
| bucket_name | No | ||
| service_types | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the readOnlyHint annotation by disclosing that the tool performs live network round-trips, may silently skip KV services depending on Couchbase Server version, returns an error response for unrecognized service_types rather than raising, and is somewhat invasive. These are critical behavioral traits the agent could not infer from the schema or annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Although lengthy, every section earns its place: scope selection, service_types values, version-dependent caveats, and invasiveness warnings all change caller behavior. The use of bolded headings and bulleted list keeps dense information scannable, and the most important purpose statement is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with two optional parameters, no schema descriptions, and an output schema present, the description covers all needed decision points: reachability check mechanics, per-service returned details, cluster versus bucket scoping, version caveats, valid service_types, invalid-input behavior, and safety advice. Nothing critical for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description fully compensates. It explains that bucket_name changes scope from cluster-level to bucket-level and guarantees KV coverage, and it enumerates the exact valid service_types values plus behavior when omitted or invalid. This is far more informative than the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Check whether the cluster is reachable right now, and where it's broken.' It then distinguishes itself from a passive connection-state check and from sibling tools by emphasizing live ping behavior and service-level reporting. This makes it instantly clear what the tool does and how it differs from related cluster-status 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 explicit guidance on when to use cluster-level versus bucket-level pinging, explains the KV-service coverage tradeoff, and advises callers to prefer narrow service_types filters and avoid high-frequency polling. It contrasts with 'a passive connection-state check' but does not explicitly name the sibling tool to use instead, so the routing guidance is strong but not fully explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_collections_in_scopeARead-only
Get the names of all collections in the given scope and bucket.
| Name | Required | Description | Default |
|---|---|---|---|
| scope_name | Yes | ||
| bucket_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already include readOnlyHint=true, and the description only restates the operation as a read (Get). No additional behavioral traits are disclosed, such as potential errors, permission requirements, or limitations beyond what the annotations convey.
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 sentence, clear subject-verb-object, no unnecessary words. Perfectly concise for the tool's simplicity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list tool with two self-explanatory parameters and an existing output schema, the description covers the essential function. It could mention that it only returns names (not full collection details) but the title and context imply that. Slight gap in not specifying the output format, but acceptable.
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 by explaining parameter semantics. However, it only repeats the parameter names ('given scope and bucket') without adding constraints, formats, or examples. The self-explanatory names partially mitigate this, but the description adds little value.
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 explicitly states 'Get the names of all collections in the given scope and bucket.' This clearly identifies the action (get names) and the resource (collections filtered by scope and bucket), distinguishing it from siblings like get_scopes_and_collections_in_bucket which operates at a different granularity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when you need collections within a specific scope and bucket, but does not provide explicit guidance on when to use this tool versus alternatives like get_scopes_and_collections_in_bucket, nor does it mention any exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_document_by_idARead-only
Get a document by its ID from the specified scope and collection. If the document is not found, it will raise an exception.
| Name | Required | Description | Default |
|---|---|---|---|
| scope_name | Yes | ||
| bucket_name | Yes | ||
| document_id | Yes | ||
| collection_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true. The description adds that an exception is raised if the document is not found, which is useful behavioral context beyond what annotations provide. No other behaviors are disclosed, but for a simple read, this is adequate.
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 extremely concise with two sentences. The first sentence states the core purpose, and the second adds an important behavioral note. No redundant or unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple document retrieval tool with an output schema (not shown but present), the description covers the essential action and a key edge case (exception on not found). It does not mention the output structure, but that is handled by the output schema. A minor improvement would be to clarify that it retrieves a single document, but overall it is sufficiently complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0% description coverage. The description only mentions scope and collection, partially explaining two of four parameters. Bucket_name and document_id are not explained, leaving the agent without full clarity on parameter roles. The description does not compensate adequately for the lack of schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (get a document) and the resources (by ID, from scope and collection). The tool name is explicit and distinguishes it from sibling tools which are about queries, indexes, and cluster info.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for retrieving a specific document but gives no explicit guidance on when to use versus alternatives or when not to use. Among siblings, no other tool directly retrieves a single document, so context is implied, but explicit guidelines are absent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_index_advisor_recommendationsARead-only
Get index recommendations from Couchbase Index Advisor for a given SQL++ query.
The Index Advisor analyzes the query and provides recommendations for optimal indexes. This tool works with SELECT, UPDATE, DELETE, or MERGE queries. The queries will be run on the specified scope in the specified bucket.
Returns a dictionary with:
current_used_indexes: Array of currently used indexes (if any)
recommended_indexes: Array of recommended secondary indexes (if any)
recommended_covering_indexes: Array of recommended covering indexes (if any)
Each index object contains:
index: The CREATE INDEX SQL++ command
statements: Array of statement objects with the query and run count
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| scope_name | Yes | ||
| bucket_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=true, and the description reinforces this by stating the tool 'analyzes' and 'provides recommendations' without mentioning side effects. It also details the return structure, offering full transparency about what the tool does and returns.
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 well-structured with front-loaded purpose and bullet points for return values. Every sentence adds value without redundancy, making it concise and easy to scan.
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 three required parameters and no output schema in structured form, the description provides detailed return information and input constraints (query types, scope/bucket). It lacks error handling or prerequisites but is otherwise complete for the tool's domain.
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%, yet the description does not describe individual parameters (bucket_name, scope_name, query) beyond mentioning 'specified scope' and 'specified bucket'. It fails to compensate for the lack of schema descriptions, leaving parameter semantics vague.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool gets index recommendations from Couchbase Index Advisor for a SQL++ query. It specifies the verb 'get' and resource 'index recommendations', and distinguishes from siblings like 'explain_sql_plus_plus_query' and 'list_indexes' by focusing on recommendation generation.
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 explains it works with SELECT, UPDATE, DELETE, or MERGE queries and operates on a specified scope and bucket. However, it does not explicitly state when to use this tool versus alternatives like 'list_indexes' or 'explain_sql_plus_plus_query', so guidance is clear but incomplete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_longest_running_queriesARead-only
Get the N longest running queries from the system:completed_requests catalog.
Prefer this over writing a raw system:completed_requests query via run_sql_plus_plus_query.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of queries to return (default: 10) |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already establishes safety, and the description adds useful behavioral context: it reads from the completed_requests catalog, implying only completed query executions are considered. It does not spell out ordering or result format, but the output schema covers the return shape.
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 purposeful sentences with no filler. The primary action is front-loaded and the preference note is brief and clearly actionable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-optional-parameter, read-only tool with an output schema, this description is complete. It names the source catalog, gives a usage preference, and the surrounding schema/annotations fill in the remaining 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 coverage is 100% and the only parameter, limit, already has a description and default value. The description does not need to add parameter-level detail; the schema carries that burden effectively.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Get'), the result ('N longest running queries'), and the data source ('system:completed_requests catalog'). This differentiates it from sibling query analytics tools by focusing on elapsed runtime rather than response size, frequency, or indexing concerns.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says to prefer this tool over writing a raw system:completed_requests query via run_sql_plus_plus_query. This gives the agent a direct decision rule for at least one obvious alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_most_frequent_queriesARead-only
Get the N most frequent queries from the system:completed_requests catalog.
Prefer this over writing a raw system:completed_requests query via run_sql_plus_plus_query.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of queries to return (default: 10) |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true, covering the operation's safety profile. The description adds the data source and the aggregating nature of the tool, but does not define what 'most frequent' means precisely (e.g., execution count vs. duration) or whether a time window applies.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short sentences with the core operation front-loaded and a useful routing hint in the second sentence. There is no redundant or filler 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 single optional parameter, read-only annotations, and an existing output schema, the description provides enough context to correctly select and invoke the tool. It names the source catalog and tells the agent when to prefer this tool over the raw query alternative.
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 100%, with the single limit parameter fully documented in the schema. The description does not add any syntax or format detail beyond 'N', so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Get'), a specified resource ('N most frequent queries from the system:completed_requests catalog'), and differentiates from raw SQL querying via run_sql_plus_plus_query. This makes the tool's purpose and scope 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 description explicitly tells the agent to prefer this tool over writing a raw system:completed_requests query via run_sql_plus_plus_query. This names the relevant alternative and provides a clear when-to-use directive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_queries_not_selectiveARead-only
Get queries that are not very selective from the system:completed_requests catalog.
Prefer this over writing a raw system:completed_requests query via run_sql_plus_plus_query.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of queries to return (default: 10) |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the safety profile is known. The description adds that this reads from the system:completed_requests catalog, which is useful context, but it does not explain how selectivity is determined, ordering, or other behavioral details.
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 sentences with no filler. The main purpose is front-loaded, and the usage preference over run_sql_plus_plus_query is immediately actionable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter read-only catalog query with an output schema, the description is largely sufficient. It names the source and provides a clear usage preference, though a more precise definition of 'not very selective' would help differentiate among the many sibling query-analysis tools.
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 only parameter, limit, is already fully described in the schema with default behavior. The description adds no additional parameter meaning, so the baseline score of 3 applies.
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 action and resource: getting non-selective queries from system:completed_requests. It is clear even though 'not very selective' is not precisely defined, and it is distinguishable from the raw run_sql_plus_plus_query alternative.
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 explicitly says to prefer this tool over writing a raw system:completed_requests query via run_sql_plus_plus_query. This gives clear guidance on the main alternative, though it does not discuss sibling get_queries_* tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_queries_not_using_covering_indexARead-only
Get queries that don't use a covering index from the system:completed_requests catalog.
Prefer this over writing a raw system:completed_requests query via run_sql_plus_plus_query.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of queries to return (default: 10) |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, so the safety profile is already covered. The description adds the source catalog and the preference over raw SQL, but does not disclose additional behavioral traits such as return format or performance characteristics. This is consistent with the annotation and adds only modest context beyond it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no filler. The purpose is front-loaded, and the usage guidance is placed in a clear second sentence. 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 simple read-only tool with one documented parameter and an output schema, the description is complete. It identifies the data source, the specific filtering criterion, and the recommended way to use it relative to raw SQL. Nothing required to call the tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter 'limit' is fully described in the input schema, including its default value. The tool description adds no additional meaning about the parameter beyond what the schema already provides, so the baseline of 3 applies.
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 ('Get'), a specific resource ('queries that don't use a covering index'), and the exact source catalog ('system:completed_requests'). This clearly distinguishes it from the raw query tool and, by the phrase 'don't use a covering index', from sibling query-analysis tools with different criteria.
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 says to prefer this tool over writing a raw system:completed_requests query via run_sql_plus_plus_query, giving the agent a clear routing instruction. It does not provide exclusions or compare to other sibling query-analysis tools, but the primary alternative is named and handled.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_queries_using_primary_indexARead-only
Get queries that use a primary index from the system:completed_requests catalog.
Prefer this over writing a raw system:completed_requests query via run_sql_plus_plus_query.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of queries to return (default: 10) |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the description need not restate safety. It adds the source catalog and frames the tool as a safer or more convenient alternative to raw queries, but it does not disclose potential costs, limitations, or details about matching behavior beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with no filler. The primary purpose is front-loaded, and the usage guidance is compact and immediately actionable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only tool with one optional parameter, an output schema, and a clear source catalog, the description is complete. An agent has enough to select and invoke 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?
There is only one parameter, limit, and its schema description covers it fully (100% coverage). The tool description adds no extra parameter guidance, so the baseline 3 applies.
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 ('Get'), a clear resource ('queries that use a primary index'), and the source catalog ('system:completed_requests'). This distinguishes it from sibling query-analysis tools like get_queries_not_selective or get_longest_running_queries without opening schemas.
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 second sentence explicitly tells the agent to prefer this tool over writing a raw system:completed_requests query via run_sql_plus_plus_query. It names an alternative and gives a clear preference, though it does not enumerate exclusions or when to choose among the other query-inspection siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_queries_with_large_result_countARead-only
Get queries with the largest result counts from the system:completed_requests catalog.
Prefer this over writing a raw system:completed_requests query via run_sql_plus_plus_query.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of queries to return (default: 10) |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already establishes the safety profile, lowering the bar for the description. The description adds the useful context that this reads from the system:completed_requests catalog, but it does not disclose ordering, limit behavior, or any performance implications of large result counts. It meets the minimum for a read-only convenience 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?
Two short sentences, no wasted words. The purpose is stated first, followed by a clear usage directive. The structure is front-loaded and 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 simple read-only tool with one optional parameter and an output schema present, the description is nearly complete. It names the source catalog and provides routing context. It could go slightly further by clarifying the ordering or default behavior, but the schema and annotations cover most of what an agent needs.
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 100%, with the 'limit' parameter fully documented in the schema. The description adds no additional parameter meaning, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Get'), a precise resource ('queries with the largest result counts'), and the source catalog ('system:completed_requests'). It also differentiates this tool from the raw query tool by explicitly recommending it over writing a raw system:completed_requests query via run_sql_plus_plus_query.
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 second sentence provides explicit usage guidance: prefer this over a raw system:completed_requests query. It names the alternative tool, but it does not mention when not to use this tool or which sibling to choose for other query-analytics concerns (e.g., response sizes or runtime).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_queries_with_largest_response_sizesARead-only
Get queries with the largest response sizes from the system:completed_requests catalog.
Prefer this over writing a raw system:completed_requests query via run_sql_plus_plus_query.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of queries to return (default: 10) |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds that the data comes from system:completed_requests and that results are the largest response sizes, but it does not disclose details such as ordering ties, result semantics, or performance characteristics; these are minor given the read-only annotation.
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 sentences carry the core function and the routing preference with no filler. The purpose statement is front-loaded, and the sibling guidance follows immediately.
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 a read-only annotation, a single documented optional parameter, and a provided output schema, the tool is simple enough that the source catalog and preference note make the description adequate. An agent can safely invoke it without further behavioral context.
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 schema covers the single limit parameter fully with a default and description, so the description has little parameter burden to carry. The description adds no extra meaning about the limit beyond what the schema already provides, matching the baseline for high schema 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?
The description states a specific verb ('Get') and a precise resource ('queries with the largest response sizes from the system:completed_requests catalog'), which is more specific than the name alone and distinguishes this diagnostic from sibling query-analysis tools. It names the underlying catalog, making the tool's scope unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly tells an agent to prefer this tool over writing a raw system:completed_requests query via run_sql_plus_plus_query. This names a concrete sibling alternative and gives clear guidance for when this tool should be selected.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_schema_for_collectionARead-only
Get the schema for a collection in the specified scope. Returns a dictionary with the collection name and the schema returned by running INFER query on the Couchbase collection.
| Name | Required | Description | Default |
|---|---|---|---|
| scope_name | Yes | ||
| bucket_name | Yes | ||
| collection_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations declare readOnlyHint=true consistently. The description adds behavioral context by specifying that it runs an INFER query and returns a dictionary with collection name and schema, which is beyond the annotation. No contradictions.
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 sentences, each serving a distinct purpose: first for action and resource, second for return value and implementation detail. No extraneous 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?
Given that an output schema exists, the description adequately explains the return value (dictionary with name and schema) and the underlying mechanism (INFER query). It lacks mention of prerequisites like bucket existence, but for a read-only schema tool, it is fairly 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?
Input schema has 0% description coverage, but parameter names are self-explanatory (bucket_name, scope_name, collection_name). The description mentions 'specified scope' but doesn't explain each parameter's purpose or format. With low schema coverage, more compensation is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Get the schema' and the resource 'collection in the specified scope', and it directly contrasts with sibling tools like 'get_collections_in_scope' which return lists rather than schemas. The mention of 'INFER query' adds specificity.
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 explains what the tool does but provides no guidance on when to use it versus alternatives like 'get_scopes_and_collections_in_bucket' or 'run_sql_plus_plus_query'. Usage context is implied but not explicitly clarified.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_scopes_and_collections_in_bucketARead-only
Get the names of all scopes and collections in the bucket. Returns a dictionary with scope names as keys and lists of collection names as values.
| Name | Required | Description | Default |
|---|---|---|---|
| bucket_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds value beyond the readOnlyHint annotation by detailing the return format (dictionary of scope names to collection lists). No behavioral contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short sentences with no unnecessary words, front-loading the action and return format.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description adequately covers the tool's purpose and output for a simple read operation. With an output schema likely defining details, it is moderately complete, though it omits error conditions.
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?
Despite 0% schema description coverage, the parameter bucket_name is self-explanatory and the description mentions 'in the bucket', which sufficiently clarifies its role.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves names of all scopes and collections in a bucket, distinguishing it from siblings like get_scopes_in_bucket (only scopes) and get_collections_in_scope (collections for a specific scope).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description does not explicitly state when to use this tool versus alternatives like get_scopes_in_bucket or get_collections_in_scope. Usage context is implied by the purpose, but no direct guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_scopes_in_bucketARead-only
Get the names of all scopes in the given bucket.
| Name | Required | Description | Default |
|---|---|---|---|
| bucket_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the description adds no extra behavioral context. It does not mention permissions, error handling, or prerequisites beyond the obvious read 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?
Single sentence that is front-loaded and contains no extraneous information. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only tool with one parameter and an output schema, the description is largely sufficient. It could mention that the bucket must exist, but overall it is adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the parameter 'bucket_name' is self-explanatory from the tool name and description. However, no additional constraints or format details are provided.
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?
Description clearly states the action (Get) and resource (names of all scopes in a bucket), precisely distinguishing it from siblings like get_scopes_and_collections_in_bucket which returns both scopes and collections.
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 explicit guidance on when to use this tool vs alternatives; usage is implied by the name and description, but no when-not or mention of sibling tools like get_scopes_and_collections_in_bucket.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_server_configuration_statusARead-only
Get the server status and configuration without establishing connection. This tool can be used to verify if the server is running and check the configuration.
| 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?
Beyond readOnlyHint annotation, it adds that no connection is established, which is a key behavioral trait. No contradiction.
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 sentences, front-loaded with key action, no extra fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given zero parameters, annotations, and output schema, the description fully covers the tool's purpose and behavior.
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?
No parameters exist, so schema coverage is 100%. Baseline 4 applies as description adds no param info but none needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it retrieves server status and configuration, and uniquely specifies 'without establishing connection', distinguishing it from siblings like test_cluster_connection.
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 indicates usage for verifying server running and checking configuration, providing context but not explicit when-nots or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_indexesARead-only
List indexes in the cluster with optional filtering by bucket, scope, collection, and index name.
Filters must be provided hierarchically: scope requires bucket, collection requires both, index requires all three.
Set return_raw_index_stats=True to get the unprocessed source row for each index.
Each result contains: name, definition (CREATE INDEX statement), status, isPrimary, bucket, scope, collection, lastScanTime. If a required field is missing, the entry contains warning and raw_index_stats instead.
Source depends on cluster version: v8+ queries system:indexes via the
query service (RBAC-scoped — the connected user sees only indexes on
keyspaces they can access); older clusters fall back to the admin-level
Index Service REST API /getIndexStatus.
| Name | Required | Description | Default |
|---|---|---|---|
| index_name | No | ||
| scope_name | No | ||
| bucket_name | No | ||
| collection_name | No | ||
| return_raw_index_stats | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses version-dependent source behavior (RBAC-scoped vs admin API), missing field handling with warnings, and output field details, offering comprehensive transparency.
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 well-structured with clear front-loading, each paragraph adds essential information without redundancy. Concise yet complete.
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 5 parameters, no required params, and an output schema, the description covers filtering hierarchy, return option, output fields, missing data handling, and version-dependent behavior—fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema coverage, the description adds significant meaning: hierarchical filtering rule and raw stats option. It compensates well but could clarify parameter formats further, though schema types suffice.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it lists indexes with optional filtering, using specific verb and resource. It distinguishes from sibling tools by focusing on index listing rather than schema or queries.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit hierarchical filtering rules and mentions the return_raw_index_stats option, but does not explicitly state when to use this tool over alternatives like get_index_advisor_recommendations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lookup_subdocumentARead-only
Look up parts of a document without fetching the whole thing, using Couchbase sub-document operations. Use this instead of get_document_by_id when you only need a few fields, a presence check, or the size of an array/object inside a document — AND you already know the exact field path(s) to look up (e.g. from a prior get_document_by_id call on this same document, from the user explicitly naming the field, or from a known/confirmed schema for this collection).
IMPORTANT: Do NOT guess field paths. If you don't already know the document's exact field names/structure, call get_document_by_id first (or instead) — a guessed path that doesn't exist returns a per-path error here rather than the real data, and reporting "not found" for a wrong guess is worse than just fetching the whole document and reading the right field.
Provide one or more of the following. Each is a list of sub-document paths using Couchbase's dot/bracket path syntax (e.g. "address.city", "tags[0]", "tags[-1]" for the last array element):
get_paths: fetch the VALUE at each path.
exists_paths: check whether each path exists, without fetching its value (cheaper than get_paths — no payload transfer — when you only need a yes/no answer).
count_paths: get the number of elements in the array or object at each path (fails per-path if the path isn't an array/object).
At least one of get_paths, exists_paths, or count_paths must be provided. As a rule of thumb, keep the combined number of paths across all three to 16 or fewer — Couchbase limits subdocument operations per call, though the exact limit is server-side and may change. If the server rejects the call (too many paths, or another constraint like path length or nesting depth), the whole call fails with {"error": "..."}.
A path that doesn't exist (or otherwise fails, e.g. count on a non-array/object) does NOT fail the whole call — it is reported individually as {"error": ...} in the returned dict so the other requested paths can still be resolved.
Returns a dict with a key for each category that was requested (only requested categories are included): { "get": {"": {"value": } | {"error": "..."}}, "exists": {"": {"value": true | false} | {"error": "..."}}, "count": {"": {"value": } | {"error": "..."}}, } On a connection/lookup failure, or an invalid request (no paths / too many paths), returns {"error": ""} instead.
| Name | Required | Description | Default |
|---|---|---|---|
| get_paths | No | ||
| scope_name | Yes | ||
| bucket_name | Yes | ||
| count_paths | No | ||
| document_id | Yes | ||
| exists_paths | No | ||
| collection_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, it discloses important runtime behavior: per-path errors do not fail the whole call, failed paths are reported individually as {"error": ...}, too many paths can cause a whole-call failure, and guessing wrong paths returns misleading 'not found' results. It also documents the exact response shape for success and failure, giving the agent a faithful model of how the tool behaves.
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 every section earns its place: purpose, usage rules, parameter semantics, path-syntax examples, failure modes, and return format. It is front-loaded with the most decision-relevant information (when to use vs get_document_by_id) and uses clear structural signposts like the IMPORTANT warning and per-category bullet lists, making it easy for an agent to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity — multiple path categories, per-path failures, server-side limits, and a non-trivial response format — the description is exceptionally complete. It even includes the return dict shape and error behaviors despite an output schema being present, and it covers the only real prerequisite (known field paths) along with how to handle uncertainty. An agent has everything needed to invoke 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?
With schema description coverage at 0%, the description carries the burden and largely delivers: get_paths, exists_paths, and count_paths are each explained with semantics, examples of path syntax, and guidance on limits and minimum requirements. The required identifiers bucket_name, scope_name, collection_name, and document_id are not individually elaborated, but their roles are strongly implied by their names and the tool's Couchbase context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('Look up parts of a document without fetching the whole thing, using Couchbase sub-document operations') and immediately differentiates itself from the sibling get_document_by_id by stating exactly when to prefer it. The name and purpose align clearly, so an agent can identify the tool's role without reading the 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 explicitly says 'Use this instead of get_document_by_id when...' and gives concrete conditions: needing only a few fields, a presence check, or an array/object size, while already knowing exact field paths. It also provides a clear 'when not to use' instruction — do not guess paths, call get_document_by_id first — which is strong routing guidance with an explicit alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_sql_plus_plus_queryA
Run a SQL++ query on a scope and return the results as a list of JSON objects.
The query will be run on the specified scope in the specified bucket. The query should use collection names directly without bucket/scope prefixes, as the scope context is automatically set.
Use named_parameters to bind values to $name placeholders in the
query instead of concatenating user input into the statement. This prevents
SQL++ injection
Example: query = "SELECT * FROM users WHERE age > 18" # Incorrect: "SELECT * FROM bucket.scope.users WHERE age > 18"
For creating a new index, prefer the create_index tool over a raw CREATE INDEX statement here — it defers the build by default and tells you the recommended next step. Use list_indexes to check whether an index is online before relying on it in a query plan.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| scope_name | Yes | ||
| bucket_name | Yes | ||
| named_parameters | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the behavioral disclosure burden. It explains that the scope context is automatically set, that named parameters are the injection-safe binding mechanism, and that results are returned as JSON objects. It stops short of mentioning side-effect potential for mutating queries, but the inclusion of CREATE INDEX guidance implies mutability.
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 well-structured and front-loaded: purpose, scoping rule, security guidance, example, and sibling tool routing. Every sentence contributes useful decision-making or invocation detail with minimal 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 an output schema exists, return-value details are already covered. The description provides enough operational context for the agent to invoke the tool correctly, including naming rules, parameter binding, and when to use alternative tools.
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 input schema has 0% description coverage, so the tool description must compensate. It explains the query parameter's naming convention, the role of named_parameters with $name placeholders, and the bucket/scope context. This covers most parameters indirectly, though bucket_name and scope_name formats are left to inference.
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 starts with a specific action, 'Run a SQL++ query on a scope and return the results as a list of JSON objects,' which clearly identifies the verb and resource. It further distinguishes itself from sibling diagnostic and explain tools by emphasizing execution and result output.
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 concrete usage guidance: use collection names without bucket/scope prefixes, bind parameters via named_parameters to prevent injection, and prefer create_index over raw CREATE INDEX. It also references list_indexes as a complementary tool, giving the agent explicit routing cues.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
test_cluster_connectionARead-only
Test the connection to Couchbase cluster and optionally to a bucket. This tool verifies the connection to the Couchbase cluster and bucket by establishing the connection if it is not already established. If bucket name is not provided, it will not try to connect to the bucket specified in the MCP server settings. Returns connection status and basic cluster information.
| Name | Required | Description | Default |
|---|---|---|---|
| bucket_name | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses it establishes connection if needed, returns status and cluster info. readOnlyHint annotation consistent.
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 sentences, no unnecessary words, front-loaded with purpose.
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?
Simple tool with optional param and output schema; description covers key behavior and return info.
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?
Only one param with 0% schema coverage; description adds meaning by explaining behavior when bucket_name is null. Lacks format details but sufficient.
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?
Clearly states it tests connection to Couchbase cluster and optionally a bucket. Distinct from siblings that query data or indexes.
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?
Explains when to provide bucket name and behavior when omitted. Could explicitly contrast with sibling tools for when to use this first.
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.
3 tool updates
v1.0.1- Added
get_cluster_diagnostics_report - Changed
get_cluster_health_and_services1 field changed- added
Input schema / properties / service_typesAdded value: +{ + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null +}
- Added
lookup_subdocument
1 tool update
v0.8.1- Changed
run_sql_plus_plus_query1 field changed- added
Input schema / properties / named_parametersAdded value: +{ + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null +}
22 tool updates
v0.8.0- Removed
delete_document_by_id - Added
explain_sql_plus_plus_query - Changed
get_buckets_in_cluster5 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / titleRemoved value: -"get_buckets_in_clusterArguments" - removed
Output schema / properties / result / titleRemoved value: -"Result" - removed
Output schema / titleRemoved value: -"get_buckets_in_clusterOutput" - added
Output schema / x-fastmcp-wrap-resultAdded value: +true
- Changed
get_cluster_health_and_services4 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / bucket_name / titleRemoved value: -"Bucket Name" - removed
Input schema / titleRemoved value: -"get_cluster_health_and_servicesArguments" - removed
Output schema / titleRemoved value: -"get_cluster_health_and_servicesDictOutput"
- Changed
get_collections_in_scope7 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / bucket_name / titleRemoved value: -"Bucket Name" - removed
Input schema / properties / scope_name / titleRemoved value: -"Scope Name" - removed
Input schema / titleRemoved value: -"get_collections_in_scopeArguments" - removed
Output schema / properties / result / titleRemoved value: -"Result" - removed
Output schema / titleRemoved value: -"get_collections_in_scopeOutput" - added
Output schema / x-fastmcp-wrap-resultAdded value: +true
- Changed
get_document_by_id7 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / bucket_name / titleRemoved value: -"Bucket Name" - removed
Input schema / properties / collection_name / titleRemoved value: -"Collection Name" - removed
Input schema / properties / document_id / titleRemoved value: -"Document Id" - removed
Input schema / properties / scope_name / titleRemoved value: -"Scope Name" - removed
Input schema / titleRemoved value: -"get_document_by_idArguments" - removed
Output schema / titleRemoved value: -"get_document_by_idDictOutput"
- Changed
get_index_advisor_recommendations6 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / bucket_name / titleRemoved value: -"Bucket Name" - removed
Input schema / properties / query / titleRemoved value: -"Query" - removed
Input schema / properties / scope_name / titleRemoved value: -"Scope Name" - removed
Input schema / titleRemoved value: -"get_index_advisor_recommendationsArguments" - removed
Output schema / titleRemoved value: -"get_index_advisor_recommendationsDictOutput"
- Changed
get_longest_running_queries7 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / limit / descriptionAdded value: +"Number of queries to return (default: 10)" - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - removed
Input schema / titleRemoved value: -"get_longest_running_queriesArguments" - removed
Output schema / properties / result / titleRemoved value: -"Result" - removed
Output schema / titleRemoved value: -"get_longest_running_queriesOutput" - added
Output schema / x-fastmcp-wrap-resultAdded value: +true
- Changed
get_most_frequent_queries7 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / limit / descriptionAdded value: +"Number of queries to return (default: 10)" - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - removed
Input schema / titleRemoved value: -"get_most_frequent_queriesArguments" - removed
Output schema / properties / result / titleRemoved value: -"Result" - removed
Output schema / titleRemoved value: -"get_most_frequent_queriesOutput" - added
Output schema / x-fastmcp-wrap-resultAdded value: +true
- Changed
get_queries_not_selective7 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / limit / descriptionAdded value: +"Number of queries to return (default: 10)" - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - removed
Input schema / titleRemoved value: -"get_queries_not_selectiveArguments" - removed
Output schema / properties / result / titleRemoved value: -"Result" - removed
Output schema / titleRemoved value: -"get_queries_not_selectiveOutput" - added
Output schema / x-fastmcp-wrap-resultAdded value: +true
- Changed
get_queries_not_using_covering_index7 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / limit / descriptionAdded value: +"Number of queries to return (default: 10)" - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - removed
Input schema / titleRemoved value: -"get_queries_not_using_covering_indexArguments" - removed
Output schema / properties / result / titleRemoved value: -"Result" - removed
Output schema / titleRemoved value: -"get_queries_not_using_covering_indexOutput" - added
Output schema / x-fastmcp-wrap-resultAdded value: +true
- Changed
get_queries_using_primary_index7 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / limit / descriptionAdded value: +"Number of queries to return (default: 10)" - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - removed
Input schema / titleRemoved value: -"get_queries_using_primary_indexArguments" - removed
Output schema / properties / result / titleRemoved value: -"Result" - removed
Output schema / titleRemoved value: -"get_queries_using_primary_indexOutput" - added
Output schema / x-fastmcp-wrap-resultAdded value: +true
- Changed
get_queries_with_large_result_count7 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / limit / descriptionAdded value: +"Number of queries to return (default: 10)" - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - removed
Input schema / titleRemoved value: -"get_queries_with_large_result_countArguments" - removed
Output schema / properties / result / titleRemoved value: -"Result" - removed
Output schema / titleRemoved value: -"get_queries_with_large_result_countOutput" - added
Output schema / x-fastmcp-wrap-resultAdded value: +true
- Changed
get_queries_with_largest_response_sizes7 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / limit / descriptionAdded value: +"Number of queries to return (default: 10)" - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - removed
Input schema / titleRemoved value: -"get_queries_with_largest_response_sizesArguments" - removed
Output schema / properties / result / titleRemoved value: -"Result" - removed
Output schema / titleRemoved value: -"get_queries_with_largest_response_sizesOutput" - added
Output schema / x-fastmcp-wrap-resultAdded value: +true
- Changed
get_schema_for_collection6 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / bucket_name / titleRemoved value: -"Bucket Name" - removed
Input schema / properties / collection_name / titleRemoved value: -"Collection Name" - removed
Input schema / properties / scope_name / titleRemoved value: -"Scope Name" - removed
Input schema / titleRemoved value: -"get_schema_for_collectionArguments" - removed
Output schema / titleRemoved value: -"get_schema_for_collectionDictOutput"
- Changed
get_scopes_and_collections_in_bucket4 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / bucket_name / titleRemoved value: -"Bucket Name" - removed
Input schema / titleRemoved value: -"get_scopes_and_collections_in_bucketArguments" - removed
Output schema / titleRemoved value: -"get_scopes_and_collections_in_bucketDictOutput"
- Changed
get_scopes_in_bucket6 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / bucket_name / titleRemoved value: -"Bucket Name" - removed
Input schema / titleRemoved value: -"get_scopes_in_bucketArguments" - removed
Output schema / properties / result / titleRemoved value: -"Result" - removed
Output schema / titleRemoved value: -"get_scopes_in_bucketOutput" - added
Output schema / x-fastmcp-wrap-resultAdded value: +true
- Changed
get_server_configuration_status3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / titleRemoved value: -"get_server_configuration_statusArguments" - removed
Output schema / titleRemoved value: -"get_server_configuration_statusDictOutput"
- Changed
list_indexes11 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / bucket_name / titleRemoved value: -"Bucket Name" - removed
Input schema / properties / collection_name / titleRemoved value: -"Collection Name" - removed
Input schema / properties / include_raw_index_statsRemoved value: -{ - "default": false, - "title": "Include Raw Index Stats", - "type": "boolean" -} - removed
Input schema / properties / index_name / titleRemoved value: -"Index Name" - added
Input schema / properties / return_raw_index_statsAdded value: +{ + "default": false, + "type": "boolean" +} - removed
Input schema / properties / scope_name / titleRemoved value: -"Scope Name" - removed
Input schema / titleRemoved value: -"list_indexesArguments" - removed
Output schema / properties / result / titleRemoved value: -"Result" - removed
Output schema / titleRemoved value: -"list_indexesOutput" - added
Output schema / x-fastmcp-wrap-resultAdded value: +true
- Changed
run_sql_plus_plus_query8 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / bucket_name / titleRemoved value: -"Bucket Name" - removed
Input schema / properties / query / titleRemoved value: -"Query" - removed
Input schema / properties / scope_name / titleRemoved value: -"Scope Name" - removed
Input schema / titleRemoved value: -"run_sql_plus_plus_queryArguments" - removed
Output schema / properties / result / titleRemoved value: -"Result" - removed
Output schema / titleRemoved value: -"run_sql_plus_plus_queryOutput" - added
Output schema / x-fastmcp-wrap-resultAdded value: +true
- Changed
test_cluster_connection4 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / bucket_name / titleRemoved value: -"Bucket Name" - removed
Input schema / titleRemoved value: -"test_cluster_connectionArguments" - removed
Output schema / titleRemoved value: -"test_cluster_connectionDictOutput"
- Removed
upsert_document_by_id
20 tool updates
v1.0.0- Changed
delete_document_by_id2 fields changed- added
Input schema / properties / bucket_nameAdded value: +{ + "title": "Bucket Name", + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "scope_name", - "collection_name", - "document_id" -]New value: +[ + "bucket_name", + "scope_name", + "collection_name", + "document_id" +]
- Added
get_buckets_in_cluster - Added
get_cluster_health_and_services - Added
get_collections_in_scope - Changed
get_document_by_id2 fields changed- added
Input schema / properties / bucket_nameAdded value: +{ + "title": "Bucket Name", + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "scope_name", - "collection_name", - "document_id" -]New value: +[ + "bucket_name", + "scope_name", + "collection_name", + "document_id" +]
- Added
get_index_advisor_recommendations - Added
get_longest_running_queries - Added
get_most_frequent_queries - Added
get_queries_not_selective - Added
get_queries_not_using_covering_index - Added
get_queries_using_primary_index - Added
get_queries_with_large_result_count - Added
get_queries_with_largest_response_sizes - Changed
get_schema_for_collection2 fields changed- added
Input schema / properties / bucket_nameAdded value: +{ + "title": "Bucket Name", + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "scope_name", - "collection_name" -]New value: +[ + "bucket_name", + "scope_name", + "collection_name" +]
- Changed
get_scopes_and_collections_in_bucket2 fields changed- added
Input schema / properties / bucket_nameAdded value: +{ + "title": "Bucket Name", + "type": "string" +} - added
Input schema / requiredAdded value: +[ + "bucket_name" +]
- Added
get_scopes_in_bucket - Added
list_indexes - Changed
run_sql_plus_plus_query2 fields changed- added
Input schema / properties / bucket_nameAdded value: +{ + "title": "Bucket Name", + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "scope_name", - "query" -]New value: +[ + "bucket_name", + "scope_name", + "query" +]
- Changed
test_cluster_connection1 field changed- added
Input schema / properties / bucket_nameAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Bucket Name" +}
- Changed
upsert_document_by_id2 fields changed- added
Input schema / properties / bucket_nameAdded value: +{ + "title": "Bucket Name", + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "scope_name", - "collection_name", - "document_id", - "document_content" -]New value: +[ + "bucket_name", + "scope_name", + "collection_name", + "document_id", + "document_content" +]
8 tool updates
- First observed
delete_document_by_id - First observed
get_document_by_id - First observed
get_schema_for_collection - First observed
get_scopes_and_collections_in_bucket - First observed
get_server_configuration_status - First observed
run_sql_plus_plus_query - First observed
test_cluster_connection - First observed
upsert_document_by_id
TDQS
Scored across 22 tools
Tools are mostly distinct: schema, document CRUD, query execution, and query analysis are clearly separated. A few overlaps exist: get_cluster_health_and_services vs get_cluster_diagnostics_report both check connectivity but explicitly differentiate active vs passive checks, and the get_queries_* tools are all similar but each targets a specific metric (selectivity, covering index, primary index, result count, etc.). Still, the descriptions are thorough enough to guide selection.
Most tools follow a verb_noun pattern: get_schema_for_collection, get_document_by_id, lookup_subdocument, run_sql_plus_plus_query, test_cluster_connection. However, there are deviations: get_queries_not_selective and get_longest_running_queries are more adjective-based, and 'lookup_subdocument' uses 'lookup' instead of 'get'. Despite mixed verb choices (get, lookup, run, test), the pattern is clear and predictable.
With 22 tools, the server is on the higher end but still well-scoped for a comprehensive Couchbase interaction layer covering schema, documents, querying, cluster health, and query analysis. The count is justified by the breadth of features (e.g., 7 query-analysis tools). It feels slightly heavy but not excessive.
The server provides read operations for documents (get, lookup subdocument) but lacks create, update, and delete for documents. It also lacks bucket/scope/collection management (create/drop). Query analysis is thorough with index advisor and health metrics. The gap in write operations is notable and will force agents to rely on raw SQL++ for mutations, which is a significant omission.
Maintenance
Related MCP Connectors
- mcpOAuthcom.gibsonai
GibsonAI MCP server: manage your databases with natural language
MCP server providing access to the Scorecard API to evaluate and optimize LLM systems.
An MCP server that provides an API to LLMs to manage their JumpCloud resources.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceAn MCP server that enables large language models to interact directly with MongoDB databases, allowing them to query collections, inspect schemas, and manage data through natural language.20 npmMIT
- AlicenseNot gradedqualityDmaintenanceA server that enables natural language interactions with Couchbase databases through the Model Context Protocol, allowing users to perform SQL++ queries on Couchbase Capella clusters using conversational commands.1MIT
- AlicenseNot gradedqualityDmaintenanceA Model Context Protocol server that enables large language models to interact directly with Couchbase databases through natural language, supporting operations like querying buckets, performing CRUD operations, and executing N1QL queries.34 npm7MIT

YugabyteDB MCP Serverofficial
AlicenseNot gradedqualityBmaintenanceAn MCP server implementation that allows Large Language Models to directly interact with YugabyteDB databases, supporting table listing and read-only SQL queries.11Apache 2.0