Skip to main content
Glama

Couchbase MCP Server

Couchbase MCP Server is a self-hosted MCP Server that allows AI agents to connect to and interact with data in Couchbase Servers (whether hosted on Capella or self-managed) or Operational Insights Enterprise. It provides tools across categories including Cluster Health, Data Schema, Query, and more — with safety controls via read-only mode and fine-grained tool disabling. It supports both STDIO and Streamable HTTP transports with OAuth capabilities.

Couchbase MCP Server is distributed as a Python Package Index (PyPI) package and via Docker. Enterprise support for Couchbase MCP Server is available by licensing Couchbase AI Data Plane, which also entitles use and enterprise support of Couchbase Agent Memory and Couchbase Agent Catalog.

Docs License Python 3.11+ PyPI version Install in Cursor Trust Score

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 orders collection?"

  • "Find the 10 most recent documents in users where status = '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 products with these fields: …" (requires CB_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.

Operational server

Operational Insights server

Use it with

A Couchbase cluster (Capella or self-managed)

A self-managed Operational Insights cluster (not available on Capella)

Subcommand

operational (the default)

operational-insights

Connection string

couchbase:// / couchbases://

HTTP(S) URL, e.g. http://localhost:8095

Credential variables

CB_CONNECTION_STRING, CB_USERNAME, …

CB_OPERATIONAL_INSIGHTS_CONNECTION_STRING, CB_OPERATIONAL_INSIGHTS_USERNAME, …

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

8000

8001

Default log file

mcp_server.log

mcp_server_operational_insights.log

The subcommand is optional for the operational server today — a bare couchbase-mcp-server starts it — but naming it keeps your configuration unambiguous. Options go after the subcommand: couchbase-mcp-server operational --transport=http. Check the installed version with uvx 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.11+):

{
  "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

CB_CONNECTION_STRING

--connection-string

Connection string to the cluster. Required

CB_USERNAME / CB_PASSWORD

--username / --password

Basic authentication

CB_CLIENT_CERT_PATH / CB_CLIENT_KEY_PATH

--client-cert-path / --client-key-path

mTLS authentication

CB_CA_CERT_PATH

--ca-cert-path

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 🖥️ are self-managed only — they use admin REST endpoints that Capella does not expose, or (discover_tool_input_values) only serve reference data for a tool that does — so they need self-managed Couchbase Server 7.6+ and are not registered on Capella connections.

Cluster setup and health

Tool

Description

get_server_configuration_status

Server status and configuration without connecting to the cluster: read-only mode, disabled/confirmation-required tools, OAuth, logging and audit counters

test_cluster_connection

Check the cluster credentials by connecting to the cluster

get_cluster_health_and_services

Cluster health and running services, optionally filtered via service_types

get_client_connectivity_report

The SDK's cached connection diagnostics, without active network probing

get_cluster_metrics 🖥️

Cluster statistics over a historic time window (stats-range endpoint)

get_cluster_tasks 🖥️

Tasks running right now — rebalance, compaction, XDCR, index build. Needs ro_admin

get_cluster_health_snapshot 🖥️

Per-node health: service topology, membership, orchestrator and a health rollup. Needs ro_admin

get_bucket_config 🖥️

A bucket's (or every bucket's) configuration and live state — quotas, eviction, replicas, durability, storage, compaction. Needs ro_admin

get_cluster_system_events 🖥️

The system event log (config changes, failovers, rebalances, restarts), windowed with since_time. Needs Full Admin or Cluster Admin

discover_tool_input_values 🖥️

Look up exact input values other tools need (e.g. every metric name for get_cluster_metrics). Works offline

Data model and schema discovery

Tool

Description

get_buckets_in_cluster

List all buckets in the cluster

get_scopes_in_bucket

List all scopes in a bucket

get_collections_in_scope

List all collections in a scope (requires the Query service)

get_scopes_and_collections_in_bucket

List all scopes and collections in a bucket

get_schema_for_collection

Infer the structure of a collection

create_scope ✏️

Create a scope in a bucket (Server 7.6+ and Capella)

create_collection ✏️

Create a collection in an existing scope (Server 7.6+ and Capella)

delete_scope ✏️

Delete a scope and all its collections — permanent

delete_collection ✏️

Delete a collection and all its documents — permanent

Document (KV) operations

Tool

Description

get_document_by_id

Get a document by ID

lookup_subdocument

Read specific paths, existence checks or counts without fetching the whole document

upsert_document_by_id ✏️

Upsert a document by ID

insert_document_by_id ✏️

Insert a new document (fails if it exists)

replace_document_by_id ✏️

Replace an existing document (fails if it doesn't exist)

delete_document_by_id ✏️

Delete a document by ID

mutate_subdocument ✏️

Modify paths in an existing document (upsert, insert, replace, remove, array ops, counters)

Query and indexing

Tool

Description

run_sql_plus_plus_query

Run a SQL++ query scoped to a bucket and scope — use collection names directly (SELECT * FROM users). Data-modifying statements are blocked in read-only mode

explain_sql_plus_plus_query

Generate and evaluate an EXPLAIN plan: metadata, extracted plan and findings

get_index_advisor_recommendations

Index Advisor recommendations for a SQL++ query

list_indexes

List indexes with definitions, filterable by bucket/scope/collection/name; flags vector indexes (is_vector, vector_type)

get_index_stats 🖥️

Per-index size, fragmentation, scan traffic and lag, per node — finds pressure and unused indexes

create_query_index ✏️

Create a scalar, Hyperscale vector or Composite vector GSI index (index_type). Deferred by default — follow with build_index

create_index ✏️

Deprecated — use create_query_index. Removed in 2.0

build_index ✏️

Build all deferred indexes on a collection

drop_index ✏️

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

List Search indexes — cluster-level, per bucket, or per scope

get_search_index_definition

Full definition of one Search index (mappings, analyzers, plan params)

run_search

Run any non-vector FTS query from its raw JSON body; explain=true returns the execution plan

upsert_search_index ✏️

Create or update a Search index, including vector field mappings. Updates trigger a full rebuild — pass the current uuid to avoid clobbering concurrent changes

drop_search_index ✏️

Drop a Search index — permanent

Both tools embed plain query text with the model configured under Embedding Providers. Available on self-managed Couchbase Server and Capella.

Tool

Description

run_vector_query

Similarity search against a GSI vector index (Server 8.0+) via APPROX_VECTOR_DISTANCE(). The index is chosen automatically; supports a SQL++ where prefilter and Hyperscale tuning (num_probes, rerank, top_n_scan). Returns full documents

run_vector_search

Search-service vector search (Server 7.6+) against a named index. scalar_query makes it hybrid; prefilter narrows candidates first. Returns index-stored fields per hit

Query performance analysis

Tool

Description

get_longest_running_queries

Longest-running queries by average service time

get_most_frequent_queries

Most frequently executed queries

get_queries_with_largest_response_sizes

Queries with the largest response sizes

get_queries_with_large_result_count

Queries with the largest result counts

get_queries_using_primary_index

Queries using a primary index

get_queries_not_using_covering_index

Queries not using a covering index

get_queries_not_selective

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

get_cluster_query_vitals

Query-engine health: request rate, active/queued requests, memory, GC, uptime. Needs ro_admin

get_active_queries

Queries executing right now across all query nodes. Needs ro_admin

delete_active_query ✏️

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 (the one exception, discover_tool_input_values, is withheld because it only serves a tool that needs them). 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

get_cluster_metrics

Management REST (/pools/default/stats/range)

get_cluster_tasks

Management REST (/pools/default/tasks)

get_bucket_config

Management REST (/pools/default/buckets[/<name>])

get_cluster_health_snapshot

Management REST, plus per-node endpoints

get_cluster_system_events

Management REST (/events)

get_index_stats

Index Service REST (each indexer's /api/v1/stats)

get_cluster_query_vitals

Query service REST (/admin/vitals)

get_active_queries

Query service REST (/admin/active_requests)

delete_active_query

Query service REST (DELETE /admin/active_requests/{id})

discover_tool_input_values

None (works offline), but it only serves get_cluster_metrics, which Capella lacks

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.

CB_MCP_EMBEDDING_MODEL_PROVIDER

Required

Optional

Notes

capella

CB_MCP_EMBEDDING_MODEL_API_KEY, CB_MCP_EMBEDDING_MODEL, CB_MCP_EMBEDDING_MODEL_ENDPOINT

—

Capella Model Service. CB_MCP_EMBEDDING_MODEL_ENDPOINT is your deployment's own URL (e.g. https://<id>.ai.couchbase.com) from Capella's AI Data Plane > Models

openai

CB_MCP_EMBEDDING_MODEL_API_KEY, CB_MCP_EMBEDDING_MODEL

CB_MCP_EMBEDDING_MODEL_ENDPOINT

Set the endpoint to use an OpenAI-compatible local server (Ollama, vLLM, LM Studio)

cohere

CB_MCP_EMBEDDING_MODEL_API_KEY, CB_MCP_EMBEDDING_MODEL

CB_MCP_EMBEDDING_MODEL_ENDPOINT

voyage

CB_MCP_EMBEDDING_MODEL_API_KEY, CB_MCP_EMBEDDING_MODEL

CB_MCP_EMBEDDING_MODEL_ENDPOINT

bedrock

CB_MCP_EMBEDDING_MODEL

CB_MCP_EMBEDDING_MODEL_AWS_ACCESS_KEY_ID, CB_MCP_EMBEDDING_MODEL_AWS_SECRET_ACCESS_KEY, CB_MCP_EMBEDDING_MODEL_AWS_REGION

Amazon Titan embedding models (e.g. amazon.titan-embed-text-v2:0) — the provider sends Titan's inputText request shape, so other Bedrock embedding models such as Cohere Embed are not supported yet. Omit credentials to use the default AWS chain. Needs the extra: pip install couchbase-mcp-server[bedrock-embeddings]

"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

CB_CONNECTION_STRING

--connection-string

Connection string to the Couchbase cluster

Required

CB_USERNAME

--username

Username with access to required buckets for basic authentication

Required (or Client Certificate and Key needed for mTLS)

CB_PASSWORD

--password

Password for basic authentication

Required (or Client Certificate and Key needed for mTLS)

CB_CLIENT_CERT_PATH

--client-cert-path

Path to the client certificate file for mTLS authentication

Required if using mTLS (or Username and Password required)

CB_CLIENT_KEY_PATH

--client-key-path

Path to the client key file for mTLS authentication

Required if using mTLS (or Username and Password required)

CB_CA_CERT_PATH

--ca-cert-path

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

CB_MCP_READ_ONLY_MODE

--read-only-mode

Prevent all data modifications (KV, Query, scope/collection management, index management, and FTS index management). When enabled, write tools are not loaded.

true

CB_MCP_TRANSPORT

--transport

Transport mode: stdio, http

stdio

CB_MCP_HOST

--host

Host for the HTTP transport mode

127.0.0.1

CB_MCP_PORT

--port

Port for the HTTP transport mode

8000

CB_MCP_WORKERS

--workers

Number of server worker processes for the http transport. Values above 1 run in stateless HTTP mode (see Multiple Workers)

1

CB_MCP_STATELESS_HTTP

--stateless-http

Handle each HTTP request without per-session state. Only honored with http; cannot be combined with confirmation-required tools (see Multiple Workers)

true when workers > 1, otherwise false

CB_MCP_DISABLED_TOOLS

--disabled-tools

Tools to disable (see Disabling Tools)

None

CB_MCP_CONFIRMATION_REQUIRED_TOOLS

--confirmation-required-tools

Tools that require explicit user confirmation before execution via MCP elicitation (see Requiring confirmation)

None

CB_MCP_LOG_LEVEL

--log-level

Logging level for the MCP server: off, debug, info, warning, error (see Logging)

info

CB_MCP_LOG_SINKS

--log-sinks

Comma-separated log destinations: stderr, file, or both (see Logging)

stderr

CB_MCP_LOG_FILE

--log-file

Base path for per-level log files (only used when the file sink is enabled)

mcp_server.log

CB_MCP_LOG_ROTATION_MAX_SIZE_MB

--log-rotation-max-size-mb

Global maximum size in MB per log file before it rotates, inherited by every level unless overridden. 0 — or a value that cannot be used, such as a negative, nan or inf — is invalid and falls back to the default with a startup warning

1 (1 MB)

CB_MCP_LOG_MAX_BYTES

--log-max-bytes

Deprecated — use CB_MCP_LOG_ROTATION_MAX_SIZE_MB (MB). Global rotation size in bytes, still honored for backward compatibility; ignored when CB_MCP_LOG_ROTATION_MAX_SIZE_MB is also set

Unset

CB_MCP_LOG_ERROR_ROTATION_MAX_SIZE_MB

--log-error-rotation-max-size-mb

Rotation size in MB for the ERROR log file; overrides CB_MCP_LOG_ROTATION_MAX_SIZE_MB for ERROR

Inherits CB_MCP_LOG_ROTATION_MAX_SIZE_MB

CB_MCP_LOG_WARNING_ROTATION_MAX_SIZE_MB

--log-warning-rotation-max-size-mb

Rotation size in MB for the WARNING log file; overrides CB_MCP_LOG_ROTATION_MAX_SIZE_MB for WARNING

Inherits CB_MCP_LOG_ROTATION_MAX_SIZE_MB

CB_MCP_LOG_INFO_ROTATION_MAX_SIZE_MB

--log-info-rotation-max-size-mb

Rotation size in MB for the INFO log file; overrides CB_MCP_LOG_ROTATION_MAX_SIZE_MB for INFO

Inherits CB_MCP_LOG_ROTATION_MAX_SIZE_MB

CB_MCP_LOG_DEBUG_ROTATION_MAX_SIZE_MB

--log-debug-rotation-max-size-mb

Rotation size in MB for the DEBUG log file; overrides CB_MCP_LOG_ROTATION_MAX_SIZE_MB for DEBUG

Inherits CB_MCP_LOG_ROTATION_MAX_SIZE_MB

CB_MCP_LOG_RETENTION_BACKUP_COUNT

--log-retention-backup-count

Rotated backup files kept per-level log file (excluding the live file), applied to every level unless overridden. 0 keeps only the live file (see Logging)

1

CB_MCP_LOG_ERROR_RETENTION_BACKUP_COUNT

--log-error-retention-backup-count

Rotated backups kept for the ERROR log file; overrides the global count for ERROR

Inherits CB_MCP_LOG_RETENTION_BACKUP_COUNT

CB_MCP_LOG_WARNING_RETENTION_BACKUP_COUNT

--log-warning-retention-backup-count

Rotated backups kept for the WARNING log file; overrides the global count for WARNING

Inherits CB_MCP_LOG_RETENTION_BACKUP_COUNT

CB_MCP_LOG_INFO_RETENTION_BACKUP_COUNT

--log-info-retention-backup-count

Rotated backups kept for the INFO log file; overrides the global count for INFO

Inherits CB_MCP_LOG_RETENTION_BACKUP_COUNT

CB_MCP_LOG_DEBUG_RETENTION_BACKUP_COUNT

--log-debug-retention-backup-count

Rotated backups kept for the DEBUG log file; overrides the global count for DEBUG

Inherits CB_MCP_LOG_RETENTION_BACKUP_COUNT

CB_MCP_OAUTH_JWT_JWKS_URI

--oauth-jwks-uri

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

CB_MCP_OAUTH_JWT_ISSUER

--oauth-issuer

Expected JWT iss claim. Required to enable OAuth

None

CB_MCP_OAUTH_JWT_AUDIENCE

--oauth-audience

Expected JWT aud claim. Required to enable OAuth

None

CB_MCP_OAUTH_JWT_ALGORITHM

--oauth-algorithm

JWT signing algorithm: one of RS256/384/512, ES256/384/512, PS256/384/512

RS256

CB_MCP_OAUTH_MCP_BASE_URL

--oauth-mcp-base-url

Public base URL of this server. When set, publishes RFC 9728 Protected Resource Metadata so PRM-aware clients can discover the IdP

None

CB_MCP_OAUTH_SCOPE_READ_LABEL

--oauth-scope-read-label

Override the OAuth scope label treated as 'read' access (advertised in PRM and matched against the token's scope/scp claim). Use when your IdP can't emit the canonical form

couchbase-mcp:read

CB_MCP_OAUTH_SCOPE_WRITE_LABEL

--oauth-scope-write-label

Override the OAuth scope label treated as 'write' access; same semantics as the read label

couchbase-mcp:write

CB_MCP_AUDIT_LOG_ENABLED

--audit-log-enabled

Enable audit logging — a separate sink from the CB_MCP_LOG_* operational logs, with a stable schema and its own retention (see Auditing)

false

CB_MCP_AUDIT_LOG_SINKS

--audit-log-sinks

Comma-separated audit destinations: console, file, or both. console writes to stderr — never stdout, which carries the JSON-RPC protocol on stdio

console

CB_MCP_AUDIT_LOG_FILE_PATH

--audit-log-file-path

Path to the audit log file. Required when file is in the sinks; the hostname and process id are inserted before the extension (audit.log → audit.<host>.<pid>.log)

None

CB_MCP_AUDIT_LOG_ROTATION_MAX_SIZE_MB

--audit-log-rotation-max-size-mb

Maximum size in MB the live audit file may reach before it rotates. 0 turns size-based rotation off

10 (10 MB)

CB_MCP_AUDIT_LOG_ROTATION_INTERVAL

--audit-log-rotation-interval

Age the live audit file may reach before it rotates, as <value><unit> where the unit is d (24 hours) or w (7 days) — e.g. 1d, 30d, 8w. 0 turns interval-based rotation off

1d

CB_MCP_AUDIT_LOG_RETENTION_MAX_BACKUPS

--audit-log-retention-max-backups

Rotated backups retained per audit file, excluding the live file. Backups are gzipped. 0 keeps none. This bounds one file, not the directory — see Auditing

10

CB_MCP_AUDIT_LOG_TOOL_ARGS

--audit-log-tool-args

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

false

CB_MCP_AUDIT_LOG_DISABLED_EVENTS

--audit-log-disabled-events

Audit events to suppress: comma-separated numeric event ids (e.g. 61490,61492), or a file with one id per line. Only filterable events can be suppressed

None

CB_MCP_EMBEDDING_MODEL_PROVIDER

--embedding-model-provider

Embedding provider for run_vector_query / run_vector_search: one of capella, openai, cohere, voyage, bedrock. Unset disables both tools' embedding step until configured — see Embedding Provider Configuration

None

CB_MCP_EMBEDDING_MODEL

--embedding-model

Model name/ID for the configured embedding provider

None

CB_MCP_EMBEDDING_MODEL_API_KEY

--embedding-model-api-key

API key for the configured provider. Not used by bedrock (uses the AWS credential chain / CB_MCP_EMBEDDING_MODEL_AWS_* instead)

None

CB_MCP_EMBEDDING_MODEL_ENDPOINT

--embedding-model-endpoint

Base URL override (an OpenAI-compatible local server, or a Capella Model Service deployment's own URL — required when CB_MCP_EMBEDDING_MODEL_PROVIDER=capella)

None

CB_MCP_EMBEDDING_MODEL_AWS_ACCESS_KEY_ID

--embedding-model-aws-access-key-id

AWS access key ID, bedrock provider only. Omit to use the default AWS credential chain

None

CB_MCP_EMBEDDING_MODEL_AWS_SECRET_ACCESS_KEY

--embedding-model-aws-secret-access-key

AWS secret access key, bedrock provider only

None

CB_MCP_EMBEDDING_MODEL_AWS_REGION

--embedding-model-aws-region

AWS region, bedrock provider only. Falls back to the AWS SDK's own region resolution if unset

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.

IMPORTANT

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

CB_OPERATIONAL_INSIGHTS_CONNECTION_STRING

--connection-string

Endpoint URL (HTTP/HTTPS). Required

CB_OPERATIONAL_INSIGHTS_USERNAME

--username

Username

CB_OPERATIONAL_INSIGHTS_PASSWORD

--password

Password

CB_OPERATIONAL_INSIGHTS_CA_CERT_PATH

--ca-cert-path

Root certificate (PEM) for a self-signed/untrusted server certificate

CB_OPERATIONAL_INSIGHTS_CLIENT_CERT_PATH

--client-cert-path

Client certificate for mTLS — PEM (with a key) or a PKCS#12 bundle (.p12/.pfx, no key). Requires an https:// URL; overrides username/password

CB_OPERATIONAL_INSIGHTS_CLIENT_KEY_PATH

--client-key-path

Private key (PEM) for the client certificate. Leave unset for PKCS#12

CB_OPERATIONAL_INSIGHTS_CLIENT_CERT_PASSWORD

--client-cert-password

Password for an encrypted key or PKCS#12 bundle

CB_MCP_OPERATIONAL_INSIGHTS_QUERY_RESULT_MAX_SIZE

--operational-insights-query-result-max-size

Maximum query result size in bytes. Unset means no limit. When set, reading stops at the budget and the response reports truncated: true; a row that would overrun it is not returned. Values above 4 MiB (4194304) are clamped to 4 MiB, with a warning on stderr at startup

CB_MCP_OPERATIONAL_INSIGHTS_ASYNC_QUERY_RESULT_TIMEOUT

--operational-insights-async-query-result-timeout

Timeout in seconds for each async query request: starting the query, checking its status, fetching results, discarding and cancelling. For a fetch it covers the whole download, so a result that takes longer than this to read fails. Raise it for large results or slow links. Positive integer, default 30, maximum 600. Larger values are clamped to 600 with a warning; any other invalid value is logged as a warning and 30 is used

All common configuration applies, with these differences from the operational server:

  • The default port is 8001 and the default log file is mcp_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.

Server Status

Tool

Description

get_server_configuration_status

Same tool as on the operational server

Data Model & Schema Discovery

Tool

Description

operational_insights_get_databases_in_cluster

List databases

operational_insights_get_scopes_in_database

List scopes in a database

operational_insights_get_collections_in_scope

List collections (datasets) in a scope

operational_insights_get_schema_for_collection

Infer a collection's JSON schema by sampling

Query and Index

Tool

Description

operational_insights_list_indexes

List secondary indexes from System.Metadata.Index

operational_insights_explain_query

EXPLAIN a SQL++ statement without running it

operational_insights_run_query_sync

Run SQL++ and return rows, up to the result size limit; can export instead. Read-only mode is enforced server-side

operational_insights_run_query_async

Start a long-running query and return a query_handle without waiting for rows; also preferred for large exports. Read-only mode is enforced server-side

operational_insights_get_async_query_results

Poll an async query; returns rows (or the export destination) when ready

operational_insights_discard_async_query_results

Free a finished async query's results

operational_insights_cancel_async_query

Stop a still-running async query (allowed in read-only mode)

operational_insights_create_index ✏️

Create a secondary index via CREATE INDEX

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=false or a token with couchbase-mcp:write.

  • csv is not offered, because it needs an explicit output schema that can't be inferred from an arbitrary SELECT.

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

Follow these security principles:

  • Give the database user least privilege — RBAC is the authoritative boundary (see below).

  • Provide only the tools the agent needs, and disable the rest — every loaded tool is something the LLM can call. Use read-only mode and CB_MCP_DISABLED_TOOLS to keep the tool list to the minimum.

  • Require confirmation for sensitive tools that you keep — see Requiring confirmation.

The controls below form three layers, from broadest to narrowest. Use them together — but remember that none of them replaces RBAC.

IMPORTANT

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_recommendations

On 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=true or CB_MCP_WORKERS above 1). The server refuses to start with that combination. Behind a load balancer, confirmation needs sticky sessions — see Load balancers.

Transports

Transport

Use for

Endpoint

stdio (default)

One local client that launches the server as a subprocess

—

http

Several clients sharing one server; supports OAuth and health checks, and workers on the operational server

http://<host>:<port>/mcp

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=http

Then 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 http transport 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=true on 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.

Load balancers

You can run several server instances behind a load balancer. Each instance keeps its MCP sessions in its own memory, so the load balancer setting decides what works:

Load balancer

Server setting

Confirmation-required tools

Sticky sessions, routed on the Mcp-Session-Id request header

One worker, stateful (the default)

Supported

No sticky sessions

--stateless-http=true

Not supported — the server refuses to start if they are configured

  • Without sticky sessions, a stateful instance rejects every request whose session was created on a different instance. Use stateless mode in that case.

  • Route on the Mcp-Session-Id header, not on cookies. Many MCP clients do not keep cookies.

  • If an instance restarts or fails over, its sessions and any pending confirmation prompts are lost. The client must start a new session.

  • Operational Insights async queries keep their query_handle in the memory of the instance that started the query, also in stateless mode. Polling, discarding or cancelling the query on a different instance returns Unknown query_handle. Use these tools with a single instance, or with sticky sessions so that all calls reach the instance that started the query. Stateless mode sends no Mcp-Session-Id, so it needs another affinity key, such as the client IP address.

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_ISSUER and CB_MCP_OAUTH_JWT_AUDIENCE are set; setting only some fails at startup.

  • CB_MCP_OAUTH_MCP_BASE_URL additionally publishes RFC 9728 Protected Resource Metadata so clients can discover the authorization server.

  • Access is gated by two scopes in the token's scope/scp claim: couchbase-mcp:read (read tools) and couchbase-mcp:write (write tools). Full access needs both. Rename them with CB_MCP_OAUTH_SCOPE_READ_LABEL / CB_MCP_OAUTH_SCOPE_WRITE_LABEL if 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 the operational server and the Operational Insights server 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) or debug.

  • CB_MCP_LOG_SINKS — stderr, file, or both. With file, one rotating file per level is written next to CB_MCP_LOG_FILE (mcp_server.info.log, mcp_server.error.log, …).

  • Rotation and retention — CB_MCP_LOG_ROTATION_MAX_SIZE_MB (default 1 MB) and CB_MCP_LOG_RETENTION_BACKUP_COUNT (default 1) apply to every level; override per level with CB_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_BYTES is deprecated.

  • Config snapshot — with the file sink, a JSON record of the environment and redacted server config is written to mcp_server_config.log.json on every start, for support.

# Debug logging to stderr and rotating per-level files
uvx couchbase-mcp-server operational --log-level=debug --log-sinks=stderr,file

Your MCP client usually also captures the server's stderr — see Client Setup for where. Details: logging documentation for the operational server and the Operational Insights server.

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=90

Records 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_userid is the caller: oauth (the token subject), local (the OS user, on stdio) or anonymous (HTTP without OAuth, which warns at startup).

  • Correlation — cid groups every record from one request, and is sent as the SQL++ client_context_id, so it joins exactly with Couchbase Server's clientContextId. 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). query and search are the exceptions: each is recorded as a single event rather than a read/write pair, because the distinction could not be made reliably for statement-driven and search surfaces. Vector operations sit inside those two categories. The full catalogue ships as descriptor.json in the package. The operational server uses block 0xF000 (61440), Operational Insights 0x10000 (65536), and both share 0xE000 (57344) for core events.

  • Filtering — CB_MCP_AUDIT_LOG_DISABLED_EVENTS suppresses read events by numeric id (e.g. 61490,61492). Write and security events cannot be disabled, and neither can the single-event categories query (61507, or 65603 on Operational Insights) and search (61510): one event covers each category's writes as well as its reads, so switching it off would lose a mutation record.

  • Rotation — by size (CB_MCP_AUDIT_LOG_ROTATION_MAX_SIZE_MB, default 10) and age (CB_MCP_AUDIT_LOG_ROTATION_INTERVAL, default 1d), whichever comes first; 0 switches either off. Rotated files are timestamped and gzipped; the live file stays plain text for tail -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 old audit.*.log* files.

  • Fail-open — if the file can't be written, the server keeps serving and counts dropped records; get_server_configuration_status reports written / 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.

  1. Open the configuration file (see the MCP quickstart guide):

    • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

    • Windows: %APPDATA%\Claude\claude_desktop_config.json

  2. Add the server under mcpServers and restart Claude Desktop.

Logs: macOS ~/Library/Logs/Claude, Windows %APPDATA%\Claude\Logs. See the MCP troubleshooting guide.

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

  2. Add the configuration under mcpServers and save.

  3. Refresh the MCP servers list to check that couchbase is enabled.

Logs: in the bottom panel, open Output and select Cursor MCP.

  1. Open Command Palette > Windsurf MCP Configuration Panel, or Windsurf Settings > Advanced > Cascade > Model Context Protocol (MCP) Servers (see Windsurf's MCP docs).

  2. Click Add Server > Add custom server, paste the configuration and save.

  3. Refresh the server list to check that couchbase is 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.

  1. Install the AI Assistant or Junie plugin.

  2. Go to Settings > Tools > AI Assistant (or Junie) > MCP Server, click +, add the configuration and click Apply.

  3. 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 operational
  • If Couchbase runs on your host machine, use couchbase://host.docker.internal as the connection string (see Docker networking). Use --network=<your_network> to join another container's network.

  • Append operational-insights instead of operational to run the Operational Insights server (port 8001).

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:latest

Troubleshooting

For full guides, see the troubleshooting documentation for the operational server and the Operational Insights server, and the security guidelines for the operational server and the Operational Insights server. Quick checks:

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

  • When running from source, check the repository path in the configuration, and run uv sync after pulling updates.

  • Call get_server_configuration_status to 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 or Streamable HTTP? STDIO for a single local client. Streamable HTTP to share one server between clients, with OAuth. 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.sh

Integration 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 -v

Usage 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

36 tools
discover_tool_input_valuesA
Read-only

Find the exact input values a specific tool requires, from reference data bundled with this server.

Call this BEFORE calling a tool that needs an exact identifier you do not already know. Do not guess the identifier and do not browse the Couchbase documentation website for it -- a guessed value comes back from the target tool as an error with no data. The reference data ships inside this server, so this works offline and while the cluster is unreachable, which is exactly when you are most likely to be looking up a metric name.

Registered today:

  • tool_name="get_cluster_metrics" -> every Couchbase Server metric name, with its type (counter/gauge/histogram), unit, the server version it first appeared in, and a one-line description. Feed a result's "name" straight into get_cluster_metrics.

tool_name is the only required argument; everything else is optional.

Two ways to call it:

  1. Browse -- pass tool_name alone. Every registered dataset is currently treated as too large to list in full, so this returns "record_count", a small "sample_records" preview, the "chapters" block (the small set of fields you can filter on, with every legal value and a record count each), and a "next_step" pointing you at search instead of a partial list.

  2. Search -- pass tool_name and search_keywords. Returns records ranked by fuzzy relevance, best first. Matching is fuzzy over identifiers and descriptions, so partial words and near-misses still hit.

Every response includes the chapters block, so you never need a separate browse call before narrowing.

NameRequiredDescriptionDefault
min_scoreNoRelevance floor, 0-100. Defaults to 0, meaning nothing is filtered out and you always get the best max_results matches ranked by score, however weak. Check each result's "score" to judge quality -- low scores across the board mean your keywords missed, so change them rather than reading further down the list. Raise this only to suppress weak matches you have already seen.
tool_nameYesREQUIRED. The tool you are about to call, e.g. "get_cluster_metrics". An unrecognised value returns the list of registered names, so you do not need to guess twice.
max_resultsNoHow many records to return. NOT capped by this server -- you are responsible for choosing a value whose response fits your client's output-size limit. If results are too broad, add keywords or a chapter filter rather than raising this.
chapter_filtersNoOptional narrowing, as {chapter_field: value}, e.g. {"category": "Query Service Metrics"}. Only fields listed in the response's "chapters" are accepted (a dataset without chapters accepts none), and multiple filters are combined with AND. Strongly recommended when you know the service: identifiers use short prefixes (kv_, n1ql_, fts_) that keyword search cannot connect to service names, so an unfiltered search for "query service memory" can return Index Service metrics instead.
search_keywordsNoA LIST of words describing what you are looking for, e.g. ["disk", "write", "queue"] or ["index", "resident", "ratio"]. Keep each concept a separate list item. Omit to browse instead of searching.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only declare readOnlyHint=true, so the description carries the rest, and it does: offline operation while the cluster is unreachable, an unrecognized tool_name returning the registered-name list instead of failing, max_results being uncapped by the server, and score-based ranking with guidance on interpreting weak scores. It is consistent with the read-only annotation and adds substantial operational context.

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

Conciseness4/5

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

The critical instruction (call before the target tool, don't guess) is front-loaded, and the two-call-mode breakdown is easy to scan. It runs long for a lookup helper and repeats the chapters-points-to-search idea in both the browse section and the closing sentence, which is mild redundancy rather than harm.

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

Completeness5/5

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

An output schema exists, so return values need no explanation, yet the description still summarizes the response shape (record_count, sample_records, chapters, next_step) precisely enough to tell an agent not to expect a full list from a browse call. For a five-parameter read-only lookup tool, nothing an agent needs in order to call it correctly is missing.

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

Parameters4/5

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

Schema coverage is 100% and the schema descriptions are already detailed, so the baseline is 3; the description earns an increment by explaining the mutually exclusive browse-vs-search call patterns and noting that tool_name is the only required argument. It stops short of adding anything new about min_score or max_results beyond what the schema already says.

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

Purpose5/5

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

The description uses a specific verb+resource formulation: find exact input values for a named tool from reference data bundled with the server. It also names the downstream consumer ("get_cluster_metrics") and the concrete payload (metric name, type, unit, version, description), so an agent can tell immediately this is a lookup tool, not a cluster query tool like its siblings.

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

Usage Guidelines5/5

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

It states the trigger explicitly ("Call this BEFORE calling a tool that needs an exact identifier you do not already know"), names two anti-patterns to avoid (guessing, browsing the Couchbase docs site), and explains the cost of getting it wrong (the target tool errors with no data). It also routes between its own two modes: tool_name alone to browse, tool_name plus search_keywords to search.

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

explain_sql_plus_plus_queryA
Read-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.

NameRequiredDescriptionDefault
queryYes
scope_nameYes
bucket_nameYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_active_queriesA
Read-only

Get all queries executing right now, across every query-service node.

Use this to find a runaway or stuck statement: elapsed time, the statement text, the client, and current state. Pair with get_cluster_query_vitals to confirm the engine is actually under load from what this returns, and pass a result's "requestId" to delete_active_query to cancel it.

Calls GET /admin/active_requests. Self-managed Couchbase Server 7.6+ only (Capella is rejected without a REST call); needs at minimum the Read-Only Admin (ro_admin) role — verify against your cluster's RBAC before relying on this in production.

/admin/active_requests answers per node — a request only shows up when the node running it is asked — so every query-service node is queried and the lists are merged into one. Each entry already carries its own "node" field, so there is no need to tag entries by which endpoint answered.

Returns {"status": "success", "active_requests": [...merged...], "unreachable_nodes": [{"node", "error"}]} (the last key omitted when every node answered), or {"status": "error", "error": ...} if no query node could be reached at all, or the cluster is Capella.

NameRequiredDescriptionDefault
timeoutNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

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

Beyond readOnlyHint=true, it discloses the per-node fan-out and merge behavior, the unreachable_nodes partial-failure shape, that Capella is rejected without a REST call, and the ro_admin RBAC requirement — exactly the operational context an agent needs.

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

Conciseness4/5

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

Front-loaded with the purpose and actions, then caveats, then return shape; well organized, though the detailed return-value enumeration partly duplicates the existing output schema.

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

Completeness5/5

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

Given an output schema exists, the description still adds the unreachable_nodes semantics and the all-nodes-failed error case, and it covers environment constraints (7.6+, self-managed only) and permissions — nothing material is missing.

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

Parameters3/5

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

There is a single 'timeout' parameter with 0% schema description coverage, and the description never mentions it, so its units, default behavior, and effect on multi-node fan-out are left unexplained; the parameter is trivial enough that this is a moderate gap rather than a critical one.

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

Purpose5/5

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

States a specific verb and resource ('get all queries executing right now') plus scope ('across every query-service node'), and the returned fields (elapsed time, statement text, client, state) distinguish it from siblings like get_longest_running_queries and get_cluster_query_vitals.

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

Usage Guidelines5/5

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

Explicitly says when to use it ('find a runaway or stuck statement'), what to pair it with ('get_cluster_query_vitals to confirm the engine is actually under load'), and the follow-up action (pass requestId to delete_active_query).

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

get_bucket_configA
Read-only

Get a bucket's configuration and live state — or every bucket's, if bucket_name is omitted.

Answers "what is this bucket configured as, and how full is it right now?" — RAM quota, replica count, eviction policy, durability level, storage backend, conflict- resolution type, auto-compaction settings, and basic stats (item count, memory used, ops/sec, disk used). Use this to explain a bucket-level symptom that get_cluster_metrics or get_index_stats pointed at, or as a pre-flight safety check before advising a compaction/quota/durability change — this tool only ever reads; create/edit/flush/delete stay CAO-owned. get_buckets_in_cluster lists bucket names via the SDK but exposes none of this; use this tool once a specific bucket needs explaining.

bucket_name must be omitted (not passed as "") to get every bucket — an empty string is rejected rather than silently treated the same as omitting it, since a caller that meant to name a bucket should not get back every bucket's configuration instead.

Calls GET /pools/default/buckets/<bucket_name> (one bucket) or GET /pools/default/buckets (every bucket, when bucket_name is omitted). Self-managed Couchbase Server 7.6+ only (Capella is rejected without a REST call); needs the Read-Only Admin (ro_admin) role.

Reading the result — returned exactly as the endpoint sends it, nothing stripped or renamed, so every field keeps its REST API name (camelCase):

  • "autoCompactionSettings" is the bare value false, not an object, when the bucket has no per-bucket override. Read false as "uses the cluster-wide compaction settings", not "compaction disabled" — they are not the same thing, and this field alone cannot tell you which.

  • "durabilityMinLevel" and "storageBackend" are absent on server versions that predate those fields; absence means "not reported", not "none"/"couchstore".

  • "vBucketServerMap" and "nodes" are the bulk of the payload (a full server list and a per-vBucket map that grows with vbucket/replica/node count) and carry no RCA-relevant signal, but are not stripped: this tool never reshapes what the endpoint returns.

  • A node that was never joined to a cluster (or whose cluster-init failed) answers this endpoint with 200 and [] rather than an error. This is unlikely to matter for a connection_string naming hosts an operator verified are cluster members, but is a real risk when it names a DNS/SRV record backed by a rotating node set (e.g. a Kubernetes headless service), where a connection can land on a freshly provisioned, not-yet-joined node: an empty list there is not proof the cluster itself has no buckets.

Returns the endpoint's response unchanged — a dict for one bucket, a list for all buckets. Raises on failure, including a 404 for an unknown bucket name.

NameRequiredDescriptionDefault
timeoutNo
bucket_nameNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

Annotations only declare readOnlyHint=true, and the description goes far beyond it: REST endpoints used, 7.6+ self-managed-only constraint (Capella rejected without a call), ro_admin role requirement, raises-on-failure including 404 for unknown buckets, and the trap where a not-yet-joined node answers 200 with [] — turning a misleading empty result into a documented hazard.

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

Conciseness3/5

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

Well front-loaded with a one-line summary followed by usage, parameter semantics, endpoint/auth notes, and a 'Reading the result' section. However, the 'returns the endpoint's response unchanged / nothing stripped or renamed / never reshapes what the endpoint returns' idea is restated three times, and the not-yet-joined-node paragraph is long for an edge case, so several sentences could be trimmed.

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

Completeness5/5

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

Covers everything an agent needs to call this correctly and interpret it: auth and version prerequisites, endpoint shapes, the false-vs-cluster-inherited autoCompactionSettings ambiguity, absent-field semantics for older servers, and payload-skew caveats. An output schema exists, yet the field-level interpretation notes add genuine value rather than duplicating it.

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

Parameters4/5

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

Schema coverage is 0%, so the description must carry parameter meaning — and it does for bucket_name: omitting it returns all buckets, passing "" is explicitly rejected rather than silently coalesced, and the return type differs (dict vs list) by that choice. The second parameter, timeout, is never mentioned, which is the only remaining gap.

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

Purpose5/5

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

States a specific verb+resource (get a bucket's configuration and live state, or all buckets when bucket_name is omitted) and enumerates the exact fields covered (RAM quota, replica count, eviction policy, durability, storage backend, stats). It explicitly contrasts with get_buckets_in_cluster ('lists bucket names via the SDK but exposes none of this'), so an agent can separate the two without opening a schema.

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

Usage Guidelines5/5

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

Gives concrete when-to-use triggers ('explain a bucket-level symptom that get_cluster_metrics or get_index_stats pointed at') and a pre-flight scenario before advising compaction/quota/durability changes. It also names the exclusion boundary ('create/edit/flush/delete stay CAO-owned'), leaving nothing to inference.

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

get_buckets_in_clusterA
Read-only

Get the names of all the accessible buckets in the cluster.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_client_connectivity_reportA
Read-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

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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

Annotations only declare readOnlyHint=true; the description adds substantially more — no network I/O is performed, the data is only as fresh as the last real contact with each node, no proactive detection of newly-down services, and no additional RBAC role is required beyond the initial cluster connection. The staleness caveat is exactly the kind of behavior an agent could not infer from structured fields.

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

Conciseness4/5

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

Front-loaded with the core purpose and the alternative routing, with the caveats following in decreasing priority. Minor redundancy in restating the no-I/O point twice (once in the middle, once in the RBAC sentence), but nearly every sentence carries distinct information.

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

Completeness5/5

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

For a zero-parameter read-only diagnostic tool, the description covers purpose, cost, freshness limits, permission implications, and the per-endpoint fields returned. An output schema exists, and the brief Returns section is consistent with it rather than a substitute for it.

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

Parameters5/5

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

Zero parameters, so the baseline is 4, and the description goes further by explaining why there are none: filtering to specific services is impossible because no I/O occurs. That preempts an agent trying to pass a service filter argument.

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

Purpose5/5

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

States a specific verb and resource: check whether the client's connections were already broken and for how long. It immediately distinguishes itself from the named sibling get_cluster_health_and_services by contrasting cached state with live pings, so an agent can tell them apart without opening either schema.

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

Usage Guidelines5/5

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

Explicitly says when to use this tool (cheap, frequent, cached-state checks), when not to ("Use get_cluster_health_and_services instead when you need a live, right-now reachability check"), and notes the capability gap that no filtering is possible. Both directions of the routing decision are covered.

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_servicesA
Read-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

NameRequiredDescriptionDefault
bucket_nameNo
service_typesNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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

The description opens with a specific verb and resource: '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.

Usage Guidelines4/5

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_cluster_health_snapshotA
Read-only

Get per-node service topology, membership, orchestrator and health in one call.

Use this to turn a symptom into a specific node and service: which node is in "warning", what it runs, whether it is still in the cluster, and whether it is the orchestrator — i.e. whether acting on it is disruptive. Also answers "did a topology change leave us in a good state?" after a node replacement or failover.

Self-managed Couchbase Server 7.6+ only (Capella is rejected without a REST call); needs the Read-Only Admin (ro_admin) role.

Reading the result:

  • cluster.unhealthy_nodes / inactive_nodes are the fast path: a node is in unhealthy_nodes when status is not "healthy", and in inactive_nodes when it is no longer an "active" member (e.g. "inactiveFailed" — already failed over, which is a different situation from an active node merely reporting "warning").

  • safe_to_act_on is false only for the orchestrator, where a restart or failover is disruptive in a way it is not elsewhere. When cluster.orchestrator_known is false no node could be flagged, so read safe_to_act_on as "unknown", not "yes" — the cluster reports no orchestrator while one is being elected.

  • reachable_address is the address to probe next, chosen between the node's internal and externally advertised addresses based on which one this server reached the cluster on. Probing the other form may fail for network reasons that look like a node outage; alternateAddresses keeps it as a fallback.

  • cluster.counters holds lifetime rebalance tallies: rebalance_start above rebalance_success means a rebalance began and did not finish — the signature of an interrupted topology change. Pair with get_cluster_tasks for what is running now.

  • recoveryType other than "none" means a recovery is in progress: not healthy yet, rather than broken.

Returns {"cluster": {...}, "nodes": [...]}; raises on failure.

NameRequiredDescriptionDefault
timeoutNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior5/5

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

Annotations only say readOnlyHint=true, and the description carries substantial extra context: version and deployment-type gating, Capella being rejected without issuing a REST call, the required ro_admin role, and that the call raises on failure. It also pre-empts misinterpretation of results, e.g. orchestrator_known=false means safe_to_act_on is 'unknown' rather than 'yes', and recoveryType other than 'none' means in-progress rather than broken.

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

Conciseness4/5

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

Well structured and front-loaded: purpose first, then the diagnostic questions, prerequisites, and a clearly delimited 'Reading the result' block. The result-reading section is long for a one-parameter read tool and partly re-states what the output schema already encodes structurally, but most of it adds interpretation (unhealthy vs inactive semantics, address selection) rather than restating field names.

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

Completeness5/5

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

For a diagnostic tool whose value is entirely in interpreting the returned payload, the description supplies prerequisites, failure behavior, and per-field semantics including the tricky orchestrator-unknown case and the rebalance_start vs rebalance_success counter signature. An agent could call this and correctly read the output without additional context.

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

Parameters3/5

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

There is one parameter (timeout, default 30) with zero schema description coverage, and the description says nothing about it at all — no unit, no guidance on when to raise it, no note on what happens when it expires. The parameter is largely self-explanatory, which keeps this at a minimum-viable 3, but the description makes no contribution here.

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

Purpose4/5

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

The description opens with a specific verb and resource set: per-node service topology, membership, orchestrator and health, retrieved in one call. It goes further than most by naming the diagnostic question it answers (symptom to node/service, post-failover topology validation). The one gap is that it never distinguishes itself from the near-duplicate sibling get_cluster_health_and_services, so an agent must guess between two similarly named health tools.

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

Usage Guidelines4/5

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

Clear usage contexts are given (turning a symptom into a specific node, checking whether a topology change left a good state), plus an explicit hand-off: pair with get_cluster_tasks for what is running now. Prerequisites and hard exclusions are stated (self-managed Couchbase 7.6+ only, Capella rejected without a REST call, ro_admin role required). It misses only the direct comparison against the sibling get_cluster_health_and_services.

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

get_cluster_metricsA
Read-only

Get one or more cluster statistics over a historic time window in a single call.

Use this to quantify a suspected problem (e.g. after get_cluster_health_and_services or get_client_connectivity_report) — is a metric spiking, climbing, or stable over time?

Self-managed Couchbase Server 7.6+ only — rejects Capella connections without a REST call. Calls POST /pools/default/stats/range.

metrics is passed through as the request body: a list of specs, each with a required "metric" (list of {"label", "value"} pairs, e.g. [{"label": "name", "value": "kv_ep_diskqueue_fill"}]), an optional "nodes" ("host:port" targets; omit it to cover every node, which is usually what you want), and optional "applyFunctions", "nodesAggregation", "start"/"end" (negative seconds relative to now; default -60/now), "step" (seconds, default 10), "alignTimestamps".

To find metric names, call discover_tool_input_values(tool_name="get_cluster_metrics") — it lists or searches the full Couchbase metrics reference bundled with this server, offline. Don't guess a metric name: an unknown name comes back as a per-spec error with no data.

Not bounded: any number of specs, window, step, or node count is passed straight through to the REST call, so a broad request (long window, fine step, many nodes/specs) can return a large response.

Returns {"status": "success", "data": [...]} (one entry per spec, each with "data" and any per-spec "errors") or {"status": "error", "error": "..."}.

NameRequiredDescriptionDefault
metricsYes
timeoutNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior4/5

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

Beyond readOnlyHint=true, it discloses the underlying REST endpoint (POST /pools/default/stats/range), the Capella rejection behavior and extra REST call cost, the per-spec error behavior for unknown metric names, and that requests are unbounded so broad queries can return large payloads. That is substantive operational context the annotations cannot convey; only the timeout parameter's runtime effect is left unstated.

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

Conciseness4/5

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

Front-loaded with purpose, then applicability caveat, then parameter contract, then metric-name discovery, then response shape — a logical order with no filler sentences. It runs long and the closing 'Returns {...}' block partially duplicates the existing output schema, a small redundancy.

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

Completeness5/5

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

For a read-only, single-endpoint metrics query with an opaque schema, the description supplies applicability limits, parameter defaults, error semantics, discovery path for metric names, and response envelope. Little an agent needs to invoke it correctly is missing.

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

Parameters5/5

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

Schema description coverage is 0% and the metrics schema is an opaque array of free-form objects, yet the description fully unpacks the request-body shape: required 'metric' as label/value pairs with a concrete example, optional nodes targets with the 'omit to cover every node' default, applyFunctions/nodesAggregation/alignTimestamps, start/end defaults of -60/now, and step default of 10. That is exactly the compensation needed for a fully undocumented schema.

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

Purpose5/5

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

Opens with a specific verb and resource plus scope: 'Get one or more cluster statistics over a historic time window in a single call.' It also distinguishes itself from the diagnostic siblings by positioning itself as the quantification step after get_cluster_health_and_services or get_client_connectivity_report, so an agent can pick it out of a 30+ tool list.

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

Usage Guidelines5/5

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

Explicit when-to-use with named upstream tools ('to quantify a suspected problem ... is a metric spiking, climbing, or stable'). It also states a hard applicability boundary (self-managed Couchbase Server 7.6+ only, rejects Capella) and routes to discover_tool_input_values for metric names instead of guessing.

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

get_cluster_query_vitalsA
Read-only

Get query-engine health (vitals) from every query-service node.

Distinguishes "the workload is heavy" from "the query engine itself is stressed" — get_cluster_metrics covers node hardware; this covers the N1QL service layer specifically: request rate, active/queued request counts, memory, GC, service uptime. Use it after get_cluster_metrics/ get_cluster_health_snapshot show healthy infra but queries are still slow.

Calls GET /admin/vitals. Self-managed Couchbase Server 7.6+ only (Capella is rejected without a REST call); needs at minimum the Read-Only Admin (ro_admin) role — verify against your cluster's RBAC before relying on this in production, since the N1QL Admin API's exact privilege requirements are not fully documented.

/admin/vitals answers per node, not cluster-wide — each query node only describes itself — so every query-service node is queried and the results are keyed by node ("host:port").

Returns {"status": "success", "vitals": {"host:port": {...}, ...}, "unreachable_nodes": [{"node", "error"}]} (the last key omitted when every node answered), or {"status": "error", "error": ...} if no query node could be reached at all, or the cluster is Capella.

NameRequiredDescriptionDefault
timeoutNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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

Beyond readOnlyHint=true, the description discloses the endpoint called (GET /admin/vitals), the ro_admin RBAC requirement with a candid caveat that privilege requirements are undocumented, the Capella rejection path, and that results are per-node rather than cluster-wide. It also explains partial-failure semantics (unreachable_nodes omitted when all nodes answer) and the all-fail error case. Slight deduction only because failure behavior for a mid-call timeout is not spelled out.

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

Conciseness4/5

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

Front-loads purpose, then differentiation, usage trigger, preconditions, per-node behavior, and return shape — a logical progression with no filler paragraphs. Some sentences (the RBAC hedging parenthetical) are longer than needed, and the return-shape example partially duplicates the output schema.

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

Completeness5/5

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

For a fan-out diagnostic tool it covers everything an agent needs: what it measures, when to call it, environment and role limits, per-node keying by host:port, and both partial and total failure outcomes. Even with an output schema present, the inline return description adds useful shape context.

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

Parameters2/5

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

Schema description coverage is 0% and the single parameter (timeout, default 30) is never mentioned in the description. It is unclear whether the timeout is in seconds, applies per node or to the whole fan-out, and whether it is per-request or total. The description therefore does not compensate for the schema gap, though the parameter is at least intuitively named.

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

Purpose5/5

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

States a specific verb and resource: fetch query-engine vitals from every query-service node, covering request rate, active/queued counts, memory, GC and uptime. It explicitly separates itself from get_cluster_metrics (node hardware) and get_cluster_health_snapshot, so an agent can route without opening other schemas.

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

Usage Guidelines5/5

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

Gives an explicit trigger condition: use it after get_cluster_metrics/get_cluster_health_snapshot show healthy infra but queries are still slow. It also states hard prerequisites (self-managed Couchbase Server 7.6+, Capella rejected) and the implied exclusion of hardware-level troubleshooting.

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

get_cluster_system_eventsA
Read-only

Get the cluster's system event log — what changed on the cluster, and when.

This is the RCA timeline: once a symptom is confirmed, it finds the config change, failover, rebalance or service restart that preceded it. Window it to the symptom's onset with since_time, then cross-check that timestamp against get_cluster_metrics.

Self-managed Couchbase Server 7.6+ only (Capella is rejected without a REST call); needs the Full Admin or Cluster Admin role. Calls GET /events.

Ordering — easy to misread:

  • Events are ALWAYS oldest-first, but which ones the server picks depends on since_time. Without it, the server takes the limit MOST RECENT events, so the last element is the newest thing on the cluster. With it, it takes the limit EARLIEST events at or after that time, so the last element is NOT the newest — more may follow it.

  • Do not re-sort or re-slice to get "the latest N": slicing keeps the oldest. Lower limit and let the server choose.

  • To page forward, pass summary.next_since_time as the next since_time. It is inclusive, so the boundary event repeats — dedupe on uuid. When it is null on a truncated result, check summary.paging_blocked: every event in the batch shares one timestamp, so sinceTime cannot move past them and a higher limit is the only way to see the rest.

A cluster's log is overwhelmingly "info", so expect routine entries in the window; move the window rather than raising limit.

Reading the result:

  • summary.by_severity / by_component say what the window holds at a glance, so a lone "error" among routine entries is visible without reading every event.

  • summary.possibly_truncated means the server filled the limit, so more events probably exist outside the window. Absence of a later event is not evidence.

  • The log is a ring buffer (10,000 entries by default), so an empty result for an old since_time can mean the events aged out, not that nothing happened.

Returns {"summary": {...}, "events": [...]}; raises on failure.

NameRequiredDescriptionDefault
limitNo
timeoutNo
since_timeNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only supply readOnlyHint, but the description adds substantial behavior: version/platform gating (7.6+ self-managed, Capella rejected without a REST call), required roles (Full Admin or Cluster Admin), the underlying GET /events call, ring-buffer size (10,000 default) and the consequence that empty results may mean aged-out events, and that failures raise. This is far beyond what the annotation conveys.

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

Conciseness4/5

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

Front-loaded with purpose, then platform/auth gate, then a clearly labeled ordering block and a labeled result-reading block. Each bullet carries a distinct operational fact, though the length is near the upper bound and a few clauses (e.g. naming summary.by_severity and by_component) restate fields the output schema already declares.

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

Completeness5/5

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

The tool is genuinely tricky (non-obvious ordering inverted by since_time, truncation subtleties, ring-buffer aging), and the description covers every trap an agent would fall into. An output schema exists, yet the description still explains the paging-relevant summary fields that the schema alone would not make actionable.

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

Parameters4/5

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

Schema coverage is 0%, so the description must carry the load, and it does for two of three parameters: since_time is explained in depth (inclusive boundary, dedupe on uuid, next_since_time paging, paging_blocked escape hatch) and limit is explained precisely (server picks most-recent vs earliest, raising it is the only recourse on a single-timestamp batch). timeout receives no mention at all, which is the only gap.

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

Purpose5/5

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

States a specific verb and resource ("Get the cluster's system event log — what changed on the cluster, and when") and immediately frames the role it plays: the RCA timeline. It is clearly differentiated from get_cluster_metrics (cross-check target) and from config-listing siblings like get_bucket_config.

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

Usage Guidelines5/5

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

Explicitly says when to use it ("once a symptom is confirmed"), how to window it ("Window it to the symptom's onset with since_time"), what to do next ("cross-check that timestamp against get_cluster_metrics"), and what not to do ("move the window rather than raising limit", "Do not re-sort or re-slice"). Alternatives are named rather than implied.

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

get_cluster_tasksA
Read-only

Get the cluster tasks running right now — rebalance, compaction, XDCR, index build.

Answers "what is this cluster doing?" — where stuck rebalances, hung index builds and lagging XDCR surface. One call is a single sample, so pair it with get_cluster_metrics to tell "slow but progressing" from "flatlined".

Calls GET /pools/default/tasks. Self-managed Couchbase Server 7.6+ only (Capella is rejected without a REST call); needs the Read-Only Admin (ro_admin) role.

Returns the endpoint's array unchanged, or [] if no tasks are reported. Only "type" and "status" are common to every entry; the rest are per type — rebalance: progress, perNode, detailedProgress, stageInfo, subtype; bucket_compaction: bucket, progress, changesDone, totalChanges; xdcr: changesLeft, docsChecked, docsWritten, source, target; global_indexes/indexer: bucket, index, progress, id; loadingSampleBucket: task_id, bucket, bucket_uuid.

Reading the result:

  • An idle cluster still reports a rebalance entry with status "notRunning", so check each task's "status" rather than counting entries.

  • "statusIsStale": true means the cluster cannot vouch for that status — read it as "unknown", not "stuck". Flatlined progress and a status that stopped updating look identical here but mean different things.

  • "progress" means different things per type, so do not compare it across tasks.

  • Poll no faster than "recommendedRefreshPeriod" (seconds), the server's own hint.

  • "cancelURI"/"lastReportURI" are informational UI links; this tool only ever GETs and never invokes them.

NameRequiredDescriptionDefault
timeoutNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

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

Goes far beyond the readOnlyHint annotation: names the underlying endpoint, the platform and role requirements, the unchanged-pass-through return behavior, and the empty-array case. The per-type field map and the interpretation notes (idle clusters still emit a 'notRunning' rebalance entry, 'statusIsStale' means unknown, progress is not comparable across types, poll no faster than recommendedRefreshPeriod, cancelURI is never invoked) are exactly the behavioral context an agent cannot infer from annotations or schema.

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

Conciseness4/5

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

Front-loaded with the one-line purpose, then the usage pairing, then endpoint/preconditions, then a bulleted reading guide — well structured and scannable. It is on the long side, and the per-type field enumeration partially duplicates the available output schema, but each bullet is actionable rather than filler.

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

Completeness5/5

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

For a diagnostic single-sample read tool, everything an agent needs is present: scope, preconditions, sibling relationship, sampling/polling guidance, and stale-vs-stuck interpretation traps. The presence of an output schema makes the return-value detail optional, yet it is included and correctly hedged as per-type.

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

Parameters3/5

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

The single parameter is an optional 'timeout' with 0% schema description coverage, and the description never mentions it, so its units and effect remain undefined. The gap is mitigated somewhat because the schema supplies a default of 30 and a timeout is a conventional control, but the description does not compensate for the coverage hole.

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

Purpose5/5

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

States a specific verb and resource ('Get the cluster tasks running right now') and enumerates the task families it covers (rebalance, compaction, XDCR, index build). It also frames the question the tool answers ('what is this cluster doing?'), which separates it cleanly from the sibling get_cluster_metrics.

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

Usage Guidelines5/5

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

Explicitly says to pair a single call with get_cluster_metrics to distinguish 'slow but progressing' from 'flatlined', giving both the when-to-use and the named alternative. It also states prerequisites and exclusions: self-managed Couchbase Server 7.6+ only, Capella rejected without a REST call, and the ro_admin role required.

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

get_collections_in_scopeA
Read-only

Get the names of all collections in the given scope and bucket.

NameRequiredDescriptionDefault
scope_nameYes
bucket_nameYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters2/5

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

Schema description coverage is 0%, so the description 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.

Purpose5/5

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.

Usage Guidelines3/5

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_idA
Read-only

Get a document by its ID from the specified scope and collection. If the document is not found, it will raise an exception.

NameRequiredDescriptionDefault
scope_nameYes
bucket_nameYes
document_idYes
collection_nameYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_recommendationsB
Read-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

Raises an error carrying the advisor's message if the advisor cannot analyse the statement (for example, a SQL++ syntax error).

NameRequiredDescriptionDefault
queryYes
scope_nameYes
bucket_nameYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, and the description adds genuine context beyond that: it discloses the error behavior when the advisor cannot analyze the statement (e.g., syntax errors). However, the sentence 'The queries will be run on the specified scope in the specified bucket' is ambiguous for a read-only tool that accepts UPDATE/DELETE/MERGE — an agent could read it as execution rather than analysis, which is a real clarity risk. It stops short of a contradiction, but it is not a clean disclosure either.

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

Conciseness3/5

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

The lead sentence is front-loaded and useful, and the supported-statement list earns its place. But a large block restates the return dictionary and per-index object fields even though an output schema exists, which duplicates structured data rather than adding meaning. Roughly half the text is redundant with the output schema.

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

Completeness3/5

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

For a three-parameter read-only analysis tool with an output schema and readOnlyHint annotation, the essentials are mostly covered: purpose, accepted query types, error behavior. Gaps remain around parameter semantics (0% schema coverage) and the ambiguous 'will be run' wording, and the return-value enumeration is redundant given the output schema. An agent could call it correctly but might hesitate over whether the query is executed.

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

Parameters3/5

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

Schema description coverage is 0%, so all three parameters (bucket_name, scope_name, query) are undocumented in the schema and the description must compensate. It does partially: the query is identified as a SQL++ statement and the bucket/scope are described as the execution context, which conveys their roles. It adds no format detail, such as whether the query must use fully qualified keyspace paths or how bucket/scope interact with the query text.

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

Purpose4/5

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

The first sentence names a specific verb and resource (index recommendations from the Couchbase Index Advisor) and scopes it to a given SQL++ query. It also enumerates supported statement types (SELECT, UPDATE, DELETE, MERGE), which sharpens the purpose further. It does not, however, distinguish itself from near-neighbors such as explain_sql_plus_plus_query, list_indexes, or get_queries_not_using_covering_index, so an agent must infer the boundary itself.

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

Usage Guidelines3/5

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

Usage is implied rather than stated: the agent learns the tool analyzes a query and works for four statement types, which suggests 'use when you want index advice for a specific query.' There is no explicit when-to-use/when-not, no mention of prerequisites (e.g., whether indexes must already exist or whether the collection must be loaded), and no routing to sibling tools that also deal with indexes or query explanation.

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

get_index_statsA
Read-only

Get per-index statistics (size, fragmentation, scan traffic) from the Index Service.

Names which index is responsible for disk or memory pressure — use it after get_cluster_metrics shows a node's index disk climbing.

Filters are hierarchical: scope requires bucket, collection requires both, index requires all three. No filters returns every index in the cluster.

Returns nodes (keyed by node, each with an indexer block and an indexes list of bucket/scope/collection/name + stats), nodes_without_index (nodes that answered but do not hold the requested index — expected, since an index lives only where it was placed) and nodes_failed (nodes that could not be reached, so a partial answer is visible as one). indexer is None for filtered calls.

Numbers are per node. A partitioned index appears under several nodes, each reporting only its own share: sum items_count/data_size/disk_size across nodes, but not num_requests, which every hosting node counts in full.

Reading the stats: disk_size far above data_size (see frag_percent) means space reclaimable by compaction; num_requests with last_known_scan_time (Unix ns, 0 = never) identifies unused indexes; num_docs_pending is indexing lag. Counters reset when the indexer restarts, so a low count alone does not prove an index is unused.

skip_empty=True drops zero-valued fields (~two thirds on an idle cluster) — leave it False when hunting unused indexes, since it also removes num_requests: 0.

NameRequiredDescriptionDefault
index_nameNo
scope_nameNo
skip_emptyNo
bucket_nameNo
collection_nameNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only declare readOnlyHint=true, and the description adds substantial behavior the agent could not otherwise know: partial results surface as nodes_failed, nodes_without_index is expected rather than an error, indexer is None on filtered calls, counters reset on indexer restart, and per-node numbers cannot be summed for num_requests on partitioned indexes.

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

Conciseness4/5

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

Purpose and the sibling hook are front-loaded in the first two sentences, and the remaining paragraphs on return shape and stat interpretation are dense rather than padded. It is long overall — the 'Reading the stats' paragraph drifts into analytical advice — but nearly every sentence carries information an agent would otherwise get wrong.

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

Completeness5/5

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

For a five-parameter, filter-hierarchy diagnostic tool this covers everything needed to call and interpret it: filter preconditions, node-level semantics, failure visibility, and the skip_empty trade-off. An output schema exists, so the extra return-value detail is bonus rather than padding.

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

Parameters4/5

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

Schema description coverage is 0%, so the description must carry the load — and it does explain the non-obvious constraint that filters are hierarchical (scope requires bucket, index requires all three) and documents skip_empty's effect and caveat in detail. The individual name parameters are only covered via that hierarchy rule rather than individually, leaving a small gap.

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

Purpose5/5

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

States a specific verb and resource — per-index statistics (size, fragmentation, scan traffic) from the Index Service — and immediately frames the diagnostic question it answers (which index is responsible for disk/memory pressure). It also positions itself relative to the sibling get_cluster_metrics, so an agent can distinguish it from list_indexes/get_index_advisor_recommendations without opening a schema.

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

Usage Guidelines5/5

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

Gives an explicit trigger condition: call it after get_cluster_metrics shows a node's index disk climbing. It also supplies a usage branch on skip_empty ('leave it False when hunting unused indexes'), which is real when-to-use guidance rather than a restatement of the parameter.

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

get_longest_running_queriesA
Read-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.

NameRequiredDescriptionDefault
limitNoNumber of queries to return (default: 10)

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_queriesA
Read-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.

NameRequiredDescriptionDefault
limitNoNumber of queries to return (default: 10)

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_selectiveA
Read-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.

NameRequiredDescriptionDefault
limitNoNumber of queries to return (default: 10)

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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_indexA
Read-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.

NameRequiredDescriptionDefault
limitNoNumber of queries to return (default: 10)

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_indexA
Read-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.

NameRequiredDescriptionDefault
limitNoNumber of queries to return (default: 10)

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_countA
Read-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.

NameRequiredDescriptionDefault
limitNoNumber of queries to return (default: 10)

Output Schema

NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_sizesA
Read-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.

NameRequiredDescriptionDefault
limitNoNumber of queries to return (default: 10)

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_collectionA
Read-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.

num_sample_values sets how many example values INFER reports per field. Leave it unset to use the server's own default (5). Pass 0 to omit sample values entirely, keeping only the structure and type information.

NameRequiredDescriptionDefault
scope_nameYes
bucket_nameYes
collection_nameYes
num_sample_valuesNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, so the description's job is to add context, and it does add some: schema is produced by an INFER query and sample values default to 5 server-side. However, it says nothing about the cost or latency of inference on large collections, permission requirements, or whether the call blocks — meaningful behavioral facts for an inference-backed read that annotations alone do not convey.

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

Conciseness4/5

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

The purpose sentence leads, followed by return description and then the optional-parameter nuance; nothing is padded. The middle sentence about the returned dictionary is somewhat redundant given an output schema exists, but it is short and not harmful.

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

Completeness4/5

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

For a four-parameter read-only tool with an output schema, the description covers what the tool does, how the schema is generated, and how the one optional parameter changes the result. The remaining gaps — hierarchical parameter semantics and inference cost — are secondary for correct invocation.

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

Parameters3/5

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

Schema description coverage is 0%, so the description must carry the parameter burden. It fully specifies num_sample_values (unset means server default 5, 0 omits samples while keeping structure and type), which is genuinely useful nuance. The three required addressing parameters (bucket_name, scope_name, collection_name) get no explanation of format or expected values beyond their names.

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

Purpose5/5

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

The description states a specific verb and resource (get the inferred schema for a Couchbase collection in a bucket/scope), and goes further to say the schema comes from an INFER query and is returned as a dictionary keyed by collection name. This clearly separates it from sibling tools such as get_document_by_id, get_bucket_config, or list_indexes, which touch the same hierarchy but return different artifacts.

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

Usage Guidelines3/5

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

Usage is only implied: the natural read is 'explore a collection's structure before writing queries.' There is no explicit guidance on when to choose this over get_document_by_id or get_bucket_config, and no stated prerequisites. The only explicit conditional advice concerns num_sample_values, not tool selection.

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_bucketA
Read-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.

NameRequiredDescriptionDefault
bucket_nameYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_bucketA
Read-only

Get the names of all scopes in the given bucket.

NameRequiredDescriptionDefault
bucket_nameYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_search_index_definitionA
Read-only

Get the full definition of a single Search (FTS) index.

Pass both bucket_name and scope_name together to look up a scope-level (scoped) index in that scope, or omit both to look up a cluster-level ("legacy") index. Passing only one of the two is invalid — Couchbase allows the same index name to exist in different scopes, so the location must be stated explicitly rather than guessed.

Returns {"success": True, "name", "source_type", "idx_type", "source_name", "uuid", "params" (mapping/analyzer configuration), "source_uuid", "source_params", "plan_params" (num replicas/partitions), "bucket", "scope"}. If no index with this name exists at the given location, returns {"success": False, "error": ...} — confirm the exact name and location first with list_search_indexes.

NameRequiredDescriptionDefault
index_nameYes
scope_nameNo
bucket_nameNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

Annotations declare readOnlyHint=true, and the description adds genuinely new behavior: the both-or-neither parameter constraint with its rationale (same index name can exist in different scopes, so location must be explicit, not guessed) and the failure mode returning {'success': False, 'error': ...}. The enumerated return keys are somewhat redundant since an output schema exists, which keeps this below a 5.

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

Conciseness4/5

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

Front-loaded with the one-line purpose, then the location rule, then the return contract. Well organized and mostly dense, though the long enumeration of return keys is low-value given a declared output schema and could be trimmed to the error case.

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

Completeness5/5

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

For a three-parameter read-only lookup with an output schema, the description covers everything an agent needs to call it correctly: what it fetches, how to specify location, what makes a call invalid, and how absence manifests. Nothing material is missing.

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

Parameters4/5

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

Schema description coverage is 0%, so the description must carry the parameter burden, and it largely does: it defines the semantics of bucket_name and scope_name as a coupled location pair, explains the 'omit both' default meaning cluster-level, and states that partial specification is invalid. index_name is only implicitly characterized (the index to look up) with no format hints, which is the main residual gap.

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

Purpose5/5

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

States a specific verb and resource ('Get the full definition of a single Search (FTS) index'), which cleanly separates it from list_search_indexes and the SQL index siblings. An agent knows immediately this is a single-object lookup, not a listing.

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

Usage Guidelines4/5

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

Gives an explicit, actionable rule for the alternative location modes: pass both bucket_name and scope_name for a scoped index, omit both for a cluster-level index, and only-one is invalid. It also points to list_search_indexes to confirm name and location before calling. What it lacks is a direct 'use X instead when' routing statement against the listing sibling, but the prescriptive confirmation step effectively covers that.

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

get_server_configuration_statusA
Read-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.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_indexesA
Read-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, is_vector (True for a Hyperscale or Composite Vector Index), and, only when is_vector is True, vector_type ("hyperscale" or "composite"). 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.

NameRequiredDescriptionDefault
index_nameNo
scope_nameNo
bucket_nameNo
collection_nameNo
return_raw_index_statsNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, it discloses that results are RBAC-scoped via system:indexes on v8+ while older clusters fall back to an admin-level REST endpoint — a meaningful visibility difference the agent cannot learn from annotations. It also explains degradation behavior when fields are missing (warning + raw_index_stats) and what return_raw_index_stats actually yields.

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

Conciseness4/5

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

Purpose and the filter hierarchy are front-loaded, and the version-dependent source note is placed last where it belongs. The enumeration of result fields (name, definition, status, isPrimary, etc.) is largely redundant given that an output schema exists and could be trimmed.

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

Completeness4/5

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

For a five-parameter listing tool it covers the important edges: RBAC scoping, cluster-version-dependent data source, and fallback result shape. The only real gap relative to the sibling set is the absence of a pointer telling the agent when to prefer this over search-index or index-stats tools.

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

Parameters4/5

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

Schema description coverage is 0%, so the description carries the burden, and it does well: it names return_raw_index_stats explicitly and states the hierarchical dependency binding bucket_name, scope_name, collection_name, and index_name. It could go further by naming each parameter literally or noting that all are optional and unfiltered calls list everything.

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

Purpose4/5

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

'List indexes in the cluster' is a specific verb+resource, and the mentioned filters (bucket, scope, collection, index name) pin down scope precisely. It does not, however, distinguish itself from close siblings such as list_search_indexes or get_index_stats, leaving the agent to infer that this covers query/index-service indexes rather than search indexes.

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

Usage Guidelines4/5

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

The description gives a concrete operational rule: filters must be supplied hierarchically, with scope requiring bucket, collection requiring both, and index requiring all three. What is missing is any statement of when to choose this tool over list_search_indexes or get_index_stats, so alternative selection is left to inference.

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

list_search_indexesA
Read-only

List Search (FTS) indexes, optionally filtered by bucket and scope.

Filtering behavior:

  • No filters: lists cluster-level ("legacy") Search indexes only — the original, pre-scoped FTS index model, defined at the cluster level.

  • bucket_name only: lists scope-level (scoped) Search indexes across every scope in that bucket.

  • bucket_name and scope_name: lists scope-level Search indexes in that one scope only.

  • scope_name without bucket_name is invalid — returns an error entry explaining that bucket_name is required.

Each entry contains: name, uuid, source_name, source_type, idx_type, bucket, scope. bucket/scope are None for cluster-level (legacy) entries. This is a summary view — to get one index's full definition (mappings, analyzers, plan params), call get_search_index_definition with that entry's name and its own bucket/scope values (both, for a scoped entry; neither, when they're None). Don't reuse this call's filters: listing by bucket_name alone spans several scopes, and get_search_index_definition rejects a bucket without a scope.

NameRequiredDescriptionDefault
scope_nameNo
bucket_nameNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior3/5

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 goes further by disclosing the invalid-input error path and the legacy-vs-scoped model distinction. It adds genuine context but nothing about result size, ordering, or limits for a list operation that could return many entries.

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

Conciseness4/5

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

Front-loaded with the purpose, then organized into a bulleted filtering section and a follow-up-pointer paragraph, so structure is strong. It runs long and the entry-field enumeration plus the filter-reuse warning are dense, but nearly every clause carries actionable content.

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

Completeness5/5

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

For a two-parameter, zero-required list tool with an output schema, the description covers filtering semantics, the legacy/scoped distinction, error cases, and the exact handoff to get_search_index_definition. An agent has everything needed to call it correctly and interpret the entries.

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

Parameters5/5

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

Schema coverage is 0%, so the description must carry the full burden, and it does: bucket_name alone spans all scopes in the bucket, bucket_name+scope_name narrows to one scope, and scope_name alone is an error. Both parameters are given semantics the bare schema completely lacks.

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

Purpose5/5

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

States a specific verb and resource ("List Search (FTS) indexes") plus the filtering dimension, which cleanly separates it from list_indexes and get_search_index_definition in the sibling list. An agent can identify the tool's role without opening the schema.

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

Usage Guidelines5/5

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

Enumerates the four filter combinations explicitly, including the invalid scope-only case and its error behavior, and names the alternative tool (get_search_index_definition) with the condition that selects it. It even warns against reusing this call's filters for the follow-up call.

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

lookup_subdocumentA
Read-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.

NameRequiredDescriptionDefault
get_pathsNo
scope_nameYes
bucket_nameYes
count_pathsNo
document_idYes
exists_pathsNo
collection_nameYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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

Given the tool's complexity — 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.

Parameters4/5

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

With schema description coverage at 0%, the description 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.

Purpose5/5

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

The description opens with a specific verb and resource ('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.

Usage Guidelines5/5

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

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 (scalar or vector), prefer the create_query_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.

For relevance-scored, fuzzy, or linguistic full-text search (scoring, highlighting, faceting, fuzzy/phrase/wildcard matching), prefer run_search over SQL++'s SEARCH() function — it keeps FTS-specific result shape (score, fragments, facets) out of general query results and gives clearer tracing of what was searched.

NameRequiredDescriptionDefault
queryYes
scope_nameYes
bucket_nameYes
named_parametersNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior3/5

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

Annotations are empty, so the description carries the full burden. It usefully discloses that scope context is auto-set, that named parameters prevent injection, and that results are a list of JSON values, but it never says whether mutating statements (INSERT/UPDATE/DELETE) are permitted, what permissions are required, or what limits/timeouts apply to arbitrary query execution.

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

Conciseness4/5

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

The core behavior is front-loaded in the first sentence, and the remaining paragraphs each serve a routing or correctness purpose. It is somewhat long, but the example and sibling comparisons are not filler.

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

Completeness3/5

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

An output schema exists, so return-value explanation is unnecessary, and the description covers scope semantics and parameter binding well. However, for a tool that runs arbitrary SQL++, the absence of annotations leaves a real gap around read-only vs mutation behavior and permission requirements.

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

Parameters4/5

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

Schema description coverage is 0%, so the description must compensate, and it does: it explains the query parameter's scope-relative syntax with a concrete example, clarifies that bucket and scope are supplied separately, and documents named_parameters as the binding mechanism for $name placeholders.

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

Purpose5/5

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

States a specific verb and resource ('Run a SQL++ query on a scope') plus the return shape, and repeatedly distinguishes itself from siblings like create_query_index, list_indexes, and run_search. An agent can identify the tool without opening the schema.

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

Usage Guidelines5/5

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

Gives explicit routing rules: prefer create_query_index for index creation, list_indexes to verify index readiness, and run_search for relevance-scored/fuzzy/FTS work rather than SQL++ SEARCH(). It also states the scope-context convention that selects correct query syntax.

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

run_vector_queryA
Read-only

Embed a query and run a vector similarity search against a GSI vector index.

Embedding: query_text is embedded using the model configured via CB_MCP_EMBEDDING_MODEL_PROVIDER/CB_MCP_EMBEDDING_MODEL/CB_MCP_EMBEDDING_MODEL_API_KEY/CB_MCP_EMBEDDING_MODEL_ENDPOINT (plus CB_MCP_EMBEDDING_MODEL_AWS_* for provider=bedrock). If no provider is configured, this tool returns {"success": False, "error": ...} explaining what to set -- it is not hidden from tool discovery when unconfigured.

Index selection: this tool queries a Couchbase 8.0+ GSI vector index (Composite Vector Index or Hyperscale Vector Index) via SQL++'s APPROX_VECTOR_DISTANCE(). Unlike Search-service vector search, GSI selects the index automatically from the vector field referenced in the query -- there is no index_name parameter, and none is needed.

distance_metric is required, deliberately with no default: it must match the similarity the index was created with (CREATE INDEX ... WITH {"similarity": ...}), or Couchbase silently falls back to not using the Composite/Hyperscale Vector Index at all (no error -- the query still returns correct results, just unindexed). There is no one value that's usually right, since it depends entirely on how the specific index was created, and this tool has no index_name to look that up automatically (see above) -- call list_indexes first and read the similarity value out of the matching index's definition field (valid values: cosine, dot, l2/euclidean, l2_squared/euclidean_squared).

num_probes/rerank/top_n_scan are Hyperscale Vector Index tuning parameters. num_probes (integer) is the number of centroids to probe -- raise it to improve poor recall. rerank (true/false) re-checks the top candidates against the full vectors; it needs num_probes. top_n_scan (integer) is how many candidates to rerank; it needs num_probes and rerank. num_probes alone, or num_probes + rerank, are both valid. A Composite Vector Index doesn't use any of them. This tool itself has no index_name to check, but list_indexes now reports each index's vector_type ("hyperscale" or "composite") -- check that first if you need to know which shape will actually serve the query.

where is an optional raw SQL++ boolean expression (e.g. "doc.status = 'active'") appended to prefilter candidates before the vector ordering -- this tool only ever emits a SELECT, so, unlike run_sql_plus_plus_query, there is no write-guard for it to bypass. If the index was created with a partial-index condition (create_query_index's condition), where must match or imply it for the planner to actually use that index -- otherwise it falls back to a full scan silently (confirmed via EXPLAIN), the same footgun documented above for a mismatched distance_metric.

select_fields limits the projected document fields; omit it to return the full document. limit defaults to 10, matching the other query/search tools in this server.

Returns {"success": True, "hits": [{"id", "distance", "document": {... selected fields, or the full document}}], "total_hits", "cluster_major_version", and a "warning" key only when the detected cluster major version is below 8 (informational -- a pre-8.0 cluster fails the query naturally with its own "unknown function" error rather than being blocked here)} or {"success": False, "error": ...}. The document is nested under "document" rather than merged into the hit directly -- a document field literally named "id" or "distance" would otherwise silently collide with (and could overwrite) this tool's own id/distance metadata.

NameRequiredDescriptionDefault
limitNo
whereNo
rerankNo
num_probesNo
query_textYes
scope_nameYes
top_n_scanNo
bucket_nameYes
vector_fieldYes
select_fieldsNo
collection_nameYes
distance_metricYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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

readOnlyHint=true is consistent with the stated 'this tool only ever emits a SELECT' and the explanation that no write-guard applies. Beyond annotations it discloses the two silent-fallback footguns (mismatched distance_metric and a `where` that misses the partial-index condition), the unconfigured-provider error shape, the pre-8.0 warning key, and the nested-document return rationale.

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

Conciseness4/5

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

Paragraph-per-topic structure with bolded leads makes the long text scannable and front-loaded. It loses a point for repetition, repeating the 'this tool has no index_name to look that up' caveat three separate times, which could be said once.

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

Completeness5/5

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

For a 12-parameter tool with 0% schema coverage and silent-failure modes, the description covers prerequisites, parameter interactions, fallback behavior, and result shape. Return documentation is arguably redundant given the output schema, but the collision-explanation for the nested 'document' key adds real value.

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

Parameters5/5

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

With 0% schema description coverage the description must carry the full burden, and it does: distance_metric has a documented rationale for having no default plus an enumerated value set, num_probes/rerank/top_n_scan have stated meaning and dependency ordering, where gets syntax and prefilter semantics, select_fields/limit are explained with the limit default.

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

Purpose5/5

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

Opens with a specific verb+resource: embed a query and run a vector similarity search against a GSI vector index. It explicitly contrasts with the Search-service sibling (run_vector_search) and states there is no index_name parameter, so an agent can distinguish it from neighboring tools without opening the schema.

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

Usage Guidelines5/5

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

Gives concrete preconditions and routing: call list_indexes first to read the index `similarity` and `vector_type`, and supplies the exact valid values for distance_metric. It also states when tuning params apply (Hyperscale only, not Composite) and what happens when they are omitted or misused.

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

test_cluster_connectionA
Read-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.

NameRequiredDescriptionDefault
bucket_nameNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 18 tool updatesv1.1.0
    • Addeddiscover_tool_input_values
    • Addedget_active_queries
    • Addedget_bucket_config
    • Addedget_client_connectivity_report
    • Removedget_cluster_diagnostics_report
    • Addedget_cluster_health_snapshot
    • Addedget_cluster_metrics
    • Addedget_cluster_query_vitals
    • Addedget_cluster_system_events
    • Addedget_cluster_tasks
    • Addedget_index_stats
    • Changedget_schema_for_collection1 field changed
      • addedInput schema / properties / num_sample_values
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
    • Addedget_search_index_definition
    • Addedlist_search_indexes
    • Addedrun_search
    • Changedrun_sql_plus_plus_query2 fields changed
      • removedOutput schema / properties / result / items / additionalProperties
        Removed value: -true
      • removedOutput schema / properties / result / items / type
        Removed value: -"object"
    • Addedrun_vector_query
    • Addedrun_vector_search
  2. 3 tool updatesv1.0.1
    • Addedget_cluster_diagnostics_report
    • Changedget_cluster_health_and_services1 field changed
      • addedInput schema / properties / service_types
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
    • Addedlookup_subdocument
  3. 1 tool updatev0.8.1
    • Changedrun_sql_plus_plus_query1 field changed
      • addedInput schema / properties / named_parameters
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
  4. 22 tool updatesv0.8.0
    • Removeddelete_document_by_id
    • Addedexplain_sql_plus_plus_query
    • Changedget_buckets_in_cluster5 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / title
        Removed value: -"get_buckets_in_clusterArguments"
      • removedOutput schema / properties / result / title
        Removed value: -"Result"
      • removedOutput schema / title
        Removed value: -"get_buckets_in_clusterOutput"
      • addedOutput schema / x-fastmcp-wrap-result
        Added value: +true
    • Changedget_cluster_health_and_services4 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / bucket_name / title
        Removed value: -"Bucket Name"
      • removedInput schema / title
        Removed value: -"get_cluster_health_and_servicesArguments"
      • removedOutput schema / title
        Removed value: -"get_cluster_health_and_servicesDictOutput"
    • Changedget_collections_in_scope7 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / bucket_name / title
        Removed value: -"Bucket Name"
      • removedInput schema / properties / scope_name / title
        Removed value: -"Scope Name"
      • removedInput schema / title
        Removed value: -"get_collections_in_scopeArguments"
      • removedOutput schema / properties / result / title
        Removed value: -"Result"
      • removedOutput schema / title
        Removed value: -"get_collections_in_scopeOutput"
      • addedOutput schema / x-fastmcp-wrap-result
        Added value: +true
    • Changedget_document_by_id7 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / bucket_name / title
        Removed value: -"Bucket Name"
      • removedInput schema / properties / collection_name / title
        Removed value: -"Collection Name"
      • removedInput schema / properties / document_id / title
        Removed value: -"Document Id"
      • removedInput schema / properties / scope_name / title
        Removed value: -"Scope Name"
      • removedInput schema / title
        Removed value: -"get_document_by_idArguments"
      • removedOutput schema / title
        Removed value: -"get_document_by_idDictOutput"
    • Changedget_index_advisor_recommendations6 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / bucket_name / title
        Removed value: -"Bucket Name"
      • removedInput schema / properties / query / title
        Removed value: -"Query"
      • removedInput schema / properties / scope_name / title
        Removed value: -"Scope Name"
      • removedInput schema / title
        Removed value: -"get_index_advisor_recommendationsArguments"
      • removedOutput schema / title
        Removed value: -"get_index_advisor_recommendationsDictOutput"
    • Changedget_longest_running_queries7 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / limit / description
        Added value: +"Number of queries to return (default: 10)"
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • removedInput schema / title
        Removed value: -"get_longest_running_queriesArguments"
      • removedOutput schema / properties / result / title
        Removed value: -"Result"
      • removedOutput schema / title
        Removed value: -"get_longest_running_queriesOutput"
      • addedOutput schema / x-fastmcp-wrap-result
        Added value: +true
    • Changedget_most_frequent_queries7 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / limit / description
        Added value: +"Number of queries to return (default: 10)"
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • removedInput schema / title
        Removed value: -"get_most_frequent_queriesArguments"
      • removedOutput schema / properties / result / title
        Removed value: -"Result"
      • removedOutput schema / title
        Removed value: -"get_most_frequent_queriesOutput"
      • addedOutput schema / x-fastmcp-wrap-result
        Added value: +true
    • Changedget_queries_not_selective7 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / limit / description
        Added value: +"Number of queries to return (default: 10)"
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • removedInput schema / title
        Removed value: -"get_queries_not_selectiveArguments"
      • removedOutput schema / properties / result / title
        Removed value: -"Result"
      • removedOutput schema / title
        Removed value: -"get_queries_not_selectiveOutput"
      • addedOutput schema / x-fastmcp-wrap-result
        Added value: +true
    • Changedget_queries_not_using_covering_index7 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / limit / description
        Added value: +"Number of queries to return (default: 10)"
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • removedInput schema / title
        Removed value: -"get_queries_not_using_covering_indexArguments"
      • removedOutput schema / properties / result / title
        Removed value: -"Result"
      • removedOutput schema / title
        Removed value: -"get_queries_not_using_covering_indexOutput"
      • addedOutput schema / x-fastmcp-wrap-result
        Added value: +true
    • Changedget_queries_using_primary_index7 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / limit / description
        Added value: +"Number of queries to return (default: 10)"
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • removedInput schema / title
        Removed value: -"get_queries_using_primary_indexArguments"
      • removedOutput schema / properties / result / title
        Removed value: -"Result"
      • removedOutput schema / title
        Removed value: -"get_queries_using_primary_indexOutput"
      • addedOutput schema / x-fastmcp-wrap-result
        Added value: +true
    • Changedget_queries_with_large_result_count7 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / limit / description
        Added value: +"Number of queries to return (default: 10)"
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • removedInput schema / title
        Removed value: -"get_queries_with_large_result_countArguments"
      • removedOutput schema / properties / result / title
        Removed value: -"Result"
      • removedOutput schema / title
        Removed value: -"get_queries_with_large_result_countOutput"
      • addedOutput schema / x-fastmcp-wrap-result
        Added value: +true
    • Changedget_queries_with_largest_response_sizes7 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / limit / description
        Added value: +"Number of queries to return (default: 10)"
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • removedInput schema / title
        Removed value: -"get_queries_with_largest_response_sizesArguments"
      • removedOutput schema / properties / result / title
        Removed value: -"Result"
      • removedOutput schema / title
        Removed value: -"get_queries_with_largest_response_sizesOutput"
      • addedOutput schema / x-fastmcp-wrap-result
        Added value: +true
    • Changedget_schema_for_collection6 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / bucket_name / title
        Removed value: -"Bucket Name"
      • removedInput schema / properties / collection_name / title
        Removed value: -"Collection Name"
      • removedInput schema / properties / scope_name / title
        Removed value: -"Scope Name"
      • removedInput schema / title
        Removed value: -"get_schema_for_collectionArguments"
      • removedOutput schema / title
        Removed value: -"get_schema_for_collectionDictOutput"
    • Changedget_scopes_and_collections_in_bucket4 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / bucket_name / title
        Removed value: -"Bucket Name"
      • removedInput schema / title
        Removed value: -"get_scopes_and_collections_in_bucketArguments"
      • removedOutput schema / title
        Removed value: -"get_scopes_and_collections_in_bucketDictOutput"
    • Changedget_scopes_in_bucket6 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / bucket_name / title
        Removed value: -"Bucket Name"
      • removedInput schema / title
        Removed value: -"get_scopes_in_bucketArguments"
      • removedOutput schema / properties / result / title
        Removed value: -"Result"
      • removedOutput schema / title
        Removed value: -"get_scopes_in_bucketOutput"
      • addedOutput schema / x-fastmcp-wrap-result
        Added value: +true
    • Changedget_server_configuration_status3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / title
        Removed value: -"get_server_configuration_statusArguments"
      • removedOutput schema / title
        Removed value: -"get_server_configuration_statusDictOutput"
    • Changedlist_indexes11 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / bucket_name / title
        Removed value: -"Bucket Name"
      • removedInput schema / properties / collection_name / title
        Removed value: -"Collection Name"
      • removedInput schema / properties / include_raw_index_stats
        Removed value: -{
        -  "default": false,
        -  "title": "Include Raw Index Stats",
        -  "type": "boolean"
        -}
      • removedInput schema / properties / index_name / title
        Removed value: -"Index Name"
      • addedInput schema / properties / return_raw_index_stats
        Added value: +{
        +  "default": false,
        +  "type": "boolean"
        +}
      • removedInput schema / properties / scope_name / title
        Removed value: -"Scope Name"
      • removedInput schema / title
        Removed value: -"list_indexesArguments"
      • removedOutput schema / properties / result / title
        Removed value: -"Result"
      • removedOutput schema / title
        Removed value: -"list_indexesOutput"
      • addedOutput schema / x-fastmcp-wrap-result
        Added value: +true
    • Changedrun_sql_plus_plus_query8 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / bucket_name / title
        Removed value: -"Bucket Name"
      • removedInput schema / properties / query / title
        Removed value: -"Query"
      • removedInput schema / properties / scope_name / title
        Removed value: -"Scope Name"
      • removedInput schema / title
        Removed value: -"run_sql_plus_plus_queryArguments"
      • removedOutput schema / properties / result / title
        Removed value: -"Result"
      • removedOutput schema / title
        Removed value: -"run_sql_plus_plus_queryOutput"
      • addedOutput schema / x-fastmcp-wrap-result
        Added value: +true
    • Changedtest_cluster_connection4 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / bucket_name / title
        Removed value: -"Bucket Name"
      • removedInput schema / title
        Removed value: -"test_cluster_connectionArguments"
      • removedOutput schema / title
        Removed value: -"test_cluster_connectionDictOutput"
    • Removedupsert_document_by_id
  5. 20 tool updatesv1.0.0
    • Changeddelete_document_by_id2 fields changed
      • addedInput schema / properties / bucket_name
        Added value: +{
        +  "title": "Bucket Name",
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "scope_name",
        -  "collection_name",
        -  "document_id"
        -]New value: +[
        +  "bucket_name",
        +  "scope_name",
        +  "collection_name",
        +  "document_id"
        +]
    • Addedget_buckets_in_cluster
    • Addedget_cluster_health_and_services
    • Addedget_collections_in_scope
    • Changedget_document_by_id2 fields changed
      • addedInput schema / properties / bucket_name
        Added value: +{
        +  "title": "Bucket Name",
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "scope_name",
        -  "collection_name",
        -  "document_id"
        -]New value: +[
        +  "bucket_name",
        +  "scope_name",
        +  "collection_name",
        +  "document_id"
        +]
    • Addedget_index_advisor_recommendations
    • Addedget_longest_running_queries
    • Addedget_most_frequent_queries
    • Addedget_queries_not_selective
    • Addedget_queries_not_using_covering_index
    • Addedget_queries_using_primary_index
    • Addedget_queries_with_large_result_count
    • Addedget_queries_with_largest_response_sizes
    • Changedget_schema_for_collection2 fields changed
      • addedInput schema / properties / bucket_name
        Added value: +{
        +  "title": "Bucket Name",
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "scope_name",
        -  "collection_name"
        -]New value: +[
        +  "bucket_name",
        +  "scope_name",
        +  "collection_name"
        +]
    • Changedget_scopes_and_collections_in_bucket2 fields changed
      • addedInput schema / properties / bucket_name
        Added value: +{
        +  "title": "Bucket Name",
        +  "type": "string"
        +}
      • addedInput schema / required
        Added value: +[
        +  "bucket_name"
        +]
    • Addedget_scopes_in_bucket
    • Addedlist_indexes
    • Changedrun_sql_plus_plus_query2 fields changed
      • addedInput schema / properties / bucket_name
        Added value: +{
        +  "title": "Bucket Name",
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "scope_name",
        -  "query"
        -]New value: +[
        +  "bucket_name",
        +  "scope_name",
        +  "query"
        +]
    • Changedtest_cluster_connection1 field changed
      • addedInput schema / properties / bucket_name
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Bucket Name"
        +}
    • Changedupsert_document_by_id2 fields changed
      • addedInput schema / properties / bucket_name
        Added value: +{
        +  "title": "Bucket Name",
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "scope_name",
        -  "collection_name",
        -  "document_id",
        -  "document_content"
        -]New value: +[
        +  "bucket_name",
        +  "scope_name",
        +  "collection_name",
        +  "document_id",
        +  "document_content"
        +]
  6. 8 tool updates
    • First observeddelete_document_by_id
    • First observedget_document_by_id
    • First observedget_schema_for_collection
    • First observedget_scopes_and_collections_in_bucket
    • First observedget_server_configuration_status
    • First observedrun_sql_plus_plus_query
    • First observedtest_cluster_connection
    • First observedupsert_document_by_id

TDQS

A3.7/5.0

Scored across 36 tools

Disambiguation4/5

Most tools target clearly distinct resources/actions, and the descriptions do heavy lifting to separate read-only KV, SQL++, FTS, vector, index, and cluster-ops surfaces. A few pairs are genuinely easy to confuse: run_vector_query (GSI) vs run_vector_search (FTS), get_scopes_and_collections_in_bucket vs get_scopes_in_bucket/get_collections_in_scope, and the three cluster-health tools (health_and_services, health_snapshot, client_connectivity_report). The six query-analysis tools are individually named but form a dense cluster an agent must read carefully.

Naming Consistency4/5

Names are uniformly snake_case and almost all follow verb_noun (get_, list_, run_, explain_, discover_, test_). Minor deviations: near-duplicate verbs for similar concepts (get_document_by_id vs lookup_subdocument, run_vector_query vs run_vector_search) which read consistently but blur intent. No camelCase or style mixing.

Tool Count2/5

36 tools exceeds the 25+ threshold and the surface spans many domains (KV, SQL++, FTS, vector, indexes, cluster diagnostics). Several query-analysis tools (not_selective, not_using_covering_index, using_primary_index, large_result_count, largest_response_sizes, longest_running, most_frequent) could be consolidated into a single parameterized tool. The count feels heavy relative to what an agent can reliably pick from.

Completeness3/5

The read/investigation surface is broad and strong, but there are no document write tools (no insert/upsert/replace/delete) despite the server being KV-capable. Several tools reference operations that aren't in the surface: run_sql_plus_plus_query points to create_query_index, and get_active_queries points to delete_active_query — neither exists, creating dead-end references. Read-only by design, but the stated domain (a Couchbase MCP server) implies write/lifecycle coverage that's missing.

Maintenance

ActivityActive
ResponsivenessSlow

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    An 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.
    22 npm
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    A 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.
    1
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    A 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.
    25 npm
    7
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    An MCP server implementation that allows Large Language Models to directly interact with YugabyteDB databases, supporting table listing and read-only SQL queries.
    11
    Apache 2.0

Appeared in Searches