Skip to main content
Glama
MCPg - Production-grade PostgreSQL MCP Server

MCPg - Production-grade PostgreSQL MCP Server

MCPg

MCP Toplist

A production-grade Model Context Protocol server for PostgreSQL. It lets AI agents safely inspect, query, operate, and tune a Postgres database — 279 tools spanning catalog introspection, query intelligence, natural-language SQL, structural diffs, hybrid search, graph queries, data movement, live ops, and more.

PyPI version Python versions License: MIT CI OpenSSF Scorecard OpenSSF Best Practices Stars MCPg MCP server AllMCPs Verified MCPVault: claimed Listed on MCP ServerList MCP Tutorial

Try it live: point an MCP client — or the MCP Inspector — at the hosted, read-only demo endpoint https://devopam-mcpg-demo.hf.space/mcp. It serves read tools against throwaway demo data; for real use, run MCPg next to your own database (see Quick start).

📍 Listed On


Aspect

MCPg

Safety

Read-only default + AST validation

Transport

stdio + HTTP/SSE

Install

pip install mcpg

Postgres Versions

14–19

Key Differentiator

Production observability + multi-tenancy

Why MCPg

  • Safe by default. Read-only access mode. Every user-supplied SQL statement parses through a validated AST allowlist before execution. Names that reach PostgreSQL as SQL identifiers are encoded with delimited-identifier quoting (see Identifier policy), not rejected merely for containing hyphens or other legal characters. Capabilities like DDL, shell, and LISTEN/NOTIFY are off until you opt in. Every tool publishes MCP ToolAnnotations (readOnlyHint, openWorldHint) derived from those same gates, so clients can auto-approve reads and gate writes without guessing.

  • One server, broad surface. Application data access (queries, search, cursors, NL→SQL) and DBA-grade operations (health checks, index tuning, EXPLAIN analysis, locks, vacuum, dumps, replicas, migrations) in a single MCP server. Agents don't have to switch tools to switch tasks.

  • PostgreSQL-native everything. No ORM, no abstraction tax — uses psycopg3 directly, speaks every pg_* system view, integrates with TimescaleDB, pgvector, PostGIS, Apache AGE, and pg_stat_statements where they're available, and degrades gracefully when they aren't.

  • Production-shaped, not demo-shaped. Connection pooling, per-request SET ROLE multi-tenancy, read-replica routing with degraded-host detection, server-side cursors with dedicated connections, rate-limiting, audit trail with regex redaction, PG TLS enforcement on startup, OIDC JWT bearer auth, per-session statement / lock timeouts.

  • Observability built in. Prometheus /metrics endpoint on the HTTP transport surfaces mcpg_tool_calls_total{tool,status} + mcpg_tool_duration_seconds. Every tool call records a structured audit event with credential-redacted arguments.

  • Test-driven, multi-version. 2,500+ unit tests plus an integration suite that runs against a real PostgreSQL container in CI — matrix covers PG 14, 15, 16, 17, 18 on every push, plus PG 19 (beta) as an experimental (non-blocking) entry tracked under issue #120.


Related MCP server: PostgreSQL MCP Server

Install

pip install mcpg
# or, in an isolated venv exposed globally:
uv tool install mcpg

Verify:

mcpg --version

Docker

Pull the pre-built image from the GitHub Container Registry (published on every tagged release — :latest tracks the newest, or pin a version like :0.6.5):

docker pull ghcr.io/devopam/mcpg:latest
docker run --rm --name mcpg -p 8000:8000 \
    -e MCPG_DATABASE_URL=postgresql://user:pass@host:5432/db \
    -e MCPG_ACCESS_MODE=read-only \
    ghcr.io/devopam/mcpg:latest

On Windows PowerShell replace the trailing \ with a backtick ` (or put the command on one line); the installation guide has ready-to-copy Linux/macOS, PowerShell, and Command Prompt blocks.

Or build it yourself from source:

docker build -t mcpg https://github.com/devopam/MCPg.git

Multi-stage image: runtime stage drops the build toolchain, runs as uid=10001 / gid=10001 with nologin shell, application files root-owned and read-only to the runtime user.

From source (developers)

git clone https://github.com/devopam/MCPg && cd MCPg
uv sync

uv sync creates a venv with all runtime + dev dependencies and exposes the mcpg console script.

More detail in the Installation Guide.


Quick start

One-click installs: Add to Cursor Install in VS Code Claude Desktop — setup for Windsurf, JetBrains, Zed, Cline, Antigravity, Qwen Code, Perplexity, ChatGPT, Copilot Studio, Continue, and HTTP clients in the integrations guide.

One-click install in Claude Desktop (.mcpb)

Download mcpg-<version>.mcpb from the latest release and double-click it (or drag it into Claude Desktop's Settings → Extensions). You'll be prompted for your PostgreSQL connection URL — stored in the OS keychain — and an access mode (defaults to read-only). That's the whole install: the bundle is ~2 kB and the host resolves the pinned mcpg release from PyPI for your platform.

Or wire it up manually (stdio transport)

Drop this into your claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/claude_desktop_config.json; Windows: %APPDATA%\Claude\claude_desktop_config.json):

{
  "mcpServers": {
    "mcpg": {
      "command": "uvx",
      "args": ["mcpg"],
      "env": {
        "MCPG_DATABASE_URL": "postgresql://user:pass@localhost:5432/mydb"
      }
    }
  }
}

Restart Claude Desktop. The MCPg toolset is now available to the model. You can ask Claude things like:

"What schemas exist in this database? For each one, summarise the three biggest tables."

"Why is this query slow? SELECT * FROM orders WHERE customer_id = 42 ORDER BY created_at DESC"

No interesting data yet? Seed the demo dataset

MCPG_DATABASE_URL=postgresql://... mcpg --demo

One command seeds a small, curated e-commerce dataset (3,000 orders, 900 product reviews, deliberately planted flaws) into an mcpg_demo schema — engineered so the index advisor, query-plan analysis, full-text search, PII audit, and graph projection all have something real to find on your first try. See the guided tour for a captured walkthrough, and remove it any time with mcpg --demo-drop.

Run as an HTTP server (for IDE integrations, web apps, etc.)

MCPG_DATABASE_URL=postgresql://user:pass@localhost:5432/mydb \
MCPG_TRANSPORT=streamable-http \
MCPG_HTTP_PORT=8000 \
mcpg

Then point any MCP-aware client at http://localhost:8000/mcp (or /sse for the SSE transport). The HTTP transport refuses to start unless it's authenticated — set MCPG_HTTP_AUTH_TOKEN=... for a static bearer, or MCPG_AUTH_MODE=oidc for full JWT validation against an OIDC issuer. To deliberately run without auth (not recommended), set MCPG_HTTP_ALLOW_UNAUTHENTICATED=true.


Configuration

MCPg is configured entirely through environment variables — no config file, no flags (the CLI's --version / --demo / --demo-drop are one-shot commands, not configuration). The only required one is MCPG_DATABASE_URL; everything else has a safe default.

Common scenarios

Scenario

Set

Local exploration, read-only

MCPG_DATABASE_URL

Read-write app data access

MCPG_ACCESS_MODE=restricted

DBA toolkit (DDL, vacuum, etc.)

MCPG_ACCESS_MODE=unrestricted + MCPG_ALLOW_DDL=true

HTTP transport with bearer auth

MCPG_TRANSPORT=streamable-http + MCPG_HTTP_AUTH_TOKEN=…

Multi-tenant SaaS

MCPG_DEFAULT_ROLE=tenant_a + MCPG_ALLOWED_ROLES=tenant_a,tenant_b,…

Read-replica fan-out

MCPG_REPLICA_URLS=postgresql://…?sslmode=require,postgresql://…?sslmode=require

NL→SQL — single provider

Set any one vendor key (ANTHROPIC_API_KEY, OPENAI_API_KEY, GEMINI_API_KEY, XAI_API_KEY, GROQ_API_KEY, HF_TOKEN, … — 22 built-in providers). MCPg auto-picks the default.

NL→SQL — multiple providers, caller picks

Set all vendor keys you want active. Each call to translate_nl_to_sql can pass provider="…" (any configured built-in or custom).

Full reference

Core

Variable

Default

Description

MCPG_DATABASE_URL

required

Primary PostgreSQL DSN. Supports URI (postgresql://…) and keyword (host=… user=…) forms. Remote hosts require sslmode=require (or stronger).

MCPG_ACCESS_MODE

read-only

read-only | restricted (allows write tools) | unrestricted (also unlocks DBA tools when paired with the gate vars).

MCPG_TRANSPORT

stdio

stdio (default, for Claude Desktop) | streamable-http | sse.

MCPG_LOG_LEVEL

INFO

DEBUG | INFO | WARNING | ERROR | CRITICAL.

MCPG_HTTP_HOST

127.0.0.1

Bind address for HTTP transports. Set to 0.0.0.0 inside containers.

MCPG_HTTP_PORT

8000

Listen port for HTTP transports (1–65535).

Capability gates (opt-in for higher-blast-radius tools)

Variable

Default

Description

MCPG_ALLOW_DDL

false

Expose DDL tools (run_ddl, create_graph, drop_graph, hypertable tools, migration tools). Requires MCPG_ACCESS_MODE=unrestricted.

MCPG_ALLOW_SHELL

false

Expose subprocess-backed tools (dump_database, restore_database, run_pg_binary). Required PG client binaries must be on PATH.

MCPG_ALLOW_TIMESCALEDB_ADMIN

false

With unrestricted mode + MCPG_ALLOW_DDL, expose the destructive / heavy TimescaleDB tools (drop_chunks, compress_chunk, decompress_chunk, reorder_chunk, merge_chunks, refresh_continuous_aggregate, run_job, alter_job, delete_job); each needs dry_run then confirm=true + confirmation_token. See docs/timescaledb.md.

MCPG_ALLOW_ALTER_SYSTEM

false

Expose alter_system, alter_system_reset_all, reload_config (unrestricted mode only; two-step confirm=true flow — see docs/alter-system.md). MCPG_ALTER_SYSTEM_ALLOWLIST / MCPG_ALTER_SYSTEM_DENYLIST (comma-separated GUC names) narrow or extend the built-in denylist.

MCPG_ALLOW_LISTEN

false

Expose LISTEN/NOTIFY tools (subscribe_channel, poll_notifications, unsubscribe_channel, list_notification_subscriptions).

Authentication (HTTP transports only)

Variable

Default

Description

MCPG_AUTH_MODE

static

static (compare bearer to MCPG_HTTP_AUTH_TOKEN) | oidc (full JWT validation).

MCPG_HTTP_AUTH_TOKEN

—

Required bearer token when MCPG_AUTH_MODE=static. Constant-time compare. The HTTP transport refuses to start (ConfigError) unless this, MCPG_AUTH_MODE=oidc, or MCPG_HTTP_ALLOW_UNAUTHENTICATED=true is set.

MCPG_HTTP_ALLOW_UNAUTHENTICATED

false

Explicit opt-out of the HTTP transport's fail-closed auth check. Loudly logged on every startup when set; not recommended.

MCPG_OIDC_ISSUER

—

OIDC issuer URL (required when MCPG_AUTH_MODE=oidc).

MCPG_OIDC_AUDIENCE

—

Expected aud claim (required when MCPG_AUTH_MODE=oidc).

MCPG_OIDC_JWKS_URL

discovered

Override JWKS endpoint (auto-discovered from issuer's .well-known otherwise).

MCPG_OIDC_ROLE_CLAIM

—

JWT claim whose value becomes the per-request PG role (SET LOCAL ROLE). Composes with the tenancy driver.

HTTP hardening (HTTP transports only)

Variable

Default

Description

MCPG_HTTP_MAX_BODY_BYTES

1048576

(1 MiB) Request bodies above this get a 413. Counts streamed bytes, so a missing/lying Content-Length can't bypass it.

MCPG_HTTP_ALLOWED_ORIGINS

—

Comma-separated CORS allowlist. Unset = no CORS middleware (no cross-origin headers emitted).

MCPG_HTTP_HSTS_MAX_AGE

63072000

Strict-Transport-Security max-age (2 years, OWASP's current recommendation). 0 disables the HSTS header. Security headers (CSP, X-Frame-Options, X-Content-Type-Options, Referrer-Policy) are always added unless the app already set them.

MCPG_HTTP_REQUEST_TIMEOUT_SECONDS

0

Per-request wall-clock cap (504 on expiry). 0 = disabled. Leave off if you rely on long-lived SSE / streamable-http streams — a hard cap also severs those.

MCPG_HTTP_TRUSTED_HOSTS

—

Comma-separated list of allowed Host header values (wildcards like *.example.com supported). Unset = no host-header validation (current behaviour). When set, requests with a non-matching Host get a 400 via Starlette's TrustedHostMiddleware.

Multi-tenancy (SET ROLE)

Variable

Default

Description

MCPG_DEFAULT_ROLE

—

Static PG role applied to every query. Identifier-validated.

MCPG_ALLOWED_ROLES

—

Comma-separated allowlist. When set, the X-MCPG-Role header / OIDC role claim must be in this list.

Read replicas

Variable

Default

Description

MCPG_REPLICA_URLS

—

Comma-separated replica DSNs. force_readonly queries round-robin across healthy replicas; primary fallback on failure; 30 s degraded-replica retry window.

Multiple databases (read-only secondaries)

Variable

Default

Description

MCPG_SECONDARY_DATABASE_URLS

—

Comma- or newline-separated name=dsn entries naming additional read-only databases this one server can serve (e.g. analytics=postgresql://…?sslmode=require,reporting=postgresql://…?sslmode=require). Read-capable tools accept an optional database argument selecting a secondary by name; omit it for the primary. Secondaries are read-only — PostgreSQL-enforced (every query runs in a READ ONLY transaction), so writes / DDL / shell / migrate always target the primary. Names must be simple identifiers ([a-z0-9_]+), unique, and not primary (the reserved id of MCPG_DATABASE_URL). Same TLS rules as the primary DSN. Call list_databases to discover the configured ids and their reachability.

Pool / timeouts / TLS

Variable

Default

Description

MCPG_POOL_MIN_SIZE

1

Minimum pool connections.

MCPG_POOL_MAX_SIZE

5

Maximum pool connections. Must be ≥ MCPG_POOL_MIN_SIZE.

MCPG_STATEMENT_TIMEOUT_MS

30000

Per-session statement_timeout set on connection checkout. Runaway queries self-terminate.

MCPG_LOCK_TIMEOUT_MS

5000

Per-session lock_timeout. Hanging lock waits self-terminate.

MCPG_ENABLE_ANALYTICAL_QUERIES

true

Expose run_analytical_query (long-running reads on an isolated pool). Set false to withdraw the tool.

MCPG_ANALYTICAL_TIMEOUT_MS

120000

Default per-call budget for run_analytical_query (2 min).

MCPG_ANALYTICAL_MAX_TIMEOUT_MS

600000

Hard ceiling for run_analytical_query; a per-call timeout_ms is clamped to this (10 min). Must be ≥ MCPG_ANALYTICAL_TIMEOUT_MS.

MCPG_ANALYTICAL_MAX_CONCURRENCY

2

Size of the isolated analytical pool — max simultaneous run_analytical_query calls.

MCPG_ALLOW_INSECURE_TLS

false

Bypass the startup TLS check that refuses remote DSNs without sslmode=require (or stronger). Loopback hosts are always exempt.

MCPG_SHUTDOWN_DRAIN_SECONDS

30

On SIGTERM, wait up to this long for in-flight tool calls to finish before closing the pool and cursors.

Subprocess tools (MCPG_ALLOW_SHELL=true only)

Variable

Default

Description

MCPG_SHELL_TIMEOUT_SEC

60

Max wall-clock for pg_dump / pg_restore / psql invocations.

MCPG_SHELL_MAX_OUTPUT_BYTES

67108864

(64 MiB) Cap on captured stdout per subprocess call.

MCPG_SUBPROCESS_BIN_ALLOWLIST

—

Comma-separated absolute dirs the resolved pg_dump / pg_restore / psql must live under. Empty = trust PATH. Defeats a PATH-shim of these binaries.

MCPG_SUBPROCESS_CPU_SECONDS

—

Per-child RLIMIT_CPU (seconds). POSIX only; unset = inherit.

MCPG_SUBPROCESS_MEMORY_MB

—

Per-child RLIMIT_AS (MiB). POSIX only; unset = inherit.

LISTEN/NOTIFY (MCPG_ALLOW_LISTEN=true only)

Variable

Default

Description

MCPG_LISTEN_QUEUE_MAX

1000

Per-channel buffer; oldest notifications dropped on overflow.

Audit

Variable

Default

Description

MCPG_AUDIT_PERSIST

false

When true, every run_write / run_ddl call persists to a mcpg_audit.events table (auto-created idempotently).

MCPG_AUDIT_REDACT_KEYS

—

Comma-separated regex fragments added to the secret-name pattern (defaults already cover password, passwd, secret, token, api[_-]?key, bearer, authorization, database_url, dsn, conninfo).

MCPG_AUDIT_INTEGRITY

false

When true, each persisted event is signed with an HMAC chained over the previous event; the verify_audit_chain tool walks the chain and reports the first break. Requires MCPG_AUDIT_HMAC_KEY.

MCPG_AUDIT_HMAC_KEY

—

Secret key for the audit HMAC chain. Required when MCPG_AUDIT_INTEGRITY=true. Never appears in repr/logs.

Secrets backend

By default every secret is read straight from the environment. Set MCPG_SECRETS_BACKEND=file to instead load API keys / bearer token / HMAC key from a mounted file — a name in the file wins; anything absent falls back to the env var, so partial files work.

Variable

Default

Description

MCPG_SECRETS_BACKEND

env

env (read every secret from the environment) | file (overlay a secrets file on top of the environment).

MCPG_SECRETS_FILE_PATH

—

Required when MCPG_SECRETS_BACKEND=file. Path to a flat name → value map: JSON always, or YAML (.yaml/.yml) when PyYAML is installed. Covers ANTHROPIC_API_KEY / OPENAI_API_KEY / GEMINI_API_KEY / GOOGLE_API_KEY / MCPG_NL2SQL_API_KEY, MCPG_HTTP_AUTH_TOKEN, and MCPG_AUDIT_HMAC_KEY.

Rate limiting

Variable

Default

Description

MCPG_RATE_LIMIT_ENABLED

true

Token-bucket per-tool rate limiting. Set to false to restore the pre-breaking-change unlimited behavior.

MCPG_RATE_LIMIT_MAX_REQUESTS

60

Global cap per window across all tools.

MCPG_RATE_LIMIT_WINDOW_SECONDS

60

Window length for the global quota.

MCPG_RATE_LIMIT_HEAVY_MAX

5

Cap for heavy tools (run_write, run_ddl, dump_database, etc.).

MCPG_RATE_LIMIT_HEAVY_WINDOW

60

Window length for the heavy-tool quota.

Caching & Feature flags

Variable

Default

Description

MCPG_CACHE_ENABLED

true

Enable or disable the adaptive cache layer.

MCPG_CACHE_TTL_SECONDS

300

Default cache Time-To-Live in seconds.

MCPG_CACHE_MAXSIZE

1024

Maximum LRU capacity bound for the memory cache.

MCPG_REDIS_URL

—

Optional Redis backend connection string for external, multi-node caching.

MCPG_ENABLE_HEAVY_DIAGNOSTICS

true

Toggle computationally heavy diagnostic, diagram, and advisor tools.

MCPG_ELICIT_CONFIRM_WRITES

false

When true, every write/DDL/shell/listen/migrate-tier tool call (any tool whose readOnlyHint annotation isn't true) requires an accepted interactive confirmation (ctx.elicit()) before running. Best-effort, not an enforcement boundary: it only engages for clients that both pass a request context and declare the elicitation capability during initialize — a client that omits either silently bypasses the gate and the tool runs as normal.

Natural-language SQL

MCPg auto-discovers every configured provider from the environment at startup — set as many vendor keys as you have and each becomes callable. Nineteen providers ship built in. Three are first-party (Anthropic, OpenAI, Gemini); the other sixteen speak the OpenAI-compatible API with vendor-preset endpoints: DeepSeek, Qwen, OpenRouter, Perplexity, xAI (Grok), Groq, Mistral, Together, Fireworks, DeepInfra, Cerebras, Nebius, Hugging Face, GitHub Models, SambaNova, and Moonshot (Kimi). Every built-in is plug-and-play — set the vendor's conventional API-key env var and it's auto-discovered — and any other OpenAI-compatible vendor or local model server (Ollama, vLLM, LM Studio) is still pluggable through configuration alone via MCPG_NL2SQL_CUSTOM_PROVIDERS. The whole built-in list is one declarative registry in nl2sql.py, so adding a vendor or refreshing a retired default model is a one-line data change.

When MCPG_NL2SQL_PROVIDER is unset, MCPg auto-picks the default in registry order — anthropic → openai → gemini stay first so existing deployments are unaffected. translate_nl_to_sql accepts an optional provider="…" argument to route per call; get_server_info reports which are configured.

Variable

Default

Description

<VENDOR>_API_KEY

—

Setting a vendor's conventional key enables that provider. Standard slugs: ANTHROPIC_API_KEY, OPENAI_API_KEY, DEEPSEEK_API_KEY, OPENROUTER_API_KEY, PERPLEXITY_API_KEY, XAI_API_KEY, GROQ_API_KEY, MISTRAL_API_KEY, TOGETHER_API_KEY, FIREWORKS_API_KEY, CEREBRAS_API_KEY, NEBIUS_API_KEY, SAMBANOVA_API_KEY, MOONSHOT_API_KEY.

(keys that deviate)

—

A few vendors don't follow <VENDOR>_API_KEY: Gemini → GEMINI_API_KEY or GOOGLE_API_KEY; Qwen → DASHSCOPE_API_KEY or QWEN_API_KEY; Hugging Face → HF_TOKEN; GitHub Models → GITHUB_TOKEN; DeepInfra → DEEPINFRA_TOKEN.

MCPG_NL2SQL_PROVIDER

auto-picked

Any built-in slug (listed above) or a custom name. Pins the default provider used when the tool is called without provider=. Unset + any vendor key present → MCPg auto-picks in registry order.

MCPG_NL2SQL_API_KEY

—

Explicit key for the configured MCPG_NL2SQL_PROVIDER. Overrides the vendor-conventional env var for that provider only. Requires MCPG_NL2SQL_PROVIDER to be set.

MCPG_NL2SQL_MODEL

provider default

Override the default model (e.g. claude-sonnet-4-6, gpt-4o-mini, grok-3-mini). Applies only to the default provider.

MCPG_NL2SQL_BASE_URL

—

Endpoint override for the default provider (private gateways / regional endpoints).

MCPG_NL2SQL_CUSTOM_PROVIDERS

—

Bring your own provider — no code change. Comma/newline-separated name=base_url|model entries declaring extra OpenAI-compatible providers beyond the built-ins (local Ollama / vLLM / LM Studio, or any niche vendor). Key from <NAME>_API_KEY by convention, or append |KEY_ENV_VAR for ones that deviate; keyless allowed for loopback endpoints. Each name becomes callable via provider=.

MCPG_NL2SQL_MAX_TOKENS

2048

Cap on generated tokens (hard limit: 16384).


Usage examples

The MCP tools are invoked by the agent (Claude, Cursor, Continue, …) in response to your natural-language instructions. A handful of illustrative round-trips:

Inspect the schema

You: What tables live in the public schema, and which ones are the biggest by row count?

Agent (using list_tables + summarize_table × N): Six tables: customers (1.2M rows), orders (4.7M), line_items (18.3M), products (340), addresses (1.4M), audit_log (45.8M — the largest, accumulates without retention).

Diagnose a slow query

You: Why does SELECT * FROM orders o JOIN line_items l ON o.id = l.order_id WHERE o.created_at > now() - interval '7 days' take 8 seconds?

Agent (using why_is_this_slow + recommend_indexes): EXPLAIN ANALYZE shows a sequential scan over orders (4.7M rows) filtered by created_at. There's no index on orders.created_at. Recommended: CREATE INDEX CONCURRENTLY orders_created_at_idx ON orders (created_at DESC); Expected improvement: ~95% reduction (index scan touches ~33K rows instead of full table). Run validate_migration on it before applying to confirm there's no locking surprise.

Translate plain English to SQL

You: Find customers who placed an order this month but never in the previous three months — show me their email and current lifetime spend.

Agent (using translate_nl_to_sql):

SELECT c.email, SUM(l.price * l.quantity) AS lifetime_spend
FROM customers c
JOIN orders o ON o.customer_id = c.id
JOIN line_items l ON l.order_id = o.id
WHERE EXISTS (
  SELECT 1 FROM orders o2 WHERE o2.customer_id = c.id
    AND o2.created_at >= date_trunc('month', now()))
  AND NOT EXISTS (
  SELECT 1 FROM orders o3 WHERE o3.customer_id = c.id
    AND o3.created_at >= date_trunc('month', now()) - interval '3 months'
    AND o3.created_at <  date_trunc('month', now()))
GROUP BY c.email;

Picture the schema

You: Draw me an ER diagram of the public schema.

Agent (using generate_schema_diagram): Returns a Mermaid diagram you can paste straight into GitHub / Notion / Obsidian.

Audit the database

You: How healthy is this database right now?

Agent (using audit_database): Returns a graded report: Memory & I/O score 92 (GOOD), Transaction & Connection 78 (WARNING: rollback rate 0.4%, look at app logs), Concurrency & Locks 60 (CRITICAL: 14 backends waiting), Cleanliness & Bloat 88 (GOOD), Slow queries 70 (WARNING: top query template runs 5000×, mean 90 ms — see optimize_query).

Run a guarded write

You: Soft-delete every order older than 5 years.

Agent (using run_write with MCPG_AUDIT_PERSIST=true): Validates the statement through the safe-SQL kernel, runs it inside a transaction, returns affected row count, persists the call (sql + arguments — with secrets regex-redacted — + status) to mcpg_audit.events for after-the-fact review.

For dozens more recipes — multi-tenant routing, RLS testing, NL→SQL, hybrid vector + FTS search, Apache AGE Cypher, TimescaleDB, ORM schema exports, server-side cursors — see docs/cookbook.md.


What's in the box

Compact category list. For the full, current tool reference see docs/tools.md; for a guided walkthrough see docs/tour.md.

  • Catalog introspection — schemas, tables, columns, indexes, constraints, views, functions, triggers, sequences, partitions, policies, roles, grants, enums, domains, composite types, FDWs, publications, subscriptions, extensions, generated columns.

  • Query intelligence — run_select, run_select_parallel, explain_query, analyze_query_plan, why_is_this_slow, recommend_indexes, analyze_workload, check_database_health, detect_n_plus_one, audit_database.

  • Search — fuzzy_search (trigram), full_text_search, vector_search, hybrid_search (pgvector + FTS via RRF), geo_search (PostGIS k-NN).

  • Natural language → SQL — translate_nl_to_sql (22 built-in providers — Anthropic, OpenAI, Gemini, xAI, Groq, Mistral, Hugging Face, … — plus any custom OpenAI-compatible endpoint; output passes through the same safe-SQL kernel as hand-written queries).

  • Visualisation — generate_schema_diagram (ER), generate_fk_cascade_graph (blast-radius of ON DELETE CASCADE), generate_graph_diagram (Apache AGE property graphs).

  • Structural diff & migrations — compare_schemas, validate_migration, staged prepare_migration / complete_migration / cancel_migration workflow.

  • Apache AGE graph + Cypher — list_graphs, describe_graph, run_cypher, create_graph, drop_graph, generate_graph_diagram.

  • Composite + advisor tools — summarize_table, find_unused_objects, find_sensitive_columns (PII heuristic), lint_naming_conventions, test_rls_for_role, list_locks, find_blocking_chains, read_pg_stat_io (PG16+), generate_test_data.

  • Live ops & maintenance — list_active_queries, verify_connection_encryption (TLS status of the live link), run_maintenance (VACUUM/ANALYZE), prune_audit_events (audit retention), cancel_query, terminate_backend, run_write, run_ddl, enable_extension.

  • Data movement — export_query / export_table (CSV/JSON), dump_database / restore_database, import_csv / import_json (COPY FROM STDIN), copy_table_between_databases.

  • Server-side cursors — open_cursor, fetch_cursor, close_cursor, list_cursors for pageable reads over millions of rows.

  • TimescaleDB — hypertable / chunk / job / continuous-aggregate introspection and stats, policy and dimension management, and gated chunk / job administration (drop_chunks, compress_chunk, refresh_continuous_aggregate, run_job, …). See docs/timescaledb.md.

  • ORM schema exporters — Prisma, Drizzle, SQLAlchemy, sqlc, Diesel, jOOQ, Ent, Ecto.

  • Event streams — subscribe_channel, poll_notifications, unsubscribe_channel, list_notification_subscriptions bridging PostgreSQL LISTEN/NOTIFY into the MCP poll model.

  • Observability — Prometheus /metrics endpoint + get_metrics_exposition tool for stdio; structured audit trail with regex-based credential redaction.


Documentation


Security

  • Vulnerability reporting: see SECURITY.md. 90-day coordinated-disclosure window; reports to devopam@gmail.com.

  • Defence-in-depth: capability gates, SafeSQL kernel, identifier allowlist, audit redaction, PG TLS enforcement at startup, rate-limiting, OIDC JWT validation, per-session timeouts.

  • See docs/security-hardening.md for the living roadmap of shipped (✅) and queued (⬜) hardening items.

Privacy Policy

MCPg is self-hosted: your database contents never leave your infrastructure, and there is no telemetry or phone-home of any kind. The one documented exception is the opt-in translate_nl_to_sql tool, which sends your question plus schema context (names, not row data) to the LLM provider you configure. Full policy — data collection, usage, storage, third-party sharing, retention, and contact — is in PRIVACY.md.


Release notes & changelog

See CHANGELOG.md for the full version history, docs/release-process.md for how releases are cut, and the GitHub Releases page for downloadable artifacts.


Contributing

Pull requests welcome — see CONTRIBUTING.md for the dev-loop setup, test conventions, and the per-PR review checklist. Participation is governed by the Code of Conduct (Contributor Covenant 2.1).


License

MIT — see LICENSE. The SQL-safety kernel (src/mcpg/sql/) is first-party, re-authored from the MIT-licensed crystaldba/postgres-mcp; see NOTICE for the lineage.

Wrapped extensions — licenses you should know about

MCPg's source is MIT, but the PostgreSQL extensions it wraps each carry their own license. The wrappers themselves are at arm's length (SQL-level calls, no static or dynamic linking into MCPg's Python process), so MCPg-the-project is not a derivative work of any of them. Operators deploying a service built on MCPg + a given extension take on whatever obligations that extension's license imposes — same as installing the extension directly. The matrix below names the license per wrapped extension so you can make an informed choice.

Extension

License

Notes for operators

pgvector

PostgreSQL License (BSD-style)

Permissive; no special obligations.

pg_partman

PostgreSQL License

Permissive.

pg_cron

PostgreSQL License

Permissive.

pg_turboquant

MIT

Permissive.

pg_buffercache / pg_walinspect / pgstattuple

PostgreSQL contrib

Permissive.

TimescaleDB

Apache 2.0 (community) + Timescale License (TSL, source-available) for some features

Mixed — see Timescale's docs for which features are TSL-gated.

Apache AGE

Apache 2.0

Permissive.

pg_search (ParadeDB)

AGPL-3.0

Operators running a network service that lets users interact with pg_search are subject to AGPL's network clause — typically the obligation to offer the source of pg_search (and any modifications) to those users. MCPg's wrappers don't extend that obligation to MCPg itself; you take on the obligation when you deploy and "convey" the extension over a network. If your service redistribution model is incompatible with AGPL's network clause, pick a different BM25 implementation (the BM25 plan lists alternatives).

This matrix is a starting point — for the binding answer on your specific deployment, consult the extension's upstream LICENSE file and (if it matters legally) your own counsel.

Disclaimer. Best efforts have been made to bring MCPg to production grade, but it remains an actively developed project and may contain issues. See the License terms for indemnity details.

Available Tools

191 tools
analyze_distance_metricAnalyze distance metricA
Read-only

Recommend a pgvector distance metric (cosine | l2 | inner_product) from the embedding-magnitude distribution. Samples up to sample_size non-NULL rows of schema.table.column, computes each embedding's L2 norm, and applies a small heuristic: pre-normalised (CV < 5% and mean ≈ 1.0) → inner_product; nearly-constant magnitude but not unit-norm → cosine (same ranking as L2, safer default); variable magnitude → cosine (normalises out heterogeneous sources). Returns the metric + a rationale + the underlying distribution stats. Reports available=false if the pgvector extension is not installed.

NameRequiredDescriptionDefault
tableYes
columnYes
schemaYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.
sample_sizeNo

Output Schema

NameRequiredDescription
availableYes
rationaleYes
magnitude_cvYes
sampled_rowsYes
magnitude_stdYes
mean_magnitudeYes
pre_normalisedYes
recommended_metricYes

TDQS

A4.7/5.0
Behavior5/5

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

Annotations only declare readOnlyHint and openWorldHint; the description adds substantial behavior on top: it samples at most sample_size non-NULL rows, computes L2 norms, applies a named heuristic, and returns metric + rationale + distribution stats. It also discloses a degradation path ('Reports available=false if the pgvector extension is not installed'), which is exactly the kind of operational detail annotations cannot 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 opening clause front-loads purpose, then mechanism, heuristic branches, return shape, and failure mode follow in a logical order with no filler sentences. The parenthetical heuristic chains are dense but every clause carries decision-relevant information, so the slight density is acceptable.

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 did not need spelling out, yet the description still names the payload (metric + rationale + distribution stats). Combined with sampling behavior and the pgvector-unavailable case, an agent has everything needed to call this correctly and interpret the result.

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 only 20%, so the description must compensate, and it does: it explains that schema.table.column identifies the embedding column being profiled and that sample_size bounds the number of non-NULL rows sampled. The only gap is the optional 'database' parameter, which the schema itself already documents well.

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 ('Recommend a pgvector distance metric') and immediately enumerates the three candidate metrics, so the agent knows exactly what comes back. This is clearly distinguishable from neighboring tools such as tune_vector_index or analyze_hnsw_recall, which tune indexes rather than choose a metric.

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

Usage Guidelines4/5

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

It gives clear decision criteria for the metric choice itself (CV < 5% and mean ≈ 1.0 → inner_product; near-constant magnitude → cosine; variable magnitude → cosine), which is real guidance on the outcome. However, it never states when to reach for this tool versus siblings like tune_vector_index, vector_recall_at_k, or recommend_vector_quantization, nor any prerequisite such as the column being of type vector.

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

analyze_hnsw_recallAnalyze HNSW recallB
Read-only

Sweeps ef_search values to measure the latency and recall trade-off curve for a given pgvector query vector against exact brute-force ground truth. Requires the vector extension. Returns a list of objects with ef_search, recall_at_k, mean_latency_ms, and p95_latency_ms — one row per ef_search value tested.

NameRequiredDescriptionDefault
kNo
tableYes
columnYes
metricNol2
schemaYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.
query_vectorYes

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds genuinely new behavioral context: it requires the vector extension and computes 'exact brute-force ground truth', which signals an expensive exact scan, and it states that the output is one row per ef_search value tested. It stops short of warning about runtime cost, sweep size, or row limits.

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?

Two sentences, front-loaded with the operation and its measurement, then the return contract. The field list is dense but earns its space by describing the row shape. Minor redundancy with the output schema, which already defines those columns.

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 repeating the return columns is optional rather than necessary, and annotations cover read-only safety. However, for a 7-parameter analytical tool with 14% schema coverage, the description leaves the semantics of k, metric, and the swept ef_search range unexplained, which is the main gap an agent would hit when invoking it.

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 only 14%, so the description must carry almost all the weight, and it does not. It never explains what k, metric, table, or column do, nor what range of ef_search values is actually swept (ef_search is not even an input parameter). Only the query vector and the extension prerequisite get any narrative support.

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?

States a specific action ('sweeps ef_search values') plus the measured quantity ('latency and recall trade-off curve') and the ground-truth baseline, so the agent knows exactly what the tool produces. It does not distinguish itself from nearby siblings such as vector_recall_at_k or recommend_hnsw_ef_search, leaving the agent to infer the difference from the output shape.

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 only routing guidance is the prerequisite 'Requires the vector extension', which is a condition for success rather than a when-to-use rule. There is no statement of when to prefer this sweep over vector_recall_at_k (single-k recall) or recommend_hnsw_ef_search (a recommendation), so selection among these siblings is only implied by the description's emphasis on a full curve.

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

analyze_lock_hotspotsAnalyze lock hotspotsA
Read-only

Rank PG 19 pg_stat_lock rows by wait dominance and surface stable reason codes. Read-only — never modifies state. Pair with find_blocking_chains for the active culprits on a specific hot lock_type. Returns an object with available (bool), server_version_num, detail, and hotspots — a list of objects with lock_type, waits, wait_time_us, reason (one of contention_dominant / high_wait_time / high_wait_count / low_contention), and suggested_followup (a human-readable next-step string).

Example: analyze_lock_hotspots()

NameRequiredDescriptionDefault
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
detailYes
hotspotsYes
availableYes
server_version_numYes

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already establish readOnlyHint=true and openWorldHint=false, so the 'Read-only — never modifies state' sentence is largely redundant. What does add value is the PG 19 version dependency and the enumerated reason codes (contention_dominant, high_wait_time, high_wait_count, low_contention), which tell the agent how results will be bucketed and that classification is heuristic rather than absolute.

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 and the sibling routing are front-loaded in the first two sentences, which is the right ordering. The last portion enumerates return fields that an output schema already declares, which is filler, though the example call is short and harmless.

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

Completeness4/5

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

With an output schema present, restating the return shape is unnecessary, but the description does supply the piece the schema cannot: the PG 19 version gate and what `available` implies for fallback behavior. An agent has enough to call it correctly; only the relationship to the raw-read lock siblings is left implicit.

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 optional database parameter whose schema description already covers it at 100%, including the secondary/primary targeting rule and rejection of unconfigured names. The description text adds no further meaning about that parameter, 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?

The description opens with a specific verb and resource ('Rank PG 19 pg_stat_lock rows by wait dominance') and names the exact output artifact ('stable reason codes'). It also distinguishes itself from the nearby lock-related siblings by pointing at find_blocking_chains for active culprits, so an agent can choose between them without opening either schema.

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

Usage Guidelines4/5

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

It gives explicit routing guidance: use this for ranked hotspot analysis, and pair with find_blocking_chains when you need the active culprits behind a specific hot lock_type. What is missing is any exclusion relative to read_pg_stat_lock or list_locks, which return the raw rows this tool ranks, so the agent must infer that boundary.

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

analyze_mpp_query_planAnalyze MPP query planA
Read-only

Run EXPLAIN (ANALYZE, FORMAT JSON) on sql and roll up MPP-specific facts: slice count, motion nodes (Redistribute Motion / Broadcast Motion / Gather Motion), and per-motion metadata (senders, receivers, estimated rows). Uses the same safety pre-flight as analyze_query_plan(io=True) — writes / DDL stay rejected. redistribute_count flags 'data is not co-located with the join key'. On vanilla PG returns available=false.

Example: analyze_mpp_query_plan(sql='SELECT * FROM big JOIN small ON big.k = small.k')

NameRequiredDescriptionDefault
sqlYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
detailYes
motionsYes
availableYes
slice_countYes
gather_countYes
motion_countYes
broadcast_countYes
redistribute_countYes

TDQS

A4.3/5.0
Behavior4/5

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

Beyond readOnlyHint/openWorldHint, the description discloses that writes and DDL are rejected by the same pre-flight as analyze_query_plan, that the result degrades gracefully to available=false off MPP, and what redistribute_count means. One notable behavior is left implicit: EXPLAIN ANALYZE actually executes the statement, so cost/latency implications of running it are not stated.

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 action and output shape, then safety, then degradation behavior, then an example. Each clause carries information, though the parenthetical 'Redistribute Motion / Broadcast Motion / Gather Motion' enumeration is slightly heavy and the trailing example is arguably optional.

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?

An output schema exists, and the description still helpfully names the key rollup fields; annotations cover the read-only profile. Completeness is high for a 2-parameter tool, with the only real omission being the execution cost of running EXPLAIN ANALYZE on a live query.

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 50%: the database parameter is fully documented in the schema, while sql is not. The description compensates by defining sql as the statement handed to EXPLAIN ANALYZE and giving a concrete example invocation, which is enough meaning to call it correctly, though it does not state constraints on the SQL (e.g. SELECT-only) beyond the write/DDL rejection.

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 EXPLAIN (ANALYZE, FORMAT JSON) on sql') and immediately narrows scope to MPP-specific rollups: slice count, motion nodes, per-motion metadata. It is clearly differentiated from the sibling analyze_query_plan by its MPP focus and its 'available=false on vanilla PG' caveat.

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 establishes context (MPP databases) and signals when the tool is inapplicable ('On vanilla PG returns available=false'), plus relates itself to analyze_query_plan(io=True) for the safety model. It stops short of an explicit 'use analyze_query_plan instead when not on an MPP cluster' routing sentence, leaving that inference to the agent.

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

analyze_query_planAnalyze query planA
Read-only

Summarise a query's execution plan: total estimated cost, estimated rows, node types used, and any sequentially-scanned tables. Set io=true to run EXPLAIN (ANALYZE, BUFFERS, TIMING) instead of the plan-only variant — adds actual_total_time_ms, shared_blocks_read/hit, io_read_time_ms, io_write_time_ms, and (PG 19) aio_read_blocks / aio_write_blocks rolled up across the plan tree. Reasoning about AIO needs io=true.

Example: analyze_query_plan(sql='SELECT * FROM orders WHERE customer_id = 42', io=true)

NameRequiredDescriptionDefault
ioNo
sqlYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
node_typesYes
total_costYes
actual_rowsNo
estimated_rowsYes
aio_read_blocksNo
io_read_time_msNo
aio_write_blocksNo
io_write_time_msNo
sequential_scansYes
shared_blocks_hitNo
shared_blocks_readNo
actual_total_time_msNo

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety basics are covered, and the description does add genuine behavior detail about what the io variant returns and the PG 19 aio_* rollups. However, the most consequential behavioral fact is undisclosed: EXPLAIN ANALYZE actually executes the statement, so io=true incurs real runtime cost and can trigger side effects for volatile functions or writes — a caveat an agent needs before flipping that flag.

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 summary of outputs is front-loaded and the io toggle explanation follows logically, with a concrete example at the end. There is mild redundancy in the trailing sentence "Reasoning about AIO needs `io=true`," which restates what the preceding parenthetical already implies, but overall the text is dense and purposeful.

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 the description is not obliged to document return shapes, and it sensibly limits itself to flagging the extra io fields. The remaining gap is material for a plan-inspection tool: no statement of which statements are safe to analyze, no warning about execution cost under io=true, and no relation to the overlapping explain_query tool.

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 only 33%: `database` is well documented in the schema, while `sql` and `io` carry no schema descriptions at all. The description compensates strongly for `io` (it explains precisely what extra fields the flag produces and why AIO reasoning requires it) and partially for `sql` via a worked example, but it never states whether `sql` must be a single statement, whether writes/DDL are permitted, or whether placeholders are supported.

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+resource ("Summarise a query's execution plan") and enumerates exactly what is summarised: total estimated cost, estimated rows, node types, and sequentially-scanned tables. It is clear what the tool produces, but it never distinguishes itself from nearby siblings such as explain_query, why_is_this_slow, or analyze_mpp_query_plan, 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 Guidelines4/5

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

It gives real mode-selection guidance for the io flag: use io=true to get EXPLAIN (ANALYZE, BUFFERS, TIMING) with actual timings and block I/O, and it names the specific case ("Reasoning about AIO needs io=true"). What it lacks is any when-to-use-this-vs-explain_query routing or a statement of when plan-only is preferred (e.g., for expensive or non-SELECT statements).

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

analyze_reranker_liftAnalyze reranker liftA
Read-only

Per-query Spearman + Kendall correlation between bi-encoder and cross-encoder ranks, aggregated across queries in the window. Low correlation = the reranker is actively reordering (doing real work); high correlation = the reranker mostly confirms the bi-encoder order. Optional model / retrieval_index filters. Surfaces reranker_idle (WARNING) when the reranker rarely changes ordering. Reads from mcpg_rag.rerank_events; returns a report with zero counts when the table doesn't exist or the window is empty.

NameRequiredDescriptionDefault
daysNo
modelNo
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.
retrieval_indexNo

Output Schema

NameRequiredDescription
modelYes
findingsYes
query_countYes
window_daysYes
mean_kendallYes
p25_spearmanYes
p75_spearmanYes
mean_spearmanYes
interpretationYes
retrieval_indexYes

TDQS

A3.7/5.0
Behavior4/5

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

Beyond the readOnlyHint/openWorldHint annotations, it discloses the underlying source table (mcpg_rag.rerank_events), the degradation behavior when the table is missing or the window is empty (zero-count report rather than an error), and that it can emit a reranker_idle WARNING. That is genuine behavioral context an annotation cannot convey; the only gap is the absence of a threshold definition for 'rarely changes ordering'.

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?

Four dense sentences with the metric definition front-loaded, followed by interpretation, optional filters, warning behavior, and edge cases — a sensible priority order with no filler. Parenthetical clarifications earn their space; only slight tightening would be possible.

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?

An output schema exists, so return-value explanation is rightly omitted, and the description still covers data source, aggregation scope, filters, warning emission, and empty/missing-table behavior — a lot for a 4-parameter read-only tool. The remaining shortfall is quantitative: no guidance on what counts as 'low' vs 'high' correlation or what minimal volume of rerank events is needed for a meaningful signal.

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 only 25% (just `database`), so the description must carry weight: it flags `model` and `retrieval_index` as optional filters and the 'window' wording maps loosely to `days`. However, it gives no format or default for `days`, no example values for `model`/`retrieval_index`, and does not say whether the filters apply to queries, documents, or both — partial compensation only.

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 names a specific computation (per-query Spearman + Kendall correlation between bi-encoder and cross-encoder ranks, aggregated over a window), which is far more precise than the title alone. It implicitly separates itself from neighbors like analyze_rerank_ndcg or analyze_rerank_score_distribution by stating exactly which statistic it produces, though it never names an alternative explicitly.

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?

It explains how to interpret results (low correlation = reranker actively reordering, high = confirming), which implies the diagnostic use case, but there is no explicit 'use this when…' statement, no exclusions, and no pointer to the sibling rerank tools (ndcg, score distribution, recommend_rerank_strategy). An agent knows what the number means but not when to prefer this over the other rerank analyses.

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

analyze_rerank_ndcgAnalyze rerank NDCGA
Read-only

NDCG@k under bi-encoder ordering vs cross-encoder ordering, averaged across labeled queries (ground_truth_relevance IS NOT NULL). Reports the delta (cross - bi) — positive = the rerank is adding real ranking quality, negative = it's hurting. Surfaces rerank_hurts_ndcg (CRITICAL) or rerank_lifts_ndcg (GOOD evidence). Reads from mcpg_rag.rerank_events; returns zero counts when no labeled rows exist in the window.

NameRequiredDescriptionDefault
kNo
daysNo
modelNo
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.
retrieval_indexNo

Output Schema

NameRequiredDescription
kYes
deltaYes
modelYes
findingsYes
window_daysYes
retrieval_indexYes
labeled_query_countYes
ndcg_at_k_under_bi_orderYes
ndcg_at_k_under_cross_orderYes

TDQS

A3.9/5.0
Behavior5/5

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

Adds substantial behavior beyond the readOnly annotation: source table mcpg_rag.rerank_events, the labeling precondition (ground_truth_relevance IS NOT NULL), the emitted finding names with severities (rerank_hurts_ndcg CRITICAL, rerank_lifts_ndcg GOOD evidence), and the zero-count edge case when no labeled rows exist.

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?

Dense but front-loaded: metric and comparison first, delta semantics next, then findings and data-source caveats. Terminology like 'bi-encoder ordering vs cross-encoder ordering' is necessary; no filler sentences.

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 shape need not be spelled out, and behavioral coverage is strong. However, with five parameters and four of them undocumented anywhere, the description is not complete enough for an agent to size the window, tune `k`, or scope by `model` without guessing.

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 only 20% (only `database` is documented). The description never explains `k`, `days`, `model`, or `retrieval_index`; only 'in the window' loosely implies `days` is a time range. An agent must guess what `k` sets and how `model` filters.

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 metric (NDCG@k), the two orderings being compared (bi-encoder vs cross-encoder), the aggregation unit (labeled queries), and the reported quantity (delta = cross - bi). This is clearly distinct from siblings like analyze_reranker_lift and analyze_rerank_score_distribution.

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 sign interpretation ('positive = adding real ranking quality, negative = hurting') gives result-reading guidance, but there is no explicit statement of when to choose this over analyze_reranker_lift or recommend_rerank_strategy. Usage is implied rather than directed.

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

analyze_rerank_score_distributionAnalyze rerank score distributionA
Read-only

Equal-width histogram of cross_encoder_score values over the window plus the top-decile share. Surfaces score_clustering (WARNING) when the reranker isn't discriminating (more than half of scores land in the top decile of the range). Reads from mcpg_rag.rerank_events. Returns an object with window_days, event_count, histogram (list of counts), bucket_edges (list of bucket boundaries), top_decile_share, and findings (list of advisory findings).

NameRequiredDescriptionDefault
daysNo
modelNo
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.
n_bucketsNo
retrieval_indexNo

Output Schema

NameRequiredDescription
modelYes
findingsYes
histogramYes
event_countYes
window_daysYes
bucket_edgesYes
retrieval_indexYes
top_decile_shareYes

TDQS

A3.7/5.0
Behavior4/5

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

Annotations only declare readOnlyHint and openWorldHint, so the description carries the real behavioral load: it names the source table (mcpg_rag.rerank_events) and defines the exact WARNING trigger (more than half of scores in the top decile of the range). It adds meaningful interpretation semantics beyond the annotations, though it says nothing about cost, volume, or limits on the scan.

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?

Three dense sentences that are front-loaded with the core measure and then the alert semantics; nothing is padding. The final enumeration of return fields is somewhat redundant given an output schema exists, keeping it short of a 5.

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

Completeness3/5

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

For a read-only analytical tool with zero required parameters, the description covers purpose, source, and alert condition well, and the output schema handles return values. However, with four of five parameters undocumented and no guidance on choosing this analysis over its reranker-analysis siblings, an agent lacks enough to pick and configure it confidently.

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 only 20% — just the `database` parameter is documented — so the description must compensate and largely does not. 'Over the window' loosely implies `days`, and 'equal-width histogram' loosely relates to `n_buckets`, but `model` and `retrieval_index` are never explained, and no defaults or filter semantics are given.

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 precise verb and measure: 'Equal-width histogram of cross_encoder_score values over the window plus the top-decile share', and names the specific finding it produces (`score_clustering`). This is concretely distinguishable from sibling analyses such as analyze_reranker_lift and analyze_rerank_ndcg, which measure lift and ranking quality rather than score spread.

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 description says it surfaces `score_clustering` when the reranker isn't discriminating, which hints at a diagnostic use case. It never states when to pick this over analyze_reranker_lift, analyze_rerank_ndcg, or recommend_rerank_strategy, and offers no exclusions or prerequisites.

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

analyze_session_costAnalyze session costA
Read-only

Surface hot-path inefficiencies from the audit log. Reads mcpg_audit.events over the last lookback_minutes (default 60, capped at 1440) and flags tools called more than hot_threshold times (default 10). Catalogue-listing tools (list_tables / list_schemas / list_indexes / etc.) get a redundant_listing finding pointing at get_compact_schema; other tools get a hot_repeated_call finding suggesting caching. Idle sessions get an idle_session finding. When mcpg_audit.events doesn't exist (audit subsystem off) returns audit_table_present=False with a diagnostic. Returns an object with audit_table_present (bool), events_examined (int), lookback_minutes, findings (list of objects with reason, tool, call_count, suggestion), and detail.

Example: analyze_session_cost(lookback_minutes=30, hot_threshold=15)

NameRequiredDescriptionDefault
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.
hot_thresholdNo
lookback_minutesNo

Output Schema

NameRequiredDescription
detailNo
findingsYes
events_examinedYes
lookback_minutesYes
audit_table_presentYes

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 and openWorldHint=false, and the description adds real value on top: the data source, the 1440-minute cap on lookback, the default thresholds, and the specific finding taxonomy (redundant_listing, hot_repeated_call, idle_session). It also discloses graceful degradation to audit_table_present=False when the audit table is absent, which is exactly the kind of behavioral trait annotations cannot express. However, it never states cost or volume characteristics — e.g. how expensive scanning a 1440-minute window is, or whether results are sampled — leaving the agent without a sense of call risk on large windows.

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 description is front-loaded with the core action and source, then layers thresholds, finding types, and the failure mode in a logical order, closing with a concrete call example. It is dense but each clause carries information; the one redundancy is restating the return object shape, which the output schema already defines.

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

Completeness4/5

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

Given an output schema exists, the description need not enumerate return fields, yet it does — a minor duplication rather than a harm. Everything an agent needs to invoke it correctly is present: source table, both tunable thresholds with defaults and a cap, finding semantics, and the no-audit-table diagnostic path. The only real omission is the role of the `database` parameter for this read path.

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 only 33% (only `database` is documented in-schema), so the description must carry the rest — and it does, giving defaults for `lookback_minutes` (60) and `hot_threshold` (10) plus the 1440 cap that the schema does not express. The `database` parameter is not mentioned at all in the description, so it is unclear whether the audit events are read from the primary or the selected secondary, which is a meaningful gap for a multi-database tool.

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 — "Surface hot-path inefficiencies from the audit log" — then names the exact source table (mcpg_audit.events) and the finding categories produced. It is clearly distinguishable from siblings like list_audit_events (raw events) or analyze_workload (query workload), since it is scoped to per-tool call counts and redundant catalogue listings.

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

Usage Guidelines4/5

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

It gives clear triggering context (analyzing audit-log call patterns with configurable lookback and hot threshold) and even routes the agent onward via the 'suggestion' field (get_compact_schema for redundant listings). It does not explicitly say when to prefer this over analyze_workload or list_audit_events, nor state prerequisites such as the audit subsystem needing to be enabled — only the degradation behavior is described.

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

analyze_table_bloatAnalyze table bloatA
Read-only

Rank a schema's tables and indexes by estimated bloat, worst first. By default uses a cheap catalog-only estimate (relpages vs a reltuples/row-width floor) plus the dead-tuple ratio from pg_stat_user_tables. Set precise=true to use pgstattuple / pgstatindex for an exact (but I/O-heavy) read when the extension is installed — it falls back to the estimate and reports method='estimate' if it isn't. Returns tables and indexes (each capped at limit) with per-object est_bloat_pct, plus available and method.

Example: analyze_table_bloat(schema='public', limit=20, precise=false)

NameRequiredDescriptionDefault
limitNo
schemaYes
preciseNo
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
detailYes
methodYes
schemaYes
tablesYes
indexesYes
availableYes

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the readOnlyHint/openWorldHint annotations, it discloses that the default path reads relpages/reltuples plus pg_stat_user_tables, that the precise path is I/O-heavy, and — critically — that the tool silently falls back to the estimate and reports `method='estimate'` when pgstattuple is absent. That fallback semantics is exactly the kind of non-obvious behavior an agent needs before interpreting results.

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

Conciseness5/5

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

Front-loads the purpose in the first sentence, then default behavior, then the opt-in precise mode, then the return shape, then a concrete example. Every clause carries information — the row-width floor, the dead-tuple ratio, and the fallback are all load-bearing.

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 4-parameter read-only analysis tool with an output schema, this covers everything needed: cost profile, extension dependency, fallback reporting, and which keys come back. Nothing an agent needs to call it correctly or interpret `method` 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 only 25% (only `database` is documented inline), so the description must compensate, and it largely does: `precise` gains fallback/extension semantics, `limit` is explained as a per-collection cap on `tables` and `indexes`, and `schema` is demonstrated in the example. Only `database` is left to the schema, which already documents it adequately.

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?

Names a specific verb (rank) and resource (a schema's tables and indexes) plus the ordering guarantee (worst bloat first). No sibling tool in the list covers bloat estimation, and the description makes the output shape explicit enough that an agent can distinguish it from neighbors like summarize_table or recommend_index_drops.

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 clear when-to-use guidance for the key decision: default cheap catalog-only estimate versus `precise=true` when exact pgstattuple/pgstatindex reads are needed and the extension is installed. It flags the I/O cost of the precise path, which is the main tradeoff an agent must weigh. It does not explicitly say when not to use the tool or name an alternative sibling, so it falls short of a 5.

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

analyze_topk_stabilityAnalyze top-k stabilityB
Read-only

Jaccard overlap between top-K-by-bi-rank and top-K-by-cross-rank per query, aggregated. High mean Jaccard means the reranker isn't actually changing the top-K membership. Surfaces topk_stable (WARNING) when the rerank is barely earning its place at this K. Reads from mcpg_rag.rerank_events; returns a report with zero counts when the table doesn't exist or the window is empty.

NameRequiredDescriptionDefault
kNo
daysNo
modelNo
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.
retrieval_indexNo

Output Schema

NameRequiredDescription
kYes
modelYes
findingsYes
p25_jaccardYes
p75_jaccardYes
query_countYes
window_daysYes
mean_jaccardYes
retrieval_indexYes

TDQS

B3.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered; the description goes further by naming the data source (mcpg_rag.rerank_events), the emitted flag (topk_stable at WARNING severity), and the degraded path — zero counts when the table is absent or the window is empty. That empty-table fallback is exactly the kind of behavior an agent cannot infer from 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.

Conciseness4/5

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

Leads with the metric definition, then interpretation, then the emitted signal, then data-source and edge-case handling — a sensible front-loaded ordering with no filler. Four sentences is proportionate, though the double-backtick markup around topk_stable is noise.

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?

With an output schema present, the description needn't explain the report shape and correctly focuses on method, interpretation, and failure mode. For a 5-parameter analytical tool with 0 required parameters and near-zero schema coverage, however, the absence of any guidance on k, days, model, or retrieval_index leaves the caller guessing at scope.

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?

Five parameters with only 20% schema description coverage, and the description explains none of them beyond the incidental phrases 'at this K' and 'the window'. It never says what k selects, what unit days represents, or how model and retrieval_index scope the query, so it does not compensate for the low coverage.

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?

Names the exact computation (Jaccard overlap between top-K-by-bi-rank and top-K-by-cross-rank, aggregated per query) and the meaning of the score, which is specific enough to separate it from NDCG/lift siblings in the rerank family. It never names a sibling explicitly, so differentiation is implicit rather than stated.

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 by 'High mean Jaccard means the reranker isn't actually changing the top-K membership' and 'when the rerank is barely earning its place at this K', which tells an agent the diagnostic situation. There is no explicit when-to-use / when-not-to-use statement and no routing to analyze_rerank_ndcg or analyze_reranker_lift for the adjacent questions.

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

analyze_vector_search_efficiencyAnalyze vector search efficiencyA
Read-only

Cross-backend retrieval-quality report for a pgvector or pg_turboquant ANN index. Detects the backend (HNSW / IVFFlat / turboquant), sweeps the matching per-backend knob (ef_search / probes / candidate_limit) across a multiplier curve, computes recall@k vs a brute-force exact baseline, Spearman + Kendall rank correlation, per-query p50/p95 wall-clock latency, and (for turboquant) the page-pruning ratio from tq_last_scan_stats. Emits findings: baseline_recall_low (CRITICAL), rerank_lift_flat / rerank_lift_steep / ranking_degraded / pruning_ineffective (WARNING). Burns sample_size x (1 + len(candidate_multipliers)) queries; ad-hoc diagnostic, not a cron tool. Requires the vector extension; turboquant-arm metrics require pg_turboquant.

NameRequiredDescriptionDefault
kNo
tableYes
columnYes
metricNocosine
schemaYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.
id_columnYes
index_nameNo
sample_sizeNo
candidate_multipliersNo

Output Schema

NameRequiredDescription
kYes
tableYes
columnYes
metricYes
schemaYes
backendYes
findingsYes
index_nameYes
sample_sizeYes
rerank_lift_curveYes
recall_at_k_baselineYes
pages_pruned_ratio_p50Yes
score_rank_correlation_kendallYes
score_rank_correlation_spearmanYes

TDQS

A4.1/5.0
Behavior5/5

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

Beyond the readOnlyHint/openWorldHint annotations, the description discloses scan mechanics (detects backend, sweeps the matching knob across a multiplier curve), emitted finding codes with severities, and cost — sample_size × (1 + len(candidate_multipliers)) queries burned. It also flags read scoping and extension dependencies 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?

One dense but well-ordered paragraph: purpose first, then method, then outputs, then cost and prerequisites. Every clause carries information, though the parenthetical enumeration of finding codes and metric lists makes it heavier than necessary for an at-a-glance read.

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?

An output schema exists, so return values need not be spelled out, yet the description still usefully summarizes finding codes and severities. For a complex diagnostic tool with read-only annotations, the main remaining gaps are parameter-level semantics and explicit sibling routing rather than missing behavioral 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 coverage is only 10% across 10 parameters, so the description must carry the load. It implicitly explains k (recall@k), sample_size (query cost), and candidate_multipliers (curve), but leaves metric (cosine/l2/ip options), id_column, index_name, schema/table/column, and database targeting unaddressed — and database semantics live only in the 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?

States a specific verb and resource — a cross-backend retrieval-quality report for a pgvector or pg_turboquant ANN index — and immediately names the scope (HNSW / IVFFlat / turboquant) and what is computed. An agent can distinguish it from siblings like vector_recall_at_k, analyze_hnsw_recall, or recommend_hnsw_ef_search 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 Guidelines4/5

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

Gives explicit when-not guidance ("ad-hoc diagnostic, not a cron tool") and prerequisites (vector extension required; turboquant-arm metrics require pg_turboquant). It does not name the narrower sibling tools (e.g. analyze_hnsw_recall or recommend_hnsw_ef_search) that an agent might prefer for single-backend knob tuning, so routing is only partially covered.

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

analyze_workloadAnalyze workloadA
Read-only

Return the slowest queries by mean execution time, via the pg_stat_statements extension. Reports availability=false if the extension is not installed.

Example: analyze_workload(limit=10)

NameRequiredDescriptionDefault
limitNo
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
availableYes
slow_queriesYes

TDQS

A3.7/5.0
Behavior4/5

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

Beyond the readOnlyHint/openWorldHint annotations, the description discloses a real behavioral trait: the tool is unavailable unless the pg_stat_statements extension is installed, and it degrades to availability=false rather than erroring. That failure mode is exactly the kind of context annotations cannot convey; only the return shape is left to the output 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?

Two tight sentences with the core behavior front-loaded, followed by a short example. The example adds modest value by showing the limit parameter in context, but it borders on redundant with the default already visible in the schema.

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 two-parameter read-only tool with an output schema, this covers the essentials: what is measured, the extension dependency, and the degraded response. Only the semantics of limit and the meaning of 'slowest' relative to other ranking options remain unstated.

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 50%: database is well documented in the schema, but limit has no description at all. The example analyze_workload(limit=10) hints at usage and the default but never states that limit truncates the result set to the top N by mean time, so the gap is only partly closed.

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 names a specific verb and resource with its ranking metric: return the slowest queries by mean execution time. That distinguishes it from neighbors like list_active_queries (current activity) and why_is_this_slow, though it never explicitly names an alternative to route away from.

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 by the narrow framing (workload = slowest by mean time), and the pg_stat_statements prerequisite is stated. But there is no explicit when-to-use/when-not or pointer to a sibling such as why_is_this_slow or analyze_query_plan for drill-down.

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

audit_databaseAudit databaseA
Read-only

Run a deep, comprehensive DBA-level database performance, logs, and health audit over the specified schema. Scans memory, checkpoints, temp file spills, contention locks, dead tuple cleanliness, and optionally scans custom logging tables. Set fresh=true to bypass the cache and re-read live (e.g. after a schema change). Returns an object with timestamp, database, version, overall_health ('GOOD' / 'WARNING' / 'CRITICAL'), health_score (int), categories (per-area results), top_issues, recommendations, and raw_stats_snapshot.

NameRequiredDescriptionDefault
freshNo
schemaYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.
log_tableNo

Output Schema

NameRequiredDescription
versionYes
databaseYes
timestampYes
categoriesYes
top_issuesYes
health_scoreYes
overall_healthYes
recommendationsYes
raw_stats_snapshotYes

TDQS

A3.9/5.0
Behavior4/5

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

The annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds useful behavior beyond that: it discloses the caching behavior and how `fresh=true` forces live re-reading, and it describes the broad set of areas scanned. It does not discuss runtime cost or permissions, but it adds meaningful context 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.

Conciseness4/5

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

The description is front-loaded with the core purpose and scan domains, and the `fresh` guidance is placed usefully after that. The final enumeration of returned fields is somewhat redundant because an output schema exists, but overall the description remains readable and mostly earns its length.

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 complex audit tool, the description covers purpose, scan scope, cache behavior, and output shape. Rich structured data is present (output schema and annotations), and the schema documents the `database` targeting parameter, but the `log_table` parameter remains underspecified in both description and schema, leaving a small gap.

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 only 25%, with only the `database` parameter documented in the schema. The description compensates somewhat by explaining `fresh` behavior and implying optional log-table scanning, but it does not explain the `log_table` parameter format or give details on the required `schema` scope beyond 'over the specified schema.' This is adequate but leaves clear gaps.

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: 'Run a deep, comprehensive DBA-level database performance, logs, and health audit over the specified schema.' It also enumerates the scan areas (memory, checkpoints, temp file spills, contention locks, dead tuple cleanliness, custom logging tables), which clearly distinguishes it from narrower sibling tools such as check_database_health or audit_settings.

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

Usage Guidelines3/5

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

The description gives useful runtime guidance for the `fresh` flag, telling the agent to set it true after a schema change to bypass the cache. However, it does not explicitly say when to choose this tool over similar siblings like check_database_health, run_advisors, or analyze_workload, so the tool-selection guidance is implied rather than explicit.

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

audit_sequencesAudit sequencesA
Read-only

Flag sequences nearing their ceiling — serial / identity / explicit sequences whose last_value / max_value exceeds warning_pct (default 80) or critical_pct (default 95). Sequence overflow is catastrophic and silent until the next nextval() raises 'reached maximum value' — the int4 serial ceiling (2^31-1) is hit far more often than expected. Pure read; available=false on PG < 10 (no pg_sequences). Returns an object with available, total_examined, warning_pct, critical_pct, detail, and sequences (at-risk only, sorted by used_pct desc — each with schema, sequence, last_value, max_value, used_pct, remaining, status).

Example: audit_sequences(warning_pct=80, critical_pct=95)

NameRequiredDescriptionDefault
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.
warning_pctNo
critical_pctNo

Output Schema

NameRequiredDescription
detailNo
availableYes
sequencesYes
warning_pctYes
critical_pctYes
total_examinedYes

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already cover readOnlyHint, but the description goes further: it declares the PG-10-and-up requirement, the availability flag, the sort order of returned rows, and that only at-risk sequences are returned. This is meaningful behavior beyond what the annotation block provides; it only lacks guidance on cost/side effects for very large catalogs.

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 rationale, then preconditions, then return shape, then an example. Dense but every sentence carries information; the return-field enumeration partly duplicates the output schema 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?

Given an output schema exists, the description covers what the agent still needs: the triggering condition, defaults, the PG-version limitation, and the meaning of `available`. Only the `database` parameter semantics are left uncovered by both description and schema coverage.

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 only 33% and two parameters (warning_pct, critical_pct) have no schema descriptions, so the description earns credit for explaining that these are thresholds on last_value/max_value with defaults 80 and 95, and for the worked example. However it says nothing about the `database` parameter (secondary read-only targeting), leaving a real 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 ('Flag sequences nearing their ceiling') plus the exact predicate (last_value/max_value exceeding warning_pct or critical_pct). It also implicitly distinguishes itself from list_sequences by being a threshold-based audit rather than an enumeration, so an agent can pick between them 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 Guidelines4/5

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

Explains the use case and the motivating failure mode ('nextval() raises reached maximum value'), and gives a runtime precondition (available=false on PG < 10). It stops short of naming an explicit alternative or saying when not to bother running this audit.

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

audit_settingsAudit settingsA
Read-only

Sanity-sweep postgresql.conf via pg_settings. Flags dangerous toggles (fsync=off, full_page_writes=off, autovacuum=off, synchronous_commit=off), cross-setting issues (maintenance_work_mem < work_mem, tiny shared_buffers, low checkpoint_completion_target), and — when total_ram_mb is supplied — RAM-relative ratios for shared_buffers / effective_cache_size (PostgreSQL can't see host RAM itself). Pure read. Returns an object with ram_aware (bool), examined_settings (list), detail, and findings (tripped rules only — each with code, setting, current, status, suggestion).

Example: audit_settings(total_ram_mb=16384)

NameRequiredDescriptionDefault
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.
total_ram_mbNo

Output Schema

NameRequiredDescription
detailNo
findingsYes
ram_awareYes
examined_settingsYes

TDQS

A4.5/5.0
Behavior5/5

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

Annotations declare readOnlyHint=true and openWorldHint=false; the description is consistent ('Pure read') and adds substantive context beyond them: the source of truth is `pg_settings`, host RAM is invisible to PostgreSQL hence the optional parameter, and `findings` contains only tripped rules. That is exactly the kind of behavior an agent needs to predict the outcome shape.

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 action, then rule categories, then a return-value summary and an example; almost no filler. The middle sentence is heavily parenthetical and dense, which costs a little readability, but every clause carries information.

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

Completeness4/5

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

With annotations covering safety and an output schema covering the return object, the description only needs to cover behavior — which it does, including the optional RAM-aware mode. It omits any mention of required privileges or version dependence of the checked settings, a minor gap for a config-audit tool.

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 50%: `database` is well documented in the schema, while `total_ram_mb` has no schema description. The description compensates by explaining that supplying it enables RAM-relative ratios and why (PostgreSQL cannot see host RAM), plus a worked example with 16384. Units and plausible bounds are only implied by the parameter name.

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: a sanity sweep of `postgresql.conf` via `pg_settings`, enumerating the exact rule classes it checks (dangerous toggles, cross-setting ratios, RAM-relative ratios). This is clearly distinct from adjacent siblings like `inspect_guc` (single setting) and `recommend_postgres_conf` (recommendations rather than pass/fail findings).

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 conditional 'when `total_ram_mb` is supplied' clause makes the two invocation modes explicit, and the example shows a concrete call. It does not, however, say when to prefer this over `recommend_postgres_conf` or `check_database_health`, so the agent must infer the boundary from names.

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

check_database_healthCheck database healthB
Read-only

Run database health checks: connection utilisation, buffer cache hit ratio, tables needing vacuum, and invalid indexes. Returns an object with status ('ok' / 'warning' / 'critical') and checks (a list of {name, status, detail} per check).

Example: check_database_health()

NameRequiredDescriptionDefault
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
checksYes
statusYes

TDQS

B3.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description goes beyond that by naming the four concrete checks and the severity model ('ok'/'warning'/'critical'), which tells the agent what a call actually costs and what signal it yields. It does not say whether thresholds are configurable or whether the check is expensive on large clusters.

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?

Two tight sentences front-load the checks, then the return shape. The return-shape sentence is partly redundant given an output schema exists, and the `check_database_health()` example adds little since it passes no arguments, but neither is costly.

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?

Return values are covered by the output schema, so the description needn't explain them. However, for a health/diagnostic tool it leaves out what the status levels mean operationally, and it ignores the optional secondary-database targeting that changes what is being checked.

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 sole parameter's description already explains the primary-vs-secondary targeting and the rejection of non-configured names. The tool description says nothing about the `database` argument, so it adds no meaning beyond the schema; baseline 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?

States a specific verb and resource ("Run database health checks") and enumerates the exact checks performed: connection utilisation, buffer cache hit ratio, vacuum-needed tables, invalid indexes. That is far more precise than the title alone, but it never distinguishes itself from sibling diagnostics such as audit_database or run_advisors.

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

Usage Guidelines2/5

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

There is no when-to-use or when-not-to-use guidance, no prerequisites, and no pointer to alternatives among the many diagnostic siblings (audit_database, run_advisors, analyze_table_bloat). The agent must infer the invocation context purely from the tool name.

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

check_pitr_readinessCheck PITR readinessA
Read-only

Assess whether the cluster is ready for point-in-time recovery (PITR) — the one-call 'could I actually recover to an arbitrary point right now, and if not what's missing?' check. Composes get_wal_archive_status (5.2) with the GUCs that gate PITR: continuous archiving must be healthy, wal_level >= replica, max_wal_senders >= 1 (so pg_basebackup can stream a base backup), and full_page_writes on (torn-page safety during replay). Read-only advisor — changes nothing, emits no secrets. Returns an object with available, ready (bool — true only when all gates pass), wal_level, archiving_healthy, gates (list of objects with name, ok, observed, remediation), remediation (ordered fixes for failing gates), and detail.

Example: check_pitr_readiness()

NameRequiredDescriptionDefault
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
gatesYes
readyYes
detailNo
availableYes
wal_levelYes
remediationYes
archiving_healthyYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false; the description reinforces this with "changes nothing, emits no secrets" and adds substantive behavior the annotations cannot convey: which four gates are evaluated and why each matters. It does go on to enumerate return fields even though an output schema exists, which is mildly redundant, but the gate semantics are genuinely additive.

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 claim is front-loaded in the first clause, and the intervening gate rationale is dense but purpose-driven. The trailing enumeration of return fields and the example call are somewhat redundant given the output schema, costing a point but not obscuring the main point.

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-required-parameter read-only advisor with full schema coverage, annotations, and an output schema, the description covers everything an agent needs: what is checked, what the gates mean, that nothing is mutated, and that remediation guidance is returned. 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?

With a single optional `database` parameter and 100% schema description coverage, the schema already explains that it targets a configured secondary and that non-configured names are rejected. The description adds no additional meaning about this parameter, 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 opens with a specific verb and resource ("Assess whether the cluster is ready for point-in-time recovery") and frames the scope as a composite readiness verdict rather than a raw metric dump. It explicitly names the sibling it composes (`get_wal_archive_status`), so an agent can distinguish this advisory tool from the lower-level archive-status tool.

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

Usage Guidelines4/5

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

It gives a clear situational trigger — "could I actually recover to an arbitrary point right now, and if not what's missing?" — which tells the agent when this one-call check is the right choice over manually inspecting GUCs. It stops short of explicit when-not-to-use guidance or naming sibling alternatives (e.g. inspect_guc, read_pg_stat_recovery) for partial checks.

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

check_segment_healthCheck segment healthA
Read-only

Walk gp_segment_configuration and surface MPP segment posture. Returns per-segment status ('u' = up), mode ('s' = sync / 'n' = not-in-sync / 'c' = changetracking), and role vs preferred_role to detect post-failover state. Top-level unhealthy_count + out_of_sync_count let agents branch without walking the segments array. Read-only. On vanilla PG returns available=false.

Example: check_segment_health()

NameRequiredDescriptionDefault
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
detailYes
segmentsYes
availableYes
healthy_countYes
total_segmentsYes
unhealthy_countYes
out_of_sync_countYes

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so restating 'Read-only' adds little; the value comes from disclosing the code semantics ('u' = up, 's'/'n'/'c' modes), the aggregate counters that let an agent branch without walking the array, and the graceful degradation to `available=false` on vanilla Postgres. That is genuine behavioral context beyond the annotations and 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?

The description is front-loaded with the core action and return shape, and each sentence carries information (field codes, aggregate counters, fallback behavior). Minor waste: 'Read-only' duplicates the annotation, and the trailing example `check_segment_health()` is near-redundant for a zero-required-parameter tool.

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

Completeness4/5

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

With an output schema present, the description needn't explain return values, yet it still summarizes the key fields and the vanilla-PG degradation path, which is the most likely source of agent confusion. The only gap is that it doesn't state why one would target a secondary database via the `database` parameter.

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 single optional `database` parameter is fully documented in the schema, including the rejection of non-configured names. The description adds nothing about the parameter, so the baseline 3 applies rather than a higher score.

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 and resource (walk `gp_segment_configuration`, surface MPP segment posture) and enumerates the exact fields returned (status, mode, role vs preferred_role). It is clearly distinguishable from generic siblings such as check_database_health or get_warehousepg_status because it is explicitly scoped to MPP segments and post-failover state.

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 through the motivation (detect post-failover state, branch on `unhealthy_count`/`out_of_sync_count`) and the exclusion cue that vanilla PG yields `available=false`. However, it never explicitly says when to pick this over `check_database_health`, `get_warehousepg_status`, or `list_replicas`, leaving the agent to infer the boundary.

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

close_cursorClose cursorB
Read-only

Close a server-side cursor and release its dedicated connection. Idempotent — returns closed=false when the cursor was not open (already closed, expired, or never existed).

NameRequiredDescriptionDefault
cursor_idYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.1/5.0
Behavior1/5

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

The description claims to 'release its dedicated connection', implying a state change, while annotations mark readOnlyHint=true. This contradicts the annotation's implication of no side effects, warranting a score of 1 per the rules.

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, no wasted words, and conveys essential information efficiently.

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

Completeness2/5

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

While an output schema exists, the description lacks guidance on the required parameter 'cursor_id' and does not mention potential errors or prerequisites. For a tool with one required param, this is insufficient.

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

Parameters1/5

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

Schema description coverage is 0% and the description does not explain the parameter 'cursor_id' beyond its name. The description adds no meaning to the input 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 clearly states the action ('Close a server-side cursor and release its dedicated connection'), uses specific verb 'close', and distinguishes it from sibling tools like open_cursor and fetch_cursor.

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 notes idempotency and the behavior when cursor is not open, giving guidance on safe reuse. However, it does not explicitly contrast with alternatives or state prerequisites, though this is straightforward for a cursor lifecycle tool.

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

cluster_vectorsCluster vectorsA
Read-only

k-means cluster a pgvector column. Samples up to sample_size (default 5000) non-NULL rows of schema.table.embedding_column, runs Lloyd's algorithm with k-means++ seeding (seed for determinism), and returns centroids (one per cluster, with size) + assignments (per-row cluster index + distance). When id_column is set each assignment carries that column's value; otherwise the row's positional sample index. metric='l2' (default — squared Euclidean) or 'cosine' (vectors normalised; centroids re-normalised every iteration). k >= 2 and there must be at least 2k parseable rows. Reports available=false if pgvector is not installed.

Example: cluster_vectors(schema='public', table='docs', embedding_column='embedding', k=8, metric='cosine')

NameRequiredDescriptionDefault
kYes
seedNo
tableYes
metricNol2
schemaYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.
id_columnNo
sample_sizeNo
max_iterationsNo
embedding_columnYes

Output Schema

NameRequiredDescription
metricYes
inertiaYes
availableYes
centroidsYes
convergedYes
dimensionYes
iterationsYes
assignmentsYes
sampled_rowsYes

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, and the description still adds substantial context: sampling cap of sample_size non-NULL rows, k-means++ seeding with seed for determinism, per-iteration re-normalisation under cosine, and a graceful available=false path. It stops short of describing cost/latency or iteration behaviour at the max-iterations cutoff.

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 operation, then mechanics, then constraints, then a runnable example. Dense but almost every clause adds operational meaning; the parenthetical defaults are slightly redundant with the schema but serve as a quick reference.

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 10-parameter analytical tool with an output schema present, the description covers the essential mechanics, metric semantics, constraints and failure mode. The one real hole is max_iterations, which affects runtime and result quality but is never described.

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 only 10%, so the description carries most of the burden and does well for sample_size (default 5000), seed, metric ('l2' squared Euclidean vs 'cosine' normalised), k (>= 2) and id_column (assignment identity vs positional sample index). However max_iterations is never mentioned and the sampling/failure semantics of the remaining params are thin, so it only partly compensates for a 10% coverage 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?

States a specific verb and resource: 'k-means cluster a pgvector column' on schema.table.embedding_column. An agent can tell this apart from retrieval siblings like vector_search or diagnostic siblings like detect_vector_outliers without opening any schema.

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: it covers preconditions (pgvector required, k >= 2, at least 2k parseable rows, available=false otherwise) which tells the agent when it will fail, but never says when to pick this over sibling tools such as analyze_distance_metric or detect_vector_outliers. No explicit when-to-use/when-not guidance.

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

compare_schemasCompare schemasA
Read-only

Return the structural diff between two schemas — tables/columns/indexes/constraints/foreign-keys added, removed, or changed. Base tables only; views and custom types are not compared. Renames surface as a paired add + remove.

Example: compare_schemas(left_schema='public', right_schema='staging')

NameRequiredDescriptionDefault
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.
left_schemaYes
right_schemaYes

Output Schema

NameRequiredDescription
left_schemaYes
right_schemaYes
tables_addedYes
tables_changedYes
tables_removedYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnlyHint=true, openWorldHint=false), and the description goes further with real behavioral context: the granularity of objects diffed, the exclusion of views and custom types, and the notable quirk that renames appear as a paired add + remove rather than as a rename — something an agent could otherwise misreport. It doesn't discuss size/limits of the diff output, which is the only meaningful gap.

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?

Three short sentences front-load the return value, then scope limits, then the rename quirk, with the example last. No filler, and each sentence carries distinct information.

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?

An output schema exists, so the description isn't obligated to explain the diff structure, and for a two-schema comparison tool the stated scope and rename behavior are nearly sufficient. The missing piece is the left/right directionality, which matters for interpreting any diff result.

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 only 33%: the database parameter is well documented inline, but left_schema and right_schema have no schema-level descriptions. The example supplies value semantics for those two (schema names such as 'public' and 'staging'), but the description never states the direction of the diff — which side counts as 'added' versus 'removed' — leaving a real risk of inverted interpretation.

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 result object — 'structural diff between two schemas' — and enumerates exactly what is compared (tables/columns/indexes/constraints/foreign-keys). It also carves out scope ('base tables only; views and custom types are not compared'), which cleanly separates it from siblings like list_views, list_composite_types, or generate_schema_diagram.

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?

Explicit exclusions tell the agent when this tool will NOT answer the question (views, custom types), and the worked example demonstrates a concrete call. It stops short of naming an alternative tool for the excluded cases, so the agent must infer that from siblings, but the usage context is otherwise clear.

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

cross_table_similarityCross table similarityA
Read-only

Find the k rows in target_schema.target_table most similar to a specific row in source_schema.source_table. Locates the source row via source_id_column = source_id_value, reads its embedding from source_embedding_column, then issues a pgvector k-NN query against target_embedding_column. Both columns must be vector(N) of the same N — verified from the catalog up front so a mismatch fails with a clear error rather than a cast error. Useful for entity-resolution / linking across tables whose embeddings come from different models but share a dimension. Returns source_embedding_found=false when no row matches the id value. Reports available=false if pgvector is not installed.

NameRequiredDescriptionDefault
kNo
metricNol2
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.
source_tableYes
target_tableYes
source_schemaYes
target_schemaYes
source_id_valueYes
source_id_columnYes
source_embedding_columnYes
target_embedding_columnYes

Output Schema

NameRequiredDescription
matchesYes
availableYes
source_dimensionYes
source_embedding_foundYes

TDQS

A4.4/5.0
Behavior5/5

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

Well beyond the readOnlyHint/openWorldHint annotations, it discloses the internal sequence (locate source row by id, read embedding, issue k-NN against target), the up-front dimension validation that converts a silent cast error into a clear failure, and the two sentinel outcomes (source_embedding_found=false, available=false when pgvector is missing). That is exactly the failure-mode information 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.

Conciseness5/5

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

The primary action is front-loaded in the first sentence and each subsequent sentence adds a distinct, non-redundant fact: mechanism, validation guarantee, intended use, and return flags. No filler or restatement of the title.

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 an 11-parameter tool with an output schema, the description covers the workflow, the dimension precondition, and the noteworthy return flags. The remaining gap is the distance-metric parameter and its allowed values, which an agent must still guess at.

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 9%, so the description must carry parameter meaning, and it does explain the role of source_id_column, source_id_value, source_embedding_column, target_embedding_column and both schema/table pairs through the narrative. However, `metric` is never mentioned and no supported values are given, and `k` is only implied by "the k rows" with no note that it defaults to 10.

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?

"Find the k rows in target_schema.target_table most similar to a specific row in source_schema.source_table" gives a concrete verb, both resources, and the direction of the join. The description then names the exact mechanism (id lookup, embedding read, pgvector k-NN), which separates it from siblings like vector_search or mmr_search that operate within a single table.

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 states the intended use case explicitly: "Useful for entity-resolution / linking across tables whose embeddings come from different models but share a dimension." That gives a clear context for reaching for this tool, but it never names an alternative tool or says when not to use it (e.g. same-table search should go to vector_search).

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

describe_ao_tableDescribe AO tableA
Read-only

Describe append-optimized (AO) / append-optimized columnar (AO/CO) storage metadata for one table: row vs column orientation, compression_type, compression_level, block_size, checksum. Reads pg_appendonly. Returns is_ao=false cleanly when the table is a regular heap. Read-only. On vanilla PG returns available=false.

Example: describe_ao_table(schema='public', table='events_ao')

NameRequiredDescriptionDefault
tableYes
schemaYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
is_aoYes
tableYes
detailYes
schemaYes
checksumYes
columnarYes
block_sizeYes
compression_typeYes
compression_levelYes

TDQS

A4.1/5.0
Behavior4/5

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

Beyond the readOnlyHint annotation, the description discloses that it reads pg_appendonly, returns is_ao=false for regular heap tables, and returns available=false on vanilla PostgreSQL. These are meaningful behavioral details about data source and fallback outcomes, though permissions and output shape are left to schema/annotations.

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

Conciseness5/5

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

The description is compact and front-loaded: it states purpose, lists returned metadata, explains fallback behavior, and ends with a single example. Every sentence contributes relevant information without repetition.

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

Completeness4/5

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

Given the output schema and read-only annotation, the description provides enough context to call the tool correctly, including fallback cases for regular heaps and vanilla PostgreSQL. Minor gaps remain around parameter semantics and explicit sibling comparison, but the core behavior is well covered.

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 only 33%, and the description does not compensate by explaining the schema and table parameters beyond a minimal example. The optional database parameter is described in the schema, not the tool description, so parameter meaning is largely left to structured fields.

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 and resource: describing append-optimized storage metadata for one table. It lists the concrete metadata fields and clearly distinguishes this from a generic table description by focusing on AO/AOCO orientation and compression details.

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 usage context is clear: call this when you need AO/AOCO storage metadata for a specific table, and the example shows the required schema/table combination. It does not explicitly compare against sibling tools such as describe_table, but the AO-specific scope makes the intended use evident.

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

describe_graphDescribe graphB
Read-only

Describe the schema structure, vertex labels, and edge labels of a specific property graph. Returns an object with graph_name, vertex_labels, and edge_labels.

NameRequiredDescriptionDefault
graph_nameYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so the description's 'Describe' operation is consistent. The description adds value by specifying return object fields (`graph_name`, `vertex_labels`, `edge_labels`), providing behavioral context 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 sentences, 20 words, no fluff. Efficiently conveys purpose and return structure.

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?

Tool is simple with one parameter and an output schema. Description covers main purpose and return format. Lacks mention of prerequisites (e.g., graph must exist) or error behavior, but these are minor gaps.

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 sole parameter `graph_name` has no schema description (0% coverage). The description only says 'specific property graph', adding minimal meaning about what value to provide. For a single required parameter, more guidance is needed.

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?

Description clearly states the tool describes schema structure, vertex labels, and edge labels of a property graph, and lists return fields. However, it does not distinguish from the sibling 'describe_property_graph', which likely serves a similar purpose.

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

Usage Guidelines2/5

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

No guidance on when to use this tool versus alternatives like 'describe_property_graph' or when not to use it. Lacks context for appropriate invocation.

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

describe_property_graphDescribe property graphA
Read-only

Describe one SQL/PGQ property graph by schema-qualified name. Requires PG 19+; raises an error otherwise. Useful when an agent has located a graph via list_property_graphs and needs the full membership before composing a run_pgq query. Returns an object with schema, name, vertex_tables (list of schema.table strings), and edge_tables (same shape).

Example: describe_property_graph(schema='public', name='org_chart')

NameRequiredDescriptionDefault
nameYes
schemaYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
nameYes
schemaYes
edge_tablesYes
vertex_tablesYes

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered; the description adds genuinely new behavior in the PG 19+ version gate and the fact that it raises an error otherwise. It also enumerates the returned fields (`schema`, `name`, `vertex_tables`, `edge_tables`), though that information is largely duplicated by the existing output 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?

Three tight sentences plus an example; the version gate and usage path are front-loaded before the return-shape detail. The example is mildly redundant with the parameter names but cheap and clarifying.

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 covers version requirements, error behavior, call-site context, and return contents, and an output schema exists so return details need not be fully restated. The one real hole is the undocumented `database` parameter for secondary read-only targets, which an agent could easily overlook.

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 only 33%: `schema` and `name` have no schema descriptions, and the third parameter `database` (targeting a configured secondary read-only database) is never mentioned in the description. The worked example (`describe_property_graph(schema='public', name='org_chart')`) partially compensates for the two required params, but the multi-database targeting behavior is left entirely to the 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?

States a concrete verb and resource ("Describe one SQL/PGQ property graph by schema-qualified name") and scopes it to a single object, which separates it from the list-style siblings. The "SQL/PGQ" qualifier implicitly distinguishes it from the Apache AGE-oriented `describe_graph`/`list_graphs` tools, and it is not a tautology of the title.

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 a clear upstream/downstream chain: locate the graph with `list_property_graphs`, then call this, then compose a `run_pgq` query. It does not explicitly say when NOT to use it (e.g., when `describe_graph` is the right tool for non-PGQ graphs), so the routing is strong but not exhaustive.

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

describe_redis_cache_tableDescribe Redis cache tableA
Read-only

Describe one foreign table backed by redis_fdw: which server it's mapped to, the Redis-side key structure (hash / list / string / set / zset), key-prefix, TTL, and SQL-side column shape. Raises an error when the table doesn't exist or isn't backed by redis_fdw. Returns an object with schema, name, server, key_type, key_prefix, ttl_seconds, columns (list of {name, data_type}), and options (the full foreign-table options dict).

Example: describe_redis_cache_table(schema='public', table='sessions_cache')

NameRequiredDescriptionDefault
tableYes
schemaYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
nameYes
schemaYes
serverYes
columnsYes
optionsYes
key_typeYes
key_prefixYes
ttl_secondsYes

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds meaningful behavior beyond that: it discloses the error behavior for missing/non-redis tables and enumerates the returned fields, which annotations cannot 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 text is front-loaded with purpose, then behavior, then return shape, then a compact example — a sensible structure. It is somewhat dense with return-field enumeration, but each clause carries information and there is no filler.

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

Completeness4/5

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

An output schema exists, so the return-field listing is partially redundant, but for a describe-style tool the extra specificity is harmless. Combined with the error behavior and the example, an agent has enough to invoke it correctly; the only gap is guidance on when to prefer this over describe_table or list_foreign_tables.

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 only 33% — only the optional `database` parameter is documented (and that is documented in the schema, not the description). The description's example call clarifies the required `schema` and `table` as identifier arguments, but adds no semantics for the primary/secondary database targeting beyond what the schema already states.

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 ('Describe one foreign table backed by redis_fdw') and immediately enumerates what is disclosed (server mapping, Redis key type, prefix, TTL, SQL column shape). This distinguishes it clearly from sibling tools like describe_table or list_foreign_tables, which are generic rather than redis_fdw-specific.

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 by the redis_fdw scoping and the error condition ('raises an error when the table doesn't exist or isn't backed by redis_fdw'), which implicitly routes agents with ordinary tables to describe_table. However, no sibling is named explicitly and there is no explicit 'use this instead of X when Y' guidance.

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

describe_selfDescribe selfA
Read-only

Return a high-level summary of what mcpg can do, organised into capability buckets (schema introspection, query execution, vector search, RAG telemetry, audit trail, migrations, time-series, etc.). Call this first when discovering mcpg's surface — it's much more compact than walking the full tool catalogue. Returns an object with headline, version, tool_count, capability_count, and a capabilities list, where each capability has id, name, summary, detail, headline_tools (top 3-6 tools to reach for first), tool_count, and all_tools (the full list in that bucket). Read-only; no database access. Pair with list_tools (MCP-protocol) when you need every tool's full schema.

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 already provide readOnlyHint=true, and the description adds 'Read-only; no database access,' which is consistent and adds useful behavioral context. No contradictions.

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

Conciseness5/5

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

The description is concise, front-loads the purpose, and every sentence adds value. No wasted words.

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 tool with annotations and an explicit output schema, the description fully covers what the tool does and its context. It is complete.

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

Parameters4/5

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

No parameters exist, so baseline 4 applies. The description need not add parameter information, and it doesn't.

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 the tool returns a high-level summary of mcpg's capabilities organized into buckets. It clearly distinguishes itself from siblings by stating it's 'much more compact than walking the full tool catalogue.'

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 'Call this first when discovering mcpg's surface' and suggests pairing with list_tools, providing clear when-to-use and relative advantage over alternatives.

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

describe_tableDescribe tableA
Read-only

Describe the columns of a table, in ordinal order. Set fresh=true to bypass the cache and re-read live (e.g. after a schema change). Returns a list of objects with name, data_type, nullable, default, and vector_dimension (set only for pgvector vector(N) columns).

Example: describe_table(schema='public', table='users')

NameRequiredDescriptionDefault
freshNo
tableYes
schemaYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds genuinely non-obvious behavior beyond that: results are cached by default and fresh=true forces a live re-read after DDL. It does not discuss what happens for a nonexistent table or schema, which is a minor remaining gap.

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?

Three short sentences plus a concrete example, with the core action and output shape front-loaded and the fresh-flag caveat immediately after. The example is mildly redundant since both named parameters are required and self-explanatory, but it earns its place as a call-shape illustration.

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 read-only introspection tool with an output schema present, the description covers the action, ordering, caching behavior, and result shape, which is close to sufficient. The only notable omission is error behavior for missing schemas or tables, which an agent may need when probing unknown objects.

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 only 25%, with just `database` documented inline, so the description must compensate and largely does: it explains the cache-bypass meaning of `fresh` and demonstrates schema/table usage in the example. The optional `database` targeting is handled by the schema itself, leaving no parameter entirely unexplained across the two sources.

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 verb and resource — describing the columns of a table, returned in ordinal order — which is far more precise than the title alone. It doesn't explicitly distinguish itself from nearby siblings like list_tables, list_generated_columns, or describe_ao_table, so an agent must infer the boundary, but the column-level intent is unambiguous.

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 guidance exists but is scoped to one parameter: set fresh=true after a schema change to bypass the cache. There is no statement of when to choose describe_table over list_tables or another metadata sibling, and no exclusions or prerequisites are given.

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

describe_toolDescribe toolA
Read-only

Return the full registered schema for one MCP tool by name — description, input_schema, output_schema, and which capability bucket it belongs to. Use this when an agent hits a tool error and needs to verify the call shape without re-walking the full describe_self payload (handy when the transport surfaces only tools/call, not tools/list). Returns registered=false plus a did_you_mean suggestion list when the name isn't on this server. Read-only; no database access. Example: describe_tool(name='run_select')

NameRequiredDescriptionDefault
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?

Annotations declare readOnlyHint=true and openWorldHint=false. Description reinforces with 'Read-only; no database access.' and describes error behavior (registered=false + did_you_mean). No contradictions.

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

Conciseness5/5

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

Concise single sentence covering return value, usage context, error handling, and read-only nature. Followed by example. No redundant 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?

Given the tool's simplicity (1 required param, no nested objects, output schema exists), the description covers all necessary aspects: purpose, usage, error handling, safety, and example. Fully adequate.

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 parameter (name) with no schema description coverage (0%). Description adds value by mentioning 'by name' and providing an example: describe_tool(name='run_select'), but does not elaborate on format or constraints beyond what's obvious.

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 returns the full registered schema for one MCP tool by name, including description, input_schema, output_schema, and capability bucket. Distinguishes from siblings like describe_self by specifying it targets a single tool.

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 advises using this tool when an agent encounters a tool error and needs to verify the call shape without re-walking the full describe_self payload, especially when transport only surfaces tools/call. Also mentions did_you_mean on error, providing clear guidance.

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

detect_n_plus_oneDetect n plus oneA
Read-only

Surface query templates in pg_stat_statements that look like an N+1 loop: hundreds of calls, each returning at most a row or two, with meaningful total wall-clock time spent. Returns the candidates sorted by total time descending so the worst offender appears first. Thresholds (min_calls, max_rows_per_call, min_total_ms) are tunable. Treat results as candidates for investigation, NOT verdicts — a hot cache-miss pattern on a primary-key lookup can trip the same shape. Reports availability=false if pg_stat_statements is not installed.

NameRequiredDescriptionDefault
limitNo
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.
min_callsNo
min_total_msNo
max_rows_per_callNo

Output Schema

NameRequiredDescription
availableYes
candidatesYes
thresholdsYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations cover read-only/local behavior, and the description adds real value beyond them: result ordering (total time descending), the availability=false signal when pg_stat_statements is not installed, and the caveat about interpretation. It does not mention auth requirements or cost/latency of the scan itself, but it is well above the annotation floor.

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?

Front-loaded with the purpose, then ordering, then tuning knobs, then the interpretation caveat and failure mode. Each sentence carries distinct information with no filler or repetition.

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

Completeness4/5

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

With an output schema present and read-only annotations supplied, the description covers what is needed to call and interpret the tool: purpose, ordering, tunables, caveat, and extension-absent behavior. The only real gap is that `limit` and the precise threshold semantics are left to a sparse schema.

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 only 20% (only `database` is documented), so the description has to compensate. It does name the three tunable thresholds (min_calls, max_rows_per_call, min_total_ms) and implies their meaning through the N+1 shape description, but it never explains `limit` or states defaults/exact semantics for the thresholds. Partial compensation only.

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 ('Surface query templates in pg_stat_statements that look like an N+1 loop') plus the exact detection shape (hundreds of calls, one or two rows each, meaningful wall-clock time). That is clearly distinct from siblings like recommend_indexes, analyze_workload, or why_is_this_slow, which are broader diagnostics.

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 strong usage context: results are candidates for investigation, not verdicts, and it names the false-positive shape (hot cache-miss on a primary-key lookup). It also states the failure mode when pg_stat_statements is absent. It stops short of naming a specific alternative tool to run instead when the result set is noisy or when the extension is missing.

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

detect_vector_outliersDetect vector outliersA
Read-only

Flag pgvector rows whose embedding sits far from any cluster centroid. Samples up to sample_size (default 5000) non-NULL rows of schema.table.embedding_column, clusters them with k-means (same engine as cluster_vectors), then per cluster computes a z-score on the distance from each row to its centroid and flags rows whose z-score exceeds zscore_threshold (default 3.0). Per-cluster scoring catches rows that are weird-for-their-group rather than weird-overall, which is usually what 'find outliers' should mean. Returns outliers sorted by z-score descending (capped at max_results), total_outliers (the unclipped count), and cluster_stats (per-cluster mean / std of within-cluster distances). When id_column is set each outlier carries that column's value; otherwise the row's positional sample index. k >= 2 and there must be at least 2k parseable rows. Reports available=false if pgvector is not installed.

NameRequiredDescriptionDefault
kNo
seedNo
tableYes
metricNol2
schemaYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.
id_columnNo
max_resultsNo
sample_sizeNo
max_iterationsNo
embedding_columnYes
zscore_thresholdNo

Output Schema

NameRequiredDescription
kYes
metricYes
outliersYes
availableYes
dimensionYes
sampled_rowsYes
cluster_statsYes
total_outliersYes
zscore_thresholdYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations only cover read-only and closed-world safety, and the description goes well beyond them: it discloses the sampling strategy (up to sample_size non-NULL rows, default 5000), the hard preconditions (k >= 2, at least 2k parseable rows), and the availability failure mode (available=false when pgvector is absent). It does not mention cost/latency implications of sampling and clustering a large table, which keeps it from 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?

A single dense paragraph with the core action front-loaded and no filler sentences; the sampling, threshold, and return-value details each add information. It would read faster with light structure given its length, and the return-value sentence is partly redundant with 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?

For a 12-parameter analytical tool with an output schema, the description covers what an agent needs: what is sampled, how scoring works, preconditions, failure modes, and result shape. The remaining undocumented knobs (metric, seed, max_iterations) are tuning parameters with sensible defaults rather than blockers to a correct first call.

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 only 8%, so the description carries most of the burden and largely does: it defines sample_size, zscore_threshold, id_column, max_results, and k, including defaults and the k >= 2 constraint. It leaves metric, seed, and max_iterations entirely unexplained in both schema and description, which is a real gap for a 12-parameter tool.

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: 'Flag pgvector rows whose embedding sits far from any cluster centroid.' The method (k-means per cluster, then z-score of centroid distance) is spelled out, so the agent can distinguish this from sibling clustering/drift tools like cluster_vectors or monitor_embedding_drift without opening any schema.

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 states the intended semantics of the operation, noting that per-cluster scoring 'is usually what find outliers should mean' versus weird-overall detection, which gives real context for choosing it. It also points at cluster_vectors as the shared engine. It stops short of explicit when-not conditions or naming alternative tools for adjacent tasks (drift monitoring, recall analysis), so it falls shy of a 5.

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

explain_queryExplain queryA
Read-only

Return the PostgreSQL execution plan for a query. By default uses EXPLAIN (FORMAT JSON) — plan only, the query is not executed. Set io=true to switch to EXPLAIN (ANALYZE, BUFFERS, TIMING) — runs the query and includes buffer + I/O timing per node (PG 19 additionally surfaces asynchronous-I/O block counts). Validated by the same safety allowlist as run_select, so writes / DDL are rejected.

Example: explain_query(sql='SELECT * FROM orders WHERE customer_id = 42', io=true)

NameRequiredDescriptionDefault
ioNo
sqlYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
planYes

TDQS

A4.7/5.0
Behavior5/5

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

Adds real behavioral context beyond the annotations: the default is non-executing, io=true actually runs the query and returns per-node buffer and I/O timing (plus async-I/O block counts on PG 19), and the same safety allowlist as run_select applies, so writes and DDL are rejected. That last point matters because a query that gets executed under ANALYZE would otherwise look like a side effect contradicting readOnlyHint, and the description pre-empts that concern by stating writes are refused.

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?

Four tight sentences front-loaded with the core purpose, then the io toggle, then the safety boundary, then an example. Every sentence adds information; the PG 19 note is a small but relevant aside, not 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?

An output schema exists, so return shape need not be described. For a three-parameter read tool, the description covers purpose, both modes, execution semantics, safety constraints, and a concrete invocation example. 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 description coverage is only 33%, with sql and io carrying just titles, so the description has to carry the load. It fully explains io: false means plan-only, true means ANALYZE with buffers and timing. It supplies a worked sql example, but the database parameter (targeting a configured secondary) is left entirely to the 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?

States a specific verb and resource ("Return the PostgreSQL execution plan for a query") and immediately distinguishes the two modes: default EXPLAIN (FORMAT JSON) is plan-only, while io=true switches to EXPLAIN (ANALYZE, BUFFERS, TIMING). That differentiates it from run_select, which executes queries outright, and the distinction is visible 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 Guidelines4/5

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

Gives clear guidance on when to leave the default (plan only, no execution) and when to set io=true (you want buffer and I/O timing per node, at the cost of running the query). It also sets a boundary: writes and DDL are rejected by the allowlist. It does not name sibling alternatives such as analyze_query_plan, optimize_query, or why_is_this_slow, so the routing signal is implicit rather than explicit.

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

export_queryExport queryA
Read-only

Run a read-only SQL query and serialise its rows to CSV or JSON. Reuses the SQL-safety checks of run_select. Truncates at limit rows and flags it in the result so callers can paginate.

Example: export_query(sql='SELECT id, email FROM users', format='csv', limit=10000)

NameRequiredDescriptionDefault
sqlYes
limitNo
formatNocsv
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
formatYes
contentYes
row_countYes
truncatedYes

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the bar is lower, yet the description still adds real behavior: read-only enforcement, reuse of run_select's safety checks, hard truncation at `limit`, and a truncation flag that enables caller-side pagination. It does not clarify whether output is returned inline rather than written to a file path, which is the one ambiguity left.

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?

Three tight sentences front-load the core behavior and the example is genuinely useful for call shape. No filler, though the example largely restates parameter names already covered in the schema.

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?

An output schema exists, so return-value detail is not required, and the description covers safety, formatting, and truncation well. The remaining gap is whether 'export' means inline payload versus a file destination, which matters for a tool with this name.

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 only 25% (only `database` is documented), so the description must compensate; it does explain `limit` (truncation threshold) and `format` (CSV or JSON) plus a worked example with concrete values. However, it never states whether limit=0 means unlimited, whether format accepts only 'csv'/'json' case-sensitively, or that sql must be a single SELECT.

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 gives a specific verb (run + serialise) plus resource (SQL query rows) and names the output formats (CSV or JSON). Saying it 'reuses the SQL-safety checks of run_select' anchors it against the closest sibling, so an agent can distinguish it from a plain query tool 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 Guidelines3/5

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

Mentioning run_select implies the family relationship, and the limit/pagination note hints at bulk use, but there is no explicit 'use this when you need exportable output instead of run_select' or 'use export_table for whole tables' routing. The agent must infer when to prefer this over run_select or export_table.

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

export_tableExport tableA
Read-only

Serialise every row in schema.table (up to limit) to CSV or JSON. Schema and table names must be plain identifiers. Returns an object with format, row_count, truncated (bool — true when the row count hit limit), and content (the serialised payload as a string).

NameRequiredDescriptionDefault
limitNo
tableYes
formatNocsv
schemaYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
formatYes
contentYes
row_countYes
truncatedYes

TDQS

A3.6/5.0
Behavior4/5

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

The annotations already declare readOnlyHint=true and openWorldHint=false, so the description does not need to restate safety. It adds useful behavior by explaining the row limit, the truncated flag, and the returned content 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?

The description is short and front-loaded: purpose first, identifier constraint second, return shape last. Every sentence contributes without unnecessary wording.

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 table-export tool with an output schema, this description is largely complete: it covers what is exported, the row limit, truncation semantics, and the return object. The main gap is that it does not route the agent away from or toward the sibling export_query tool.

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 only 20%, so the description must carry parameter meaning. It explains limit, CSV/JSON format, and plain-identifier constraints for schema/table, but it does not mention the database parameter, default values, or all parameter interactions.

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

Purpose4/5

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

The description clearly states the specific action: serialising every row in schema.table to CSV or JSON. It is easy to distinguish from a general query tool, but it does not explicitly contrast itself with the sibling export_query.

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

Usage Guidelines2/5

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

The description implies this is for exporting an entire table, but it gives no explicit when-to-use guidance, no exclusions, and no reference to the sibling export_query alternative.

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

fetch_cursorFetch cursorA
Read-only

Fetch the next batch from an open server-side cursor. exhausted=true means the FETCH returned fewer rows than requested — stop polling. batch_size defaults to 100; hard cap is 10000 per call.

NameRequiredDescriptionDefault
cursor_idYes
batch_sizeNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior5/5

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

The description adds behavioral context beyond the annotations (readOnlyHint, openWorldHint) by explaining the exhausted flag and batch size limits. It aligns with annotations (read operation) and informs the agent about polling termination conditions.

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 only two sentences, no filler, and all information is essential. It is well-structured and front-loaded with the core 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?

Given the tool's complexity (cursor fetch with batch size and exhaustion signal), the description adequately covers all necessary points: what it does, when to stop, and batch constraints. The presence of an output schema (not shown) does not require additional description of return values.

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?

While the description covers semantics for batch_size (default and cap), it does not describe the required cursor_id parameter. With 0% schema coverage, the description partially compensates but leaves a gap for cursor_id.

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 that the tool fetches the next batch from an open server-side cursor, using specific verb 'fetch' and resource 'next batch'. It distinguishes itself from siblings like open_cursor and close_cursor by focusing on the incremental fetch operation.

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 provides clear context for usage, including when to stop polling (exhausted=true) and the batch size defaults/cap. It does not explicitly compare to alternatives, but the guidance is sufficient for an agent to decide when to use this tool.

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

find_blocking_chainsFind blocking chainsB
Read-only

Return (blocked, blocking) backend pairs via pg_blocking_pids. Each row pairs a backend waiting on a Lock with one PID holding the lock that's preventing progress. Cycles are possible (A blocks B, B blocks A); render with care. Read-only.

NameRequiredDescriptionDefault
limitNo
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior4/5

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

Annotations already cover safety (readOnlyHint, openWorldHint), so 'Read-only' is redundant, but the description adds real value: it defines what each row means (a waiter paired with a holder), warns that cycles can occur, and cautions about rendering them. It says nothing about the effect of the default limit of 50 or output volume, which would have completed the picture.

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?

Four short sentences with the return shape front-loaded and no filler; the cycle caveat earns its place. The trailing 'Read-only' duplicates the annotation and could be dropped.

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?

The tool is simple (two optional params) and has an output schema, so return values need not be explained. However, the role of the limit parameter and the choice against sibling lock tools remain unexplained, leaving the definition only minimally complete.

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

Parameters2/5

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

Schema coverage is 50%: 'database' is documented in the schema, but 'limit' has no description anywhere. The description mentions neither parameter, so it adds no meaning beyond the schema and fails to compensate for the undocumented limit.

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?

States a specific verb and resource ('Return (blocked, blocking) backend pairs') and even names the underlying mechanism (pg_blocking_pids). An agent understands exactly what comes back, but the description never distinguishes this from close siblings like walk_blocking_chains or list_locks.

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

Usage Guidelines2/5

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

There is no when-to-use or when-not-to-use guidance. With a near-duplicate sibling (walk_blocking_chains) and adjacent tools (list_locks, analyze_lock_hotspots, read_pg_stat_lock), an agent is left to guess which one to call; only the lock-diagnosis context is implied.

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

find_sensitive_columnsFind sensitive columnsA
Read-only

Flag columns whose names or types look like they hold sensitive data (passwords, tokens, PII, financial info, health records). Pure heuristic — no row sampling, no value introspection. Categories: credential, financial, contact, identifier, health, government_id, location. Each finding carries a confidence (high / medium / low) so an agent can filter for a first review pass. Treat as a SIGNAL, not a verdict — a column named email_template_id matches the email pattern but isn't itself an email address. Returns an object with findings (list of {schema, table, column, data_type, category, confidence, matched_pattern}) and summary counts by category.

NameRequiredDescriptionDefault
schemaYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
schemaYes
columnsYes

TDQS

A4.1/5.0
Behavior5/5

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

Beyond the readOnlyHint/openWorldHint annotations, it discloses the core behavioral trait: pure name/type heuristic with no row sampling or value introspection, plus a concrete false-positive example (email_template_id). The confidence tiers and category list give the agent the vocabulary it needs to triage output.

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 behavior, then heuristics, then categories, confidence, and caveats — a logical order with little waste. The closing sentence re-describes the return object, which duplicates the output schema rather than earning 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 read-only heuristic scanner, the description covers mechanism, output categories, confidence semantics, and pitfalls, and annotations plus an output schema handle safety and return shape. The remaining gap is scope — whether it scans every table in the given schema, and any cost/latency implications.

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 coverage is only 50%: the `database` param is well documented in the schema, but `schema` has no schema description and the tool description never clarifies what it accepts or whether the scan is limited to that one schema. The description mentions no parameters at all, so it fails to compensate for the coverage gap.

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

Purpose5/5

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

States a specific verb and resource — 'flag columns whose names or types look like they hold sensitive data' — and enumerates the categories it recognizes. This clearly separates it from siblings like audit_database, lint_naming_conventions, or run_advisors, which an agent might otherwise confuse it with.

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?

Provides real usage context: 'so an agent can filter for a first review pass' and 'treat as a SIGNAL, not a verdict,' which tells the agent how much weight to put on results. It does not, however, name an alternative tool or state explicit when-not-to-use conditions relative to the many audit/lint siblings.

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

find_unused_objectsFind unused objectsA
Read-only

Find tables and indexes with zero scans since pg_stat was last reset — a strong signal of dead code, but NOT a verdict. Tables report seq+idx scan counts, write counts, and estimated row count; indexes report size and definition. Excludes PRIMARY KEY and UNIQUE indexes (PG needs those regardless of scans). Run this after the database has been hot for a meaningful period — fresh stats produce false positives. Returns an object with tables (list of candidate tables with their stats) and indexes (list of candidate indexes with size and definition).

NameRequiredDescriptionDefault
schemaYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
schemaYes
tablesYes
indexesYes

TDQS

A4/5.0
Behavior4/5

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

Annotations already establish read-only, closed-world behavior, and the description still adds real substance: the PK/UNIQUE exclusion (a behavioral rule that would otherwise surprise an agent), the stats-reset baseline, and the false-positive caveat. It does not discuss cost, row limits, or what happens on empty results, which keeps it out of the top band.

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 definition and four tight sentences with no filler. The final sentence enumerating the `tables` and `indexes` keys is somewhat redundant with the output schema, but it partially earns its place by restating what each entry carries.

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 an analytical read tool with an output schema, the description covers the signal, the caveats, the exclusions, and the return shape. The one real hole is the required `schema` parameter, which is undocumented in both the schema and the description.

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 coverage is 50%: the `database` param is well documented in the schema, but the required `schema` param has only a title and no description anywhere. The description never mentions the schema scope or whether scan stats are per-schema or per-database, so the agent must guess at the required parameter's meaning.

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 pair — find tables and indexes with zero scans since pg_stat was last reset — plus the interpretation of that signal. An agent knows exactly what this returns and how it differs from pure catalog listings like list_indexes or list_tables.

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?

"Run this after the database has been hot for a meaningful period — fresh stats produce false positives" gives clear preconditions, and "NOT a verdict" tells the agent how to frame results. It stops short of naming alternatives such as recommend_index_drops, which targets a nearby question, so the routing is implied rather than explicit.

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

generate_diesel_schemaGenerate Diesel schemaA
Read-only

Read a PostgreSQL schema and emit a Diesel ORM (Rust) schema.rs. One table! macro per table with column SQL types, Nullable<T> for nullable columns, plus joinable! declarations for single-column intra-schema FKs and an allow_tables_to_appear_in_same_query! macro so multi-table joins type-check. Enum types are emitted as Text-backed wrapper enums in a pg_enum module so the output works without diesel_derive_enum. Composite FKs are a documented v1 gap. Schema/table/column names must be plain identifiers ([A-Za-z_][A-Za-z0-9_]*); delimited names (hyphens, spaces, mixed-case-only) are not supported here because they become source identifiers in generated code — use SQL tools (export_table, dump_database) for those objects. See docs/identifier-policy.md.

NameRequiredDescriptionDefault
schemaYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior5/5

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

Beyond the readOnlyHint/openWorldHint annotations, it discloses exactly what gets emitted (one table! per table, Nullable<T> for nullables, joinable! for single-column intra-schema FKs, allow_tables_to_appear_in_same_query!), how enums are handled (Text-backed wrappers in a pg_enum module, no diesel_derive_enum), and a documented limitation (composite FKs are a v1 gap). That is precisely the kind of output-shape and edge-case context an agent needs before invoking.

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 verb and output artifact, then progressively narrower details (enums, FK gap, identifier policy, doc pointer). It is dense and long-ish, but each sentence carries distinct information; the only near-redundancy is restating the identifier restriction twice in different framings.

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

Completeness4/5

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

With an output schema present, return-value explanation is unnecessary, and the description covers the meaningful unknowns: generated constructs, enum strategy, composite-FK limitation, and unsupported identifiers. It is silent on whether views/indexes/defaults are reflected and on failure behavior when an unsupported identifier is encountered, which keeps it short of full completeness.

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 50%: the `database` parameter carries its own description in the schema (configured secondary, read-only, omit for primary), but the required `schema` parameter is undocumented there. The description partially compensates by specifying the identifier pattern [A-Za-z_][A-Za-z0-9_]* that schema names must satisfy, though it never states plainly that `schema` is the PostgreSQL schema whose tables are converted. 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 first sentence states a specific verb and resource pair—read a PostgreSQL schema, emit a Diesel ORM (Rust) schema.rs—and the surrounding detail (table!, Nullable<T>, joinable!) makes it unmistakable against siblings like generate_prisma_schema or generate_drizzle_schema.

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 names an explicit exclusion with a routing instruction: objects with delimited names (hyphens, spaces, mixed-case-only) are not supported here and should go through export_table or dump_database instead. It does not explicitly state when to prefer this over the other ORM generators, but the target-framework specificity makes that inference safe.

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

generate_drizzle_schemaGenerate Drizzle schemaA
Read-only

Read a PostgreSQL schema and emit a Drizzle ORM TypeScript schema string (drizzle-orm/pg-core). Covers tables, columns with PG-native types, primary/foreign keys, unique constraints, indexes, defaults, and enums. Single-column FKs emit column-level .references(); composite FKs are a documented v1 gap. Views, foreign tables, partitions, triggers, and functions are out of scope. Returns the rendered TypeScript schema.ts source as a single string. Schema/table/column names must be plain identifiers ([A-Za-z_][A-Za-z0-9_]*); delimited names (hyphens, spaces, mixed-case-only) are not supported here because they become source identifiers in generated code — use SQL tools (export_table, dump_database) for those objects. See docs/identifier-policy.md.

NameRequiredDescriptionDefault
schemaYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

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 already declare readOnlyHint=true and openWorldHint=false, so safety is covered; the description still adds genuinely new behavioral facts — that a single rendered `schema.ts` string is returned, that composite FKs are an acknowledged limitation, and that identifier restrictions stem from generated source code being identifiers. It stops short of saying anything about size/limits of the emitted output for very large schemas.

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 action and output format, then limitations, then the name restriction with alternatives — a logical order with no filler. The trailing doc pointer is acceptable but the identifier-policy rationale is stated twice (rule plus 'because they become source identifiers'), slightly over-explained.

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?

Covers the reading scope, the emitted artifact, the unsupported object classes, the v1 FK gap, and the identifier constraint — more than enough for a read-only generator; the output schema also carries the return type. The one omission is clarifying the `schema` argument's meaning, which matters for a tool whose whole input is a schema name.

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 50%: `database` is already fully documented in the schema (including the list_databases id constraint), and the description adds nothing to it. The required `schema` parameter is only implicitly characterized by 'Read a PostgreSQL schema', leaving whether it is a single namespace name unstated in the description. Baseline 3 for a half-covered two-parameter tool with partial compensation.

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?

Specific verb+resource: 'Read a PostgreSQL schema and emit a Drizzle ORM TypeScript schema string (drizzle-orm/pg-core)', then enumerates exactly what constructs are covered (tables, columns, PK/FK, unique, indexes, defaults, enums). This clearly separates it from siblings like generate_prisma_schema, generate_diesel_schema, or the plain SQL DDL tools.

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-not guidance: views, foreign tables, partitions, triggers, and functions are out of scope, and objects with delimited names should go to SQL tools (`export_table`, `dump_database`). It also flags the composite-FK v1 gap up front so an agent knows when the output will be incomplete rather than discovering it after the call.

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

generate_ecto_schemasGenerate Ecto schemasA
Read-only

Read a PostgreSQL schema and emit Ecto (Elixir) schema modules — one .ex file per table, named after the singularised table. Each module uses Ecto.Schema with field declarations, belongs_to for single-column intra-schema FKs, and timestamps() when both inserted_at and updated_at exist. The Elixir top-level module is configurable via app_module (default MyApp). Returns a JSON object {filename: source} so the agent can write each file. Schema/table/column names must be plain identifiers ([A-Za-z_][A-Za-z0-9_]*); delimited names (hyphens, spaces, mixed-case-only) are not supported here because they become source identifiers in generated code — use SQL tools (export_table, dump_database) for those objects. See docs/identifier-policy.md.

NameRequiredDescriptionDefault
schemaYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.
app_moduleNoMyApp

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, but the description adds material context they do not cover: the tool does not write files itself, it returns a {filename: source} JSON map so the agent must perform the writes. It also discloses the identifier-policy constraint that causes failures. It does not discuss cost, limits on large schemas, or what happens on unsupported column types.

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 verb and product, followed by generation rules, return contract, and the identifier restriction in descending importance. Dense but every clause carries information; the reference to docs/identifier-policy.md and the parenthetical examples are the only slightly expendable elements.

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 read-only code generator with an output schema present and annotations covering safety, the description supplies the important extras: naming convention, FK and timestamp handling, module naming, the return map contract, secondary-database targeting, and the identifier limitation. Remaining gaps (behaviour on unsupported types, performance on very large schemas) are minor rather than blocking.

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 only 33%, and the description covers the two undocumented parameters: app_module is explained as the configurable Elixir top-level module with default MyApp, and schema is implied as the PostgreSQL schema to read. The database parameter is already fully documented in the schema. However, the description never clarifies what values `schema` accepts (e.g., a name from list_schemas) or what happens if it does not exist, so it does not fully compensate for the coverage 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 ('Read a PostgreSQL schema and emit Ecto (Elixir) schema modules'), plus concrete output shape (one .ex file per table, named after the singularised table). This clearly separates it from the many sibling generators (generate_prisma_schema, generate_drizzle_schema, generate_ent_schemas, generate_sqlalchemy_models) without the agent needing to open any schema.

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 when-not plus named alternatives: objects with delimited names (hyphens, spaces, mixed-case) should go to SQL tools export_table or dump_database instead. It also explains the reason, which helps the agent generalise. What is missing is a positive trigger describing when the agent should prefer this over the other ORM generators, though the language/target in the purpose makes that largely self-evident.

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

generate_ent_schemasGenerate Ent schemasA
Read-only

Read a PostgreSQL schema and emit Ent (Go) Schema struct files — one .go file per table. Each file exports a struct that lists field.X(...) calls for every column, edge.To(...) for single-column intra-schema FKs, and field.Enum().Values() for enum-typed columns. Composite FKs are a documented v1 gap. Returns a JSON object {filename: source} so the agent can write each file. Schema/table/column names must be plain identifiers ([A-Za-z_][A-Za-z0-9_]*); delimited names (hyphens, spaces, mixed-case-only) are not supported here because they become source identifiers in generated code — use SQL tools (export_table, dump_database) for those objects. See docs/identifier-policy.md.

NameRequiredDescriptionDefault
schemaYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior5/5

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

Annotations declare readOnlyHint=true and openWorldHint=false, and the description is fully consistent with a read-only inspection. It goes well beyond them: documents the v1 limitation (composite FKs unsupported), states the return shape ({filename: source}) and the agent's implied next action (write each file), and flags the identifier-name constraint.

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 verb and output artifact, then limitations, then constraints. Dense and mostly waste-free; the identifier policy paragraph is slightly repetitive in restating the same constraint twice and pointing to external docs.

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, yet the description still explains the return shape and that one file is produced per table. For a code generator with a documented v1 gap and naming constraint, an agent has everything needed to call it and handle the result.

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 50%: the database parameter is documented in the schema, but the required 'schema' parameter has no schema description. The prose 'Read a PostgreSQL schema' loosely implies what schema means, but no details are added about qualification, search_path behavior, or defaults.

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?

Names a specific verb and output artifact: read a PostgreSQL schema and emit Ent (Go) Schema struct files, one .go file per table. The framework qualifier ('Ent') separates it from the sibling generators (generate_prisma_schema, generate_drizzle_schema, generate_ecto_schemas) and the description even previews the emitted constructs (field.X, edge.To, field.Enum().Values()).

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 states the negative case: delimited names (hyphens, spaces, mixed-case-only) are unsupported and should go to export_table or dump_database instead, with the reason given (they become source identifiers). No explicit guidance on choosing among the other schema generators, but the framework naming makes the selection unambiguous.

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

generate_fk_cascade_graphGenerate FK cascade graphA
Read-only

Build a Mermaid graph LR of foreign-key cascade chains in a schema. Each edge runs from the referencing table to the referenced table, labelled with the cascade action(s) on DELETE / UPDATE. By default only FKs with at least one CASCADE / SET NULL / SET DEFAULT action are included — those are the ones that produce a write blast radius. Pass include_all=true to include NO ACTION / RESTRICT FKs too (full FK topology view). Cross-schema FK targets are rendered as separate nodes prefixed with their schema. Returns the Mermaid graph LR diagram as a string.

NameRequiredDescriptionDefault
schemaYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.
include_allNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the readOnlyHint/openWorldHint annotations, it discloses the default filtering rule and its rationale, the direction and label semantics of each edge, how cross-schema targets are rendered as prefixed nodes, and the return type. That is substantial behavioural context an agent could not infer from 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?

Front-loaded with the artifact produced, then default behaviour, then the opt-in flag, then rendering and return details. Every sentence adds information with no repetition of the schema or annotations.

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 generator with an output schema, the description covers purpose, default vs. full mode, edge semantics and output type. Nothing 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.

Parameters4/5

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

Schema coverage is only 33%, but the description fully explains include_all (its default false, what it adds, when to use it) and the schema field itself documents database. The required 'schema' parameter's meaning is only implied by context, leaving one 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 ('Build') and a precise resource ('Mermaid graph LR of foreign-key cascade chains in a schema'), and the edge direction and labelling are defined. It is clearly distinct from siblings like generate_schema_diagram and list_foreign_keys, which produce other artifacts.

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 gives the default behaviour (only CASCADE/SET NULL/SET DEFAULT FKs, chosen because they carry write blast radius) and the branch to opt into full topology via include_all=true. It does not name sibling tools to prefer over this one, so it stops short of a 5.

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

generate_graph_diagramGenerate graph diagramB
Read-only

Generate a Mermaid flowchart diagram representing nodes and relationships in a property graph to visualize its schema and topology. Returns the Mermaid flowchart as a string.

NameRequiredDescriptionDefault
limitNo
graph_nameYes

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.3/5.0
Behavior3/5

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

Annotations already indicate readOnlyHint=true, and description adds that it returns a Mermaid string. This adds some context beyond annotations, but behavioral traits like potential performance impact or output size are not disclosed. No contradictions.

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

Conciseness5/5

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

Two sentences, front-loaded with verb and resource, no fluff. Every word earns its place.

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

Completeness2/5

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

Despite having an output schema and only 2 parameters, the description omits crucial detail about the 'limit' parameter and how the graph_name is used. The return format is stated, but the tool's behavior with different parameter values is not explained.

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

Parameters1/5

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

Schema description coverage is 0%, so parameters (limit, graph_name) have no descriptions. The description does not mention or explain any parameters, leaving their purpose unclear. The agent must rely solely on names, which is insufficient.

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

Purpose5/5

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

The description clearly states the verb 'Generate' and the resource 'Mermaid flowchart diagram' for property graphs, with a specific purpose 'to visualize its schema and topology'. It distinguishes from siblings like describe_property_graph and generate_graph_projection by focusing on visual representation.

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: 'to visualize its schema and topology' suggests using it when a diagram is needed. However, no explicit when-to-use, when-not-to-use, or alternatives are provided. Among many sibling tools, guidance is absent.

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

generate_graph_projectionGenerate graph projectionA
Read-only

Generate openCypher CREATE/MERGE statements that project a relational schema into an Apache AGE property graph — rows become vertices (one label per table), foreign keys become edges. EMITS the Cypher for review; NEVER executes it (like generate_test_data). With row_limit=0 (default) it returns a schema-level template plan (one CREATE per label, one MERGE per edge type, $prop placeholders) reading only the catalog. With row_limit>0 it also emits concrete per-row statements (values escaped, NULLs omitted, capped at 1000 rows/table). Tables without a primary key still get node CREATEs but their edges are skipped (they can't be reliably MATCHed). NOTE: AGE materialises the data (this is a LOAD, not a virtual view); run the node statements before the edge statements; the projection is 1-hop faithful to the FK graph. Returns an object with available (AGE installed, advisory), schema, graph_name, row_limit, node_labels (list of label, source_table, key_columns, property_columns), edge_types (list of edge_type, from_label, to_label, from_key, to_key, fk_name), cypher_statements (generated, never executed), warnings, and detail.

Example: generate_graph_projection(schema='public', graph_name='g', row_limit=0)

NameRequiredDescriptionDefault
schemaYes
tablesNo
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.
row_limitNo
graph_nameNog

Output Schema

NameRequiredDescription
detailYes
schemaYes
warningsYes
availableYes
row_limitYes
edge_typesYes
graph_nameYes
node_labelsYes
cypher_statementsYes

TDQS

A4.6/5.0
Behavior5/5

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

Adds substantial behavior beyond readOnlyHint: the 1000 rows/table cap, NULL omission and value escaping, the fact that PK-less tables get node CREATEs but no edges, the required node-before-edge execution order, and the caveat that AGE materialises data so this is a load rather than a virtual view. The 'never executed' claim is consistent with readOnlyHint=true.

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 action and the never-executes constraint before mode-specific detail. It is dense but nearly every sentence conveys actionable constraint; the enumerated return-field list is redundant given an output schema exists and is the one section that does not earn its space.

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 generator with five parameters and mutation-adjacent semantics, the definition covers mode selection, row caps, PK handling, ordering, and the materialisation caveat, which is everything an agent needs to call it correctly. Return-value explanation is redundant since an output schema exists, but this does not leave a gap.

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 only 20% schema description coverage, the description carries most of the burden and does so for row_limit (0 vs >0 semantics, default, cap) and graph_name (via the example), while database is covered by its schema description. The `tables` parameter is never mentioned in the description, so one of five parameters remains semantically opaque.

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 artifact: generates openCypher CREATE/MERGE statements projecting a relational schema into an Apache AGE graph, with rows as vertices and FKs as edges. It immediately distinguishes itself from execution-oriented siblings (run_cypher) by declaring it NEVER executes, and from inspection siblings (describe_graph, list_graphs) by naming the generated output.

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 a clear decision rule between the two modes: row_limit=0 (default) yields a schema-level template plan reading only the catalog, while row_limit>0 emits concrete per-row statements. It names generate_test_data as the analogous non-executing generator but does not explicitly route the agent to run_cypher for execution or contrast with generate_graph_diagram, so the sibling mapping is slightly incomplete.

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

generate_jooq_configGenerate jOOQ configA
Read-only

Read a PostgreSQL schema and emit a jooq-codegen configuration XML pointing at it. Unlike the other exporters, jOOQ generates Java code itself from a live database — the artefact here is the configuration file the user feeds to mvn jooq-codegen:generate (or the Gradle task). The XML lists every base table explicitly via an regex, excludes MCPg's bookkeeping tables, and emits a for every json / jsonb column so they map to org.jooq.JSON / org.jooq.JSONB out of the box. Default Java package is com.example.jooq; override via the target_package arg. Schema/table/column names must be plain identifiers ([A-Za-z_][A-Za-z0-9_]*); delimited names (hyphens, spaces, mixed-case-only) are not supported here because they become source identifiers in generated code — use SQL tools (export_table, dump_database) for those objects. See docs/identifier-policy.md.

NameRequiredDescriptionDefault
schemaYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.
target_packageNocom.example.jooq
target_directoryNosrc/main/java

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

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

It discloses specific behavioral traits beyond the annotations, such as the automatic exclusion of 'MCPg's bookkeeping tables' and the enforced mapping of JSON/JSONB columns using specific types. This is crucial operational detail.

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 description is highly dense, prioritizing technical information over conversational brevity. It is structured logically, moving from high-level function to technical constraints and limitations.

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 description is exceptionally complete, detailing the specific nature of the output file, how certain data types are handled, and what limitations apply to naming conventions. This provides a full picture of the tool's operational boundaries.

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 low at 25%. While it doesn't elaborate heavily on parameter values, it provides vital external context regarding identifier naming constraints relevant to the input schema parameter.

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 defines the tool's goal: reading a PostgreSQL schema and emitting a jooq-codegen configuration XML. This distinguishes it from related schema generation tools.

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 provides clear usage guidance by stating the specific workflow (feeding the config to mvn jooq-codegen) and warning against using it for delimited identifiers, routing users to the correct SQL export tools.

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

generate_prisma_schemaGenerate Prisma schemaA
Read-only

Read a PostgreSQL schema and emit a valid Prisma .prisma schema string (mirrors prisma db pull). Covers tables, columns, primary/foreign keys, unique constraints, indexes, and enums. Views, foreign tables, partitions, triggers, functions, and policies are out of scope; unmappable types fall back to Unsupported("..."). Returns the rendered schema.prisma source as a single string. Schema/table/column names must be plain identifiers ([A-Za-z_][A-Za-z0-9_]*); delimited names (hyphens, spaces, mixed-case-only) are not supported here because they become source identifiers in generated code — use SQL tools (export_table, dump_database) for those objects. See docs/identifier-policy.md.

NameRequiredDescriptionDefault
schemaYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered; the description goes further by disclosing the unmappable-type fallback to `Unsupported("...")` and the strict identifier policy that will reject certain objects. These are behavioral constraints an agent cannot infer from the 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 purpose and output artifact, then scope, then edge-case behavior, then a pointer to a policy document. Every sentence carries information, but the middle section is dense and the external `docs/identifier-policy.md` reference adds a follow-up step that may not be resolvable by the agent.

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 not be explained, yet the description still notes the rendered `schema.prisma` comes back as a single string. Combined with explicit out-of-scope objects, type fallback behavior, and identifier constraints, an agent has everything required to call this correctly or pick a different tool.

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 50%: the `database` parameter is documented in the schema (secondary read-only database id, reject unknown names), but the `schema` parameter has no schema-level description. The description partially compensates by stating that schema/table/column names must be plain identifiers matching `[A-Za-z_][A-Za-z0-9_]*`, which constrains what the `schema` argument can be, but it never says explicitly that `schema` is the target PostgreSQL schema name.

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 pair ("Read a PostgreSQL schema and emit a valid Prisma `.prisma` schema string") and anchors it to a familiar reference point (`prisma db pull`). The output artifact is named concretely, so an agent can distinguish it from sibling generators like generate_drizzle_schema or generate_diesel_schema without opening any 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 enumerates what is in scope (tables, columns, PK/FK, unique constraints, indexes, enums) and what is not (views, foreign tables, partitions, triggers, functions, policies). It also routes the unsupported case to named alternatives — `export_table` and `dump_database` — with the reason (delimited names become source identifiers), which is exactly the when-not/alternative guidance an agent needs.

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

generate_schema_diagramGenerate schema diagramA
Read-only

Render a Mermaid ER diagram for a schema. Views and foreign tables are excluded; partitions are excluded by default — pass include_partitions=true to draw each partition as its own entity. Returns the Mermaid erDiagram as a string ready to paste into a Markdown block.

Example: generate_schema_diagram(schema='public', include_partitions=false)

NameRequiredDescriptionDefault
schemaYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.
include_partitionsNo

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 and openWorldHint=false, so the safety profile is covered. The description adds real value by disclosing the exclusion rules and the exact return shape (a Mermaid erDiagram string ready to paste into Markdown). It does not mention size limits, performance on large schemas, or error behavior for unknown schemas.

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 tight sentences plus a concrete example call; the scope exclusions and the return format are front-loaded with no filler. Every sentence carries information an agent needs.

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 rendering tool with an output schema, the description covers what is produced, what is omitted, and how to change the default. Nothing needed 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.

Parameters4/5

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

Schema description coverage is only 33%, so the description must carry weight, and it does for include_partitions by explaining both the default and the effect of enabling it. The required 'schema' parameter is left implicit, and 'database' semantics live only in the schema, but the example call reinforces the two main parameters.

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

Purpose5/5

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

States a specific verb and resource ('Render a Mermaid ER diagram for a schema') and immediately narrows scope by declaring what is excluded (views, foreign tables, partitions by default). An agent can distinguish this from generate_schema_docs or generate_fk_cascade_graph 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 Guidelines4/5

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

Gives a clear conditional rule for the main branch point ('partitions are excluded by default — pass include_partitions=true to draw each partition as its own entity'), which is the key usage decision. It does not explicitly name alternatives such as generate_schema_docs or describe_table, so routing among the many sibling generators 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.

generate_schema_docsGenerate schema docsA
Read-only

Generate a detailed Markdown reference of a schema's tables, columns, constraints, indexes, views, foreign tables, and custom enums along with comments / descriptions. Optional include_samples fetches a few distinct, non-null values for each column. Returns a single Markdown document as a string.

Example: generate_schema_docs(schema='public', include_samples=true)

NameRequiredDescriptionDefault
schemaYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.
include_samplesNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered, and the description usefully adds that it returns a single Markdown string and that include_samples probes distinct non-null values per column (an extra read cost). It does not disclose cost/size behavior for large schemas or whether samples can be slow on big tables, which are the remaining behavioral risks for this tool.

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?

Three sentences plus one inline example, front-loaded with purpose, then optional behavior, then return type. The example earns its place by showing call syntax with both key params. No filler, though the enumeration of object types is long enough that it slightly crowds the opening.

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

Completeness4/5

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

With read-only annotations and an output schema present, the description need not explain return structure, and it still names the return type. For a 3-parameter documentation generator it covers purpose, optional enrichment, and output form adequately; only edge cases (very large schemas, missing schema, secondary-database read-only implications) are unaddressed.

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 only 33% - only `database` is documented in the schema (configured secondary id, non-id names rejected). The description compensates for `include_samples` by explaining exactly what is fetched ('a few distinct, non-null values for each column'), which is genuinely additive over a bare boolean default. However, the required `schema` parameter gets no semantic detail (case sensitivity, search_path, behavior when the schema does not exist), leaving one of three params thin.

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 ('Generate a detailed Markdown reference of a schema's tables, columns, constraints, indexes, views, foreign tables, and custom enums'), which is far more precise than the title alone. It implicitly separates itself from the granular list_*/describe_table siblings by being a whole-schema document generator, though it never names a sibling like generate_schema_diagram or get_compact_schema to draw the contrast explicitly.

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: an agent can infer this is for producing comprehensive documentation of one schema, and the include_samples sentence hints at when to enrich it. There is no explicit when-not guidance and no routing to alternatives such as generate_schema_diagram (visual) or list_tables (raw enumeration), which is a missed opportunity given the very large sibling set.

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

generate_sqlalchemy_modelsGenerate SQLAlchemy modelsA
Read-only

Read a PostgreSQL schema and emit a SQLAlchemy 2.0 declarative models file (DeclarativeBase + Mapped[T] + mapped_column). Covers tables, columns with PG-native types (incl. jsonb via sqlalchemy.dialects.postgresql.JSONB), primary keys, single-column FKs via ForeignKey(), unique constraints (column-level + composite via table_args), defaults, and enums (emitted as Python enum.Enum classes). Composite FKs are a documented v1 gap. Returns the rendered Python models.py source as a single string. Schema/table/column names must be plain identifiers ([A-Za-z_][A-Za-z0-9_]*); delimited names (hyphens, spaces, mixed-case-only) are not supported here because they become source identifiers in generated code — use SQL tools (export_table, dump_database) for those objects. See docs/identifier-policy.md.

NameRequiredDescriptionDefault
schemaYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already mark it read-only and closed-world, and the description adds substantial behavior beyond that: it enumerates exactly what is covered (jsonb via JSONB, single-column FKs, composite uniques via __table_args__, enums as Python Enum classes), discloses the v1 limitation ('Composite FKs are a documented v1 gap'), and states the return type ('rendered Python models.py source as a single string'). This is exactly the kind of scope-and-limitation disclosure the annotations cannot carry.

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 action and artifact, and every clause carries information (capability list, gap disclosure, return type, identifier policy, alternative tool). It is dense to the point of being a run-on with many parentheticals, which slightly hurts scanability, but no sentence is wasted.

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 need not explain return values, yet it does note the return is a single source string. Combined with the coverage list, the v1 composite-FK gap, the identifier constraint, and the alternative-tool routing, an agent has everything needed to call this correctly and to know when the call will be rejected.

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 50% (only `database` is documented inline; `schema` has no description in the schema), so the description has to compensate. It does partially, by constraining the form of schema/table/column names to plain identifiers and pointing to docs/identifier-policy.md, and by explaining the fallback for delimited names. It still never says what the `schema` argument selects relative to the `database` argument, which is a real 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+resource+output artifact: 'Read a PostgreSQL schema and emit a SQLAlchemy 2.0 declarative models file (DeclarativeBase + Mapped[T] + mapped_column)'. This cleanly separates it from the many sibling codegen tools (generate_prisma_schema, generate_drizzle_schema, generate_diesel_schema, generate_jooq_config) without needing 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 Guidelines4/5

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

Explicitly names when NOT to use it ('delimited names ... are not supported here ... use SQL tools (export_table, dump_database)'), and names the supported feature set that defines the appropriate scope. It does not explicitly route an agent among the sibling ORM generators (Prisma/Drizzle/Diesel), though the output language makes that largely self-evident.

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

generate_sqlc_schemaGenerate sqlc schemaA
Read-only

Read a PostgreSQL schema and emit a sqlc-friendly schema.sql (plain DDL). Order: CREATE SCHEMA, CREATE TYPE for each enum, CREATE TABLE statements (columns only), ALTER TABLE ADD CONSTRAINT (PK / unique / check / foreign key in that order), then CREATE INDEX for non-constraint indexes. The file replays cleanly against an empty database so FKs land after all referenced tables exist. In-process — no MCPG_ALLOW_SHELL needed. Returns the rendered schema.sql text as a single string. Schema/table/column names must be plain identifiers ([A-Za-z_][A-Za-z0-9_]*); delimited names (hyphens, spaces, mixed-case-only) are not supported here because they become source identifiers in generated code — use SQL tools (export_table, dump_database) for those objects. See docs/identifier-policy.md.

NameRequiredDescriptionDefault
schemaYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and openWorldHint=false, so the description adds real extra context: emission order, the guarantee that the file replays cleanly against an empty database, that it runs in-process without MCPG_ALLOW_SHELL, and that it returns the rendered text as a single string. The one gap is that it does not say what happens when a schema has no tables or unsupported objects beyond naming.

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 ordering details, then the identifier restriction and alternatives — a logical progression with no filler. It is dense and long-ish, and the trailing docs pointer is low value for an agent, but each sentence carries 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 two-parameter generation tool with an output schema present, the description covers output format, deterministic ordering, replay safety, execution mode, and the unsupported-input escape hatch. An agent has everything needed to decide to call it and to predict the result.

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 only 50%: the `database` parameter is well described in the schema itself, but `schema` has no schema-level description and the tool description never states that it is the source schema name (or whether it accepts patterns). The identifier-policy sentence indirectly constrains which objects are processable, which is useful, but the core `schema` parameter's meaning is left implicit.

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 ("Read a PostgreSQL schema and emit a sqlc-friendly schema.sql") plus the exact output artifact, which cleanly separates it from sibling generators like generate_prisma_schema or generate_drizzle_schema. The parenthetical "(plain DDL)" pins down the format without ambiguity.

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 exclusion rule with named alternatives: delimited names (hyphens, spaces, mixed-case-only) are unsupported here and the agent should use export_table or dump_database instead. There is no general when-to-use guidance relative to the other schema generators, but the routing for the failure case is concrete.

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

generate_test_dataGenerate test dataA
Read-only

Generate synthetic INSERT statements for a table — typed values respecting column type, NOT NULL, and DEFAULT. Returns the SQL as strings; does NOT execute it. Useful for seeding dev / staging environments. The generator is deterministic when a seed is provided. Foreign keys are NOT resolved — the caller must pre-seed referenced rows or drop the FK before applying. Hard cap of 10000 rows per call. Pure read (the actual writes go through run_write under unrestricted mode).

NameRequiredDescriptionDefault
rowsNo
seedNo
tableYes
schemaYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
tableYes
schemaYes
statementsYes
rows_generatedYes
skipped_columnsYes

TDQS

A4.7/5.0
Behavior5/5

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

Goes well beyond the readOnlyHint/openWorldHint annotations: it declares the output is SQL strings that are never executed, that generation is deterministic given a seed, that foreign keys are not resolved and referenced rows must be pre-seeded or the FK dropped, and that there is a hard cap of 10000 rows per call. The 'pure read, writes go through run_write' sentence reinforces rather than contradicts the readOnlyHint.

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?

Five dense sentences, each carrying distinct information, with the core capability and the 'does NOT execute' constraint front-loaded before caveats about FKs and row limits. There is no filler or restatement of the title.

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 generation tool with an output schema already describing the returned SQL strings, the description covers everything an agent needs: what is produced, that it is not executed, determinism controls, FK preconditions, row limits, and the database targeting caveat. No material behavioral question is left open.

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 only 20% (only 'database' is documented in the schema), so the description must carry the load — and it does for the important ones: rows is constrained by the stated 10000-row cap and seed is explained as a determinism switch. Table and schema are only implied by 'for a table', leaving a gap on whether schema accepts a name or a database-qualified path, but overall compensation is strong.

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 (generate synthetic INSERT statements for a table) plus the exact content rule (typed values respecting column type, NOT NULL, DEFAULT). It also disambiguates the closely related sibling generate_test_row_for by making clear this is a bulk, per-table operation producing SQL text rather than executing rows.

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 concrete when-to-use context (seeding dev / staging environments) and names the write path it is not (run_write under unrestricted mode). It stops short of an explicit when-not rule, such as preferring generate_test_row_for for a single row, but the surrounding guidance is clear enough to route the agent correctly.

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

generate_test_row_forGenerate test row forA
Read-only

Generate ONE realistic test row for a table — catalogue-aware. Skips identity / generated columns (server fills them in), samples one existing row from each referenced table for FK columns (so the row inserts cleanly), and uses column-name heuristics (*_email → user_N@example.com, *_url → https://example.com/r/N, *_at → recent timestamp, etc.) to make values look like data. Sibling of generate_test_data (bulk) — designed for the shadow-migration workflow where a single realistic row matters more than volume. Returns an object with insert_sql (one ready-to-execute INSERT), columns (per-column ColumnFill with sql_literal + heuristic explanation), schema, table. Does NOT execute the INSERT — caller applies via run_write when ready.

Example: generate_test_row_for(schema='public', table='orders', seed=42)

NameRequiredDescriptionDefault
seedNo
tableYes
schemaYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.
follow_foreign_keysNo

Output Schema

NameRequiredDescription
tableYes
schemaYes
columnsYes
insert_sqlYes

TDQS

A4.3/5.0
Behavior5/5

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

Goes well beyond the annotations by disclosing what is skipped (identity/generated columns), how FK values are produced (sampling one existing row per referenced table so the row inserts cleanly), the column-name heuristics used for value shape, and that the tool does NOT execute the INSERT. This is the kind of behavior an agent cannot infer from readOnlyHint/openWorldHint.

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?

Dense but front-loaded: the one-row scope and catalogue-awareness come first, then mechanics, then return shape, then the non-execution caveat, then an example. Every sentence carries information, though the heuristic parenthetical is packed tightly enough to slow scanning.

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 generator with an output schema, the description covers generation strategy, FK handling, return keys, and the execution boundary. Remaining gaps are minor — seed determinism and the `follow_foreign_keys` toggle — and return values are already documented by the output schema.

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 only 20% (only `database` is documented in-schema), so the description carries much of the burden. It illustrates `schema`, `table`, and `seed` via the example call and explains FK sampling, which implicitly covers `follow_foreign_keys`. However, `seed` reproducibility semantics and how to disable `follow_foreign_keys` (default true) are never stated.

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 ("Generate ONE realistic test row for a table") and immediately differentiates itself from the bulk sibling `generate_test_data`. An agent can tell exactly which of the two generation tools to pick 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 Guidelines4/5

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

Names the alternative (`generate_test_data` bulk) and the workflow that selects this tool: "the shadow-migration workflow where a single realistic row matters more than volume." It also clarifies the hand-off — the caller applies the INSERT via `run_write`. It stops short of explicit when-not-to-use conditions, but the routing context is clear.

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

get_aio_statusGet AIO statusA
Read-only

Report whether PG 19's async-I/O subsystem is usable. On PG < 19 returns available=false with a diagnostic pointing the agent at the existing read_pg_stat_io / run_maintenance tools. Never raises — driver-level errors during the version or settings probe also surface as available=false. Returns an object with available (bool), server_version_num (int), server_version, io_method ('sync' / 'worker' / 'io_uring' / null), io_min_workers, io_max_workers, and detail (a guidance string).

Example: get_aio_status()

NameRequiredDescriptionDefault
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
detailYes
availableYes
io_methodYes
io_max_workersYes
io_min_workersYes
server_versionYes
server_version_numYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already cover read-only safety, but the description adds genuinely new behavioral facts: the tool never raises and driver-level probe errors degrade to available=false. That error-contract detail is exactly what an agent needs to branch on. The enumerated return fields are useful but partly duplicate the existing output 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 core purpose, then the degradation behavior, then the return shape, with a call example at the end. The long field enumeration is slightly wasteful since an output schema exists, but nothing is confusing or padded.

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-required-parameter status probe with annotations and an output schema, everything an agent needs to decide and call is present: version gating, failure semantics, and fallback tooling.

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 optional parameter with 100% schema description coverage, and the schema already explains the database id targeting and rejection of unconfigured names. The description adds nothing about the parameter, so 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?

Names a specific resource and scope: 'whether PG 19's async-I/O subsystem is usable', with the version boundary stated explicitly. It is clearly distinct from the sibling I/O tools (read_pg_stat_io, run_maintenance) which it routes to rather than duplicates.

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

Usage Guidelines4/5

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

It gives a clear usage condition (checking PG 19 async-I/O availability) and explicitly names the fallback path for PG < 19 via the diagnostic pointing at read_pg_stat_io / run_maintenance. It does not, however, position itself relative to recommend_io_method, which is the closest sibling for I/O method advice.

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

get_compact_schemaGet compact schemaA
Read-only

Return a highly condensed, token-efficient text summary of a schema's tables, columns, primary keys, nullability, and relations to save context window tokens. Set fresh=true to bypass the cache and re-read live (e.g. after a schema change).

NameRequiredDescriptionDefault
freshNo
schemaYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already establish readOnly and closed-world, so the description's main added value is the caching behavior and the bypass path via fresh=true, which is genuinely useful operational context. It doesn't say whether the cache is shared across sessions or how large the output can get, but an output schema is present to carry 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.

Conciseness4/5

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

Two sentences, front-loaded with the purpose and followed by the one non-obvious parameter behavior. 'Highly condensed, token-efficient' is mildly redundant but reinforces the tool's differentiator rather than padding.

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 read-only, three-parameter summarization tool with an output schema, the description covers what matters: what is summarized, why (token savings), and how to force a live read. Missing only explicit sibling routing and any mention of scope limits, such as single vs. multiple schemas.

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 only 33% (only `database` is described in the schema). The description explains `fresh` well, including its purpose and an example trigger, but leaves the required `schema` parameter uncharacterized and doesn't reinforce the primary-vs-secondary database distinction. Partial compensation for a real coverage gap.

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?

States a specific verb and resource: returns a condensed text summary of a schema's tables, columns, primary keys, nullability, and relations, with the explicit goal of saving context tokens. It doesn't name any of the many sibling tools it competes with (describe_table, list_tables, generate_schema_docs), so the differentiation is only implicit.

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 only usage guidance is conditional and tied to a parameter: use fresh=true after a schema change. There is no explicit statement of when an agent should pick this over describe_table, list_tables, or generate_schema_docs, which are all plausibly overlapping choices in this catalog.

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

get_current_wal_lsnGet current WAL LSNA
Read-only

Return the current WAL LSN — write-side on a primary (pg_current_wal_lsn()) or replay-side on a standby (pg_last_wal_replay_lsn()). Natural pairing for the read-your-writes workflow: capture on the primary right after a write, then pass to wait_for_lsn on the standby session before the follow-up read. Works on every supported PG version. Returns an object with role ('primary' or 'standby') and lsn (PostgreSQL LSN literal, e.g. '0/1234ABCD').

Example: get_current_wal_lsn()

NameRequiredDescriptionDefault
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
lsnYes
roleYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered; the description adds real value beyond that by disclosing role-dependent behavior (different PG function on primary vs standby) and version portability across supported PG versions. It also describes the returned object shape, though that partially duplicates the output 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-loads purpose, then workflow, then compatibility, then return shape — a sensible ordering with little waste. The trailing 'Example: get_current_wal_lsn()' line earns almost nothing for a zero-required-argument tool and is the one removable sentence.

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 tool, the description covers purpose, primary/standby semantics, the companion workflow, version support, and return values, while the input schema and output schema carry the parameter and return details. An agent has everything needed to call it correctly in the intended workflow.

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 single `database` parameter is fully documented in the schema, including the secondary/read-only targeting rule, so the baseline is 3. The description never mentions the parameter, adding no meaning on top of the 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?

States a specific verb and resource ('Return the current WAL LSN') and immediately qualifies scope: write-side on a primary via pg_current_wal_lsn(), replay-side on a standby via pg_last_wal_replay_lsn(). This lets an agent distinguish it from adjacent tools like wait_for_lsn, read_pg_wal_stats, and get_wait_for_lsn_status without opening any schema.

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 concrete when-to-use guidance through the read-your-writes workflow: capture on the primary right after a write, then hand the value to wait_for_lsn on the standby before the follow-up read, and it names that sibling explicitly. What is missing is any when-not-to-use or exclusion (e.g. when get_wait_for_lsn_status or read_pg_wal_stats is the better call).

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

get_database_ddlGet database DDLA
Read-only

Return the CREATE DATABASE DDL for a named database using PG 19's pg_get_databasedef(oid) function. Returns found=false with an empty ddl when the database doesn't exist. Requires PG 19+. Returns an object with object_type ('database'), object_name, found, and ddl.

Example: get_database_ddl(database_name='analytics')

NameRequiredDescriptionDefault
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.
database_nameYes

Output Schema

NameRequiredDescription
ddlYes
foundYes
object_nameYes
object_typeYes

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, but the description adds real behavioral context beyond them: the PG 19+ version requirement and the specific not-found contract (`found=false` with an empty `ddl` instead of an error). That not-found semantics is the most decision-relevant detail and is not derivable from 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.

Conciseness4/5

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

Front-loaded with the core action, followed by the failure contract, the version requirement, and a concrete example — a sensible order with little waste. The return-shape sentence slightly duplicates what the output schema already provides.

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 read-only introspection tool with an output schema and annotations, the description covers the essentials: what it returns, version gating, not-found behavior, and an example call. Return value explanation is not needed given the output schema exists.

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 50%: the `database` parameter has a rich description in the schema, but `database_name` has none there. The description and example clarify that `database_name` is a plain database name string, but it never mentions the `database` secondary-targeting parameter, so it only partially compensates for the gap.

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?

States a specific verb and resource: return the `CREATE DATABASE` DDL for a named database, and names the underlying `pg_get_databasedef(oid)` mechanism. It is clearly distinct from siblings like get_role_ddl and get_tablespace_ddl by resource, though it never explicitly contrasts itself with them.

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: it says the tool needs PG 19+, which functions as a precondition, and the example shows the typical call. There is no explicit when-to-use/when-not or routing to alternatives such as get_pg19_ddl_status for capability checking.

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

get_data_checksums_statusGet data checksums statusA
Read-only

Report whether PG 19's online data_checksums toggle is usable + the current setting. Never raises — driver-level errors surface as available=false. On PG ≤ 18 reports available=false but still surfaces the current state (set at initdb time) so the agent has context, and points at the offline pg_checksums fallback. Returns an object with available (bool), server_version_num (int), server_version, enabled (bool / null), and detail (guidance string).

Example: get_data_checksums_status()

NameRequiredDescriptionDefault
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
detailYes
enabledYes
availableYes
server_versionYes
server_version_numYes

TDQS

A4.3/5.0
Behavior5/5

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

Beyond the annotations, the description discloses two high-value behavioral traits an agent cannot infer: it never raises, and driver-level errors are converted into `available=false`. It also explains the version-gated branch (PG ≤ 18 still returns state plus fallback guidance), which prevents the agent from misreading a `false` as a failure.

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 key behavior (what is reported, never raises) is front-loaded, and the version-branch detail follows logically. The trailing example `get_data_checksums_status()` is redundant given a zero-required-parameter tool, but the rest of the text is dense with useful content.

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 read-only, single-optional-parameter status tool with an output schema present, the description covers purpose, version behavior, error handling, and fallback path. The return-field enumeration overlaps the output schema somewhat, and the `database` targeting behavior is left entirely to the schema, but nothing an agent needs to call it correctly is absent.

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 `database` parameter already has full schema documentation (100% coverage) explaining that it targets a configured secondary and that unconfigured names are rejected. The description never mentions this parameter, so it adds no meaning beyond the schema — 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 resource and setting: PG 19's online `data_checksums` toggle, and states exactly what is reported (usability + current setting). An agent can distinguish this from nearby tools like `audit_settings` or `inspect_guc` because the scope is pinned to one specific setting and its online-toggle capability.

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

Usage Guidelines4/5

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

It gives clear usage context by version: on PG 19 it reports the online toggle, and on PG ≤ 18 it returns `available=false` while still surfacing initdb-time state and pointing at the offline `pg_checksums` fallback. What is missing is explicit routing against sibling tools (e.g., when to prefer this over `inspect_guc` or `audit_settings`), so it stops short of full when/when-not guidance.

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

get_hypertable_statsGet hypertable statsA
Read-only

Size and compression statistics for one TimescaleDB hypertable: total/compressed chunk counts, approximate row count, table/index/toast/total bytes, and bytes before/after compression. Errors if the table is not a hypertable; available=false when the timescaledb extension is not installed.

NameRequiredDescriptionDefault
tableYes
schemaYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
tableYes
schemaYes
availableYes
index_bytesYes
table_bytesYes
toast_bytesYes
total_bytesYes
total_chunksYes
compressed_chunksYes
approximate_row_countYes
after_compression_bytesYes
before_compression_bytesYes

TDQS

A4/5.0
Behavior4/5

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

Beyond the readOnlyHint, it discloses real behavioral traits: a hard error when the relation is not a hypertable, and an available=false outcome when the timescaledb extension is absent. That edge-case behavior is exactly what an agent needs and is not captured by 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 tight sentences, front-loaded with purpose then edge cases, with zero filler. Every clause (metric list, error condition, extension-missing case) carries information.

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

Completeness4/5

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

With an output schema present and a read-only annotation, the remaining burden is edge-case behavior, which is covered (non-hypertable error, extension-missing fallback). Minor gap: no mention of cost/latency on large hypertables or what units the byte metrics use, though the output schema may cover the latter.

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 only 33% (only 'database' is documented), but the two undocumented params (schema, table) are self-evident and the description reinforces 'one hypertable' targeting. It adds no format or resolution guidance for schema/table beyond the schema itself, so a baseline score is warranted.

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?

Names the specific verb and resource ('Size and compression statistics for one TimescaleDB hypertable') and enumerates exactly which metrics come back (chunk counts, row count, bytes, compression ratios). This clearly separates it from sibling tools like list_hypertables, list_chunks, or describe_table.

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?

Implicitly the tool is for a hypertable already known to the caller, and the error-on-non-hypertable note hints at prerequisites, but it never states when to reach for this versus list_hypertables, list_chunks, or analyze_table_bloat. Usage is inferable rather than guided.

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

get_logical_replication_statusGet logical replication statusA
Read-only

Report whether PG 19's on-demand wal_level flip is usable, plus the configured wal_level, the new PG 19 effective_wal_level preset GUC, and max_replication_slots. When configured and effective diverge the agent can tell that an ALTER SYSTEM has been done but a reload is still pending. Never raises. Returns an object with available (bool), server_version_num, server_version, wal_level, effective_wal_level, max_replication_slots, and detail.

Example: get_logical_replication_status()

NameRequiredDescriptionDefault
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
detailYes
availableYes
wal_levelYes
server_versionYes
server_version_numYes
effective_wal_levelYes
max_replication_slotsYes

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already establish readOnlyHint=true and openWorldHint=false, but the description adds two traits annotations cannot express: the tool never raises, and it is version-sensitive (PG 19 features, surfaced through an `available` flag). The divergence interpretation (ALTER SYSTEM done, reload pending) is also substantive behavioral context. Return-field enumeration overlaps the output schema slightly, keeping it off 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?

It is front-loaded with the core purpose and the diagnostic interpretation, with no filler sentences. The explicit list of returned keys is somewhat redundant given a companion output schema, which is the only wasted space.

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 version-gated read tool this covers what an agent needs: what is checked, why divergence matters, that it never raises, and an example invocation. The only gap is that the optional `database` targeting behavior is left entirely to the schema, which is acceptable given an output schema already documents the return shape.

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 `database` parameter is fully documented in the schema, including the rejection of non-configured names. The description says nothing about the parameter, so it adds no meaning beyond the schema — baseline 3 for a high-coverage single-parameter tool.

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 precise verb (report) and a precisely scoped resource: whether the PG 19 on-demand wal_level flip is usable plus configured wal_level, effective_wal_level, and max_replication_slots. That is specific enough to separate it from neighbors like inspect_guc, list_replicas, or list_publications 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 Guidelines3/5

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

Usage is implied by the interpretation note — read this to confirm a wal_level change has actually taken effect after ALTER SYSTEM — but the description never says when to call it versus inspect_guc or list_replicas, and names no alternatives. An agent has to infer the workflow context.

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

get_metrics_expositionGet metrics expositionA
Read-only

Return the in-process Prometheus-format metrics for this MCPg server. Three series: mcpg_tool_calls_total (counter by tool / status), mcpg_tool_duration_seconds (histogram by tool with sum and count). Useful when the HTTP transport's /metrics endpoint is unreachable (e.g. running over stdio) or to fetch via the MCP protocol itself.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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

Annotations declare readOnlyHint=true, and the description adds behavioral context by stating it returns 'in-process' metrics (snapshot at call time) and describes the series structure (counter with tool/status labels, histogram with sum/count). No contradictions.

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

Conciseness5/5

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

The description is three well-structured sentences. The first sentence states the core purpose, the second lists the series (adding detail), and the third provides usage guidance. Every sentence is informative and no waste.

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 no parameters, annotations indicating read-only, and an output schema, the description is complete: it explains what the tool returns and when to use it, covering all needed information for an agent.

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?

No parameters exist, and the description adds value by explaining the output structure, which is helpful since the input schema is empty and the output schema provides structure.

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

Purpose5/5

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

The description clearly states it returns Prometheus-format metrics for the MCPg server, listing specific series (counter and histogram) and their fields. It distinguishes itself from siblings by mentioning when it's useful (when HTTP /metrics endpoint is unreachable or via MCP protocol).

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 states when to use the tool: when the HTTP /metrics endpoint is unreachable (e.g., over stdio) or to fetch via MCP protocol. While it doesn't mention when not to use, it provides clear context that makes the usage scenario obvious.

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

get_pg19_ddl_statusGet PG 19 DDL statusA
Read-only

Report whether PG 19's pg_get_roledef() / pg_get_databasedef() / pg_get_tablespacedef() DDL-dump functions are usable on this server. Never raises — driver-level errors surface as available=false. On PG ≤ 18 reports available=false and points the agent at pg_dumpall --roles-only / --globals-only / --tablespaces-only as the fallback. Returns an object with available (bool), server_version_num (int), server_version, has_pg_get_roledef (bool), has_pg_get_databasedef (bool), has_pg_get_tablespacedef (bool), and detail (guidance string).

Example: get_pg19_ddl_status()

NameRequiredDescriptionDefault
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
detailYes
availableYes
server_versionYes
has_pg_get_roledefYes
server_version_numYes
has_pg_get_databasedefYes
has_pg_get_tablespacedefYes

TDQS

A4.2/5.0
Behavior4/5

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

Beyond readOnlyHint/openWorldHint, the description adds a genuinely useful behavioral guarantee: it never raises and driver-level errors are folded into available=false. It also enumerates the returned fields, including a detail guidance string, which goes past 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.

Conciseness4/5

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

Front-loaded with the core question in the first sentence, then error behavior, fallback, and return shape in a compact sequence. Slightly dense with the field enumeration, but each sentence does work.

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 capability detection, version gating, failure semantics, and fallback path; with an output schema present, the description need not explain return values further. An agent has everything needed to call it and act on the result.

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 database parameter is documented at 100% schema coverage, including the 'configured id only, omit for primary' constraint, so the schema carries the semantics. The description itself says nothing about the parameter, so 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?

States a specific verb (report/check) and a specific resource: whether PG 19's pg_get_roledef()/pg_get_databasedef()/pg_get_tablespacedef() DDL-dump functions are usable. This clearly separates it from the sibling DDL-emitting tools get_role_ddl, get_database_ddl and get_tablespace_ddl.

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?

Tells the agent what happens on PG ≤ 18 (available=false) and names concrete fallbacks (pg_dumpall --roles-only/--globals-only/--tablespaces-only), which is real when-to-use guidance. It stops short of explicitly saying 'call this before get_role_ddl/get_database_ddl', which would have made the routing unambiguous.

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

get_pg19_partitions_statusGet PG 19 partitions statusA
Read-only

Report whether PG 19's ALTER TABLE … MERGE PARTITIONS and ALTER TABLE … SPLIT PARTITION forms are usable on this server. Never raises — driver-level errors surface as available=false. On PG ≤ 18 reports available=false and points the agent at the detach / create / attach fallback path. Returns an object with available (bool), server_version_num (int), server_version, and detail (guidance string).

Example: get_pg19_partitions_status()

NameRequiredDescriptionDefault
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
detailYes
availableYes
server_versionYes
server_version_numYes

TDQS

A4.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description does add genuinely useful behavior beyond that: 'Never raises — driver-level errors surface as available=false', plus the version-gating fallback. However, much of the remaining text enumerates return fields (available, server_version_num, server_version, detail) that an output schema already supplies, so the additive value is thinner than it first appears.

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 question, then error semantics, then version fallback, then the return shape — a sensible order. The return-field enumeration and the bare example line are largely redundant given an output schema and a no-arg signature, costing a little tightness.

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

Completeness5/5

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

For a single-parameter, read-only capability probe with an output schema, everything an agent needs is present: what is checked, that it never raises, how failures map to available=false, and what to do on older servers. Return values need not be re-explained, so no material gap remains.

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 one optional parameter at 100% schema description coverage, the schema already explains the `database` id targeting and the rejection of unconfigured names. The description adds nothing about that parameter, so the schema carries it; baseline 3 applies, nudged to 4 because the tool has only one optional param and the omission causes no ambiguity.

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: it reports whether PG 19's `ALTER TABLE … MERGE PARTITIONS` and `SPLIT PARTITION` forms are usable on this server. That is concrete enough to separate it from neighboring capability-probe tools like get_pg19_ddl_status, get_pg19_stats_status, and get_skip_scan_status, which cover different feature areas.

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?

Usage context is clear: an agent should probe this before attempting MERGE/SPLIT PARTITIONS, and the PG ≤ 18 branch routes it to the detach / create / attach fallback path. It does not explicitly name sibling probes as alternatives or state a 'do not use if' condition, keeping it just short of a 5.

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

get_pg19_stats_statusGet PG 19 stats statusA
Read-only

Report whether PG 19's pg_stat_lock and pg_stat_recovery views are usable on this server. Never raises — driver-level errors surface as available=false. On PG < 19 returns available=false with a diagnostic pointing the agent at find_blocking_chains / pg_stat_replication. Returns an object with available (bool), server_version_num (int), server_version, has_pg_stat_lock (bool), has_pg_stat_recovery (bool), and detail (guidance string).

Example: get_pg19_stats_status()

NameRequiredDescriptionDefault
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
detailYes
availableYes
server_versionYes
has_pg_stat_lockYes
server_version_numYes
has_pg_stat_recoveryYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations only declare readOnlyHint/openWorldHint=false; the description adds genuine behavior beyond that: the call never raises, driver errors are swallowed into available=false, and results are version-gated. It does not discuss cost, permissions, or latency, but those are minor for a capability probe.

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 question, then the failure mode, then the fallback, then the shape — a logical order with no filler. The trailing zero-argument example and the field enumeration are marginal value since an output schema already exists.

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-param status probe, everything an agent needs is present: what is checked, what happens on old versions, that it never throws, and which siblings to use instead. The field list is redundant with the output schema but does no harm.

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?

One optional parameter at 100% schema description coverage, so the schema already explains the 'database id from list_databases / secondary read-only target' semantics fully. The description adds nothing about the database parameter, which is acceptable given the coverage baseline of 3.

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 ('Report whether PG 19's `pg_stat_lock` and `pg_stat_recovery` views are usable'), which distinguishes it from the actual data-reading siblings read_pg_stat_lock and read_pg_stat_recovery. An agent can tell this is a capability/preflight probe rather than a data read without opening any schema.

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 explicit fallback routing: on PG < 19 it 'points the agent at find_blocking_chains / pg_stat_replication', naming concrete alternatives. What's missing is the forward directive — it never says 'call this before read_pg_stat_lock' — so the agent must infer the preflight role.

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

get_pgq_statusGet PGQ statusA
Read-only

Report whether SQL/PGQ (the SQL standard for property graph queries, new in PG 19) is usable on this server. SQL/PGQ coexists with the AGE-style graph_operations bucket — get_pgq_status is the agent's hint about which surface to reach for. Never raises; on PG < 19 reports available=false with a diagnostic pointing at run_cypher. Returns an object with available (bool), server_version_num (int), server_version (the human-readable string), and detail (a guidance string the agent can surface to the user).

Example: get_pgq_status()

NameRequiredDescriptionDefault
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
detailYes
availableYes
server_versionYes
server_version_numYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered; the description adds genuinely new behavior beyond them — 'Never raises' and the PG < 19 degradation path with an embedded diagnostic. It stops short of saying how version detection is performed or whether anything is required of the caller, so it is strong but not exhaustive.

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 question, then the routing role, then failure behavior. The enumerated return fields (`available`, `server_version_num`, `server_version`, `detail`) partially duplicate the output schema, which is the only wasted material; otherwise tight.

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?

An output schema exists and annotations cover read-only safety, so the description need only carry the version gate and routing logic — both are present. The one omission is that it never connects the `database` parameter to the version check (a configured secondary may be a different major version), which mildly matters for interpreting `available` on non-primary targets.

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 `database` parameter is fully documented in the schema (100% coverage, including the secondary read-only targeting and rejection of unconfigured names), and the description says nothing about it. Baseline 3 applies since the schema carries the full parameter burden; the description does not compensate for or extend it.

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 ('Report whether SQL/PGQ ... is usable on this server') and immediately differentiates the two graph surfaces, naming the AGE-style `graph_operations` bucket and `run_cypher` as the alternatives. An agent can tell this apart from the other graph tools without opening any 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 frames the tool as the routing probe ('the agent's hint about which surface to reach for') and gives the fallback path: on PG < 19 it reports available=false with a diagnostic pointing at `run_cypher`. That is both a when-to-use rule and a named alternative with the condition that selects it.

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

get_pg_search_index_metadataGet PG search index metadataA
Read-only

Fetch the parsed reloptions for a single BM25 index (schema.index). Same shape as one entry of list_pg_search_indexes — typed accessors for the 13 documented options plus the raw index_options dict. Raises when the extension is not installed or no BM25 index by that name exists. Returns an object with schema, index, the typed option fields, and index_options (raw reloptions dict for forward-compat).

NameRequiredDescriptionDefault
indexYes
schemaYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
indexYes
tableYes
schemaYes
columnsYes
sort_byNo
key_fieldNo
json_fieldsYes
layer_sizesNo
text_fieldsYes
range_fieldsYes
index_optionsYes
boolean_fieldsYes
numeric_fieldsYes
datetime_fieldsYes
search_tokenizerYes
mutable_segment_rowsNo
target_segment_countNo
background_layer_sizesNo

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, and the description adds genuinely new behavior: it raises when the pg_search extension is absent or the named index does not exist, and it exposes a raw index_options dict for forward compatibility. The return-shape sentence overlaps with the output schema, but the failure modes are valuable.

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 first sentence carries the core purpose and is front-loaded; the rest is compact. The closing sentence restating the return object is largely redundant given the output schema, so a little space is not earned.

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 two-key read-only lookup with an output schema, this covers purpose, error conditions, and output shape. Secondary-database targeting is left entirely to the single schema description, but overall an agent has enough to call it 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?

Schema coverage is only 33% — just the optional database parameter is documented in the schema. The description partially compensates by framing schema and index as a composite identifier pair, but it does not clarify identifier casing, quoting, or what database targeting changes 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?

States a specific verb and resource — fetch parsed reloptions for a single BM25 index — and names the composite key form (schema.index). It also distinguishes itself from list_pg_search_indexes by noting the output is the same shape as one of its entries.

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 reference to list_pg_search_indexes implies the split: enumerate with that tool, drill into one with this one. It also gives a precondition (raises if the extension is not installed or no BM25 index by that name exists), but it never explicitly says 'use this instead of X when...'.

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

get_prewarm_extension_statusGet prewarm extension statusA
Read-only

Report whether pg_prewarm (and the supporting pg_buffercache) are installed, and whether pg_prewarm is listed in shared_preload_libraries (the autoprewarm worker requires it). Returns an object with pg_prewarm_installed (bool), pg_buffercache_installed (bool), autoprewarm_libraries_present (bool), and shared_preload_libraries (the raw setting).

Example: get_prewarm_extension_status()

NameRequiredDescriptionDefault
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
pg_prewarm_installedYes
pg_buffercache_installedYes
shared_preload_librariesYes
autoprewarm_libraries_presentYes

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description still adds real context beyond the annotations by explaining why shared_preload_libraries matters (the autoprewarm worker requires it) and enumerating the four boolean/raw fields returned.

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 definition is front-loaded with the core check, then the return shape, then an example. The trailing no-argument example is nearly redundant but short and harmless; nothing else is wasted.

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 an output schema, one optional fully-documented parameter, and annotations covering safety, the description fills the remaining gaps: the semantic meaning of each field and the operational prerequisite it detects. An agent can call it correctly with no further information.

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%; the single optional `database` parameter is fully documented in the schema as a configured secondary database id from list_databases. The description adds nothing about that parameter, which is acceptable given the schema baseline but earns no extra credit.

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 (report), resource (pg_prewarm/pg_buffercache installation state and shared_preload_libraries membership), and explains the reason (the autoprewarm worker requires the entry). This lets an agent distinguish it from generic siblings such as list_extensions or list_prewarmed_relations.

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

Usage Guidelines3/5

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

The description implies the use case — verifying prerequisites before autoprewarm-related work — but never explicitly says when to call this instead of list_extensions, list_prewarmed_relations, or recommend_prewarm_targets, and gives no exclusions. The usage context is inferable but not spelled out.

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

get_redis_cache_statsGet Redis cache statsA
Read-only

Best-effort cache metrics for a redis_fdw server. redis_fdw does not ship a uniform stats SQL surface across versions, so the tool validates that the server exists and otherwise reports available=false with a diagnostic. Operators wanting live metrics should query Redis directly (INFO / DBSIZE). Returns an object with server, available (bool), key_count, used_memory_bytes, and detail (a human-readable note).

Example: get_redis_cache_stats(server='redis_primary')

NameRequiredDescriptionDefault
serverYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
detailYes
serverYes
availableYes
key_countYes
used_memory_bytesYes

TDQS

A4.4/5.0
Behavior5/5

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

Beyond the readOnlyHint/openWorldHint annotations, the description discloses a critical behavioral trait: the tool is best-effort and may return available=false with a diagnostic because redis_fdw lacks a uniform stats surface. This tells the agent in advance that a false/unavailable result is expected, not an error — exactly the kind of context annotations cannot 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 best-effort caveat and fallback are front-loaded, then the return shape, then an example — a logical order with no padding. Minor redundancy: enumerating return fields overlaps with 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?

For a two-parameter tool with annotations and an output schema, this covers the degraded-result semantics, the fallback path, and a usage example. Nothing an agent needs to call it correctly or interpret an unavailable result 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?

Schema coverage is only 50%: the `database` param is documented in-schema, but `server` has no description. The description compensates partly with an example call showing server='redis_primary', but it never explains what a server is or how it relates to list_redis_foreign_servers, 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 and resource ('Best-effort cache metrics for a redis_fdw server') and immediately scopes it against siblings like list_redis_foreign_servers and describe_redis_cache_table by framing it as a metrics reporter rather than a lister/describer. An agent knows exactly what this retrieves.

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

Usage Guidelines4/5

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

It gives a clear use context (validating the server exists, getting available/key_count/memory) and explicitly routes agents wanting live metrics to direct Redis INFO/DBSIZE instead. It stops short of naming specific sibling alternatives by name, but the when-to-use and fallback guidance is explicit.

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

get_repack_statusGet repack statusA
Read-only

Report whether PG 19's in-server REPACK command is usable. On PG < 19 returns available=false with a diagnostic pointing the agent at the long-standing pg_repack extension shell-out path so the fallback is clear. The in-server REPACK CONCURRENTLY is the headline PG 19 operational win — online table rebuild with no blocking writers. Returns an object with available (bool), server_version_num (int), server_version (the human-readable string), and detail (a guidance string the agent can surface to the user).

Example: get_repack_status()

NameRequiredDescriptionDefault
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
detailYes
availableYes
server_versionYes
server_version_numYes

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the description adds useful behavior beyond that: version-conditional output, a fallback diagnostic, and the meaning of REPACK CONCURRENTLY. It does not mention auth or rate limits, but for a read-only status check the added behavioral detail is solid.

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 purpose is front-loaded, but the description includes a promotional sentence about REPACK CONCURRENTLY being the 'headline PG 19 operational win' and redundantly lists return fields despite an output schema. The trivial example also adds little value. It is readable but not maximally concise.

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 simple one-parameter, read-only status tool with an output schema, the description covers purpose, PG-version behavior, fallback guidance, and the meaning of the returned detail string. The parameter and output shape are handled by structured fields, so nothing essential 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?

Schema description coverage is 100%, so the single optional database parameter is already fully documented in the schema. The description does not add any additional meaning for that parameter, making the baseline 3 appropriate.

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

Purpose5/5

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

The description states a specific verb and resource: 'Report whether PG 19's in-server REPACK command is usable.' It also names the relevant fallback, pg_repack extension shell-out path, making the scope distinct from generic status sibling 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 clear context for checking PG 19 REPACK availability and explains that PG < 19 returns available=false with a diagnostic pointing to the pg_repack fallback. It does not explicitly name a sibling tool alternative or state a when-not-to-use condition, but the usage context is clear.

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

get_role_ddlGet role DDLA
Read-only

Return the CREATE ROLE DDL for a named role using PG 19's pg_get_roledef(oid) function — no shell-out to pg_dumpall --roles-only required. Returns found=false with an empty ddl when the role doesn't exist. Requires PG 19+; raises on older servers (pair with get_pg19_ddl_status to feature-detect). Returns an object with object_type ('role'), object_name, found (bool), and ddl (the verbatim CREATE statement).

Example: get_role_ddl(role_name='app_user')

NameRequiredDescriptionDefault
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.
role_nameYes

Output Schema

NameRequiredDescription
ddlYes
foundYes
object_nameYes
object_typeYes

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, and the description still adds substantive behavior: found=false with empty ddl for missing roles, an exception raised on pre-PG-19 servers, and a version-detection teammate. Error and edge-case behavior are disclosed rather than left to inference.

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?

Front-loaded with the action, then fallback mechanism, edge case, version constraint, and return shape — each sentence carries distinct information with no restatement of the name or title.

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?

Even though an output schema exists, the description voluntarily names the key result fields and the found=false semantics, and it covers the main failure mode (pre-PG-19 servers). Nothing an agent needs to invoke this 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 50%; the `database` parameter is fully documented in the schema, while `role_name` has no schema description. The description compensates by clarifying that role_name is the named role whose CREATE statement is returned and by supplying a worked example call.

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 ('Return the CREATE ROLE DDL for a named role') and names the exact mechanism (pg_get_roledef) plus the alternative it replaces (pg_dumpall --roles-only). It is clearly distinguishable from siblings like get_database_ddl and get_tablespace_ddl.

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 a concrete usage condition — requires PG 19+, and explicitly routes the agent to get_pg19_ddl_status for feature detection on older servers. It does not address when to prefer list_roles or grantees inspection, but the operative when/when-not is covered.

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

get_server_infoGet server infoA
Read-only

Return the MCPg server version, access mode, transport, database connection status, and PostgreSQL wal_level / effective_wal_level (the latter is None on PG ≤ 18 where the GUC doesn't exist; on PG 19+ a divergence between the two indicates a reload is still pending).

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?

Annotations already provide readOnlyHint=true. The description adds valuable behavioral details: handling of effective_wal_level for PG 18 vs 19+, and that divergence indicates pending reload. This goes beyond annotations and clarifies edge cases.

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, efficiently structured, front-loaded with the main action. Every clause adds necessary detail without redundancy.

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

Completeness5/5

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

With no parameters and an output schema (assumed), the description completely covers what the tool returns, including version-specific nuance. No gaps remain for the agent.

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%. The description does not need to add parameter info, but it does explain what the return values include. Baseline for zero parameters is 4, 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 'Return the MCPg server version, access mode, transport, database connection status, and PostgreSQL wal_level / effective_wal_level'. This uses a specific verb and defines the resource exactly. No sibling tool offers the same output, so differentiation is clear.

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?

Although not explicitly stating when to use or not, the tool's unique purpose among siblings (none other returns server info) makes it obvious. The description implies it is the go-to for server metadata. Slight deduction for lack of explicit alternatives or exclusions.

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

get_skip_scan_statusGet skip scan statusA
Read-only

Report whether PG 19's B-tree skip-scan optimisation is the planner default on this server. Never raises — driver-level errors surface as available=false. On PG ≤ 18 reports available=false and points the agent at the standard 'add a dedicated single-column index' fallback. Returns an object with available (bool), server_version_num (int), server_version, and detail (guidance string).

Example: get_skip_scan_status()

NameRequiredDescriptionDefault
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
detailYes
availableYes
server_versionYes
server_version_numYes

TDQS

A4.1/5.0
Behavior5/5

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

Goes well past the readOnlyHint/openWorldHint annotations by disclosing that the tool never raises, that driver-level errors surface as available=false, and how behaviour differs on PG ≤ 18 versus PG 19. These are exactly the runtime traits an agent needs to interpret a failure-free response.

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 answer, followed by error semantics, version fallback, and return shape, then a short example. Four compact sentences with little waste, though the return-field enumeration partially duplicates the output schema.

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?

An output schema and annotations exist, so the description need not explain return values, and it still adds error-handling and version-gating context. The only gap is the absence of any mention of the secondary-database targeting parameter, which the schema carries on its own.

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% and the single optional `database` parameter is fully documented in the schema, so the baseline applies. The description never mentions the parameter and its example call `get_skip_scan_status()` uses no arguments, adding no meaning beyond the 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?

States a specific verb and resource: report whether PG 19's B-tree skip-scan optimisation is the planner default on this server. The version-gated framing and the named fallback ('add a dedicated single-column index') make it distinguishable from the sibling recommend_skip_scan_indexes 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 Guidelines3/5

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

Usage is implied by the purpose (checking planner default status) and the description explains the next step on PG ≤ 18, but it never states when to call this versus recommend_skip_scan_indexes or why_is_this_slow, nor any exclusions. Guidance is inferable rather than explicit.

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

get_tablespace_ddlGet tablespace DDLA
Read-only

Return the CREATE TABLESPACE DDL for a named tablespace using PG 19's pg_get_tablespacedef(oid) function. Returns found=false with an empty ddl when the tablespace doesn't exist. Requires PG 19+. Returns an object with object_type ('tablespace'), object_name, found, and ddl.

Example: get_tablespace_ddl(tablespace_name='fast_ssd')

NameRequiredDescriptionDefault
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.
tablespace_nameYes

Output Schema

NameRequiredDescription
ddlYes
foundYes
object_nameYes
object_typeYes

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds real behavioral context on top: the PG 19+ version gate and the not-found contract ('Returns found=false with an empty ddl when the tablespace doesn't exist'), which an agent would otherwise have to discover by trial.

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?

Three tight sentences plus an example, with the core action front-loaded. The final sentence restating the returned object_type/object_name/found/ddl fields is partly redundant given an output schema exists, but it is brief and still aids at-a-glance readability.

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?

This is a simple, single-resource read tool with an output schema and read-only annotations, and the description covers the version prerequisite, the missing-object case, and the call shape. Nothing an agent needs in order to invoke it correctly is absent.

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 50% — the `database` parameter is well documented in the schema itself, but `tablespace_name` has no schema description. The description contributes a concrete call example (tablespace_name='fast_ssd'), clarifying that the parameter takes a name rather than an OID, but adds no syntax or constraints.

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 names a specific verb and resource ('Return the CREATE TABLESPACE DDL for a named tablespace') and even names the underlying function pg_get_tablespacedef(oid). It does not explicitly contrast with the closely related get_role_ddl / get_database_ddl siblings, so an agent must infer the distinction from the noun 'tablespace', but the operation itself is unambiguous.

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: 'Requires PG 19+' functions as a hard precondition, which is genuinely useful selection guidance. However, there is no explicit when-to-use framing versus the sibling DDL tools and no statement of what to do if the server is pre-19 beyond the version note.

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

get_timescaledb_telemetry_reportGet timescaledb telemetry reportA
Read-only

Return the usage report TimescaleDB builds about this database (get_telemetry_report()): versions, relation counts and sizes, feature usage. It is generated locally from catalog data and nothing is sent by this call (the periodic upload is a separate background job governed by timescaledb.telemetry_level). Contains instance metadata such as the database UUID, so treat it as sensitive.

NameRequiredDescriptionDefault
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
reportYes
availableYes

TDQS

A3.8/5.0
Behavior4/5

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

Annotations only declare readOnlyHint and openWorldHint; the description adds genuinely new behavior: the report is generated locally from catalog data, this call transmits nothing, and the periodic upload is a separate background job controlled by timescaledb.telemetry_level — which directly resolves the privacy worry the name "telemetry" creates. It also flags that the payload contains sensitive instance metadata (database UUID). What it does not cover is cost, permissions, or output shape (though an output schema exists).

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?

Three front-loaded sentences: identity and payload first, then the no-egress clarification, then the sensitivity warning. No repetition of the title or schema, and every clause carries information an agent cannot get from structured fields.

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

Completeness4/5

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

For a zero-required-parameter read tool with a fully documented schema and an output schema, the description covers what it returns, whether it sends data, and its sensitivity. It leaves open only secondary details such as required privileges and whether the report content varies with the telemetry level setting.

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% and the single optional 'database' parameter is fully documented in the schema, including the restriction to configured secondary ids from list_databases. The description adds nothing about that parameter, so the baseline 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?

States a specific verb and resource ("Return the usage report TimescaleDB builds about this database") and even names the underlying function get_telemetry_report(), then enumerates the contents (versions, relation counts and sizes, feature usage). It does not distinguish itself from nearby TimescaleDB siblings such as get_hypertable_stats or list_timescale_jobs, so an agent must infer the boundary.

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: an agent reads that this is the telemetry report and should call it when telemetry content is wanted. There is no explicit when-to-use, when-not-to-use, or named alternative among the many TimescaleDB tools listed as siblings.

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

get_turboquant_heap_statsGet TurboQuant heap statsB
Read-only

Return the exact heap row count tq_index_heap_stats() reports for a single turboquant index (schema.index). The raw upstream payload is preserved in raw for any extra counters upstream may add. Requires the pg_turboquant extension.

NameRequiredDescriptionDefault
indexYes
schemaYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
rawYes
indexYes
schemaYes
row_countYes

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds two useful behavioral facts beyond that: the result mirrors tq_index_heap_stats() exactly and the untouched upstream payload is carried in a 'raw' field for future counters. It stops short of saying what happens when the extension is absent or the index is not a turboquant index.

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?

Three short sentences, front-loaded with the core purpose, then the payload-passthrough note, then the prerequisite. Nothing is redundant, though the 'for any extra counters upstream may add' clause is slightly speculative padding.

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 values need not be explained, and the description covers purpose, identifier shape and extension prerequisite. For a read-only single-index stats tool with one undocumented optional param, it is adequate, but it omits error/absence behavior and any hint about which sibling to use when only metadata is wanted.

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 33%, and the two required parameters ('schema', 'index') carry no per-parameter descriptions. The description partially compensates by writing them as a paired '(schema.index)' identifier, which tells the agent the two fields jointly address one index. The optional 'database' parameter's targeting semantics live only in the schema, so the description adds meaning but does not fully close the coverage gap.

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 gives a precise verb and resource: 'Return the exact heap row count tq_index_heap_stats() reports for a single turboquant index', and clarifies the (schema.index) addressing, so an agent knows exactly what data comes back. It does not explicitly contrast itself with nearby siblings like get_turboquant_index_metadata or get_turboquant_last_scan_stats, which keeps it short of a 5.

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

Usage Guidelines3/5

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

Usage is only implied: an agent can infer this is the tool for raw heap-count statistics on one turboquant index. The only explicit guidance is the prerequisite 'Requires the pg_turboquant extension', with no statement of when to prefer this over get_turboquant_index_metadata or the list_turboquant_* tools, and no failure conditions.

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

get_turboquant_index_metadataGet TurboQuant index metadataA
Read-only

Fetch the tq_index_metadata payload for a single turboquant index (schema.index). Documented fields are surfaced as typed attributes; the full upstream payload is preserved in raw_metadata so advisors can reach unanticipated fields. Raises when the extension is not installed or no turboquant index by that name exists. Returns an object with schema, index, algorithm_version, quantizer_family, residual_sketch_kind, fast_path_eligible, capability_flags, delta_state, maintenance_recommended, and raw_metadata (full upstream payload).

NameRequiredDescriptionDefault
indexYes
schemaYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
indexYes
tableYes
columnYes
schemaYes
opclassNo
input_typeNo
operabilityYes
capabilitiesYes
raw_metadataYes
access_methodNo
delta_enabledNo
heap_relationNo
index_optionsYes
delta_head_blockNo
delta_live_countNo
delta_page_depthNo
delta_tail_blockNo
delta_live_fractionNo
delta_batch_page_countNo
delta_merge_thresholdsYes
delta_merge_recommendedNo
heap_live_rows_estimateNo

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already establish readOnlyHint=true and openWorldHint=false, and the description adds genuinely new behavior: it raises when the extension is not installed or when no turboquant index by that name exists, and it discloses that typed attributes are a curated subset with the full upstream payload preserved in raw_metadata. That failure-mode and truncation disclosure is exactly the kind of context annotations cannot carry.

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 information — what is fetched and for which index — is front-loaded, and the failure conditions follow logically. The trailing enumeration of ten return-field names is somewhat redundant given an output schema exists, but it is compact and does orient the reader.

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 read-only three-parameter lookup with an output schema, the description covers what is returned at a high level, the error cases, and the raw_metadata fallback. An output schema exists so detailed return-value documentation is not required; the only minor gap is the lack of routing guidance versus the other turboquant inspection 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?

Schema coverage is only 33% (just the optional database parameter), so the description needs to carry weight for schema and index. It does partially: '(schema.index)' defines the pair as a qualified index identity, but gives no guidance on casing, quoting, or whether a non-turboquant index name is simply a not-found case. The database parameter is fully explained in the schema itself.

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 names a specific verb and resource — 'Fetch the tq_index_metadata payload for a single turboquant index' — and the parenthetical '(schema.index)' pins down the lookup key. 'Single' implicitly distinguishes it from the sibling list_turboquant_indexes, though that sibling is never named, so the contrast requires a small inference.

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 context is implied rather than stated: the tool is for retrieving metadata on one known index, and the mention of advisors reaching 'unanticipated fields' via raw_metadata hints at an investigative use case. There is no explicit when-to-use/when-not guidance and no named alternative (e.g., list_turboquant_indexes for discovery).

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

get_turboquant_last_scan_statsGet TurboQuant last scan statsA
Read-only

Return the backend-local JSON tq_last_scan_stats() reports for the most recent turboquant scan: score_mode, simd_kernel, pages_scanned, pages_pruned, plus the raw payload. Returns null when the extension is absent or no turboquant scan has run on this connection yet.

NameRequiredDescriptionDefault
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

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

The annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds useful behavioral context by stating the result is backend-local, tied to the most recent scan on this connection, and returns null when the extension is absent or no scan has run.

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 are front-loaded with the return behavior and null conditions, with no redundant or wasted wording. The field list is compact and supports quick scanning.

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 stats tool with an output schema and full parameter documentation, the description is nearly complete. It explains the main return shape and null behavior, though it does not explicitly position the tool against related TurboQuant diagnostics.

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%, and the optional database parameter is fully documented in the schema as targeting a configured secondary read-only database. The description adds no parameter-specific meaning beyond that, 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 uses a specific verb and resource: return backend-local JSON stats for the most recent TurboQuant scan. It also names the key fields (score_mode, simd_kernel, pages_scanned, pages_pruned), which clearly distinguishes it from sibling tools like get_turboquant_heap_stats or get_turboquant_index_metadata.

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 this is for inspecting the latest TurboQuant scan and notes the null cases when the extension is absent or no scan has run. However, it gives no explicit when-to-use guidance relative to siblings such as get_turboquant_heap_stats or recommend_turboquant_maintenance.

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

get_wait_for_lsn_statusGet wait for LSN statusA
Read-only

Report whether PG 19's WAIT FOR LSN is usable on this server. Also reports whether the current backend is a standby (the only context where the wait does meaningful work). Never raises. On PG ≤ 18 returns available=false and points at the poll-loop fallback. Returns an object with available (bool), server_version_num (int), server_version, is_in_recovery (bool), and detail.

Example: get_wait_for_lsn_status()

NameRequiredDescriptionDefault
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
detailYes
availableYes
is_in_recoveryYes
server_versionYes
server_version_numYes

TDQS

A4.1/5.0
Behavior4/5

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

Beyond readOnlyHint/openWorldHint it discloses two meaningful traits: the call never raises (so the agent needn't guard with error handling) and it degrades to available=false on PG ≤ 18 rather than failing. Those are exactly the behaviors annotations cannot express.

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?

Three short sentences front-load purpose, then behavior, then the returned field list, plus a call example. Slightly dense in the return-fields enumeration, but nothing is wasted and the most important clause comes first.

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

Completeness4/5

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

With an output schema present the description needn't enumerate return values, yet it does name them anyway, and it covers the version-gating and never-raising behaviors an agent needs. Only the tie-in to wait_for_lsn as the natural next step is left implicit.

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 single optional `database` param is fully documented in the schema (configured secondary id vs primary, rejection of plain names). The description adds nothing about the parameter, which is acceptable at this coverage level but earns no bonus.

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-plus-resource statement ('Report whether PG 19's `WAIT FOR LSN` is usable on this server') and adds the secondary purpose (is the backend a standby). It is clearly a capability-probe tool, distinct from the sibling action tool wait_for_lsn and from get_current_wal_lsn.

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 contextualizes use well: the wait only does meaningful work on a standby, and on PG ≤ 18 the tool redirects to the poll-loop fallback rather than leaving the agent guessing. It stops short of explicitly saying 'call this before wait_for_lsn', so it is strong but not a full when/when-not/alternatives statement.

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

get_wal_archive_statusGet WAL archive statusA
Read-only

Report WAL-archiving health from pg_stat_archiver + the archive-mode GUCs — the early-warning signal for a failing archive_command / archive_library (full archive volume, bad object-store credentials, network partition), which otherwise silently accumulates WAL in pg_wal/ until the volume fills. Companion to read_pg_wal_records (which inspects WAL records); this covers the WAL archive. Read-only; never raises. The archive_command string is NOT echoed (it can embed credentials) — only a boolean archive_command_set. Returns an object with available, archiving_enabled, archive_mode, archive_command_set, archived_count, last_archived_wal, last_archived_time, failed_count, last_failed_wal, last_failed_time, stats_reset, healthy (bool — false when archiving is on and the latest attempt failed), and detail.

Example: get_wal_archive_status()

NameRequiredDescriptionDefault
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
detailYes
healthyYes
availableYes
stats_resetYes
archive_modeYes
failed_countYes
archived_countYes
last_failed_walYes
last_failed_timeYes
archiving_enabledYes
last_archived_walYes
last_archived_timeYes
archive_command_setYes

TDQS

A4.4/5.0
Behavior5/5

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

Annotations cover only readOnlyHint and openWorldHint; the description adds real behavioral context beyond them: it never raises, it deliberately suppresses the archive_command string because it can embed credentials (returning only a boolean), and it defines the semantics of `healthy` as false when archiving is on and the latest attempt failed. That is exactly the kind of sensitive-data and edge-case disclosure annotations cannot carry.

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 failure modes, then the sibling distinction, then return fields — every sentence carries information and nothing is padding. It loses a point for enumerating all thirteen return fields even though an output schema exists, which is partially redundant.

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-required-parameter diagnostic read with annotations and an output schema present, the description covers purpose, urgency, failure modes, credential safety, and result semantics. Nothing an agent needs in order to call and interpret it 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?

Schema coverage is 100% and the single `database` parameter is fully documented in the schema, including the list_databases id constraint and primary-vs-secondary behavior. The description says nothing about the parameter, so it adds no meaning beyond the schema — 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?

States a specific verb and resource ("Report WAL-archiving health from pg_stat_archiver + the archive-mode GUCs") and immediately distinguishes itself from the nearest sibling: read_pg_wal_records inspects WAL records, this covers the WAL archive. An agent can pick between them without opening either schema.

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

Usage Guidelines4/5

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

Gives a clear triggering scenario — the early-warning signal for a failing archive_command/archive_library that silently accumulates WAL in pg_wal/ — and names the alternative it complements. There is no explicit "don't use this for X" exclusion, but the sibling boundary is drawn precisely enough for correct selection.

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

get_warehousepg_statusGet WarehousePG statusA
Read-only

Probe the connected server for the WarehousePG (Greenplum-derived MPP) signature. Reports available=true only when BOTH the version string mentions WarehousePG / Greenplum AND the gp_segment_configuration catalog view exists. Surfaces coordinator_role, segment_count (primary segments only), and mirroring (bool). On vanilla PostgreSQL clusters returns available=false with a clean diagnostic — the rest of the mcpg.warehousepg.* family advertise themselves inert via this probe. Read-only; never raises.

Example: get_warehousepg_status()

NameRequiredDescriptionDefault
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
detailYes
versionYes
availableYes
mirroringYes
segment_countYes
coordinator_roleYes

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, and the description reinforces that with 'Read-only; never raises' — a genuinely useful guarantee about failure behavior. It also discloses the detection predicate (version string AND catalog view), the fields surfaced (coordinator_role, segment_count as primaries only, mirroring), and the clean negative path. It does not discuss cost, latency, or what the diagnostic looks like in detail, which is why this is a 4 rather than 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 core action and the availability predicate, then the surfaced fields, then the negative case, then the example. Dense but every sentence carries information. The 'advertise themselves inert' phrasing is slightly jargon-heavy but communicates a real cross-tool contract.

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

Completeness4/5

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

For a zero-required-parameter read-only probe with an output schema and full annotation coverage, the description covers detection semantics, negative behavior, and failure guarantees. The only gap is that it never tells the agent it can target a secondary database, leaving the sole parameter's practical use entirely to the schema.

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 single optional `database` parameter is fully documented in the schema, so the baseline of 3 applies. The description never mentions the ability to target a configured secondary database, adding no meaning beyond the schema on the one parameter that exists.

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 ('Probe the connected server for the WarehousePG signature') and pins down the exact semantics of the result: available=true only when both the version string and the gp_segment_configuration view match. It also distinguishes itself from the surrounding toolset by noting that the rest of the mcpg.warehousepg.* family gates on this probe.

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

Usage Guidelines4/5

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

The description makes the calling context clear — this is the capability probe that determines whether the warehousepg family is usable, and on vanilla PostgreSQL it returns available=false with a clean diagnostic. That implies 'call this before the warehousepg tools', but the guidance is implied rather than stated as an explicit when-to-use/when-not-to-use rule with a named alternative.

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

inspect_gucInspect gucA
Read-only

Inspect one PostgreSQL GUC via pg_settings: live value, unit, context (postmaster/sighup/user/…), pending_restart, vartype, and whether ALTER SYSTEM can change it. Use this before alter_system to see whether a reload or restart is required. Read-only.

NameRequiredDescriptionDefault
nameYes

Output Schema

NameRequiredDescription
nameYes
unitYes
detailYes
sourceYes
contextYes
max_valYes
min_valYes
settingYes
vartypeYes
boot_valYes
categoryYes
enumvalsYes
reset_valYes
activationYes
short_descYes
pending_restartYes
alterable_via_alter_systemYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the 'Read-only' note is confirmatory. The description adds real behavioral value by disclosing the fields returned (context, pending_restart, vartype) and the decision it supports (reload vs restart), which goes 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?

Front-loads the return contents, then the usage coupling to alter_system, then a one-word safety tag. Every clause earns its place with no filler.

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

Completeness5/5

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

For a single-parameter read tool with a full output schema and read-only annotations, the description covers purpose, the decision context, and the returned data. Nothing an agent needs to invoke it correctly is missing, even if the field enumeration is mildly redundant with the output schema.

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 0%, so the schema provides no help; the description implies the lone parameter is the GUC name ('Inspect one PostgreSQL GUC'), which compensates partially. It adds no format or syntax guidance beyond that implication.

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 (inspect) and resource (one PostgreSQL GUC via pg_settings), then enumerates exactly what is retrieved (live value, unit, context, pending_restart, vartype, ALTER SYSTEM applicability). This distinguishes it from audit_settings and the alter_system flow it references.

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 directs the agent to use it before alter_system to determine whether a reload or restart is needed, naming the related tool and the condition that selects this one. Nothing is left to inference about when to reach for it.

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

lint_naming_conventionsLint naming conventionsA
Read-only

Lint table / column / index naming in a schema. Detects the majority case style (snake_case / camelCase / PascalCase / SCREAMING_SNAKE) per schema and per table, then flags outliers. Also flags indexes whose names do not start with a conventional prefix (idx_, ix_, pk_, uq_, fk_ by default). Findings carry the offender's style and the detected majority — agents can use the style field to filter for renames vs accept-as-is. Pure read. Returns an object with schema_style (detected majority), findings (list of style outliers), and index_prefix_findings (indexes with non-conventional prefixes).

NameRequiredDescriptionDefault
schemaYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
schemaYes
findingsYes
schema_majority_styleYes

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and openWorldHint=false, and the description reinforces that with 'Pure read' rather than contradicting it. It adds real behavioral detail beyond the annotations: how the majority style is detected per schema and per table, the default prefix set (idx_, ix_, pk_, uq_, fk_), and the shape of findings; it does not mention cost or permissions, but those are minor here.

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 core purpose and detection logic are front-loaded and efficient, but the final sentence enumerating `schema_style`, `findings`, and `index_prefix_findings` largely restates the output schema that is already supplied, spending words on information the agent already has.

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 two-parameter read-only linter with a full output schema and readOnly/openWorld annotations, the description covers detection logic, defaults, and how to triage findings — enough to call it correctly. It does not discuss multi-database targeting or output volume, but the schema covers the former and the output schema covers the latter.

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 only 50% schema coverage, the description compensates by making the scope of `schema` concrete — majority style is computed per schema and per table within that schema. It adds nothing about the `database` parameter, but that parameter is fully documented in the schema itself (configured read-only secondary ids, rejection of unconfigured 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?

States a specific verb (lint) and precise resource scope (table/column/index naming in a schema), and the detection rules described (majority-case style per schema and per table, index prefix conventions) make it clearly distinguishable from siblings like run_advisors or compare_schemas.

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 context is implied by the purpose and the description explains how to act on results ('agents can use the style field to filter for renames vs accept-as-is'), but it never states when to choose this over alternatives such as run_advisors or audit_database, nor any when-not conditions.

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

list_active_queriesList active queriesA
Read-only

List the queries currently running on the server, with each backend's wait event, duration, and the PIDs blocking it. Returns a list of objects with pid, username, application, state, wait_event (null when not waiting), duration_seconds, query, and blocked_by (list of PIDs holding locks this backend is waiting on).

NameRequiredDescriptionDefault
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds useful return-shape semantics ('wait_event' null when not waiting, blocked_by as a list of PIDs), but says nothing about visibility restrictions on pg_stat_activity (non-superusers/roles without pg_read_all_stats only see their own sessions), which materially affects interpretation of results.

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?

Two sentences, front-loaded with the core action, and the field enumeration is compact. The field list is somewhat redundant with the existing output schema, but it reads cleanly and there is no filler.

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

Completeness4/5

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

With an output schema present, the description need not explain return values, and it restates them anyway. For a read-only, single-optional-parameter tool this is nearly complete; the main omissions are permission/visibility caveats and sibling routing.

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 single 'database' parameter is fully documented in the schema, including the list_databases cross-reference and rejection of unconfigured names. The description adds nothing about the parameter, so the baseline 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 opens with a specific verb and resource: 'List the queries currently running on the server,' which is unambiguous. It does not explicitly distinguish itself from related siblings like find_blocking_chains, list_locks, or read_pg_stat_lock, even though it reports blocked_by PIDs that overlap with those tools.

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

Usage Guidelines3/5

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

Usage is only implied: an agent can infer this is the live-session monitoring tool from 'currently running.' There is no explicit when-to-use/when-not guidance and no routing to alternatives such as find_blocking_chains for deep lock analysis or why_is_this_slow for a single query diagnosis.

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

list_audit_eventsList audit eventsA
Read-only

List recent rows from mcpg_audit.events (newest first). Returns an empty list when MCPG_AUDIT_PERSIST has never been turned on (no audit table yet). Optionally filter by tool name.

NameRequiredDescriptionDefault
toolNo
limitNo
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already establish this is a safe, non-open-world read. The description adds behavior the annotations do not: result ordering, and the important failure mode that an empty list means the audit table has never been created rather than that no events matched. It says nothing about volume limits or truncation.

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, front-loaded with the resource and ordering, followed by the one genuinely non-obvious caveat. No filler.

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

Completeness4/5

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

An output schema exists, so return shape need not be described, and the description covers the resource, ordering, optional filter, and empty-result cause. The remaining gap is the meaning of `limit` and any guidance on relating this to the chain-verification sibling.

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 33%; the `database` parameter is well documented in the schema, but `tool` and `limit` have no schema descriptions. The description clarifies that `tool` is an optional filter but does not state the match semantics (exact vs substring) or what `limit` defaults to or caps at, so it only partially compensates.

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 names a specific verb and resource ("List recent rows from mcpg_audit.events") and states ordering ("newest first"), so an agent knows exactly what is returned. It does not explicitly contrast with the sibling verify_audit_chain, which is the main source of ambiguity.

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

Usage Guidelines3/5

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

Usage is only implied: read audit events, optionally narrowed by tool name. There is no statement of when to prefer this over verify_audit_chain or when paging/limits should be tuned, and no prerequisites are mentioned beyond the empty-list caveat.

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

list_autowarm_jobsList autowarm jobsA
Read-only

List the pg_cron jobs MCPg registered for autowarm (jobname LIKE 'mcpg_autowarm%'). Returns an empty list when pg_cron is not installed. Returns a list of objects with jobid, jobname, schedule (the cron expression), and command (the SELECT the job runs).

Example: list_autowarm_jobs()

NameRequiredDescriptionDefault
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior4/5

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

Beyond the readOnlyHint/openWorldHint annotations, the description discloses a genuine behavioral edge case: an empty list is returned when pg_cron is not installed, so the agent will not misread an empty result as an error. It also describes the returned fields, though the output schema already covers that.

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 scope-defining filter is front-loaded in the first sentence, followed by the edge case and return shape. The trailing example call is marginally useful for a zero-required-parameter tool and the field list partly 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?

With annotations carrying the safety profile, a fully documented parameter schema, and an output schema for return values, the description supplies the one thing structured fields cannot: the autowarm-specific filter and the pg_cron-absent behavior. Nothing needed 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.

Parameters3/5

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

Schema description coverage is 100% and the `database` parameter is thoroughly documented in the schema (secondary read-only target, id from list_databases, invalid names rejected). The description adds nothing about it, so the baseline 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 gives a specific verb and resource (list pg_cron jobs) and narrows the scope precisely to jobs MCPg registered for autowarm via the `jobname LIKE 'mcpg_autowarm%'` predicate. That filter effectively separates it from `list_cron_jobs`, though the sibling is never named explicitly.

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: an agent can infer this is for inspecting autowarm-specific cron jobs. There is no explicit when-to-use versus `list_cron_jobs` or `list_timescale_jobs`, and no statement of prerequisites such as autowarm having been configured first.

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

list_available_extensionsList available extensionsA
Read-only

List every extension available to the database, with whether it is installed. Returns a list of objects with name, default_version, installed_version (null when not installed), and installed (bool).

NameRequiredDescriptionDefault
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds one genuinely useful behavioral detail — installed_version is null when not installed — but the rest of its content enumerates return fields that the output schema already documents, and it says nothing about the secondary read-only database behavior implied by the parameter.

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?

Two tight sentences, front-loaded with the action and scope, and zero filler. The second sentence is somewhat redundant with the output schema but is compact enough not to be wasteful.

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?

A simple read-only listing tool with an output schema, full parameter documentation, and clear annotations. Return-field detail in the description is redundant given the output schema, and the secondary-database capability lives only in the schema, but nothing needed 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.

Parameters3/5

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

Schema coverage is 100% and the single 'database' parameter is fully documented in the schema, including the id-from-list_databases requirement and rejection of unconfigured names. The description adds nothing about this parameter, so the baseline 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?

States a specific verb and resource ('List every extension available to the database') and adds the key distinction that results include install status. It only implicitly differentiates from the sibling list_extensions, relying on the reader to infer that this tool covers available-but-not-installed extensions as well.

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 when-to-use guidance and no mention of the sibling list_extensions. The phrase 'every extension available ... with whether it is installed' implies this is the superset view, but the agent must infer the routing decision itself.

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

list_chunksList chunksA
Read-only

List the chunks of a TimescaleDB hypertable with each chunk's range_start / range_end and whether it has been compressed. Empty list when the table is not a hypertable. Returns an object with available (bool) and chunks (list of {chunk_name, range_start, range_end, is_compressed, total_size_bytes}).

NameRequiredDescriptionDefault
tableYes
schemaYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
chunksYes
availableYes

TDQS

A3.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds real behavior beyond that: the non-hypertable case yields an empty list and an `available` flag, which tells the agent how to interpret a null-looking result. It stops short of noting whether the target database must be the primary.

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?

Three short sentences, front-loaded with the action and its output, then the edge case, then the return shape. Nothing is repeated and nothing is filler.

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

Completeness4/5

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

For a simple read-only listing tool with annotations and an output schema, this is close to sufficient: the caller knows what it returns and how a non-hypertable target behaves. The remaining gap is parameter-level meaning for `schema`/`table`, which the description does not fill.

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 coverage is only 33% — `table` and `schema` have no descriptions at all — so the description should carry that load. It only implies the table must be a hypertable and says nothing about what schema means or how the two relate, leaving the agent to infer semantics for two of three required-ish inputs.

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?

States a specific verb and resource (list the chunks of a TimescaleDB hypertable) plus the distinguishing payload (range_start/range_end, compression state). An agent can separate this from list_hypertables or list_partitions by the word 'chunks', though no sibling is named explicitly.

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?

Gives a useful pre-condition outcome ('Empty list when the table is not a hypertable') that implies when the tool is applicable, but never says when to prefer it over list_hypertables, get_hypertable_stats, or list_partitions, and states no prerequisites or cost.

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

list_composite_typesList composite typesB
Read-only

List the standalone composite types in a schema with their attributes. Returns a list of objects with name and attributes (list of {name, data_type} for each field).

NameRequiredDescriptionDefault
schemaYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior3/5

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

The annotations already declare this a read-only, closed-world operation, so the safety profile is covered. The description adds only the return shape ('a list of objects with name and attributes'), which is duplicated by the output schema and doesn't cover behavior such as what happens for an unknown schema or whether empty results are possible.

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?

Two short sentences, front-loaded with the action and resource, with no filler. The second sentence largely restates what the output schema already declares, which is the only wasted content.

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?

Because an output schema exists, the return-value sentence is not strictly necessary, and the real gap is the undocumented `schema` parameter and the lack of any hint about resolving schema names. For a simple two-parameter read tool it is adequate but leaves a required argument unexplained.

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 50%: the `database` parameter is well documented in the schema, but the required `schema` parameter has no description anywhere. The description never clarifies that `schema` is a schema name (obtainable from list_schemas), so it fails to compensate for the coverage gap on the one required argument.

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 names a specific verb and resource ('List the standalone composite types in a schema with their attributes'), and the word 'standalone' usefully distinguishes it from row types attached to tables and from sibling listing tools like list_enums and list_domains. It stops short of naming any sibling explicitly, so the differentiation is implied rather than spelled out.

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: an agent can infer it should be used when it needs composite type definitions, but the description never says when to prefer this over list_enums, list_domains, or describe_table, nor whether it needs to be preceded by list_schemas. No exclusions or alternatives are stated.

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

list_constraintsList constraintsA
Read-only

List a table's constraints — primary/foreign keys, unique, check, exclusion. Set fresh=true to bypass the cache and re-read live (e.g. after a schema change). Returns a list of objects with name, type, and definition (the constraint SQL).

Example: list_constraints(schema='public', table='orders')

NameRequiredDescriptionDefault
freshNo
tableYes
schemaYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered; the description adds genuinely new behavior by disclosing that results are cached by default and that `fresh=true` forces a live re-read. It also states the return shape (`name`, `type`, `definition`), which goes beyond the annotations.

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

Conciseness5/5

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

Purpose is front-loaded, followed by the one non-obvious parameter behavior, the return shape, and a concrete call example. Every sentence carries information an agent would otherwise lack, with no filler.

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

Completeness4/5

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

An output schema exists, so enumerating return fields is a bonus rather than a necessity, and the caching semantics fill the real gap. What's missing is edge-case behavior — e.g. what happens for a nonexistent table/schema or whether the list is ever truncated — but for a simple read-only lister this is nearly complete.

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

Parameters4/5

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

Schema description coverage is only 25% (just `database` is documented), so the description must compensate — and it does for the most ambiguous param, explaining that `fresh` bypasses the cache and re-reads live. `schema` and `table` are left to inference, though the worked example clarifies their format.

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?

States a specific verb and resource ("List a table's constraints") and enumerates the constraint kinds covered — primary/foreign keys, unique, check, exclusion — which lets an agent tell it apart from most siblings. It does not, however, address the overlap with `list_foreign_keys` or `list_indexes`, which an agent must resolve on its own.

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

Usage Guidelines3/5

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

The description gives conditional guidance for one parameter ("Set `fresh=true` ... e.g. after a schema change") but never states when to choose this tool over the numerous sibling listers, particularly `list_foreign_keys`. Usage is implied by the enumerated constraint types rather than explicitly routed.

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

list_continuous_aggregatesList continuous aggregatesB
Read-only

List TimescaleDB continuous aggregates with their source hypertable, materialized_only flag and compression flag.

NameRequiredDescriptionDefault
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
availableYes
continuous_aggregatesYes

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds which attributes are surfaced (materialized_only, compression flag), but says nothing about failure behavior when TimescaleDB is absent or about the read-only secondary-database targeting handled in the 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?

One well-formed sentence with zero filler, front-loading the resource and then the returned attributes. It could be improved only by appending a short usage or prerequisite clause.

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 and annotations cover safety, so return values and risk need not be explained. However, for an extension-specific TimescaleDB tool, the description omits the prerequisite that the extension be installed, which is the main thing an agent would otherwise get wrong.

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% for the single optional 'database' parameter, which the schema fully documents including the requirement to use an id from list_databases. The description adds no extra meaning beyond the schema, so the baseline 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?

States a specific verb and resource (list TimescaleDB continuous aggregates) and names the returned fields, including the source hypertable, which separates it from the sibling list_hypertables / list_chunks tools. It stops short of explicitly naming those siblings as alternatives.

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

Usage Guidelines2/5

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

The description gives no when-to-use condition, no prerequisites (e.g. TimescaleDB extension must be installed), and no routing to or away from the adjacent TimescaleDB tools. The intended use can only be inferred from the name.

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

list_cron_jobsList cron jobsA
Read-only

List the pg_cron jobs registered in the database. Returns an empty list when pg_cron is not installed.

NameRequiredDescriptionDefault
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds real value beyond them by disclosing the degenerate case: an empty list when pg_cron is not installed, which prevents an agent from misreading an empty result as a failure.

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, the core purpose front-loaded and the caveat second. Every clause earns its place with no filler.

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

Completeness4/5

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

With an output schema present, return-value detail is unnecessary, and annotations plus the schema cover safety and targeting. The description covers purpose and the notable empty-result edge case; only explicit routing to sibling job-listing tools 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 has 100% schema description coverage, including the pointer to list_databases and the note that non-configured names are rejected. The description adds no additional meaning about the database parameter, so the baseline 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 names a specific verb and resource ("List the pg_cron jobs registered in the database"), and the explicit "pg_cron" qualifier separates it from the many other list_* siblings such as list_timescale_jobs and list_autowarm_jobs. It stops short of explicitly naming those siblings, so it is clear but not maximally differentiating.

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 by the tool name and resource scope; there is no explicit when-to-use or when-not-to-use guidance and no named alternative for job listing in other schedulers. The note about returning an empty list when pg_cron is absent is a helpful interpretation hint rather than selection guidance.

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

list_cursorsList cursorsA
Read-only

List every currently-open server-side cursor with its SQL, rows_returned so far, age in seconds, and the TTL after which it'll be auto-closed.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true. The description adds value by listing returned fields (SQL, rows, age, TTL) and mentioning auto-close behavior. No contradictions.

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

Conciseness5/5

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

Single sentence with all essential information. No extraneous words, purpose and output clearly stated up front.

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 and an output schema, the description fully covers what the tool returns and its behavior. No gaps.

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

Parameters4/5

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

No parameters, so baseline is 4. The description correctly notes there are no arguments, which is 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?

The description uses a specific verb ('list') and resource ('server-side cursors'), and details the exact fields returned. It clearly distinguishes from siblings like close_cursor and open_cursor.

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

Usage Guidelines2/5

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

No guidance on when to use this tool versus alternatives (e.g., fetch_cursor, close_cursor). The agent must infer usage from context.

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

list_databasesList databasesA
Read-only

List every database this MCPg server is configured to serve: the primary (the default target of every tool) plus any read-only secondaries from MCPG_SECONDARY_DATABASE_URLS. Read-capable tools accept an optional database argument naming one of these ids; omitting it targets the primary. Secondaries are read-only (PostgreSQL-enforced) — writes / DDL / shell / migrate always run against the primary. Returns an object with primary_id, database_ids (primary first), and databases — a list of objects with id, is_primary, read_only, reachable (a live SELECT 1 probe), and detail (an error string when unreachable).

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
databasesYes
primary_idYes
database_idsYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations declare readOnlyHint=true, and the description reinforces that this is a read-only operation. It adds transparency about secondaries being read-only (PostgreSQL-enforced) and describes the return object structure. No contradictions with annotations.

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

Conciseness5/5

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

The description is concise, with three sentences covering purpose, usage context, and return format. No redundant information; every sentence adds value. Well-structured and easy to parse.

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 and an output schema (though not shown in input, context says true), the description fully explains the tool's behavior, return structure, and how it relates to other tools. No gaps.

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

Parameters4/5

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

There are 0 parameters (schema coverage 100%), so the baseline is elevated. The description adds meaning by explaining the role of primary and secondary databases and describes the return object (primary_id, database_ids, databases list with fields). This provides context beyond the 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 clearly states 'List every database this MCPg server is configured to serve', specifying the verb 'list' and resource 'databases'. It distinguishes from sibling tools by detailing the primary and secondary database concept, which is unique to this tool.

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 explains when to use this tool: to see available databases and understand which database is targeted by default. It provides context that read-capable tools accept an optional `database` argument and that writes target the primary. No explicit exclusions or alternatives are given, but the context is clear.

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

list_distribution_policiesList distribution policiesA
Read-only

List the data-distribution policy for each table in a WarehousePG schema (HASH(col,...), RANDOM, or REPLICATED). Joins gp_distribution_policy to pg_attribute for the distribution-key column names in catalog order. schema=None returns every non-system schema. Read-only. On vanilla PG returns available=false with a diagnostic.

Example: list_distribution_policies(schema='public')

NameRequiredDescriptionDefault
schemaNo
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
detailYes
policiesYes
availableYes

TDQS

A4.2/5.0
Behavior4/5

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

Beyond the readOnlyHint/openWorldHint annotations it discloses meaningful behavior: the underlying catalog join, that column names come back in catalog order, that all non-system schemas are returned by default, and the graceful `available=false` fallback on vanilla PG. Missing only return-shape detail, which the output schema covers.

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?

Three tight sentences plus a one-line example, front-loaded with the core action and policy values. The catalog-join sentence is dense but earns its place by justifying the column ordering of results.

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 two-parameter read-only catalog tool with an output schema and full annotations, this is nearly complete: scope, defaults, and the unsupported-platform fallback are all stated. The only gap is not addressing the `database` parameter or the potential confusion with the RLS-oriented `list_policies` sibling.

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 50%: `database` is documented in the schema while `schema` is not. The description partially compensates by explaining `schema=None` returns every non-system schema, but it never mentions the `database` targeting argument. Baseline 3 given the schema already carries the other half.

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 the data-distribution policy for each table in a WarehousePG schema") and enumerates the exact policy forms returned (HASH(col,...), RANDOM, REPLICATED). This clearly separates it from sibling catalog listings such as list_tables or list_policies.

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 clear operating context: it is WarehousePG-specific, `schema=None` covers every non-system schema, and on vanilla PostgreSQL it returns `available=false` with a diagnostic rather than erroring. It does not explicitly contrast itself with the similarly named `list_policies` (RLS) or `describe_table`, so the agent must infer the boundary.

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

list_domainsList domainsB
Read-only

List the domain types in a schema, with base type, default, and check constraints. Returns a list of objects with name, base_type, nullable, default, and constraints (list of CHECK clauses).

NameRequiredDescriptionDefault
schemaYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds the shape of the returned rows, but says nothing about whether the schema must exist, whether an empty list is returned for unknown schemas, or how the optional secondary-database targeting affects behavior — context that matters given the schema's note that unconfigured database names are rejected.

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?

Two compact sentences with the purpose front-loaded and no filler. The second sentence partly restates return fields that the output schema already declares, which is mild redundancy but not bloat.

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 two-parameter read tool with annotations and an output schema, this is nearly complete: purpose, scope, and row shape are all stated. The remaining gap is routing guidance against the many sibling list_* tools, which the description never addresses.

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 50%: the `database` parameter is well documented in the schema itself, while `schema` is bare. The description only implies that `schema` names the owning schema, adding little beyond the schema. The enumerated return fields are output-schema territory rather than parameter meaning.

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?

States a specific verb and resource ("List the domain types in a schema") and enumerates the attributes surfaced (base type, default, check constraints). It is clearly distinguishable from siblings like list_enums and list_composite_types by resource name, though it never explicitly contrasts itself with them.

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

Usage Guidelines2/5

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

No when-to-use or when-not-to-use guidance is given. An agent must infer on its own whether to call this versus list_enums, list_composite_types, or describe_table, and there is no mention of the prerequisite of knowing a schema name (obtainable from list_schemas) or of when to target a secondary database.

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

list_enumsList enumsB
Read-only

List the enum types in a schema, with their labels in sort order. Returns a list of objects with name and values (list of label strings, in the order defined).

NameRequiredDescriptionDefault
schemaYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds real behavioral detail beyond that: values come back in definition order, which matters for PostgreSQL enum comparison semantics. It says nothing about permissions, empty results, or cross-database behavior for the secondary database path.

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 tight sentences with the resource and ordering rule front-loaded, and the return shape spelled out second. Nothing is redundant or padded.

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 catalog listing with an output schema that documents the return value, the description says what is returned and in what order. Only the `schema` identifier format and the secondary-database nuance for the listing are left unpadded, which are minor for this complexity.

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 50%: the `database` parameter is well documented in the schema itself, but `schema` has no description there and the tool description only implies it is a schema name. The description adds marginal meaning (which schema's enums are listed) but does not compensate for the undocumented identifier format.

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 verb and resource ("List the enum types in a schema") and adds the payload shape, so an agent knows exactly what it retrieves. It does not name a sibling such as list_composite_types or list_domains to differentiate itself, which keeps it just short of a 5.

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

Usage Guidelines2/5

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

There is no explicit when-to-use guidance and no alternatives are mentioned, despite a large sibling family of list_* catalog tools (list_domains, list_composite_types, describe_table). What usage context exists is only implied by the resource name.

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

list_extensionsList extensionsA
Read-only

List the extensions installed in the database. Returns a list of objects with name and version.

NameRequiredDescriptionDefault
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

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

readOnlyHint=true and openWorldHint=false already tell the agent this is a safe, non-mutating local read, so the description carries a lighter burden. It adds the shape of the result (name/version objects), but that is already covered by the output schema, and it says nothing about scope, permissions, or cost.

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, zero filler, with the purpose front-loaded before the return-shape detail. Nothing would be lost by trimming further, and nothing needs to be added for readability.

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

Completeness4/5

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

For a zero-required-parameter read-only listing tool with a fully documented schema, complete annotations, and an output schema, the description supplies enough to call it correctly. The only real gap is explicit routing away from list_available_extensions, which is the most likely confusion for an agent.

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% and the single `database` parameter is already documented in detail, including that it must be a configured id from list_databases and that names are rejected. The description adds no further meaning about that parameter, so the baseline 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?

States a specific verb and resource ('List the extensions installed in the database') and the word 'installed' implicitly separates it from the sibling list_available_extensions. It does not name that sibling or spell out the installed-vs-available distinction, so the differentiation is left partly to inference.

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: an agent can infer this is the tool for what is already present in a database rather than what could be installed, and nothing is said about when not to use it. No alternative tool is named despite list_available_extensions being an obvious near-neighbor in the catalog.

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

list_foreign_data_wrappersList foreign data wrappersB
Read-only

List the foreign-data wrappers installed in the database. Returns a list of objects with name, handler (qualified function name), validator, and options (dict of wrapper-specific options).

NameRequiredDescriptionDefault
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already establish this as a safe, closed-world read (readOnlyHint=true, openWorldHint=false), so the bar is lower. The description adds a description of the returned record fields, but does not state what happens when no wrappers are installed, whether the list is scoped by schema, or any ordering/pagination behavior.

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

Conciseness5/5

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

Two sentences, front-loaded with the action and followed by the return shape; no filler or restatement of the title.

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, single-optional-parameter read tool with a full schema and an output schema, the description covers purpose and return fields adequately. The only gap is routing guidance against sibling foreign-object listing 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?

There is a single optional parameter with 100% schema description coverage, so the schema already explains the `database` id targeting a configured secondary read-only database. The description adds no meaning beyond that, which is the expected baseline for a fully documented schema.

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?

Names a specific verb and resource ("List the foreign-data wrappers installed in the database") and enumerates the returned fields, so the object of the operation is unambiguous. It does not distinguish itself from adjacent catalog tools such as list_foreign_servers or list_foreign_tables, which an agent could easily confuse it with.

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

Usage Guidelines2/5

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

No when-to-use guidance is given: nothing says to call this before inspecting foreign servers/tables, nor whether it is a prerequisite for other foreign-data operations. The `database` parameter is the only usage hint and that documentation lives in the schema, not the description.

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

list_foreign_keysList foreign keysA
Read-only

List foreign keys in a schema, resolved to columns and referenced table. Set fresh=true to bypass the cache and re-read live (e.g. after a schema change). Returns a list of objects with name, from_table, from_columns, to_schema, to_table, to_columns.

Example: list_foreign_keys(schema='public')

NameRequiredDescriptionDefault
freshNo
schemaYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare this a read-only, closed-world operation, so the safety profile is covered. The description adds real behavior the annotations do not: results are cache-backed and a stale read is possible unless fresh=true is set. It does not state what happens on an unknown schema (empty list vs error), leaving one behavioral gap.

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 compact sentences plus a one-line example: the core action leads, the cache escape hatch follows, and the return shape is a single clause. Nothing is redundant and nothing is buried.

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

Completeness4/5

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

With an output schema present the description does not need to enumerate return fields, yet it names them anyway, and it covers the cache dimension that is otherwise invisible. What remains unaddressed is behavior on an invalid or missing schema and any mention that this overlaps with list_constraints.

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 only 33%, so the description has to compensate, and it does for two of three params: fresh is explained with its purpose and trigger, and schema is demonstrated via the worked example. The database parameter is fully documented in the schema itself, so its absence from the description is no loss.

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?

States a specific verb and resource ('List foreign keys in a schema') plus what the output resolves to (columns and referenced table), which lets an agent distinguish this from generic tools like list_tables. It stops short of naming the closest sibling, list_constraints, which also surfaces FK constraints, so the boundary is not fully explicit.

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 a concrete invocation example and a clear condition for the non-default parameter ('set fresh=true ... e.g. after a schema change'), which is genuine when-to-use guidance. It offers no exclusion rule against list_constraints or generate_fk_cascade_graph, so an agent must infer which tool wins when both could answer.

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

list_foreign_serversList foreign serversA
Read-only

List the foreign servers defined in the database, with their FDW and options. Returns a list of objects with name, wrapper (foreign-data wrapper name), type, version, and options (dict of server options).

NameRequiredDescriptionDefault
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds useful context that servers are enumerated with their wrapper and options, but spends most of its words restating the return shape that the output schema already provides. It says nothing about catalog visibility/permission effects, which would be genuinely additive.

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?

Two sentences, front-loaded with the action and scope, then the result contents. The second sentence is largely redundant with the output schema, but the whole text is short and free of filler.

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

Completeness4/5

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

A zero-required-parameter, read-only catalog listing with a full output schema and 100% schema coverage has low informational demands, and the description covers purpose and contents. Sibling disambiguation is the main thing 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?

Schema description coverage is 100% and the single optional 'database' parameter is fully documented in-schema, including the secondary read-only database targeting and the rejection of unconfigured names. The description adds no parameter meaning beyond that, so the baseline 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 verb and resource ('List the foreign servers defined in the database') and names the scope ('with their FDW and options'). It does not explicitly differentiate itself from close siblings like list_foreign_data_wrappers, list_foreign_tables, or list_redis_foreign_servers, so an agent must infer the boundary.

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 by the phrase 'defined in the database' – an agent can infer this is catalog discovery. There is no explicit when-to-use vs when-to-use-a-sibling guidance and no stated prerequisitives or exclusions, leaving the agent to reason about alternatives on its own.

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

list_foreign_tablesList foreign tablesA
Read-only

List the foreign tables in a schema, with their server and options. Returns a list of objects with name, server (foreign-server name), and options (dict of per-table options).

NameRequiredDescriptionDefault
schemaYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
resultYes

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 and openWorldHint=false, so the safety profile is covered. The description adds the return shape (name, server, options), but that duplicates the output schema rather than adding new behavioral context. Nothing is said about behavior when the schema is absent or contains no foreign tables.

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, zero waste, with the purpose front-loaded and the return shape trailing. Every clause carries information and there is no filler or restatement of the title.

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

Completeness4/5

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

With annotations covering the safety profile and an output schema defining the returned fields, the description needs to establish purpose and scope only, which it does. The remaining gap is behavioral edge cases (missing schema, empty results), minor for a read-only listing tool.

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 only 50%, and the undocumented parameter is the required `schema`, which the description covers by stating the listing is scoped to a schema. The description adds no detail beyond that, leaving format expectations (e.g., exact name vs. search path) unstated. Baseline for partial coverage would be 3; the description compensates only for the required parameter, so 3-4 is warranted.

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 names a specific verb and resource ("List the foreign tables in a schema") and adds scope detail (per-server, per-table options). It doesn't explicitly distinguish itself from nearby siblings like list_foreign_servers or list_foreign_data_wrappers, but the resource is distinct enough that an agent can select it 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 Guidelines3/5

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

Usage is only implicit: an agent can infer this is the introspection tool for foreign tables within a given schema. There is no explicit when-to-use guidance, no statement of when to prefer list_foreign_servers or list_user_mappings instead, and no mention of prerequisites such as the schema needing to contain foreign tables.

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

list_functionsList functionsA
Read-only

List the functions and procedures defined in a schema. Returns a list of objects with name, kind ('function' or 'procedure'), arguments (signature string), returns (return-type string), and language (plpgsql / sql / c / etc.).

NameRequiredDescriptionDefault
schemaYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
resultYes

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 and openWorldHint=false, so the safety profile is covered. The description adds the shape of returned objects but says nothing about whether system/catalog schemas are included, what happens for a nonexistent schema, or whether results are paginated or bounded — the kind of context that would justify a 4 or 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 purpose in the first clause, then a compact enumeration of returned fields — no filler. The field enumeration partly duplicates the output schema, so it isn't perfectly economical, but it is short and readable.

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 two-parameter read-only listing tool with an output schema present, the description is largely sufficient: purpose, scope, and result contents are all covered. Only edge-case behavior (nonexistent schema, system schemas, result limits) 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?

Schema coverage is 50%: the `database` parameter is fully documented in the schema itself, while `schema` is undocumented there but its meaning is obvious and partially implied by the description's 'defined in a schema'. The description adds no syntax, format, or qualification details beyond the schema, 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?

States a specific verb ('List') and resource ('functions and procedures') and adds the scope ('defined in a schema'). This cleanly separates it from sibling introspection tools like list_tables, list_views and list_sequences without the agent needing to open any schema.

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: an agent can infer it should be called when it needs routine/procedure metadata. There is no explicit when-to-use or when-not-to-use guidance, and no routing to alternatives such as get_compact_schema, generate_schema_docs or describe_tool for a broader picture.

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

list_generated_columnsList generated columnsA
Read-only

List every GENERATED ALWAYS AS (...) STORED column in a schema, with its data type, the underlying expression, and whether it's stored or virtual. PostgreSQL today supports only the stored form; the kind field is reported anyway so the response shape is forward-compatible when PG adds virtual columns. Returns a list of objects with schema, table, column, data_type, expression, kind ('stored' today; reserved for 'virtual').

NameRequiredDescriptionDefault
schemaYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already declare this a read-only, closed-world operation, so the safety profile is covered. The description adds genuine context the annotations cannot: PG currently only supports the stored form and the `kind` field is forward-compatible. It does not mention anything about the secondary read-only database targeting behavior, which is left entirely to the 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 action and scope, and the two explanatory sentences are short. The final sentence enumerating returned fields is largely redundant given an output schema exists, which is the only real waste.

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 two-parameter read-only list tool with an output schema, this is essentially complete: the agent knows what it returns and the notable PostgreSQL limitation. The explicit field enumeration is redundant given the output schema, and the multi-database aspect is only handled in the schema.

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 50%: the trickier `database` parameter carries a thorough schema description covering configured-id validation and read-only targeting, while the required `schema` parameter is undocumented but self-evident. The description adds 'in a schema' as scope but no syntax or meaning beyond that, so the baseline 3 is right.

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 precise verb ('List') and a very specific resource: 'every GENERATED ALWAYS AS (...) STORED column in a schema', plus the fields returned. This is clearly distinguishable from the many sibling list_* tools (list_tables, list_indexes, list_constraints) because the column class is named explicitly.

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 by the narrow resource definition — an agent knows to call it when it wants generated/computed column inventory — but there is no explicit 'use this instead of describe_table' routing, no prerequisites, and no mention of when not to use it. Adequate, not guiding.

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

list_grantsList grantsA
Read-only

List the privileges granted on a table — who may do what to it. Returns a list of objects with grantee, privilege (SELECT / INSERT / UPDATE / DELETE / TRUNCATE / REFERENCES / TRIGGER), grantable (bool — may the grantee regrant), and grantor.

NameRequiredDescriptionDefault
tableYes
schemaYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds the shape of results (privilege enum, grantable flag, grantor), but that duplicates an output schema that already exists, and it says nothing about behavior on a missing table, column-level grants, or PUBLIC grantees.

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?

Two sentences, front-loaded with the core purpose, no filler. The second sentence re-enumerates return fields that the output schema already defines, so it is slightly redundant but still compact.

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 simple read-only lookup with annotations and an output schema, the essentials are present. However, with two of three parameters undocumented and no guidance on the secondary-database variant or error behavior, an agent could still misinvoke it on non-primary databases.

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 only 33% — only `database` is documented. The description never explains `schema` vs `table` addressing or how grants resolve when `database` points at a secondary read-only instance, so it fails to compensate for the coverage gap even though the parameter names are largely self-evident.

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 the privileges granted on a table') and adds a plain-language gloss ('who may do what to it') that disambiguates it from nearby concepts like roles or RLS policies in the sibling list.

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: an agent can infer it should call this when asking who can read or write a given table. There is no explicit when-to-use, no mention of when to prefer list_roles or list_policies instead, and no stated prerequisites such as needing schema/table to exist.

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

list_graphsList graphsA
Read-only

List all active Apache AGE property graphs in the database. Returns a list of objects with name (graph name) and oid.

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 already declare readOnlyHint=true. The description adds context about the return structure and that only active graphs are listed, providing extra transparency beyond 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 efficient sentences with no fluff. All information is front-loaded and relevant.

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 list tool with no parameters and an output schema present, the description is complete. It specifies the return format adequately.

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?

There are zero parameters, so baseline is 4. The description adds no parameter info because none exist, and the schema coverage is 100%.

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 lists all active Apache AGE property graphs and specifies the return format with `name` and `oid`. This is a specific verb-resource combination that distinguishes it from other list tools.

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

Usage Guidelines3/5

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

No explicit guidance on when to use this tool versus alternatives, but the context of listing graphs is straightforward and the description implies its usage for retrieving graph metadata.

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

list_hypertablesList hypertablesA
Read-only

List every TimescaleDB hypertable visible to the current role, with chunk count, compression flag, and total size. Reports available=false when the timescaledb extension is not installed. Returns an object with available (bool) and hypertables (list of {schema, table, num_chunks, compression_enabled, total_size_bytes}).

NameRequiredDescriptionDefault
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
availableYes
hypertablesYes

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered; the description adds genuinely useful behavior beyond that: visibility is limited by the current role and the tool degrades gracefully with available=false when the extension is absent. It doesn't discuss cost or whether chunk counts are computed live on large catalogs, which keeps it short of a 5.

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

Conciseness4/5

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

Three tight, front-loaded sentences: purpose and scope first, edge case second, return shape last. The final sentence restates the return object field-by-field even though an output schema exists, which is redundant but 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 zero-required-parameter listing tool with annotations and an output schema, this covers purpose, role-based visibility, and extension-absence handling. The only omission is any mention of the secondary read-only database option, which the schema happens to document adequately.

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 optional parameter whose schema description already fully explains secondary-database targeting and the rejection of arbitrary names (100% coverage). The prose adds nothing about it, so the baseline 3 for schema-covered parameters 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 and resource ("List every TimescaleDB hypertable") plus the scope ("visible to the current role") and the exact fields reported (chunk count, compression flag, total size). That combination cleanly separates it from neighbors like list_chunks and get_hypertable_stats without needing to name them.

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 by the resource and by the note that it reports available=false when TimescaleDB isn't installed, which tells the agent to call it as a capability probe. However, it never says when to prefer this over list_chunks or get_hypertable_stats, nor any when-not conditions.

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

list_indexesList indexesA
Read-only

List the indexes defined on a table. Set fresh=true to bypass the cache and re-read live (e.g. after a schema change). Returns a list of objects with name, method (btree / gin / gist / brin / hash / spgist / hnsw / ivfflat / …), definition (the CREATE INDEX statement), and partitioned.

Example: list_indexes(schema='public', table='users')

NameRequiredDescriptionDefault
freshNo
tableYes
schemaYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior4/5

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

The annotations only declare readOnlyHint and openWorldHint, but the description adds a real behavioral detail they do not carry: results are cached, and fresh=true forces a live re-read after DDL. It also pre-empts confusion over stale results, which matters for a schema-introspection tool. It does not mention cost or latency of a fresh read, and the return shape is already implied by the output schema, so a 4 rather than 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?

The structure is front-loaded: purpose first, then the cache escape hatch, then the return shape, then an example. Every sentence carries information. The return-field enumeration runs slightly long given that an output schema exists, but it is still useful as a quick reference.

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?

This is a simple read tool with an output schema that needs no return-value explanation, and the description still covers cache semantics, invalidation trigger, return fields, and a call example. The only real gap is the absence of any disambiguation from the vector and pg_search index siblings.

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 25%: only database is documented there, and it is documented well. The description compensates by explaining what fresh actually does and by showing schema and table in a worked example. It never mentions the optional database parameter or the read-only secondary-database targeting, but the schema covers that.

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 definition opens with a concrete verb plus resource and scope: "List the indexes defined on a table." That separates it from siblings such as recommend_indexes or list_constraints. It stops short of naming the nearest overlapping siblings (list_pg_search_indexes, get_turboquant_index_metadata, list_turboquant_indexes), so the boundary still takes some inference.

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 guidance is limited to one concrete case: set fresh=true to bypass the cache and re-read live, e.g. after a schema change. The description never says when to reach for this tool instead of list_pg_search_indexes or the turboquant index inspectors, and it states no prerequisites such as permissions on the target schema.

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

list_locksList locksB
Read-only

List currently-held and waiting locks, joined with backend state from pg_stat_activity. Ordered by (granted ASC, pid) so waiting locks float to the top. Returns lock type, mode, qualified relation name when applicable, transaction / virtualxid, the application_name + state + wait event of the owning backend, and the first 200 chars of its query. Read-only.

NameRequiredDescriptionDefault
limitNo
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.1/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, and the description's 'Read-only' restates rather than extends that. It does add genuine behavior beyond structured fields: the (granted ASC, pid) ordering that floats waiting locks to the top, and the explicit column list of the result set. It omits pagination/truncation behavior and any cost or permission notes.

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?

Three tight sentences, front-loaded with what is listed, then ordering, then return shape; nothing is padded. The trailing 'Read-only' is redundant against the annotations but costs only a few 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?

With an output schema and annotations present, the description needn't restate return values, and it does supply the join source, sort order, and column intent. The remaining gap is the undocumented limit parameter and unspecified truncation behavior for the query snippet beyond 200 chars.

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 description says nothing about either parameter. Schema coverage is 50%: the database parameter is fully documented in the schema, but the limit parameter (default 100) has no description anywhere, so an agent gets no guidance on paging or how limit interacts with the ordering. The description fails to compensate for the coverage gap.

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

Purpose4/5

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

The description names a specific verb and resource ('List currently-held and waiting locks') and states the join with pg_stat_activity, so the operation is unambiguous. It does not distinguish itself from near-siblings like read_pg_stat_lock, find_blocking_chains, or analyze_lock_hotspots, so an agent must infer the boundary.

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

Usage Guidelines2/5

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

There is no explicit when-to-use guidance and no mention of alternatives, even though several siblings (find_blocking_chains, walk_blocking_chains, analyze_lock_hotspots, read_pg_stat_lock) cover adjacent territory. Usage is only implied by the fact that lock inspection is useful when diagnosing contention.

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

list_partitionsList partitionsB
Read-only

Describe how a table is partitioned (strategy and bounds) and list its partitions. Returns an object with partitioned (bool), strategy ('range' / 'list' / 'hash' or null), and partitions (a list of {name, bounds} for each partition).

NameRequiredDescriptionDefault
tableYes
schemaYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
strategyYes
partitionsYes
partitionedYes

TDQS

B3.1/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds some value by explaining how non-partitioned tables are represented (partitioned=false, strategy=null) rather than erroring, but it says nothing about permissions, error modes, or cost on large partitioned tables.

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?

Two sentences, front-loaded with the action, with no filler. The second sentence is somewhat redundant with the existing output schema, but it is compact and readable.

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 introspection tool with an output schema and readOnly annotations, the definition covers what the tool does and how to interpret the non-partitioned case. Remaining gaps are minor: no mention of the secondary-database targeting behavior or of failure modes.

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 only 33% — just the optional `database` param is documented in the schema, and that documentation lives in the schema, not the description. The description adds no meaning for `schema` or `table`, and does not explain that `database` targets a read-only secondary; for a low-coverage schema the description should compensate and it does not.

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 verb and resource: it both describes the partitioning strategy/bounds of a table and enumerates the partitions. This is much more precise than the bare name, though it never distinguishes the tool from near neighbors like describe_table or get_pg19_partitions_status.

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

Usage Guidelines2/5

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

There is no when-to-use or when-not-to-use guidance, no mention of prerequisites (e.g., that the table must exist in the given schema), and no routing to alternatives such as describe_table or get_pg19_partitions_status. The agent must infer the use case entirely from the tool name.

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

list_pg_search_indexesList PG search indexesA
Read-only

List every pg_search BM25 index in the database along with the parsed reloptions (the WITH (...) config) for each. Surfaces the 13 documented bm25 options (key_field, the six *_fields jsonb configs, layer_sizes, background_layer_sizes, target_segment_count, mutable_segment_rows, sort_by, search_tokenizer). The full parsed dict is preserved in index_options so unsurfaced or future options stay reachable. Returns an empty list when the pg_search extension is not installed.

NameRequiredDescriptionDefault
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior4/5

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

Annotations already declare a read-only, closed-world operation, and the description adds real behavioral detail beyond them: the full parsed option dict is preserved under index_options so unsurfaced options remain reachable, and it returns an empty list when pg_search is not installed. That edge-case disclosure is the kind of context annotations cannot carry.

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 action, followed by what is surfaced and the empty-list edge case; no filler sentences. The parenthetical enumeration of 13 option names is dense but genuinely informative rather than redundant.

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 shape needn't be explained, and the description covers scope plus the extension-absent case. However, it never clarifies whether it enumerates indexes in one database or across all databases, leaving the interaction with the `database` parameter implicit.

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 single `database` parameter is fully documented in-schema, including the rejection of unconfigured names. The description adds nothing about the parameter, so the baseline 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?

States a specific verb and resource: listing every pg_search BM25 index with its parsed reloptions, and enumerates the surfaced bm25 options. It is distinguishable from generic listing tools by domain, but never names sibling tools like list_indexes or get_pg_search_index_metadata, 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?

Use is only implied by the description of what it lists; there is no explicit 'use this when...' guidance or named alternative (e.g. get_pg_search_index_metadata for a single index). The extension-absent behavior is stated, which helps set expectations but is not usage guidance.

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

list_policiesList policiesA
Read-only

List the Row-Level-Security policies on a table, and whether row security is enabled. Returns an object with rls_enabled (bool) and policies — a list of {name, command (SELECT/INSERT/UPDATE/DELETE/ALL), permissive (bool), roles, using_expression, check_expression}.

NameRequiredDescriptionDefault
tableYes
schemaYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
policiesYes
rls_enabledYes

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds the concrete result shape (rls_enabled flag plus per-policy command, permissive, roles, using/check expressions), but says nothing about pagination, permissions required, or behavior when the table has no policies.

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?

Two tight sentences, purpose front-loaded before the return detail. The second sentence is long but information-dense; only mild redundancy with the declared output schema.

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 metadata lister with an output schema and safety annotations, the description covers what it does and what comes back. The remaining gap is the undocumented schema/table parameters and absence of any when-to-use routing against the RLS testing siblings.

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 coverage is only 33%: the `database` parameter is documented inline, but `schema` and `table` carry no descriptions. The phrase 'on a table' hints at the table parameter, yet the description adds no clarification of qualification, case sensitivity, or the primary-vs-secondary database target.

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?

Specific verb plus resource ('List the Row-Level-Security policies on a table') with an added scope detail (also reports whether row security is enabled). It is plainly distinguishable from siblings like test_rls_for_role or list_grants 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 Guidelines3/5

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

Usage is only implied: an agent can infer this is the inspection step for RLS, but the description never says when to pick it over test_rls_for_role or list_grants, and offers no prerequisites or exclusions.

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

list_prewarmed_relationsList prewarmed relationsA
Read-only

Report current shared-buffer residency per relation, ranked by blocks-cached descending. Requires the pg_buffercache extension; returns an empty list when it's missing. Returns a list of objects with schema, table, blocks_cached (8 KiB pages currently in shared buffers), total_blocks (the relation's on-disk size in the same unit), pct_cached (the residency ratio rounded to 2 decimals), and dirty_blocks (pages with pending writes).

Example: list_prewarmed_relations(schema='public', limit=50)

NameRequiredDescriptionDefault
limitNo
schemaNo
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, and the description adds real value on top: the pg_buffercache dependency, graceful degradation to an empty list, the sort order, and the unit (8 KiB pages) for the block counts. It does not mention cost on large catalogs, but nothing required is missing or contradicted.

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?

Three tightly packed sentences plus a one-line example, front-loaded with the core action and sort order. Every sentence adds new information — dependency, degradation behavior, field semantics — with no restatement of the name.

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?

An output schema exists, so enumerating return fields is a bonus rather than a necessity, and the description covers the extension requirement and failure mode that the schema cannot express. The remaining gap is the unspecified `limit` semantics, which matters for a tool with a default of 100 rows.

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 only 33% (only `database` is documented), so the description must compensate for `limit` and `schema`. It does so partially: the example shows `schema='public'` and `limit=50`, implying filtering and top-N truncation, but it never states that `limit` caps row count or that `schema` is an exact-match filter.

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?

States a specific verb and resource (report shared-buffer residency per relation) plus a defined ordering (blocks-cached descending), which lets an agent distinguish it from a plain buffer-cache dump. It never names the closely related siblings (read_pg_buffercache_relations, read_pg_buffercache_summary, recommend_prewarm_targets), so the differentiation is implied rather than explicit.

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 extension prerequisite and the empty-list-when-missing behavior give useful preconditions for calling it. However there is no explicit when-to-use guidance against the many sibling cache/prewarm tools, so the agent must infer that this is for per-relation residency rather than summary or recommendation workflows.

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

list_property_graphsList property graphsA
Read-only

List SQL/PGQ property graphs defined in the database (reads information_schema.sql_property_graphs). Returns an empty list on PG < 19 or when the catalog view is missing (early Beta builds may not expose it yet — pair with get_pgq_status to disambiguate). Returns a list of objects with schema, name, vertex_tables (list of schema.table strings), and edge_tables (same shape).

Example: list_property_graphs()

NameRequiredDescriptionDefault
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds genuinely non-obvious behavior: empty-list semantics on older versions and Beta builds, and the recommended disambiguation path with `get_pgq_status`. That is meaningful context beyond the annotations, though it doesn't discuss permissions or cost.

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?

Three sentences, front-loaded with the resource and source view, followed by the failure-mode caveat. The trailing zero-argument example is mildly redundant but short and does not obscure anything.

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?

An output schema exists, yet the description still restates the return fields, which is mild duplication. All the important gaps for a read-only listing tool — version-dependent emptiness and how to confirm it — are covered, so an agent can call it and interpret results 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 one optional `database` parameter with 100% schema description coverage, so the schema already explains targeting a secondary read-only database. The description says nothing about the parameter, which is acceptable at full coverage but adds no extra meaning (e.g., behavior when the target is not configured).

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 uses a specific verb+resource ('List SQL/PGQ property graphs') and names the exact catalog source (`information_schema.sql_property_graphs`), which implicitly separates it from generic graph listing. However, the sibling `list_graphs` is never mentioned, so an agent seeing both tools must infer the distinction (AGE-style graphs vs SQL/PGQ graphs) rather than being told.

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

Usage Guidelines4/5

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

It gives a concrete conditional instruction: an empty result on PG < 19 or a missing catalog view should be disambiguated by pairing with `get_pgq_status`. It stops short of explicitly stating when to prefer this over `list_graphs` or `describe_property_graph`, so sibling routing is only implied.

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

list_publicationsList publicationsA
Read-only

List logical-replication publications with the tables and operations they include. Returns a list of objects with name, owner, all_tables (bool), publishes_insert / publishes_update / publishes_delete / publishes_truncate (bools), and tables (list of schema.table strings).

NameRequiredDescriptionDefault
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

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

The annotations already declare this as a read-only, non-open-world operation. The description adds the useful return shape, but does not add behavioral context such as permission requirements, filtering behavior, or limitations beyond what the annotations and schema provide.

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 description is two short sentences and front-loads the purpose. The return-field listing is somewhat redundant because an output schema exists, but it remains compact and useful.

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 listing tool with full parameter documentation, annotations, and an output schema, this description is sufficiently complete. It could be stronger with explicit usage guidance relative to sibling tools, but nothing essential for invocation 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?

Schema description coverage is 100%, so the single optional database parameter is already fully documented in the input schema. The description adds no additional meaning about how the parameter affects the listing.

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: it lists logical-replication publications, including the tables and operations they contain. This distinguishes it clearly from nearby siblings such as list_subscriptions or get_logical_replication_status.

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 by the name and description, but the description does not explicitly say when to choose this tool versus alternatives like list_subscriptions or get_logical_replication_status. It also gives no exclusions or prerequisites.

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

list_redis_foreign_serversList Redis foreign serversA
Read-only

List the foreign servers backed by redis_fdw — the FDW that exposes a Redis instance as SQL-queryable foreign tables. Reports each server's connection address, port, database, TLS posture, and whether a user mapping (credential) is configured. Returns an empty list when the redis_fdw extension is not installed. Returns a list of objects with name, address, port, database, tls (bool), password_configured (bool), and options (the full server-options dict).

Example: list_redis_foreign_servers()

NameRequiredDescriptionDefault
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already establish readOnlyHint=true and openWorldHint=false, so the safety profile is covered; the description goes further by disclosing the exact shape of what comes back (name, address, port, database, tls, password_configured, options) and the important edge case that an absent redis_fdw yields an empty list rather than an error. That edge-case disclosure is genuinely useful behavioral context not available from annotations.

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 the returned fields, then the empty-list caveat — a sensible ordering with little waste. The trailing example line is marginally redundant for a zero-required-parameter tool but 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 read-only single-parameter list tool with an output schema, the description is more than sufficient: purpose, scope, return fields, and the no-extension edge case are all present. The only omission an agent might want is the interaction with the `database` parameter and how this differs operationally from the generic foreign-server listing.

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% and the single `database` parameter is fully documented in the schema, including the secondary/read-only targeting semantics and the rejection of unconfigured ids. The description adds nothing about that parameter — it never mentions secondary database targeting — so it sits at the baseline where the schema does all the work.

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 and resource ('List the foreign servers backed by redis_fdw') and immediately qualifies the scope: only servers exposed through that particular FDW, with the underlying mechanism (Redis instance as SQL-queryable foreign tables) spelled out. This distinguishes it from the sibling list_foreign_servers, which covers all FDWs, without the agent needing to open 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 Guidelines3/5

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

Usage is only implied — the redis_fdw scoping hints that an agent wanting all foreign servers should look elsewhere, and the empty-list-on-missing-extension note tells the agent how to interpret a null result. But there is no explicit 'use list_foreign_servers instead when...' routing or statement of prerequisites/alternatives.

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

list_replicasList replicasA
Read-only

Report the health of every configured read replica. Each entry shows index, password-obfuscated DSN, whether the replica is currently degraded (skipped from routing), the last error that took it out, and how many seconds remain before it's re-probed. Returns an empty list when no replicas are configured.

NameRequiredDescriptionDefault

No parameters

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 already declare readOnlyHint=true, and the description adds detailed behavioral context: entry fields (index, obfuscated DSN, degradation flag, last error, reprobe seconds) and empty list return for no replicas. No contradictions.

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

Conciseness5/5

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

Two concise sentences, first stating purpose, second detailing outputs. No redundant 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?

Complete for a zero-parameter tool with output schema. Covers what each entry contains and the edge case of empty list.

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; schema coverage is 100%. Description adds value by explaining output fields, which is more than the schema alone.

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 'report the health of every configured read replica' and enumerates the fields in each entry. Distinguishes from other list_* sibling tools by focusing on replica health status.

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?

Implicitly clear when to use: to check read replica health. No explicit alternatives or when-not, but the tool's specificity makes it unambiguous.

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

list_resource_groupsList resource groupsA
Read-only

List configured WarehousePG resource groups + their utilisation. Reads gp_toolkit.gp_resgroup_status for concurrency, cpu_max_percent, cpu_weight, memory_limit, memory_shared_quota, plus live num_running / num_queueing. Pairs with analyze_workload for 'where's my workload time going' diagnosis. Read-only. On vanilla PG returns available=false.

Example: list_resource_groups()

NameRequiredDescriptionDefault
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
detailYes
groupsYes
availableYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, and the description reinforces 'Read-only' while adding real substance beyond them: the underlying source view (`gp_toolkit.gp_resgroup_status`), the specific columns read, live counters, and graceful degradation to `available=false` on vanilla PG. That degradation behavior is exactly the kind of non-obvious trait an agent needs; only missing details are cost/latency and any privilege requirements.

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 payload are front-loaded in the first sentence, with behavioral caveats following. Dense but each clause carries information; the trailing `Example: list_resource_groups()` is largely redundant for a zero-required-argument call, which is the only real waste.

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 an output schema present (so return shape needn't be described), full annotation coverage, and a fully documented single parameter, the description supplies everything else an agent needs: what it lists, where the data comes from, how it degrades on non-WarehousePG, and which tool to combine it with.

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 optional `database` parameter whose schema description is already complete (100% coverage, explaining it targets a configured secondary read-only database and that non-id names are rejected). The description adds nothing about this parameter, so the baseline 3 applies — the schema does all the work.

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 ('List configured WarehousePG resource groups') and immediately scopes the payload ('+ their utilisation'), then enumerates the exact metrics returned. No sibling tool covers resource groups, and the WarehousePG qualifier prevents confusion with generic PG listing tools like list_databases or list_roles.

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

Usage Guidelines4/5

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

It gives an explicit pairing ('Pairs with `analyze_workload` for where's-my-workload-time-going diagnosis'), which tells the agent the diagnostic workflow this belongs to, and warns that on vanilla PG it returns `available=false` — an implicit when-not-applicable condition. It stops short of naming a direct alternative or stating prerequisites (e.g. extension installed) outright.

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

list_rolesList rolesA
Read-only

List the database roles and their attributes, excluding PostgreSQL's own roles unless include_system is true. Returns a list of objects with name, superuser, create_role, create_db, can_login, replication, bypass_rls, connection_limit, member_of.

NameRequiredDescriptionDefault
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.
include_systemNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already establish that this is a safe read-only operation with no external side effects. The description adds meaningful behavior beyond that by stating that PostgreSQL's own roles are excluded by default and by naming the returned role attributes. It does not mention ordering, pagination, or permission prerequisites, but those gaps are minor for this simple read 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?

The description is two tight sentences with the core scope and default filtering front-loaded. Every clause adds useful information, and there is no redundant or empty wording.

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 list tool with an output schema and readOnly annotations, the description covers the key behavior and return object shape. It could be slightly more complete by mentioning ordering or pagination limits, but nothing essential for correct invocation appears to be 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 50%, and the only undocumented parameter is include_system; the description compensates by explaining that it controls whether PostgreSQL's own roles are included. The database parameter is already richly documented in the schema, so its absence from the description is not a material gap.

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 verb and resource: it lists database roles and their attributes, and it specifies the system-role exclusion behavior. It does not explicitly distinguish itself from nearby role-related siblings such as get_role_ddl or test_rls_for_role, so it stops short of a 5.

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

Usage Guidelines3/5

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

The description explains the include_system toggle, which gives useful usage context for that parameter. However, it does not state when to choose this tool over alternatives or name any sibling tools, leaving broader usage guidance implied.

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

list_schemasList schemasA
Read-only

List database schemas, excluding PostgreSQL's own schemas unless include_system is true. Returns a list of objects with name.

Example: list_schemas(include_system=false)

NameRequiredDescriptionDefault
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.
include_systemNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds meaningful behavioral context by stating that PostgreSQL's own schemas are excluded by default and returned only when include_system is true.

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

Conciseness5/5

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

The description is front-loaded with the core behavior, followed by a compact return-shape note and a single example. There is no unnecessary wording.

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, zero-required-parameter list tool with an output schema, the description is nearly complete. It omits only explicit guidance on the optional database parameter, but the input schema already covers that fully.

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 50%, with the database parameter well documented in the schema itself. The description compensates for the undocumented include_system parameter by explaining its effect on system-schema inclusion, though it adds no further format or syntax detail.

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: listing database schemas. It also defines the scope by excluding PostgreSQL's own schemas unless include_system is true, which distinguishes it from sibling listing tools such as list_tables and list_databases.

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 explains the include_system behavior, which implies when system schemas are returned. However, it does not explicitly say when to use this tool versus alternatives like list_databases or list_tables, nor does it state prerequisites for the optional database parameter.

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

list_sequencesList sequencesA
Read-only

List the sequences defined in a schema, with their range, increment, and last value. Returns a list of objects with name, data_type, start_value, min_value, max_value, increment, cycle (bool), last_value.

NameRequiredDescriptionDefault
schemaYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds that results are per-schema and enumerates returned fields, but says nothing about permissions, behavior on an empty or nonexistent schema, or how the primary vs secondary database affects results.

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?

Two sentences, front-loaded with the action, with no filler. The second sentence mostly restates the return shape that the output schema already provides, which is mild redundancy but still readable.

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?

This is a simple read-only list tool with an output schema and covered safety annotations, so little explanation is required. The only real gap is the undocumented 'schema' argument and the lack of any cue distinguishing this from audit_sequences.

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 50%: the 'database' parameter carries a thorough description about secondary read-only targets, while 'schema' is undocumented. The description implies the schema argument scopes the listing but adds no naming, default-schema, or resolution semantics beyond that, so the baseline of 3 holds.

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 ('List the sequences defined in a schema') and names the attributes it reports, so the agent knows exactly what the call returns. It does not distinguish itself from the nearby audit_sequences tool, which is the one ambiguity an agent could hit in this large sibling set.

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 by the scoping phrase 'defined in a schema', but there is no explicit when-to-use guidance, no statement of when to prefer audit_sequences, and no prerequisites. Adequate but leaves routing to inference.

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

list_subscriptionsList subscriptionsA
Read-only

List logical-replication subscriptions; requires superuser to see any rows.

NameRequiredDescriptionDefault
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds a genuinely useful behavioral caveat beyond them: superuser privilege is required to see any rows, warning the agent that an empty result may mean insufficient privileges rather than no subscriptions.

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?

A single compact sentence with the purpose front-loaded and the privilege caveat attached after a semicolon. No redundant or filler wording.

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

Completeness4/5

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

Given one optional parameter, full schema descriptions, existing annotations, and an output schema that covers return values, the description supplies what is needed to call it. It could only add which databases to query or how subscriptions relate to publications, a minor gap.

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 single 'database' parameter is thoroughly documented in the schema, including the list_databases id requirement and rejection of plain names. The description adds no parameter meaning beyond that, so the baseline 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?

States a specific verb (List) and resource (logical-replication subscriptions), which separates it from neighbors such as list_publications and get_logical_replication_status. It does not explicitly name a sibling to avoid, but the resource scope is distinctive enough to select correctly.

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 by the resource name; the description never says when to prefer this over get_logical_replication_status or list_publications, nor any prerequisite beyond the superuser note. An agent must infer the when-to-use boundary from the title alone.

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

list_tablesList tablesB
Read-only

List the tables and views in a schema, flagging partitioned tables and partitions. Returns a list of objects with name, type ('table' or 'view'), partitioned, is_partition.

Example: list_tables(schema='public')

NameRequiredDescriptionDefault
schemaYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds the useful flagging semantics (partitioned, is_partition), but says nothing about behavior on a non-existent schema, system-schema inclusion, or the secondary read-only database targeting that the schema mentions.

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?

One compact purpose sentence followed by the return shape and a call example, front-loaded with the verb and resource. Slight redundancy since an output schema already exists, but the example earns its place for parameter clarity.

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?

Reasonably complete given an output schema exists, so return values needn't be spelled out in depth. Still missing guidance on the sibling overlap (views/partitions) and edge-case behavior, which matters for a schema-introspection tool in a catalog this dense.

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 50%: the `database` parameter is thoroughly documented in the schema itself, while the required `schema` parameter has no schema description. The example `list_tables(schema='public')` partially compensates by showing the expected value form, but no further semantics (case sensitivity, default schema, search_path) are added.

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 uses a specific verb and resource ('List the tables and views in a schema') and adds the distinguishing detail that partitioned tables and partitions are flagged. It does not, however, distinguish itself from close siblings like list_views or list_partitions, which overlap substantially with this 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?

Usage is only implied: an agent can infer this is the browse-the-schema step, helped by the inline example. There is no explicit statement of when to prefer this over list_views or list_partitions, nor any prerequisite or exclusion.

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

list_timescale_jobsList timescale jobsA
Read-only

List TimescaleDB background jobs (retention / compression / refresh / reorder policies and user jobs) with schedule, next start, last run status and run/failure counts. Job ids below 1000 are TimescaleDB system jobs.

NameRequiredDescriptionDefault
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
jobsYes
availableYes

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds genuinely non-obvious domain semantics — that job ids below 1000 are TimescaleDB system jobs — which prevents misreading user jobs as system ones. The remaining field list (schedule, next start, last run status, counts) largely duplicates the output schema, so it is not additional credit.

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 the resource and scope, then the interpretive detail. No filler wording and nothing redundant that isn't carrying information.

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 read-only list tool with an output schema and one well-described parameter, the definition covers what is listed, the returned metadata, and the system-job id heuristic. The only material gap is differentiating this from list_cron_jobs, which an agent comparing schedules of TimescaleDB jobs versus generic cron entries would need.

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 optional 'database' parameter is fully documented in the schema, including that non-configured names are rejected, giving 100% coverage. The description adds nothing about targeting a secondary database, so the schema does all the work — the baseline 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?

States a specific verb and resource plus the enumerated job categories (retention, compression, refresh, reorder policies, user jobs), so an agent knows exactly what is returned. It stops short of distinguishing itself from the nearby list_cron_jobs sibling, which is the one tool most likely to be confused with TimescaleDB background jobs.

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: an agent can infer this is the tool for inspecting scheduled TimescaleDB maintenance. There is no explicit when-to-use statement, no mention of prerequisites, and no direction to list_cron_jobs or get_timescaledb_telemetry_report as alternatives.

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

list_triggersList triggersB
Read-only

List the user-defined triggers on a table. Returns a list of objects with name, function (the called function's qualified name), and definition (the CREATE TRIGGER SQL).

NameRequiredDescriptionDefault
tableYes
schemaYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds the scope note that only user-defined triggers are returned, but it does not mention permission requirements or behavior on a nonexistent table — and its return-value sentence largely restates what the output schema already provides.

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?

Two short sentences, front-loaded with the action and scope; no filler. The second sentence is somewhat redundant given the output schema exists, which keeps it from a 5.

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?

This is a simple read tool with annotations and an output schema, so the return-shape sentence is unnecessary while the parameter explanation is thin. An agent can call it, but may be unsure about schema/table semantics and the secondary-database path.

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 only 33%: `schema` and `table` are bare strings in the schema. The description mentions "table" implicitly but never explains the schema/table pairing or how the optional `database` selector changes which instance is queried, so it does not compensate for the coverage gap.

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 names a specific verb and resource ("List the user-defined triggers on a table") and adds a scope qualifier ("user-defined") that distinguishes it from system-trigger introspection. It is clearly separable from siblings such as list_constraints or list_indexes, though it does not explicitly acknowledge them.

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 phrase "on a table" signals that a table context is required, but there is no statement of when to prefer this over describe_table or the DDL tools, and no mention of prerequisites or ordering relative to list_schemas/list_tables.

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

list_turboquant_indexesList TurboQuant indexesA
Read-only

List every pg_turboquant ANN index in the database along with the metadata payload that tq_index_metadata() reports for it: algorithm_version, quantizer_family, residual_sketch_kind, fast_path_eligible, capability_flags, delta_state, and maintenance_recommended. Returns an empty list when the pg_turboquant extension is not installed.

NameRequiredDescriptionDefault
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, and the description adds genuinely useful behavior: the full field set of the reported metadata payload and the empty-list outcome when the extension is not installed. It does not discuss ordering or cost, but for a read-only catalog listing the added context is solid.

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 action and scope, followed by the reported fields and the extension-absent case. The inline field enumeration is long but earns its place by telling the agent what the payload contains; the sentence is dense but not padded.

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?

An output schema exists, so enumerating return fields is somewhat redundant, but the extension-not-installed behavior is information the agent needs to interpret an empty result. Combined with a fully covered one-parameter schema and read-only annotations, nothing critical 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?

Schema coverage is 100% and the single optional 'database' parameter is fully documented in the schema, including the read-only secondary restriction. The description adds no parameter meaning of its own, 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?

States a specific verb and resource ('List every pg_turboquant ANN index in the database') and names the exact metadata payload returned, which cleanly separates it from siblings like get_turboquant_index_metadata (single index) and list_indexes (generic indexes).

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 by the listing verb and the extension-scoped subject, but the description never states when to prefer this over get_turboquant_index_metadata or when to reach for it at all. The only conditional given is the empty-list behavior when pg_turboquant is absent, which is a side effect rather than selection guidance.

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

list_user_mappingsList user mappingsB
Read-only

List role-to-foreign-server mappings; the catch-all appears as user='public'. Returns a list of objects with user (role name or 'public'), server (foreign-server name), and options (dict of mapping options, e.g. credentials).

NameRequiredDescriptionDefault
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds a genuinely useful domain detail — that the catch-all mapping surfaces as user='public' and that options may contain credentials — but says nothing about pagination, ordering, or privilege requirements for seeing other roles' mappings.

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 the operation, then the return shape. Every clause carries information an agent would otherwise have to guess.

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?

An output schema exists and the description still usefully names the three returned fields, which helps the agent reason about results. The only gap is the optional database-targeting behavior, which is delegated entirely to the schema.

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% and the single 'database' parameter is fully documented in the schema, including the secondary read-only targeting rule. The description adds no parameter meaning beyond that, so baseline 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?

States a specific verb and resource: 'List role-to-foreign-server mappings', which is clearly distinct from siblings such as list_foreign_servers or list_grants. It never explicitly names a sibling or scope boundary, so it stops shy of a 5.

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

Usage Guidelines2/5

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

There is no when-to-use or when-not-to-use guidance and no pointer to alternatives (e.g. list_foreign_servers for the server side, list_grants for privileges). Usage is only inferable from the tool name and purpose.

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

list_viewsList viewsA
Read-only

List the views and materialized views in a schema, with their definitions. Returns a list of objects with name, materialized (bool), and definition (the SELECT SQL).

NameRequiredDescriptionDefault
schemaYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description usefully adds the result shape (name, materialized bool, definition SELECT SQL), but says nothing about ordering, whether views in other schemas are included, permission requirements, or the secondary-database targeting behavior.

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

Conciseness5/5

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

Two tight sentences, front-loaded with the action and scope, then the return shape. Every clause carries information; nothing is repeated or padded.

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 catalog listing with an output schema present, this is close to complete: the scope and the returned fields are both stated. Minor gaps remain around the undocumented `schema` parameter format and whether the listing spans only the given schema.

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 50%: the optional `database` parameter is well documented in the schema itself (configured secondary read-only id, invalid names rejected), but the required `schema` parameter has no schema description at all. The description only implicitly conveys that `schema` scopes the listing and does not state its format (e.g. qualified vs unqualified, case sensitivity).

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?

A specific verb plus a specific resource: 'List the views and materialized views in a schema, with their definitions.' The resource (views/materialized views) is narrow enough that an agent can separate it from the many other list_* siblings (list_tables, list_indexes, list_functions) without opening the schema. It stops short of 5 because no sibling is named or contrasted explicitly.

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: mentioning 'with their definitions' signals the tool is for inspecting view SQL rather than just enumerating names. There is no explicit when-to-use statement, no statement of when to prefer e.g. list_tables or describe_table, and no prerequisite or exclusion guidance.

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

migrate_vector_to_halfvecMigrate vector to halfvecA
Read-only

Generate a DDL plan that converts a pgvector vector(N) column to halfvec(N) — halving per-element storage (4 → 2 bytes) with typically negligible recall impact at d ≥ 768. Reads the column's current type + dimension from the catalog, finds every index on the column, and emits an ordered migration_sql plan: DROP each affected index, ALTER COLUMN to halfvec(N) via a USING cast, then recreate each index with its halfvec opclass. Also returns a mirror rollback_sql that restores the original vector(N) type plus the original index definitions. Nothing is executed — feed the plan through the shadow-migration workflow (prepare_migration / validate_migration_schema) before applying. Returns already_halfvec=true (and an empty plan) when the column is already halfvec, and refuses any index whose opclass has no halfvec sibling rather than rewriting it incorrectly. Requires the vector extension.

NameRequiredDescriptionDefault
tableYes
columnYes
schemaYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
notesYes
indexesYes
availableYes
dimensionYes
row_countYes
column_typeYes
rollback_sqlYes
migration_sqlYes
already_halfvecYes
estimated_total_bytes_savedYes
estimated_bytes_per_row_afterYes
estimated_bytes_per_row_beforeYes

TDQS

A4.1/5.0
Behavior5/5

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

Annotations declare readOnlyHint=true, and the description reinforces this with 'Nothing is executed' rather than contradicting it. Beyond annotations it discloses the ordered plan contents (drop indexes, ALTER with USING cast, recreate with halfvec opclass), the rollback mirror, the already_halfvec=true edge case, refusal of opclasses with no halfvec sibling, and the vector-extension prerequisite.

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 mechanism, then edges into safeguards and prerequisites. Every clause carries information, though the long em-dash-and-parenthetical sentences make it denser than necessary.

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?

An output schema exists, so the description's return-value discussion (migration_sql, rollback_sql, already_halfvec) is bonus rather than obligation. For a plan-generating DDL tool with mutation implications, the safety and sequencing guidance is complete; only the unexplained identifier parameters leave a gap.

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 25% — only `database` is documented, and that is in the schema, not the description. The description never explains how `schema`, `table`, and `column` identify the target, nor how the column's dimension is resolved, so it fails to compensate for the low 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?

States a specific verb and resource with scope: 'Generate a DDL plan that converts a pgvector vector(N) column to halfvec(N)', including the storage and recall rationale. An agent can distinguish this from siblings like recommend_vector_quantization or tune_vector_index without opening any schema.

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 nothing is executed and directs the plan through the shadow-migration workflow (prepare_migration / validate_migration_schema) before applying, which is clear when-to-use context. It does not name a sibling to use *instead* when halfvec is inappropriate, so it falls short of full when/when-not routing.

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

monitor_embedding_driftMonitor embedding driftA
Read-only

Compare two time windows of a pgvector column and flag distributional drift. Samples up to sample_size (default 5000) non-NULL embeddings from each window (filtered by timestamp_column), computes the centroid (per-dimension mean vector) and L2-norm distribution of each, then reports the cosine distance between the two centroids (the main drift signal), the relative change in mean / std of the L2-norm distribution, and a boolean drift_detected that flips when cosine distance exceeds drift_threshold (default 0.05). Each window is treated as a half-open [start, end) interval. Useful for ops monitoring of embedding pipelines — an upstream model swap typically shows up as a large centroid cosine distance even if the norm distribution looks stable. insufficient_data is returned distinctly from drift_detected=false when either window is empty. Reports available=false if pgvector is not installed.

Example: monitor_embedding_drift(schema='public', table='docs', embedding_column='embedding', timestamp_column='created_at', baseline_start='2026-01-01', baseline_end='2026-02-01', current_start='2026-02-01', current_end='2026-03-01')

NameRequiredDescriptionDefault
tableYes
schemaYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.
current_endYes
sample_sizeNo
baseline_endYes
current_startYes
baseline_startYes
drift_thresholdNo
embedding_columnYes
timestamp_columnYes

Output Schema

NameRequiredDescription
notesYes
currentYes
baselineYes
availableYes
dimensionYes
drift_detectedYes
drift_thresholdYes
insufficient_dataYes
centroid_cosine_distanceYes
norm_std_relative_changeYes
norm_mean_relative_changeYes

TDQS

A4.6/5.0
Behavior5/5

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

Goes well beyond the readOnly/openWorld annotations: it discloses sampling behavior (up to sample_size non-NULL embeddings), how windows are bounded (half-open [start, end)), what signal is primary, the exact condition that flips drift_detected, and two distinct failure modes (insufficient_data for empty windows, available=false without pgvector). This is the kind of operational detail an agent cannot infer from the 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-loads the core action and signal, then adds mechanism, edge cases, and a concrete call example. Dense but every sentence carries information; the only minor cost is a long single paragraph that could be split for scanability.

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 an 11-parameter, 8-required analytical tool, the description covers inputs, computation, primary and secondary metrics, thresholds, and degraded-mode returns. An output schema exists, yet the description still names the key result fields, so an agent knows how to interpret the response without opening 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 description coverage is only 9%, so the description must carry the load, and it does for most parameters: sample_size (default 5000, sampling cap), drift_threshold (default 0.05, the flip condition), timestamp_column (the filter field), embedding_column, and the four window boundaries via the half-open interval rule plus a worked example. The `database` parameter is documented in the schema itself rather than the description, leaving only a minor 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?

Opens with a specific verb and resource: 'Compare two time windows of a pgvector column and flag distributional drift.' The scope (two windows, centroid cosine distance, L2-norm distribution) clearly separates it from neighboring vector tools such as detect_vector_outliers, analyze_topk_stability, or cluster_vectors.

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?

Provides a concrete usage context — ops monitoring of embedding pipelines, where an upstream model swap surfaces as a large centroid cosine distance. It never names an alternative tool or states when NOT to use this one (e.g., versus drift checks on other column types), so it stops short of explicit routing guidance.

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

monitor_index_buildMonitor index buildA
Read-only

Surface every active CREATE INDEX and its progress from pg_stat_progress_create_index (PG12+, no extension). One row per build with pid, schema.relation.index_name, the command, phase label, blocks_done/total, tuples_done/total, and a computed progress_pct (blocks first, tuples as fallback, null when neither phase reports a denominator). Useful next to list_active_queries when an HNSW / IVFFlat build on a big table is taking longer than expected. Returns a list of objects with pid, schema, relation, index_name, command, phase, blocks_done, blocks_total, tuples_done, tuples_total, and progress_pct (null when no denominator is reported).

NameRequiredDescriptionDefault
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

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 readOnlyHint/openWorldHint, the description discloses the version floor (PG12+), that no extension is required, the one-row-per-build granularity, and the exact resolution logic for progress_pct (blocks first, tuples as fallback, null when no denominator). That computed-field rule is behavior an agent could not infer from the 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.

Conciseness3/5

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

It is front-loaded with the operational fact, but the column list is enumerated twice — once in prose ('pid, schema.relation.index_name, ... progress_pct') and again in the closing 'Returns a list of objects with ...' sentence. Since an output schema exists, that trailing enumeration is largely redundant and inflates the text.

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

Completeness4/5

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

For a zero-required-parameter monitoring tool with annotations and an output schema, the description covers the essentials: source view, version requirement, row semantics, and progress computation. It is only weakened by duplicating return-field documentation that the output schema already provides.

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 optional parameter whose schema description already covers the secondary-database targeting rule at 100% coverage, so the baseline of 3 applies. The description never mentions the `database` parameter, adding no meaning on top of the 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 first sentence names a specific verb and source system: 'Surface every active CREATE INDEX and its progress from pg_stat_progress_create_index (PG12+, no extension).' It also enumerates the exact per-row shape, so an agent can distinguish this monitoring tool from catalog tools like list_indexes or activity tools like list_active_queries.

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 triggering scenario: 'Useful next to list_active_queries when an HNSW / IVFFlat build on a big table is taking longer than expected.' That clarifies when to reach for it, but it stops short of explicit exclusions, e.g. what to use when no build is running or when the server is pre-PG12.

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

open_cursorOpen cursorA
Read-only

Open a server-side cursor for a SELECT query. The cursor holds the result set on the server side so an agent can page through millions of rows without loading them all. SQL is validated by the same safety allowlist as run_select. Returns the cursor_id; fetch the rows with fetch_cursor and close with close_cursor (or let the 5-minute TTL clean up). Hard cap of 16 concurrent cursors.

NameRequiredDescriptionDefault
sqlYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior5/5

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

Annotations cover only readOnlyHint/openWorldHint, and the description adds the operationally decisive facts an agent needs: server-side result retention, a 5-minute TTL as an alternative to explicit close, a hard cap of 16 concurrent cursors, and that SQL passes the same safety allowlist as run_select. These are resource-exhaustion constraints absent from the annotations and schema.

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?

Four dense sentences, front-loaded with purpose, then mechanism, then lifecycle routing, then the concurrency cap. Every sentence carries information an agent cannot get from the schema or annotations.

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 has an output schema, so return contents needn't be spelled out, yet the description still notes cursor_id is the return. Combined with lifecycle routing, TTL and the concurrency limit, nothing needed to invoke 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?

Schema coverage is 50%: the optional database parameter is fully documented in the schema, while sql has no schema description. The description adds that sql must be a SELECT and is subject to the allowlist, but gives no syntax or size guidance for it, so it only partially compensates for the undocumented parameter.

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 ("Open a server-side cursor for a SELECT query") and immediately scopes it to emissioning a result set for paging. It is clearly distinguishable from siblings run_select (one-shot execution), fetch_cursor (row retrieval) and close_cursor (release), all of which are named.

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 an explicit use condition ("page through millions of rows without loading them all") and directs the agent to fetch_cursor and close_cursor for the next steps. It stops short of explicitly contrasting with run_select for small result sets, though the reference to run_select's allowlist implies the relationship.

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

optimize_queryOptimize queryB
Read-only

Analyze a SQL query for syntax anti-patterns and performance issues using EXPLAIN plan costs and index scans, returning an optimized version.

NameRequiredDescriptionDefault
sqlYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
findingsYes
rationaleYes
original_sqlYes
optimized_sqlYes
explain_summaryYes

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already cover the safety profile (readOnlyHint=true, openWorldHint=false), so the description isn't burdened with that. It does add useful method context (EXPLAIN plans, index scans), but leaves a material ambiguity: whether the supplied SQL is actually executed or only parsed/planned, and whether the 'optimized version' is returned as a suggestion only. For a tool that accepts arbitrary SQL, that distinction matters.

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?

One front-loaded sentence with no filler; the core action and the deliverable come first. It is efficient, though it could have used a few more words to add routing guidance without bloat.

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 the return shape needn't be spelled out, and annotations carry the read-only signal. What remains missing is execution semantics and sibling differentiation, which for a query-analysis tool with ~10 close alternatives is enough to leave the definition only 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?

Schema coverage is 50%: the optional 'database' parameter is documented thoroughly in the schema, while 'sql' has no schema description at all. The description refers to 'a SQL query' but adds nothing about single vs. multiple statements, dialect expectations, or whether parameterized statements are allowed, so it does not compensate for the gap.

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 names a specific verb ('Analyze') and resource ('a SQL query') and adds concrete method detail (syntax anti-patterns, EXPLAIN plan costs, index scans) plus a concrete deliverable ('an optimized version'). It does not, however, distinguish itself from adjacent siblings such as explain_query, analyze_query_plan, why_is_this_slow, or run_advisors, so an agent cannot route between them from the text alone.

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

Usage Guidelines2/5

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

There is no when-to-use or when-not-to-use guidance and no mention of any alternative. Given the crowded sibling set of query-diagnosis tools (explain_query, analyze_query_plan, analyze_session_cost, recommend_indexes), the absence of routing guidance is a real gap.

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

pg_search_more_like_thisPG search more like thisA
Read-only

Find rows similar to a seed document via pdb.more_like_this + @@@. document_id is the value of key_field for the seed row. All nine documented pdb.more_like_this tuning args (fields jsonb, min_doc_frequency, max_doc_frequency, min_term_frequency, max_query_terms, min_word_length, max_word_length, boost_factor, stop_words) are optional kwargs — when omitted the wrapper does not mention them in the SQL so upstream's defaults apply. Returns the same {id, score} hit shape as pg_search_run. Requires the pg_search extension.

NameRequiredDescriptionDefault
limitYes
tableYes
fieldsNo
schemaYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.
key_fieldYes
stop_wordsNo
document_idYes
boost_factorNo
max_query_termsNo
max_word_lengthNo
min_word_lengthNo
max_doc_frequencyNo
min_doc_frequencyNo
min_term_frequencyNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered; the description adds genuinely new behavior: the pg_search extension dependency and the important detail that omitted tuning kwargs are dropped from the generated SQL so upstream defaults apply. It does not mention pagination or cost/limits on scanning a large table, which keeps it 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 core purpose, then seed-row semantics, then optional args, then return shape and prerequisite — a sensible order. It is dense with backticked identifiers and the nine-arg enumeration is long, but every clause carries information rather than filler.

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

Completeness4/5

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

For a 15-parameter tool with an output schema, the description covers the non-obvious required-parameter relationship (document_id ↔ key_field), the extension prerequisite, defaulting behavior, and return shape. Remaining gaps are limit behavior and schema/table selection conventions, which are largely self-evident from their names.

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 only 7% (just 'database'), so the description has to compensate and does so partially: it explains that document_id is the value of key_field for the seed row and enumerates the nine optional tuning args with their types. But it gives no meaning for limit, schema, table, key_field, or how each tuning knob changes results, leaving the majority of the 15 parameters semantically thin.

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: 'Find rows similar to a seed document', and pins the underlying mechanism (pdb.more_like_this + @@@). It also anchors itself against a sibling by noting the returned hit shape matches pg_search_run, so an agent can tell it apart from full-text/hybrid search 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 Guidelines3/5

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

The seed-document framing implies when the tool applies, and 'Requires the pg_search extension' gives a prerequisite. However, it never explicitly states when to choose this over pg_search_run or hybrid_bm25_vector_search, nor any exclusion or fallback path if the extension is absent.

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

pg_search_parse_queryPG search parse queryA
Read-only

Parse a query string through pdb.parse and return its canonical text form for debugging — useful for confirming the parser interpreted a phrase as expected. lenient=True relaxes syntax checking; conjunction_mode=True treats space-separated terms as AND-joined rather than OR-joined. Requires the pg_search extension.

NameRequiredDescriptionDefault
lenientNo
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.
query_stringYes
conjunction_modeNo

Output Schema

NameRequiredDescription
parsedYes

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already declare this is a safe read-only, closed-world operation, so the safety profile is covered. The description still adds real value by stating a hard prerequisite ('Requires the pg_search extension') and what the tool returns (canonical text), but it says nothing about failure behavior when the extension is absent or when lenient parsing still rejects input.

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 the effect and purpose, then the two flag semantics and the prerequisite. No filler, no restatement of the tool name.

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

Completeness4/5

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

With an output schema present, the description needn't detail return structure, and it still summarizes the return as canonical text. Combined with the extension prerequisite and flag semantics, an agent has enough to call it correctly; only error/absence handling is unaddressed.

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 only 25%, so the description must compensate and largely does: it explains that lenient relaxes syntax checking and that conjunction_mode switches space-separated terms from OR to AND. The database parameter is covered by its own schema description, leaving only the obvious query_string undocumented.

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?

States a specific verb and resource ('Parse a query string through pdb.parse and return its canonical text form') plus the debugging intent, which implicitly separates it from the search-executing siblings like pg_search_run and pg_search_more_like_this. It never names a sibling explicitly, so the differentiation is inferred rather than stated.

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 clause 'useful for confirming the parser interpreted a phrase as expected' gives a concrete debug-time use case. There is no explicit 'do not use this to run searches — use pg_search_run instead' routing statement, so an agent must infer the boundary from the sibling names.

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

pg_search_runPG search runA
Read-only

Run a BM25 keyword search against a pg_search-indexed table. Returns hits as {id, score, snippets} where id is the value of the caller-supplied key_field and score is pdb.score(t). columns=None searches the whole index; columns=["col"] restricts to a single text field. Multi-column search needs the pdb.parse per-field config JSON and is deferred to a follow-up phase. return_snippets=True requires snippet_field and projects pdb.snippets over that column. Requires the pg_search extension. SECURITY: snippet_start_tag / snippet_end_tag are not sanitized (they pass through to upstream as-is). The defaults match pg_search's HTML defaults; if callers forward untrusted values and a downstream consumer renders snippets as HTML, that's an XSS vector — output escaping is the renderer's responsibility.

NameRequiredDescriptionDefault
limitYes
queryYes
tableYes
schemaYes
columnsNo
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.
key_fieldYes
snippet_fieldNo
return_snippetsNo
snippet_end_tagNo</b>
snippet_start_tagNo<b>
snippet_max_num_charsNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered; the description adds real value beyond that with an unsanitized snippet-tag/XSS warning and the downstream-rendering responsibility note. It also discloses the extension dependency and the deferred multi-column phase, which are behavioral facts not present in any structured field.

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 is front-loaded in the first sentence, then return shape, then parameter scoping, then security. The security caveat is long but each clause adds an actionable fact (no sanitization, HTML default match, renderer's responsibility); only minor trimming is possible.

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 12-parameter search tool with an output schema, this covers the essentials: return shape, scoring source, column scoping, snippet wiring, extension prerequisite, and the security caveat. Gaps remain around limit behavior and result ordering, but nothing that would cause a wrong 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 only 8%, so the description carries most of the burden; it does explain the trickiest parameters well (columns semantics, return_snippets requiring snippet_field, key_field determining the returned id, snippet tag defaults). It is silent on limit, query syntax, and table/schema semantics, leaving several of the 12 parameters under-described.

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?

Names a specific verb and resource: 'Run a BM25 keyword search against a pg_search-indexed table.' This distinguishes it from siblings such as full_text_search, fuzzy_search, hybrid_bm25_vector_search, and pg_search_more_like_this, since BM25 scoring over a pg_search index is a precise scope an agent can match.

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

Usage Guidelines3/5

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

The description gives useful preconditions ('Requires the pg_search extension') and a scoping rule ('columns=None searches the whole index'), plus an explicit exclusion that multi-column search is not yet supported. It stops short of routing guidance: nothing says when to prefer this over full_text_search, hybrid_bm25_vector_search, or pg_search_more_like_this.

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

read_autovacuum_priorityRead autovacuum priorityA
Read-only

Return the tables most urgently needing autovacuum, ranked by how close their dead-tuple count is to the per-table autovacuum threshold (autovacuum_vacuum_threshold + autovacuum_vacuum_scale_factor * reltuples, honouring per-table reloptions overrides). Each row carries priority ('overdue' if past the threshold, 'watchlist' if within 50%, 'borderline' otherwise) plus the inputs (n_dead_tup, vacuum_threshold, last_autovacuum, autovacuum_enabled) so the agent can explain why a table landed on the shortlist. Top-level overdue_count lets an agent branch without walking the list. Read-only catalog query.

Example: read_autovacuum_priority(limit=25)

NameRequiredDescriptionDefault
limitNo
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
rowsYes
detailYes
availableYes
overdue_countYes
watchlist_countYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already carry readOnlyHint=true and openWorldHint=false, and the description adds real behavioral substance beyond that: the exact threshold formula, that per-table reloptions overrides are honoured, and the concrete cutoffs defining 'overdue'/'watchlist'/'borderline'. The sentence 'Read-only catalog query' is redundant with the annotations but does not contradict them.

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 ranking rule, then the row shape, then the top-level field, then a concrete example — a sensible order with little wasted text. The trailing 'Read-only catalog query' repeats what readOnlyHint already declares, a minor redundancy in an otherwise dense and useful block.

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?

Despite the output schema existing, the description still names the key returned fields and the branchable overdue_count, and it fully documents the ranking logic and bucket definitions. For a two-parameter read-only ranking tool, nothing an agent needs to call or interpret it 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?

Schema coverage is only 50%: 'database' is well documented in the schema, but 'limit' has no description at all. The description implies top-N selection and shows limit=25 in the example, yet never states what limit caps or how ranking interacts with truncation, so it only partially compensates for the 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 ('Return the tables most urgently needing autovacuum') plus the ranking criterion, which is far more precise than the title alone. An agent can distinguish this shortlist/prioritization tool from siblings like analyze_table_bloat or check_database_health 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 Guidelines4/5

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

Gives clear operating context: the priority buckets tell the agent what each row means, the included inputs exist 'so the agent can explain why', and 'overdue_count' lets it branch without walking the list. It stops short of naming alternative tools or stating when NOT to call it, so it misses the top band.

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

read_migration_historyRead migration historyA
Read-only

Query and summarize historical migrations applied to the database by popular migration frameworks (Alembic, Flyway, Diesel, Django, Prisma, Golang Migrate, Goose, Sequelize). Allows filtering by schema. Returns an object with one optional list per detected framework: alembic, flyway, diesel, django, prisma, golang_migrate, goose, sequelize. Each entry is null when the framework's table isn't present; otherwise it carries the framework-specific row shape (e.g. alembic has {version_num}; flyway has {installed_rank, version, description, type, ...}).

NameRequiredDescriptionDefault
schemaNo
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
gooseNo
dieselNo
djangoNo
flywayNo
prismaNo
alembicNo
sequelizeNo
golang_migrateNo

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered; the description adds genuine behavioral context by explaining the detection model (per-framework lists, null when the framework's table isn't present) and giving example row shapes. It stops short of mentioning cost, edge cases like permission-restricted framework tables, or behavior on unreachable databases.

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 action and scope, followed by return-shape detail. The framework enumeration and row-shape examples are somewhat verbose given an output schema exists, but they are informative rather than 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?

With only two optional parameters and an output schema, the description covers what the tool does and what it returns, but leaves the `schema` parameter's semantics ambiguous and offers no guidance on framework detection failure or empty results. Adequate but with a visible gap on the one undocumented parameter.

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 only 50%: the `database` parameter is well documented in the schema, but `schema` has no schema-level description. The description partly compensates by saying 'Allows filtering by schema', yet it does not clarify default scope (all schemas?), naming conventions, or how an invalid schema is handled, so the gap is only half bridged.

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 — 'Query and summarize historical migrations applied to the database' — and enumerates the frameworks it detects (Alembic, Flyway, Django, Prisma, etc.), which no sibling tool does. An agent can immediately tell this apart from schema-generation siblings like generate_prisma_schema or general introspection tools like list_tables.

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

Usage Guidelines3/5

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

The description implies the use case (inspecting already-applied migrations across frameworks) and notes schema filtering, but never states when to prefer this over alternatives such as generate_prisma_schema/generate_drizzle_schema or when it is not appropriate. Usage is inferable but not guided.

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

read_pg_buffercache_relationsRead PG buffercache relationsA
Read-only

Read the list of database relations taking up the most space in the PostgreSQL shared buffer cache. Reports buffered size, percentage of shared buffers, percent of relation buffered, average usage count, and dirty pages. Allows filtering by schema. Requires the pg_buffercache extension. If not installed, returns available=false.

NameRequiredDescriptionDefault
limitNo
schemaNo
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
availableYes
relationsYes

TDQS

A3.7/5.0
Behavior4/5

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

Beyond readOnlyHint=true and openWorldHint=false, the description discloses the extension dependency and the graceful degradation path ('If not installed, returns available=false'), which is exactly the kind of failure behavior an agent needs. It adds no detail on row limits or cost of the scan, so it is strong but not complete.

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?

Four short sentences, front-loaded with the purpose, then outputs, then filter, then prerequisite and failure mode. No filler, though the list of reported metrics is slightly dense and the ordering of the extension note could be earlier since it gates success.

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

Completeness4/5

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

With an output schema present, the description needn't spell out return shapes, yet it still names the key columns and the available=false fallback. The only real gap is the semantics of the limit parameter, which is left ambiguous for a read tool with a default row cap.

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?

Only the database parameter is documented in the schema (coverage 33%). The description compensates for the 'schema' parameter by stating it filters by schema, but says nothing about 'limit' (default 100) — whether it caps rows returned or the number of relations ranked. Partial compensation justifies the baseline 3.

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 ('Read the list of database relations taking up the most space in the PostgreSQL shared buffer cache') and enumerates the returned metrics, so the agent knows exactly what it gets. It does not explicitly contrast itself with the close sibling read_pg_buffercache_summary, which keeps it below a 5.

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

Usage Guidelines3/5

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

It gives an important prerequisite ('Requires the pg_buffercache extension') and states the schema filter is optional, which helps decide whether the call will succeed. However, there is no explicit when-to-use guidance or pointer to alternatives such as read_pg_buffercache_summary when an aggregate view is wanted.

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

read_pg_buffercache_summaryRead PG buffercache summaryA
Read-only

Read a high-level summary of the PostgreSQL shared buffer cache usage. Reports total buffers, free/used buffers, dirty buffers, and average usage count. Requires the pg_buffercache extension. If not installed, returns available=false.

NameRequiredDescriptionDefault
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
availableYes
free_buffersNo
used_buffersNo
dirty_buffersNo
total_buffersNo
average_usage_countNo

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already establish readOnlyHint=true and openWorldHint=false, so safety is covered. Beyond that, the description adds real behavioral content: the pg_buffercache extension prerequisite and the graceful-degradation contract ('returns available=false' when absent), which an agent cannot learn from the schema or annotations. It stops short of describing buffer units (pages vs bytes) or what 'average usage count' means operationally.

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?

Three short sentences, front-loaded with what the tool returns, then the prerequisite, then the failure mode. Every sentence carries information an agent needs, and nothing is repeated from the title or schema.

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 single-optional-parameter read tool with an output schema and full annotation coverage, the definition is nearly complete: purpose, returned metrics, extension dependency, and degraded response are all covered. The only minor gaps are metric units/semantics for 'usage count' and no explicit pointer to the relations-level sibling for drill-down.

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 optional parameter and schema description coverage is 100%, with the schema already explaining that it targets a configured read-only secondary database and that non-id names are rejected. The description adds nothing about the database parameter, so it sits at the baseline for fully documented schemas.

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?

Specific verb ('Read') plus resource ('PostgreSQL shared buffer cache usage') and scope qualifier ('high-level summary'), and it enumerates the reported metrics (total, free/used, dirty, average usage count). It implicitly contrasts with the per-relation sibling read_pg_buffercache_relations via 'high-level summary', but never names that sibling, so differentiation relies on inference.

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: 'high-level summary' suggests this is the aggregate view rather than the per-relation view, and the extension prerequisite is stated as a precondition. There is no explicit 'use this instead of X' routing to read_pg_buffercache_relations, no when-not guidance, and no tie-in to diagnostic workflows such as cache-hit troubleshooting.

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

read_pg_stat_ioRead PG stat IOA
Read-only

Read the pg_stat_io view (PostgreSQL 16+). Reports per (backend_type, object, context) cumulative I/O activity — reads, writes, extends, evictions, hits, fsyncs. Useful for spotting buffer-cache misses and write amplification. On PostgreSQL 14 / 15 the view doesn't exist, so the tool returns available=false and an empty list.

NameRequiredDescriptionDefault
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
rowsYes
availableYes
server_versionYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description still adds real behavioral context beyond them: the counters are cumulative, and on unsupported server versions the tool degrades gracefully to available=false plus an empty list rather than erroring — important for interpreting results. It does not discuss reset behavior of cumulative counters or row volume, which keeps it short of a 5.

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

Conciseness5/5

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

Three sentences, front-loaded with the resource and version, then the payload, then the failure mode. No filler and no repetition of the title.

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

Completeness4/5

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

With an output schema present, return values needn't be explained, and the version caveat covers the main failure path. Only the database/secondary-targeting behavior is left entirely to the schema, a minor gap for a single-parameter read tool.

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 optional parameter (database) with 100% schema description coverage, including the constraint that non-configured names are rejected. The description contributes nothing about targeting a secondary database, so the schema is doing all the work; 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 the exact resource (the pg_stat_io view, PostgreSQL 16+) and specifies the grouping granularity (backend_type, object, context) plus the metrics reported (reads, writes, extends, evictions, hits, fsyncs). This clearly separates it from nearby siblings like read_pg_buffercache_summary and read_pg_wal_stats without the agent needing to open 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 Guidelines4/5

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

It states the diagnostic use case — spotting buffer-cache misses and write amplification — and gives an explicit version exclusion: on PostgreSQL 14/15 the view doesn't exist and the tool returns available=false with an empty list. What's missing is routing guidance toward the alternative tools (buffercache summary, WAL stats, recommend_io_method) when this view is unavailable or when a different granularity is wanted.

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

read_pg_stat_lockRead PG stat lockA
Read-only

Return every row from PG 19's pg_stat_lock view (per-lock-type acquire / wait / wait-time counters since the most recent pg_stat_reset). Empty list on PG < 19 or when the view isn't present. Returns a list of objects with lock_type (relation / page / tuple / xid / virtualxid / advisory / ...), acquires, waits, and wait_time_us.

Example: read_pg_stat_lock()

NameRequiredDescriptionDefault
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered; the description goes further by disclosing the version-gated failure mode ('empty list on PG < 19 or when the view isn't present') and the reset-relative window of the counters. That is exactly the kind of context annotations cannot express. It stops short of noting privilege requirements or whether the counters are cluster-wide or per-database.

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 compact sentences plus a trivial example. Purpose is front-loaded, the version caveat and return shape follow, and every clause carries information an agent needs. No filler.

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

Completeness4/5

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

For a single-optional-param read tool with full annotation coverage and an output schema, this is nearly complete: it covers scope, version fallback, and counter semantics. Minor gap is scope granularity (whether results are per-database or server-wide) given the `database` parameter, but that is small.

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%, and the sole `database` parameter is fully documented in the schema including the configured-id restriction. The description adds nothing about that parameter, so the baseline 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?

States a specific verb and resource ('Return every row from PG 19's pg_stat_lock view') and pins down the data model: per-lock-type acquire/wait/wait-time counters. That counter-based, cumulative semantics implicitly separates it from the current-lock listing siblings (list_locks, find_blocking_chains), though it never names them explicitly.

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 prescribed: the 'since the most recent pg_stat_reset' phrasing tells an agent this is for cumulative lock statistics, not live contention. There is no explicit when-to-use vs. when-not, and no alternative named for troubleshooting active blocking, which is what list_locks and find_blocking_chains exist for.

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

read_pg_stat_recoveryRead PG stat recoveryA
Read-only

Return rows from PG 19's pg_stat_recovery view — replay progress, lag, and startup state for a standby. Empty list on PG < 19, when the view isn't present, or when the server isn't in recovery (a primary running standalone returns no rows). Returns a list of objects with replay_lsn, replay_lag_seconds, last_replayed_at, and startup_state (any of which may be null when not applicable).

Example: read_pg_stat_recovery()

NameRequiredDescriptionDefault
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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

With readOnlyHint/openWorldHint already declaring a safe local read, the description still adds real behavioral context: version gating (PG < 19), absence-of-view handling, and the empty-list-on-primary semantics. It also warns that individual fields may be null when not applicable, which is the kind of nuance an agent needs to avoid misreading results. It stops short of stating cost or pagination behavior.

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 view and purpose, then version/empty-result caveats, then a compact call example — no wasted framing. The enumeration of returned fields partly duplicates the existing output schema, which is the only redundancy.

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

Completeness5/5

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

For a zero-required-parameter read tool with an output schema and full annotation coverage, everything needed to call it correctly and interpret an empty result is present. The database-targeting semantics live in the schema, and return values are formally described by the output schema.

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% and the single optional `database` parameter is fully documented in the schema (targeting a configured secondary read-only database). The description adds no meaning beyond that and never mentions the parameter, so 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?

States a specific verb and resource ('Return rows from PG 19's pg_stat_recovery view') and immediately scopes it to 'replay progress, lag, and startup state for a standby'. That scope separates it cleanly from siblings like read_pg_wal_stats, get_wal_archive_status, or get_logical_replication_status.

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

Usage Guidelines4/5

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

The description gives clear applicability conditions: it only has meaningful content on PG 19+, when the view exists, and when the server is in recovery, so a primary returns no rows. It does not name alternative tools for adjacent questions (e.g. list_replicas for topology, get_wal_archive_status for archiving), so routing among siblings 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.

read_pg_wal_recordsRead PG WAL recordsA
Read-only

Read Write-Ahead Log (WAL) records information over a specified LSN range. Requires the pg_walinspect extension. If not installed, returns available=false.

NameRequiredDescriptionDefault
limitNo
end_lsnNo
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.
start_lsnYes

Output Schema

NameRequiredDescription
recordsYes
availableYes

TDQS

A3.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds genuinely extra behavior: the dependency on the pg_walinspect extension and the graceful degradation to an available=false response when it is absent, which is exactly the kind of thing an agent needs to interpret a result.

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, front-loaded with the operation and scope, followed by the prerequisite and failure mode. No filler and nothing wasted.

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 values need not be described, and the extension caveat is valuable. However, for a four-parameter tool with 25% schema coverage, the missing LSN format and limit semantics leave the agent under-informed about how to construct a valid call.

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 only 25% — only the database parameter carries prose. The description mentions an LSN range but gives no LSN syntax or format guidance for start_lsn/end_lsn, and says nothing about limit (default 100) or how the range interacts with it. With low coverage the description should compensate and does not.

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 uses a specific verb (Read) plus a specific resource (Write-Ahead Log records) and states the scope (a specified LSN range), which is much clearer than a tautology. It does not, however, distinguish itself from nearby siblings such as read_pg_wal_stats, get_wal_archive_status, or get_current_wal_lsn, so an agent must infer the boundary.

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 prerequisite (pg_walinspect extension) and the fallback behavior (available=false) are useful context, but there is no explicit when-to-use or when-not-to-use guidance relative to the other WAL and stats tools. Usage is only implied by the LSN-range phrasing.

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

read_pg_wal_statsRead PG WAL statsB
Read-only

Read Write-Ahead Log (WAL) record statistics over a specified LSN range, grouped by resource manager or record type. Requires the pg_walinspect extension. If not installed, returns available=false.

NameRequiredDescriptionDefault
end_lsnNo
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.
start_lsnYes
per_recordNo

Output Schema

NameRequiredDescription
statsYes
availableYes

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety and locality are covered. The description adds real value beyond them by disclosing the extension dependency and the 'available=false' degraded response, which an agent needs for error handling. It stops short of describing volume, cost, or what happens with a missing/invalid LSN.

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?

Three short sentences, each carrying distinct information: what is returned, the required extension, and the failure mode. Front-loaded with the purpose and free of filler.

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

Completeness4/5

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

An output schema exists, so return-value explanation is not needed, and annotations cover the safety profile. What remains missing is modest but real: LSN format guidance and default/omitted end_lsn semantics for a tool whose whole input revolves around an LSN range.

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 only 25% — only 'database' is documented in the schema — so the description needed to carry the parameter burden. It mentions an 'LSN range' and the grouping mode but never explains the LSN string format, what omitting end_lsn means (presumably up to current LSN), or how per_record maps to the stated grouping choices.

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?

States a specific verb and resource ('Read Write-Ahead Log (WAL) record statistics') plus the aggregation dimension (resource manager or record type). This implicitly separates it from the nearby read_pg_wal_records, though it never names that sibling explicitly.

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

Usage Guidelines3/5

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

Provides a prerequisite (pg_walinspect must be installed) and a fallback behavior, which effectively tells the agent when the tool will be useless. It does not state when to prefer this over read_pg_wal_records or get_wal_archive_status, nor any conditions that should exclude its use.

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

recommend_efficiency_thresholdsRecommend efficiency thresholdsA
Read-only

Compute corpus-percentile thresholds from accumulated mcpg_rag.efficiency_observations history. Phase E currently adapts three thresholds: baseline_recall_low (p10 of recall_baseline), ranking_degraded_spearman (p10 of spearman), and pruning_ineffective (p10 of pages_pruned_ratio_p50). The remaining four thresholds stay at their hardcoded defaults. Filters by days window + optional backend / metric / k so callers can ask 'what's normal for HNSW+cosine+k=10 in this deployment' vs 'what's normal globally'. Falls back to defaults (with derived_from_corpus=false) when the corpus is smaller than the minimum required. Returns an object with corpus_size, derived_from_corpus (bool), and the threshold fields (baseline_recall_low, baseline_recall_low_adapted, ranking_degraded_spearman, ranking_degraded_spearman_adapted, pruning_ineffective, pruning_ineffective_adapted, rerank_lift_flat_delta, rerank_lift_steep_low, rerank_lift_steep_high, and ranking_degraded_recall).

NameRequiredDescriptionDefault
kNo
daysNo
metricNo
backendNo
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
corpus_sizeYes
baseline_recall_lowYes
derived_from_corpusYes
pruning_ineffectiveYes
rerank_lift_steep_lowYes
rerank_lift_flat_deltaYes
rerank_lift_steep_highYes
ranking_degraded_recallYes
ranking_degraded_spearmanYes
baseline_recall_low_adaptedYes
pruning_ineffective_adaptedYes
ranking_degraded_spearman_adaptedYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, but the description adds substantial behavior: the fallback-to-defaults path is flagged via derived_from_corpus=false when the corpus is below a minimum, and it clarifies that only three of seven thresholds are actually adapted. The actual minimum corpus size is never stated, which is the one meaningful gap.

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?

Purpose and adaptation scope are front-loaded and earned, but the tail of the description enumerates ten return fields already covered by the existing output schema, which is redundant bulk. The heavy backtick styling and multi-clause sentences make it denser than necessary.

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?

Covers the computational model, filter scoping, degradation fallback, and adaptation scope for a moderately complex aggregating tool; return values are also spelled out despite an output schema existing. Missing only the minimum corpus-size requirement that determines the fallback.

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 only 20% (only database is documented in the schema), so the description must compensate, and it largely does: days is a time window, and backend/metric/k are scoping filters with a concrete example of their combined meaning. It does not explain k's semantics (top-k) or value ranges, leaving some inference.

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: compute corpus-percentile thresholds from efficiency_observations history. It names exactly which three thresholds are adapted (baseline_recall_low, ranking_degraded_spearman, pruning_ineffective) and that four remain hardcoded, which clearly separates it from sibling analysis tools like analyze_vector_search_efficiency or recommend_hnsw_ef_search.

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 usage context — slicing by days/backend/metric/k to answer 'what's normal for HNSW+cosine+k=10 in this deployment' versus globally — which tells an agent when to apply filters. It stops short of naming when NOT to call it or pointing to a specific sibling alternative.

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

recommend_headline_toolsRecommend headline toolsA
Read-only

Empirically curate describe_self's per-bucket headline_tools from the audit log. Reads mcpg_audit.events over the last lookback_days (default 7, capped at 90), groups successful calls by capability bucket, and reports the top-top_n (default 6) tools per bucket with newcomers (recommended but not in the hand-curated current list) and departures (currently headlined but not in the recommendation). The output is a REVIEWABLE recommendation, not an auto-applied override — operators decide whether to update mcpg.about.CAPABILITIES. Returns audit_table_present=False with a diagnostic when the audit subsystem is off. Returns an object with audit_table_present, lookback_days, top_n, events_examined, detail, and buckets (list of objects with bucket_id, current, recommended, newcomers, departures, call_counts).

Example: recommend_headline_tools(lookback_days=14, top_n=6)

NameRequiredDescriptionDefault
top_nNo
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.
lookback_daysNo

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?

Goes well beyond the readOnlyHint/openWorldHint annotations: names the source table, the default and hard cap on the lookback window (7, capped at 90), the non-mutating 'recommendation, not override' behavior, and the degraded `audit_table_present=False` path when the audit subsystem is disabled. That is exactly the failure-mode disclosure 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 core action and scope, and the constraint/behavior sentences follow logically. The sentence enumerating returned fields (`audit_table_present`, `lookback_days`, ...) partially duplicates the existing output schema and is the one part that does not fully earn its space.

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, non-trivial annotations, and a niche cross-cutting purpose, the description covers source of truth, aggregation logic, defaults, caps, degraded behavior, and the review workflow. An agent could decide correctly whether to call this and with what arguments from the description alone.

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 only 33% — `top_n` and `lookback_days` carry no schema descriptions — but the description compensates by giving defaults and the 90-day cap for `lookback_days` and by defining `top_n` as tools per bucket (default 6). The `database` parameter is already documented in the schema as targeting a configured read-only secondary, so remaining ambiguity is minimal.

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: curate `describe_self`'s per-bucket `headline_tools` from the audit log, derived from successful calls in `mcpg_audit.events`. It is clearly distinguishable from siblings like `describe_self` (which serves the list) and `list_audit_events` (which reads raw events) without opening any schema.

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 the operating context well: reads the last `lookback_days`, produces a reviewable recommendation rather than an applied override, and states who decides (operators updating `mcpg.about.CAPABILITIES`). It does not explicitly name which sibling to use instead when the audit subsystem is off or when the operator just wants raw events, so usage routing is clear but not fully exclusive.

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

recommend_index_dropsRecommend index dropsA
Read-only

Sibling of recommend_indexes for indexes to remove. Walks pg_stat_user_indexes + pg_stat_user_tables for existing indexes that look like pure cost — large on disk but never (or barely) scanned. Three reason codes, descending strength: never_used (no recorded idx_scans since the last stats reset — candidate for drop, but verify before removal), scan_no_fetch (planner picks it but it returns no rows — usually existence-check pattern), rarely_used (scan rate below low_scan_ratio of the table's total scan activity). Primary-key / unique / exclusion-constraint indexes are excluded (dropping those would be a schema change, not a performance win); indexes below min_index_size_bytes are skipped too. Returns a ready-to-run DROP INDEX CONCURRENTLY statement per candidate. Read-only advisor — execution is on the operator.

Example: recommend_index_drops(schema='public', min_index_size_bytes=1000000, low_scan_ratio=0.01)

NameRequiredDescriptionDefault
schemaNo
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.
low_scan_ratioNo
min_index_size_bytesNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, and the description goes well beyond that: it enumerates the three reason codes with their semantics and relative strength, explains that never_used is only a candidate requiring verification, discloses the constraint-index and size exclusions, and clarifies that it is an advisor that emits DDL text rather than executing it. That is exactly the extra behavioral context an agent needs before recommending a destructive statement.

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 and sibling distinction are front-loaded, and the reason codes are ordered by descending strength, which is good structure. It is dense with parentheticals and slightly long, but nearly every clause carries substantive information rather than restating the name.

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 advisor over statistics catalogs, the definition covers method, thresholds, exclusions, ranking of reasons, and output shape, and an output schema exists so return values need no further explanation. An agent has everything needed to call it and to interpret the results responsibly.

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 only 25% (only `database` is documented), so the description must compensate, and it largely does: low_scan_ratio is defined as a fraction of the table's total scan activity and min_index_size_bytes as a skip threshold. The `schema` parameter is only conveyed implicitly through the worked example rather than explained, which leaves one 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 (recommend indexes to drop) and immediately anchors it against the sibling recommend_indexes ('for indexes to remove'), so the add-vs-drop split is unambiguous. It further names the exact catalogs consulted (pg_stat_user_indexes, pg_stat_user_tables) and the output artifact (DROP INDEX CONCURRENTLY statements).

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 clear when-to-use framing: large-but-unscanned indexes that are pure cost, with explicit exclusions (primary-key/unique/exclusion-constraint indexes, indexes under min_index_size_bytes) that tell the agent what this tool will not surface. It does not reference adjacent candidates such as find_unused_objects or analyze_table_bloat, so a small amount of routing inference is left to the agent.

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

recommend_indexesRecommend indexesA
Read-only

Recommend tables that may benefit from indexing — large tables read mostly by sequential scan. Set fresh=true to bypass the cache and re-read live (e.g. after a schema change). Returns a list of objects with schema, table, live_tuples, sequential_scans, index_scans, and a reason explaining why the table is a candidate.

Example: recommend_indexes(min_live_tuples=10000)

NameRequiredDescriptionDefault
freshNo
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.
min_live_tuplesNo

Output Schema

NameRequiredDescription
resultYes

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 and openWorldHint=false, so the safety profile is covered. The description still adds real behavioral value by disclosing that results are cached by default and that `fresh=true` forces a live re-read — information found nowhere else in the structured data.

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?

Four short, front-loaded segments — purpose with criteria, a parameter tip, the return shape, and a call example — with no filler. Every sentence carries a distinct piece of information an agent would otherwise have to infer.

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 three-parameter read-only tool with no required arguments and an output schema present, this covers the essentials: what qualifies a table, cache behavior, and a usage example. Remaining gaps — what `min_live_tuples` means precisely and whether the recommendation accounts for existing indexes — are minor but non-trivial.

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 only 33%: only `database` has a schema description, so `fresh` and `min_live_tuples` rely on the description. The description explains `fresh` concretely (bypass cache, re-read live) and anchors `min_live_tuples` through a worked example, though it never defines the threshold semantics or the default of 10000 in prose.

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 names a specific verb and resource ('Recommend tables that may benefit from indexing') and defines the qualifying signal — large tables read mostly by sequential scan — so an agent knows exactly what comes back. It does not name the closest sibling, recommend_index_drops, or clarify that this is the additive counterpart to that drop-oriented tool.

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 context is implied through the candidate criteria (sequential-scan-heavy large tables) and the explicit case for `fresh=true` after a schema change. What is missing is routing guidance: nothing says when to pick this over recommend_index_drops, run_advisors, or optimize_query, which all overlap in the tuning workflow.

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

recommend_io_methodRecommend IO methodA
Read-only

Recommend a PG 19 io_method ('sync' / 'worker' / 'io_uring') for the current workload. Reads pg_stat_database aggregates (blks_read / blks_hit / stats_reset) and the current setting, then maps the workload signals to one of: high_concurrent_read_load (→ io_uring), bursty_io_with_cache_pressure (→ worker), low_io_pressure (→ sync), current_setting_optimal (no change), or insufficient_stats (window too short). Read-only — never invokes ALTER SYSTEM; emits a ready_to_run_sql snippet the operator can paste when the recommendation differs from the current setting. Returns an object with available (bool), server_version_num, detail, and recommendations — a list of objects with recommended_method, reason, current_method, cache_miss_ratio, reads_per_second, stats_window_seconds, and ready_to_run_sql (null when no change suggested).

Example: recommend_io_method()

NameRequiredDescriptionDefault
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
detailYes
availableYes
recommendationsYes
server_version_numYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, and the description reinforces this by stating it never invokes ALTER SYSTEM and only emits a pasteable ready_to_run_sql snippet. It also discloses the insufficient-stats failure mode and the cache-miss/read-rate signals used. It does not discuss permissions or cost of reading the stats views.

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?

Front-loaded with the purpose, then the data sources, then the enumerated outcome labels, then the side-effect guarantee and return shape. Dense but every clause carries decision-relevant information; the trailing example call is the only filler.

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

Completeness4/5

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

With an output schema present and 100% schema coverage, the definition covers what an agent needs: scope, inputs, decision outputs, and no-write guarantee. The only omission is how the optional `database` target interacts with secondary/read-only databases in terms of stats availability.

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 `database` parameter is documented at 100% coverage in the schema, including its list_databases id constraint, and the description adds nothing about it (it only shows a zero-arg example call). Baseline 3 applies when the schema carries the parameter semantics.

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 ('Recommend a PG 19 io_method') and enumerates the exact candidate values and the signal-to-outcome mapping the tool produces. An agent can distinguish it from recommend_postgres_conf, inspect_guc, or get_aio_status without opening schemas, since this one is scoped to io_method selection.

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 clear context for use: it reads pg_stat_database aggregates plus the current setting and requires an adequate stats window (with 'insufficient_stats' handled explicitly). It does not explicitly name alternative tools or say when to prefer them, so it stops short of full when/when-not guidance.

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

recommend_ivfflat_probesRecommend IVFFlat probesA
Read-only

Recommend an ivfflat.probes value for a target recall@k — the IVFFlat analogue of recommend_hnsw_ef_search. Samples sample_queries rows (default 10) as query vectors, builds an exact brute-force top-k ground truth per query, sweeps probe_values (default 1/2/5/10/20/50) measuring mean recall@k and p50/p95 latency at each, and recommends the smallest value clearing target_recall (default 0.95). VERIFIES an IVFFlat index actually exists on the column (returns has_ivfflat_index=false with guidance otherwise — a sweep without one just measures sequential scans). The query row is excluded from its own results. Requires the vector extension. Returns an object with available, has_ivfflat_index, index_name, metric, k, target_recall, sample_queries, recommended_probes (int or null), detail, and sweep (list of objects with probes, mean_recall_at_k, p50_latency_ms, p95_latency_ms, meets_target).

Example: recommend_ivfflat_probes(schema='public', table='docs', column='embedding', k=10, target_recall=0.95)

NameRequiredDescriptionDefault
kNo
tableYes
columnYes
metricNol2
schemaYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.
target_recallNo
sample_queriesNo

Output Schema

NameRequiredDescription
kYes
sweepYes
detailNo
metricYes
availableYes
index_nameYes
target_recallYes
sample_queriesYes
has_ivfflat_indexYes
recommended_probesYes

TDQS

A4.3/5.0
Behavior5/5

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

Annotations only declare readOnlyHint and openWorldHint=false; the description goes well beyond by disclosing the entire measurement procedure (sampling rows, building exact brute-force ground truth, sweeping probe values, measuring mean recall@k and p50/p95 latency), a default sweep set, the default target recall, the smallest-value-that-clears-target selection rule, and the self-match exclusion caveat. These are behavioral traits an agent could not infer from annotations or schema, and they materially affect how results should be interpreted.

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 method, then verification, then caveats; the example call at the end aids invocation. The final enumeration of ten return fields is redundant given an output schema exists and is the one block that does not earn its space, keeping it from a 5.

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 an 8-parameter analysis tool with an output schema and only read-only annotations, the description covers mechanics, preconditions, defaults, and selection policy thoroughly. The dangling `probe_values` reference and the thin `metric` treatment are the notable holes; return values need not be explained since an output schema is present.

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 only 13% (essentially just `database`), so the description must compensate; it does supply defaults and meaning for `k`, `target_recall`, and `sample_queries`. However, it references a `probe_values` parameter with a default list that does not exist in the input schema, which could mislead an agent into passing an invalid argument, and it leaves `metric` semantics largely unexplained beyond appearing in the return object.

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?

Names a specific action (recommend an `ivfflat.probes` value), the exact resource (IVFFlat index probes for a target recall@k), and explicitly differentiates itself from the sibling `recommend_hnsw_ef_search` by calling itself 'the IVFFlat analogue'. An agent can distinguish it from `tune_vector_index`, `vector_recall_at_k`, and `analyze_hnsw_recall` without opening any schema.

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 clear preconditions and context: an IVFFlat index must exist (it verifies and returns `has_ivfflat_index=false` otherwise, explaining why a sweep without one is meaningless), and the vector extension is required. It routes to the HNSW counterpart by analogy, but does not explicitly state when-not to use it (e.g., versus `tune_vector_index` or `analyze_vector_search_efficiency`), so it falls short of full alternative routing.

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

recommend_pg_search_maintenanceRecommend PG search maintenanceA
Read-only

Walk every pg_search BM25 index and emit advisor findings. Rules currently surfaced: missing_key_field (CRITICAL — the key_field reloption is required by upstream; an index without it can't satisfy queries) and no_field_configs (WARNING — none of the six *_fields reloptions are set, so the index falls back to default tokenization for every indexed column). Each finding carries a ready-to-run suggested_action SQL statement. Returns an empty list when the extension is not installed. Also feeds the pg_search BM25 Indexes category in audit_database.

NameRequiredDescriptionDefault
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already establish readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds substantive behavior beyond that: the enumerated rules with their severities and rationale, the fact that each finding includes a ready-to-run suggested_action SQL statement, and the edge case that an empty list is returned when the extension is absent. That is meaningful disclosure for a read-only advisor.

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 action, then structured parenthetical rule explanations, then return behavior and cross-reference. Dense but every clause carries information; a minor trim of the verbose severity explanations would help but nothing is truly wasteful.

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

Completeness4/5

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

With an output schema present, the description needn't explain the return shape, yet it still discloses the finding structure and the empty-list case. Combined with the rule catalog, an agent has enough to call and interpret this correctly; only explicit alternative-comparison guidance 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?

Schema description coverage is 100% and the single database parameter is already fully documented in the schema (optional, list_databases ids only, secondaries rejected). The description adds nothing about the parameter, 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?

Opens with a specific verb and resource: 'Walk every pg_search BM25 index and emit advisor findings,' which is unmistakably distinct from siblings like recommend_turboquant_maintenance or recommend_hnsw_ef_search. Naming the exact rule identifiers (missing_key_field, no_field_configs) makes the scope concrete rather than generic.

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 by the resource-specific phrasing and by the note that it feeds the 'pg_search BM25 Indexes' category in audit_database, which hints at a relationship to that sibling. However, there is no explicit when-to-use/when-not-to-use guidance, no mention of prerequisites such as the extension needing to be installed beyond the empty-list behavior, and no pointer to an alternative tool.

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

recommend_postgres_confRecommend Postgres confA
Read-only

Compute pgtune-style postgresql.conf recommendations. Pure calculator — touches no database. Given total_ram_mb (required), cpu_count (default 4), workload (one of web/oltp/dw/desktop/mixed, default mixed), storage (one of ssd/hdd/san, default ssd), and an optional max_connections override, returns recommended values for shared_buffers, effective_cache_size, work_mem, maintenance_work_mem, wal_buffers, min_wal_size/max_wal_size, checkpoint_completion_target, default_statistics_target, random_page_cost, effective_io_concurrency, and the parallel-worker knobs. Memory fields are postgres-ready strings; settings is the same data as a flat {guc: value} dict for direct rendering. Pair with audit_settings (audit first, then size).

Example: recommend_postgres_conf(total_ram_mb=16384, cpu_count=8, workload='oltp', storage='ssd')

NameRequiredDescriptionDefault
storageNossd
workloadNomixed
cpu_countNo
total_ram_mbYes
max_connectionsNo

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?

Annotations set readOnlyHint=true and openWorldHint=false, and the description reinforces that it is a pure calculator with no database side effects. It also lists all output fields, providing full transparency without contradicting annotations.

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 description is informative and front-loaded with the main purpose, but the list of output fields is somewhat dense. The example adds clarity. Overall well-structured, though slightly verbose.

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

Completeness5/5

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

Given the tool's complexity, the description covers purpose, parameters, output, usage context (pairing), and provides an example. It is complete for an agent to understand and invoke correctly.

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?

Despite 0% schema description coverage, the description thoroughly explains each parameter: total_ram_mb is required, cpu_count defaults to 4, workload enum values, storage enum values, and optional max_connections override. This adds significant meaning beyond the schema's default values.

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 that the tool computes pgtune-style postgresql.conf recommendations, specifying it's a pure calculator that touches no database. It distinguishes itself from siblings by its calculator nature and mentions pairing with audit_settings.

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 explains that it's a read-only calculator safe to call anytime, and explicitly advises pairing with audit_settings (audit first, then size). It does not list when not to use it or alternatives, but the context is clear enough for usage guidance.

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

recommend_prewarm_targetsRecommend prewarm targetsA
Read-only

Recommend relations whose first-query latency would benefit from pg_prewarm. Inspects pg_stat_user_tables + pg_statio_user_tables to find high cold-miss-rate / seq_scan-dominant relations, and caps the cumulative cost at shared_buffers_budget_pct * shared_buffers so the recommendation never silently exceeds shared_buffers. The advisor is read-only — never invokes pg_prewarm itself. Returns an object with shared_buffers_blocks (configured shared_buffers in 8 KiB pages), budget_blocks (the cap), total_cost_blocks (sum of recommendations actually returned), and candidates — a list of objects with schema, relation, reason (seq_scan_dominant / high_cold_miss_rate / small_hot_relation_uncached / index_in_critical_path), prewarm_mode, estimated_buffer_cost, heap_blks_read, heap_blks_hit, cache_miss_ratio, and ready_to_run_sql.

Example: recommend_prewarm_targets(shared_buffers_budget_pct=60.0, limit=10)

NameRequiredDescriptionDefault
limitNo
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.
prewarm_modeNobuffer
min_heap_blks_readNo
shared_buffers_budget_pctNo

Output Schema

NameRequiredDescription
candidatesYes
budget_blocksYes
total_cost_blocksYes
shared_buffers_blocksYes

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already cover the read-only and closed-world profile, yet the description adds real value: it names the source tables inspected, the detection heuristics (seq_scan-dominant, high cold-miss-rate), and the key side-effect-free guarantee that the budget cap prevents recommendations from exceeding shared_buffers. It does not discuss cost of the scan itself or ordering guarantees of candidates, which keeps it short of a 5.

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

Conciseness4/5

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

One dense but front-loaded paragraph: purpose first, then methodology, then the return contract, then a usage example. The long enumeration of return fields is slightly redundant given an output schema exists, but every sentence otherwise earns its place.

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

Completeness3/5

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

The methodology and budget semantics are well covered and the output schema relieves the description of explaining return values. The gap is parameter behavior: three of five inputs, including the mode selector and the threshold that drives candidate selection, are undocumented anywhere, which is material for a tuning advisory tool.

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 coverage is only 20%, so the description carries most of the burden, but it only explains shared_buffers_budget_pct (via the cap formula) and limit (via the example). prewarm_mode (default 'buffer'), min_heap_blks_read, and the units/meaning of limit are left entirely undefined; only database is covered, and that is by the schema, not the description.

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

Purpose5/5

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

States a specific verb and resource ('Recommend relations whose first-query latency would benefit from pg_prewarm') and grounds it in concrete catalog tables. An agent can distinguish this advisory tool from siblings like list_prewarmed_relations or get_prewarm_extension_status without opening any schema.

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 via 'The advisor is read-only — never invokes pg_prewarm itself', which tells the agent this is a recommendation step and not an execution step. However, it never states when to prefer this over list_prewarmed_relations or get_prewarm_extension_status, nor any prerequisite such as having the extension installed, so the agent must infer the routing.

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

recommend_read_your_writesRecommend read your writesA
Read-only

Advise whether the caller should use WAIT FOR LSN for read-your-writes consistency. Combines server role (primary vs standby), replay lag, and PG version into a structured recommendation. Never raises. reason is one of primary_no_wait_needed, standby_no_lag, standby_lag_unknown, standby_with_lag, standby_pg18_or_older, unavailable. Returns an object with recommend_use (bool), reason, is_in_recovery, server_version_num, current_lag_bytes (int / null), and detail.

Example: recommend_read_your_writes()

NameRequiredDescriptionDefault
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
detailYes
reasonYes
recommend_useYes
is_in_recoveryYes
current_lag_bytesYes
server_version_numYes

TDQS

A4.3/5.0
Behavior4/5

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

The annotations already mark this as a safe read-only, closed-world operation. The description adds meaningful behavior beyond that: it combines server role, replay lag, and version; never raises; enumerates the possible `reason` values including `unavailable` and lag-unknown states; and lists the return object fields.

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

Conciseness5/5

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

The description is front-loaded with the core purpose, then compactly lists the inputs considered, failure behavior, reason codes, and return fields. The example call is brief and the entire definition is appropriately sized with no wasted wording.

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 that this is a low-risk advisory tool, annotations cover its safety profile, an output schema exists, and the description supplies the behavioral contract, reason codes, and non-raising behavior, nothing essential for correct invocation is missing. The description is complete relative to the tool's complexity.

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%, so the optional `database` parameter is already documented as a configured secondary database id. The description adds no further parameter semantics and does not mention the database targeting behavior, so the schema carries the burden and 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 decision-support verb and resource: advise whether the caller should use `WAIT FOR LSN` for read-your-writes consistency. It also differentiates this advisory tool from siblings such as `wait_for_lsn` by describing it as producing a structured recommendation rather than performing the wait.

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

Usage Guidelines4/5

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

The description clearly establishes the decision context: callers use it to decide whether to apply `WAIT FOR LSN` based on role, replay lag, and PG version. It does not explicitly name the alternative tool (`wait_for_lsn`) or give when-not conditions, but the intended usage is clear from the opening sentence.

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

recommend_redis_cache_targetsRecommend Redis cache targetsA
Read-only

Recommend tables that would benefit from a Redis cache layer. Inspects pg_stat_user_tables for read-heavy, low-write relations whose working set fits comfortably in Redis (default: read/write ratio ≥ 10, ≥ 1000 reads, ≤ 1M rows). When server is provided the generated ready_to_run_sql stub targets that server name; otherwise the stub uses a placeholder operators must substitute. Advisor is read-only — never touches Redis itself. Returns an object with server and candidates — a list of objects with schema, table, reads, writes, read_write_ratio, estimated_row_count, reason (read_only_lookup_table / small_hot_relation / read_heavy_low_write / moderate_read_dominant), and ready_to_run_sql (a CREATE FOREIGN TABLE stub).

Example: recommend_redis_cache_targets(server='redis_primary', limit=10)

NameRequiredDescriptionDefault
limitNo
serverNo
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.
max_rowsNo
min_reads_per_dayNo
min_read_write_ratioNo

Output Schema

NameRequiredDescription
serverYes
candidatesYes

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, and the description reinforces this with 'Advisor is read-only — never touches Redis itself', so there is no contradiction. It goes further by disclosing the data source (pg_stat_user_tables), the default thresholds, and the important operational caveat that the returned SQL stub uses a placeholder unless `server` is supplied.

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 and criteria, then the server caveat, then return shape, then a concrete example — a sensible order. The long enumeration of every candidate field and reason enum is partly wasted since an output schema exists, which is the main thing keeping this from a 5.

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?

Six optional parameters, an output schema, and annotations are all in place, and the description covers the ranking criteria, the stub-generation caveat, and the return shape adequately. The remaining hole is `limit` — nothing anywhere tells an agent what it caps or how results are ordered before truncation.

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 only 17% (only `database` is documented), so the description must compensate, and it partly does: it explains `server`'s effect on the generated stub and gives human-readable meaning for the three threshold parameters (ratio ≥ 10, ≥ 1000 reads, ≤ 1M rows). However, `limit` is never explained anywhere, and the thresholds are stated as fixed defaults rather than as tunable knobs, leaving real gaps.

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 ('Recommend tables that would benefit from a Redis cache layer') and immediately narrows the target population with concrete criteria (read-heavy, low-write, working set fits in Redis). This distinguishes it clearly from near-siblings like recommend_prewarm_targets, recommend_indexes, and list_redis_foreign_servers.

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 a clear condition for use — relations that are read-heavy with a low write volume and a small working set — plus the effect of supplying versus omitting `server`. It does not explicitly name an alternative tool (e.g. recommend_indexes for query-level tuning) or state when *not* to use this advisor, so it falls short of full when/when-not routing.

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

recommend_redistributeRecommend redistributeA
Read-only

Distribution-skew advisor for a hash-distributed table. Reads pg_stats.n_distinct for every column on the table and suggests a better hash key when the current one is low-cardinality. Pure catalog read — no per-segment scans. Returns ranked candidates, optional recommendation, and ready-to-review suggested_ddl (ALTER TABLE … SET WITH (REORGANIZE=TRUE) DISTRIBUTED BY (col)). Diagnosis-only — never executes. On vanilla PG returns available=false.

Example: recommend_redistribute(schema='public', table='fact_sales')

NameRequiredDescriptionDefault
tableYes
schemaYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
tableYes
detailYes
schemaYes
availableYes
candidatesYes
suggested_ddlYes
current_methodYes
recommendationYes
current_columnsYes

TDQS

A4.2/5.0
Behavior4/5

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

Beyond readOnlyHint, the description discloses that it reads only pg_stats and does no per-segment scans, that it is diagnosis-only and never executes, and that it degrades to available=false on vanilla PG. The suggested_ddl is flagged as "ready-to-review," which correctly signals it is output, not execution. Missing only details like whether it requires MPP server type detection or cost of reading wide tables.

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 mechanism, safety profile, return shape, and a usage example — each sentence carries information. The level of density is high but appropriate for a multi-output advisor; nothing is filler beyond the somewhat redundant restatement of return fields that the output schema already covers.

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 advisor with an output schema, the description covers mechanism, safety, failure mode, and output shape, which is more than enough to call it correctly. The one remaining gap — the optional database targeting a secondary — is documented in the schema itself.

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 only 33% — the database parameter is the sole one documented in the schema. The description compensates partly by giving a concrete call example with schema and table, and by implying table must be hash-distributed, but it never explains the database parameter's targeting of a read-only secondary, nor any validation of schema/table 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?

"Distribution-skew advisor for a hash-distributed table" names a specific analysis verb and resource, and the follow-on sentences state the exact mechanism (pg_stats.n_distinct per column) and outcome (suggest a better hash key). It is clearly distinguishable from catalog-listing siblings such as list_distribution_policies or describe_table.

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 trigger condition is explicit: use it when the current hash key is low-cardinality, and the note that vanilla PG returns available=false tells the agent when the call will be a no-op. It stops short of naming sibling alternatives (e.g. list_distribution_policies) or saying what to do when available=false.

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

recommend_rerank_strategyRecommend rerank strategyA
Read-only

Roll-up advisor over the four analytics for one window. Returns a single headline summary + the full list of findings. Built from whichever combination of reranker_idle / topk_stable / score_clustering / rerank_hurts_ndcg / rerank_lifts_ndcg fires. Also feeds the RAG Reranker Pipeline category in audit_database. Reads from mcpg_rag.rerank_events.

NameRequiredDescriptionDefault
daysNo
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.
retrieval_indexNo

Output Schema

NameRequiredDescription
summaryYes
findingsYes
window_daysYes
retrieval_indexYes

TDQS

A3.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds real behavioral context beyond that: it names the backing table (mcpg_rag.rerank_events) and discloses a side effect outside the tool itself — that its output feeds the 'RAG Reranker Pipeline' category in audit_database. It does not mention cost, latency, or minimum data requirements for findings to fire.

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 intent and return shape are front-loaded in the first sentence, and the remaining sentences add source and integration detail without filler. The middle enumeration of five backticked finding keys is dense but informative rather than redundant. Slightly tighter phrasing would improve scanability.

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 the return shape needn't be spelled out, and the description still communicates the headline-plus-findings structure and data source. The main gap is parameter coverage: two of three inputs have no explanation anywhere, and no guidance distinguishes this roll-up from the four sibling analysis tools. Adequate, but not complete for a multi-signal advisor.

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?

Only the 'database' parameter is documented in the schema, leaving 'days' and 'retrieval_index' undescribed at 33% coverage. The description's phrase 'for one window' gives a weak hint that 'days' defines the analysis window, but it says nothing about what 'retrieval_index' scopes or how findings are filtered by it. With coverage this low, the description should compensate more than it does.

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 gives a specific verb and resource: a 'roll-up advisor over the four analytics for one window' that returns a headline summary plus findings. It enumerates the exact finding keys (reranker_idle, topk_stable, score_clustering, rerank_hurts_ndcg, rerank_lifts_ndcg), so the agent knows the output vocabulary. It stops short of naming the sibling analyze_* tools it aggregates, so the boundary is implied rather than stated.

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 by the phrase 'roll-up advisor over the four analytics,' which suggests this is the aggregate entry point rather than a single-metric analysis. There is no explicit instruction such as 'use this instead of analyze_reranker_lift when you want all reranker signals at once,' and no stated prerequisites for the call. An agent can infer the intent, but must make the choice unaided.

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

recommend_skip_scan_indexesRecommend skip scan indexesA
Read-only

Find composite B-tree indexes whose leading column has low NDV — these are the ones PG 19's skip-scan optimisation unlocks. Each candidate's trailing columns can now be served by the composite index alone, so any dedicated single-column indexes on those trailing columns become review candidates for recommend_index_drops. Returns an empty list on PG ≤ 18 or driver failure — pair with get_skip_scan_status for the diagnostic. max_leading_ndv (default 1000) caps the leading-column NDV that's considered low enough for skip-scan to be profitable. Returns a list of objects with schema, table, index_name, leading_column, trailing_columns (list of strings), estimated_leading_ndv (int), and rationale (human-readable explanation).

Example: recommend_skip_scan_indexes()

NameRequiredDescriptionDefault
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.
max_leading_ndvNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds genuinely new behavior: a PG 19 version dependency, an empty-list return on driver failure (rather than an error), and the default-cap semantics — these are the kinds of traits annotations cannot express.

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 definition, then version caveat, then parameter meaning, then return shape — a sensible ordering. The trailing `Example: recommend_skip_scan_indexes()` line carries zero information and is dead weight in an otherwise dense paragraph.

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 the definition, version prerequisites, failure behavior, follow-up tool, parameter default, and the return fields even though an output schema exists. For a two-parameter read-only advisory tool, nothing an agent needs in order to call it or interpret an empty result 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 50%: `database` is documented in the schema but `max_leading_ndv` has no description there. The description fills that gap by defining it as the NDV cap below which skip-scan is considered profitable, plus its default of 1000, which is exactly the compensating detail 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?

States a specific verb and resource — find composite B-tree indexes whose leading column has low NDV — and anchors it to the PG 19 skip-scan feature. It also names the sibling it feeds into (`recommend_index_drops`), so an agent can place it in the index-recommendation family 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 Guidelines4/5

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

Gives concrete selection conditions: the candidates are the trailing-column indexes that become redundant, and failure conditions (PG ≤ 18, driver error) return an empty list with `get_skip_scan_status` as the diagnostic companion. It stops short of explicitly contrasting with `recommend_indexes`, but the use context is clear enough to act on.

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

recommend_turboquant_maintenanceRecommend TurboQuant maintenanceA
Read-only

Walk every pg_turboquant index and emit advisor findings. Rules currently surfaced: prerequisites_unmet (CRITICAL — pgvector is missing) and delta_tier_large (WARNING — upstream's own delta_health.merge_recommended=true advisory, emits a tq_maintain_index suggested_action). Each finding carries a ready-to-run suggested_action SQL statement. Returns an empty list when the extension is not installed. Also feeds the pg_turboquant Indexes category in audit_database.

NameRequiredDescriptionDefault
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior4/5

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

Goes well beyond the readOnlyHint/openWorldHint annotations by disclosing the two rules currently surfaced, their severities, that each finding carries a ready-to-run suggested_action SQL, and the empty-list behavior when the extension is absent. A minor gap is that it does not say whether the walk is expensive or bounded on large index counts.

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 action, then layered detail on rules and return behavior; every sentence carries information. RST-style double-backtick literals add mild visual noise but not real bloat.

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 one-optional-parameter read-only advisor with annotations and an output schema, the description covers purpose, rule set, finding shape, and side-relationship to audit_database. Nothing critical is missing, though a pointer to where maintenance sits relative to query-knob tuning would close the last gap.

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% and the single 'database' parameter already documents the list_databases id targeting and the rejection of unconfigured names. The description adds nothing about the parameter, so baseline 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?

States a specific verb+resource: 'walk every pg_turboquant index and emit advisor findings', and enumerates the concrete rules produced. It is clearly distinguishable in substance from list_turboquant_indexes and get_turboquant_index_metadata, but it never explicitly names the adjacent recommend_turboquant_query_knobs or recommend_pg_search_maintenance to draw the line for the agent.

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 can infer this is the advisor-style check for TurboQuant indexes, and the note about returning an empty list when the extension is not installed functions as a soft precondition. There is no explicit when-to-use vs alternatives guidance and no when-not statement.

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

recommend_turboquant_query_knobsRecommend TurboQuant query knobsA
Read-only

Run tq_recommended_query_knobs — per-query knob advisor. Two modes: plain (just candidate_limit + optional final_limit) gives generic recommendations; index-aware (supply both index_schema and index_name, plus optional filter_selectivity) specialises the recommendations to the named index's catalog state. Returns probes, oversample_factor, max_visited_codes, max_visited_pages — pass these to turboquant_approx_candidates / turboquant_rerank_candidates. Requires pg_turboquant.

NameRequiredDescriptionDefault
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.
index_nameNo
final_limitNo
index_schemaNo
candidate_limitYes
filter_selectivityNo

Output Schema

NameRequiredDescription
probesYes
max_visited_codesYes
max_visited_pagesYes
oversample_factorYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered; the description adds a genuine prerequisite ("Requires pg_turboquant") and enumerates the concrete output knobs plus their intended destination tools, which is behavior beyond the annotations. No discussion of cost, latency, or what happens if the index has no catalog state, which is the main remaining gap.

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 function name and role, then mode rules, then return fields, then the prerequisite. Dense but every clause carries information. Minor deduction for reStructuredText double-backtick markup that adds noise rather than clarity for an agent reader.

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?

An output schema exists, so enumerating return fields is a bonus for chaining rather than a necessity. With six parameters, one required, and a prerequisite extension, the description covers everything an agent needs to construct a correct call. Only the optional database/secondary targeting path is not mentioned in prose.

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 only 17%, so the description must carry the load, and it largely does: it defines the mode-dependency between index_schema/index_name (must be supplied together), frames final_limit and filter_selectivity as optional modifiers, and explains that filter_selectivity specializes the recommendation. Only the database parameter goes undiscussed in the description text (though its schema field is documented) and the candidate_limit/final_limit relationship is unspecified.

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-query knob advisor wrapping tq_recommended_query_knobs) and immediately scopes it against the sibling families that recommend different knobs (hnsw ef_search, ivfflat probes, turboquant maintenance) by making clear this is per-query, not per-index-maintenance. It also names its downstream consumers, so an agent knows exactly where the output flows.

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 documents two modes and the exact parameter conditions that select each: plain mode takes candidate_limit + optional final_limit, index-aware mode requires BOTH index_schema and index_name. That is strong when-to-use guidance. It stops short of stating when to skip this tool entirely (e.g., prefer a static default when no index is known) or how it relates to recommend_ivfflat_probes-style siblings.

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

recommend_vector_quantizationRecommend vector quantizationA
Read-only

Scan a schema for vector(N) columns whose storage could be halved by switching to pgvector v0.7+'s halfvec(N) type (16-bit float). Returns one recommendation per qualifying column with current vs suggested bytes, the savings ratio, and a one-line rationale. Skips columns that are already non-vector and small tables where the absolute saving wouldn't justify the migration.

NameRequiredDescriptionDefault
schemaYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, and the description is consistent, adding advisory-only framing plus explicit skip rules for small tables. It also describes the shape of each recommendation (current vs suggested bytes, savings ratio, rationale), though some of that overlaps the output schema. It does not mention prerequisites such as pgvector version detection failures.

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?

Three tight sentences, front-loading the qualifying condition and the return shape before the skip rules. No redundant restatement of the title and no filler.

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

Completeness4/5

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

An output schema exists, so the description needn't detail return values, and it still covers the essential behavioral exclusion rules for a read-only advisory tool with two parameters. The remaining gap is operational: no pointer to `migrate_vector_to_halfvec` as the follow-up action or to `list_schemas` for valid `schema` values.

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 50%: the `database` parameter is well documented in the schema itself, while `schema` has no description. The description partially compensates by implying `schema` is the namespace to scan, but does not say whether it accepts a Postgres schema name, requires `list_schemas` first, or how multiple schemas are handled. Baseline 3 is appropriate given the schema carries half the weight.

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?

States a specific verb and resource: scan a schema for `vector(N)` columns convertible to `halfvec(N)`, and the output is one recommendation per qualifying column. This clearly separates it from listing/diagram tools in the sibling set. It does not explicitly name `migrate_vector_to_halfvec` as the action-taking counterpart, so the recommend-vs-migrate boundary is left to inference.

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?

Gives inclusion/exclusion criteria (skips non-`vector` columns and small tables where absolute savings don't justify migration), which implies when the tool is useful. However, it never states the positive trigger (e.g., 'run before planning a storage-reduction migration') nor points to `migrate_vector_to_halfvec` for actually applying the change, leaving the agent to infer the workflow.

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

retrieve_with_contextRetrieve with contextA
Read-only

Context-packed k-NN retrieval (a one-shot RAG building block). Runs a pgvector k-NN against schema.table.embedding_column for a caller-supplied query_vector (no embedding model needed), then expands each hit one hop along foreign keys and returns the hit row + its related parent / child records in one object. Parents (when include_parents, default true) are the rows a hit references via outbound FKs; children (when include_children, default true) are rows referencing the hit via inbound FKs, capped at max_related (default 5) per FK. Limitations: 1 hop only; inbound (child) expansion is same-schema only. The embedding column is dropped from every returned row. Requires the vector extension. Returns available, dimension, detail, and hits (each with distance, row, and related — a list of fk_name/direction/related_schema/related_table/rows).

Example: retrieve_with_context(schema='public', table='docs', embedding_column='embedding', query_vector=[0.1, 0.2, 0.3], k=5)

NameRequiredDescriptionDefault
kNo
tableYes
metricNol2
schemaYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.
max_relatedNo
query_vectorYes
include_parentsNo
embedding_columnYes
include_childrenNo

Output Schema

NameRequiredDescription
hitsYes
detailNo
availableYes
dimensionYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered; the description still adds real behavior: parents/children are on by default, child expansion is capped per FK by `max_related` (default 5), the embedding column is stripped from every returned row, and the vector extension is required. What is missing is any note on cost/performance of doing k-NN plus N+1 FK expansions, or error behavior when the extension is absent.

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 mechanism, then defaults, limitations, and return shape in a logical order, closing with a concrete call example. It is dense rather than padded, though the parenthetical default restatements and the return-shape sentence add length where the output schema already exists.

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 10-parameter tool with 10% schema coverage, the definition covers every decision an agent needs: what it retrieves, how expansion is bounded, what is stripped, and what environment must exist. Return values are described even though an output schema exists, which is redundant but not harmful.

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 only 10% (just `database`), so the description must carry the load and largely does: it defines `query_vector` as caller-supplied with no embedding model, explains `include_parents`/`include_children` semantics and defaults, and defines `max_related` as a per-FK cap. Gaps remain for `metric` (default l2) and `k` (only shown in the example), which are undocumented in both schema and prose.

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 mechanism and resource: a pgvector k-NN over `schema.table.embedding_column` for a caller-supplied vector, followed by one-hop FK expansion returning hit rows plus related parents/children. This is clearly distinguishable from sibling vector tools like `vector_search` or `cross_table_similarity`, which do not interleave relational expansion.

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: 'a one-shot RAG building block' with 'no embedding model needed' signals when to reach for it, and two hard limitations (1 hop only, child expansion same-schema only) are given. However, it never names an alternative (e.g. `vector_search` for plain ANN without joins, or `cross_table_similarity`) nor states when not to use this tool.

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

run_advisorsRun advisorsB
Read-only

Run a set of catalog-driven advisor rules against a schema and return the aggregated findings. Rules cover missing primary keys, unindexed foreign keys, duplicate indexes, and nullable timestamps without time zone. Advisory only — no writes.

NameRequiredDescriptionDefault
schemaYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
schemaYes
findingsYes
rules_runYes

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so 'Advisory only — no writes' largely restates what the agent already knows. The description does add that findings are aggregated and catalog-driven, but it says nothing about cost, how many rules run, or whether findings are ordered/severity-ranked.

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, zero filler: the action comes first, the covered rule set second, and the read-only guarantee last. Nothing is repeated and every clause carries information.

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

Completeness4/5

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

With an output schema present, return formatting needn't be explained, and the read-only profile is covered by annotations plus the closing sentence. The main residual gap is the ambiguity around the required 'schema' argument's identifier format.

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 coverage is only 50%: the optional 'database' parameter is well documented in the schema, but the required 'schema' parameter has no description there and the description only says 'against a schema' without clarifying whether it is a name, an OID, or a qualified identifier. The description therefore does not compensate for the undocumented required parameter.

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 gives a specific verb ('Run advisor rules') and resource ('against a schema') and enumerates the rule categories checked (missing primary keys, unindexed foreign keys, duplicate indexes, nullable timestamps without time zone). That makes it clearly distinct from generic siblings like audit_database or recommend_indexes, though it never names an alternative outright.

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: point it at a schema to get advisory findings. There is no explicit when-to-use versus neighbors such as recommend_indexes, find_unused_objects, or audit_database, and no stated prerequisites (e.g., whether the schema must exist or whether the catalog must be readable).

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

run_analytical_queryRun analytical queryA
Read-only

Run a read-only SELECT that may take longer than the standard limit — for genuine analytical work (large aggregations, multi-table joins, window functions, DISTINCT/GROUP BY over millions of rows). Validated by the same allowlist as run_select, but executed on a DEDICATED connection pool (isolated from the fast-path tools) with an elevated, bounded timeout. Prefer run_select for ordinary queries; reach for this only when a query legitimately needs more time. timeout_ms overrides the per-call budget (clamped to the server's configured maximum, MCPG_ANALYTICAL_MAX_TIMEOUT_MS); work_mem (e.g. '256MB') elevates sort/hash memory for this statement. Runs against the primary database. Returns an object with columns, rows, row_count, and truncated (true when more rows than max_rows were produced) — same shape as run_select.

Example: run_analytical_query(sql='SELECT c, count(*) FROM big GROUP BY c', timeout_ms=180000)

NameRequiredDescriptionDefault
sqlYes
max_rowsNo
work_memNo
timeout_msNo

Output Schema

NameRequiredDescription
rowsYes
columnsYes
row_countYes
truncatedYes

TDQS

A4.7/5.0
Behavior4/5

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

Adds context beyond annotations: dedicated connection pool, elevated timeout, primary database. Annotations already mark read-only.

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?

Concise, front-loaded purpose, efficient sentences covering all key aspects without redundancy.

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

Completeness5/5

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

Covers behavior, connection isolation, timeout behavior, return shape (known from output schema), and distinguishes from siblings.

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?

Describes timeout_ms clamping and work_mem usage. Example clarifies usage. Compensates for 0% 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?

Clearly states it runs read-only analytical SELECT queries requiring longer time, distinguishing from standard queries.

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 advises to prefer run_select for ordinary queries and use this only when more time is needed.

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

run_cypherRun CypherB
Read-only

Execute an openCypher query on a specific graph database. Supports read queries (MATCH) and write/modifying queries (CREATE, SET, DELETE, MERGE, REMOVE). Returns an object with columns (list of result column names) and rows (list of result rows as dicts keyed by column).

NameRequiredDescriptionDefault
graph_nameYes
cypher_queryYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior1/5

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

The description states support for write queries (CREATE, SET, DELETE, MERGE, REMOVE), which contradicts the annotation readOnlyHint=true. This is a serious inconsistency. Additionally, no details about permissions, side effects, or error handling are provided.

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 description is brief (two sentences) and front-loaded with the key purpose and supported queries. It could be slightly more structured but is efficient overall.

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

Completeness2/5

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

The tool has moderate complexity with a write operation and an output schema (though not shown). The description explains the return format but fails to address parameter details and the contradiction with annotations, leaving gaps for an agent to correctly invoke the tool.

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 coverage is 0%, so description must fully explain parameters. It only mentions 'on a specific graph database' for graph_name and lists allowed query types for cypher_query, lacking details on valid graph names, query syntax, or constraints.

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 executes an openCypher query on a specific graph database, listing supported query types (MATCH for read, CREATE/SET/DELETE/MERGE/REMOVE for write) and the return format (columns and rows). This distinguishes it from SQL-based siblings like run_select.

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 specifies the supported Cypher commands for read and write queries, giving clear usage context. However, it does not explicitly exclude alternatives or mention when to prefer a different tool (e.g., SQL queries).

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

run_pgqRun PGQA
Read-only

Execute a SQL/PGQ SELECT ... GRAPH_TABLE query and return the rows. The query must be a single SELECT (or WITH ... SELECT) statement that references GRAPH_TABLE — anything else is refused at the boundary (use run_select for non-graph reads). max_rows caps the result set; when the cap is hit, truncated=true. Requires PG 19+. Returns an object with columns (list of column names from the query's COLUMNS (...) clause), rows (list of dicts keyed by those columns), row_count, and truncated (bool).

Example: run_pgq(query="SELECT * FROM GRAPH_TABLE (org_chart MATCH (e:Employee)-[:REPORTS_TO]->(m:Manager) COLUMNS (e.name AS employee, m.name AS manager))", max_rows=50)

NameRequiredDescriptionDefault
queryYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.
max_rowsNo

Output Schema

NameRequiredDescription
rowsYes
columnsYes
row_countYes
truncatedYes

TDQS

A4.2/5.0
Behavior4/5

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

Beyond readOnlyHint/openWorldHint it discloses real behavior: boundary-level refusal of non-conforming statements, server version gating (PG 19+), and that `max_rows` produces a `truncated=true` signal rather than an error. The return-shape sentence partially duplicates the output schema, but the truncation and validation semantics are genuinely additive.

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?

Front-loaded with the core constraint and alternative in the first two sentences, then adds truncation, version requirement, return shape, and a single worked example. Dense but every sentence carries information an agent needs to call it correctly.

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?

An output schema exists so return values needn't be re-explained, and the description still covers validation, version gating, and truncation. The remaining gap is sibling routing against `run_cypher` and the secondary-database override, which matters for a tool with a `database` parameter.

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 only 33%: `query` and `max_rows` carry no schema descriptions, and only `database` does. The description compensates for `max_rows` (cap semantics plus truncation) and constrains `query` (must contain GRAPH_TABLE), but says nothing about the `database` targeting parameter or the 200-row default, so the gap is only partly closed.

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: execute a SQL/PGQ `SELECT ... GRAPH_TABLE` query and return rows. It immediately differentiates itself from the non-graph sibling by name (`run_select`), so an agent can route correctly 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 Guidelines4/5

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

Gives an explicit acceptance condition (must be a single `SELECT` or `WITH ... SELECT` referencing `GRAPH_TABLE`, anything else refused) and a named alternative (`run_select` for non-graph reads). It omits `run_cypher`, the other obvious graph-query sibling, and does not say when to prefer Cypher over PGQ.

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

run_selectRun SELECTB
Read-only

Validate and run a read-only SQL query. Writes, DDL, and other unsafe statements are rejected before execution.

Example: run_select(sql='SELECT id, email FROM users LIMIT 10', max_rows=1000)

NameRequiredDescriptionDefault
sqlYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.
max_rowsNo

Output Schema

NameRequiredDescription
rowsYes
columnsYes
row_countYes
truncatedYes

TDQS

B3.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, but the description still adds real behavior: unsafe statements are validated and rejected *before execution*, which tells the agent it can safely attempt a statement and expect a refusal rather than a partial write. What it omits is what happens when the result exceeds max_rows (truncation vs. error) and whether it targets only the primary database by default, though the latter is covered in the 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?

Two short sentences plus one example, with the core action and safety guarantee front-loaded. The example earns its place by demonstrating the untyped `sql` and `max_rows` usage, though its syntax is largely self-evident to an agent already reading the 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?

The return format is covered by the output schema, so the description needn't explain results, and safety behavior is well covered. The gaps are the semantics of max_rows (truncation behavior) and any routing guidance against the tuned/parallel variants, which matter for a moderately complex query-execution tool in a crowded sibling set.

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 only 33%: the `database` parameter is documented in the schema, but `sql` and `max_rows` have no schema descriptions. The example partially compensates by showing a realistic sql string and max_rows=1000, implying max_rows is a row cap, but it never states whether exceeding that cap truncates results or raises an error, leaving the most consequential parameter underspecified.

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 verb and resource ('Validate and run a read-only SQL query') and adds a safety constraint ('Writes, DDL, and other unsafe statements are rejected'). An agent knows exactly what the tool does. However, it never distinguishes itself from near-identical siblings such as run_select_tuned, run_select_parallel, or run_analytical_query, so the agent cannot tell why this variant should be chosen.

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

Usage Guidelines2/5

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

There is no when-to-use guidance and no mention of alternatives. With siblings like run_select_tuned (tuned execution), run_select_parallel, run_analytical_query, explain_query, and the cursor tools (open_cursor/fetch_cursor), an agent has no stated rule for picking this tool over those; the read-only framing only implies intended usage.

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

run_select_parallelRun SELECT parallelA
Read-only

Run up to parallel_limit read-only SELECTs concurrently. Each statement is validated by the same safety allowlist as run_select; one bad query does not abort the others — its error is captured in its own outcome slot. Useful for dashboard-style fan-out where round-trip latency dominates (e.g. fetching counters / aggregates from several tables at once). Each outcome includes an index so the caller can correlate results without relying on ordering.

NameRequiredDescriptionDefault
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.
max_rowsNo
statementsYes
parallel_limitNo

Output Schema

NameRequiredDescription
outcomesYes

TDQS

A4.4/5.0
Behavior5/5

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

Beyond the readOnlyHint/openWorldHint annotations, it discloses the key behavioral traits of a fan-out tool: per-statement validation against the same safety allowlist, failure isolation ('one bad query does not abort the others — its error is captured in its own outcome slot'), and index-tagged outcomes enabling correlation without relying on ordering. These are exactly the partial-failure semantics an agent needs before batching.

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?

Three sentences, each carrying distinct load: capability, error-isolation contract, and result-correlation mechanism. The limitation is stated up front and nothing is repeated from the title or annotations.

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 tool is moderately complex (4 params, 1 required, output schema present), and the description covers concurrency semantics, failure handling, and result correlation well enough to call it correctly. The only real gap is the undocumented `max_rows` row-cap behavior, which matters when fanning out over large tables.

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 25% — only `database` is documented in the schema. The description compensates by explaining `parallel_limit` (cap on concurrent statements) and the semantics of `statements` (each validated individually with per-slot errors), but `max_rows` is left entirely unexplained in both places, so the coverage gap is only partly closed.

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: 'Run up to parallel_limit read-only SELECTs concurrently.' It also implicitly differentiates itself from the sibling run_select by naming it in the allowlist comparison, so an agent can tell the batched variant apart from the single-statement one.

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

Usage Guidelines4/5

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

It gives a clear use case ('dashboard-style fan-out where round-trip latency dominates, e.g. fetching counters/aggregates from several tables at once') and references run_select as the shared-safety single-query counterpart. It never states explicitly when to prefer run_select over this tool for a single statement, so the routing guidance is contextual rather than exhaustive.

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

run_select_tunedRun SELECT tunedA
Read-only

Run a read-only SELECT with an elevated, bounded work_mem (and optionally maintenance_work_mem) for THIS statement only. Useful for heavy analytical SELECTs (large sorts / hash joins / GROUP BY) that spill to disk under the default work_mem. The knob is set via SET LOCAL inside the same read-only transaction, so it never leaks back into the pool. Both knobs must match ^\d+(kB|MB|GB)$ and are hard-capped at 2GB (unbounded values are an OOM risk). SQL is validated read-only by the same allowlist as run_select. SET LOCAL only affects transactional statements — non-transactional maintenance (CREATE INDEX CONCURRENTLY, VACUUM) is out of scope.

Example: run_select_tuned(sql='SELECT a, count(*) FROM big GROUP BY a', work_mem='256MB')

NameRequiredDescriptionDefault
sqlYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.
max_rowsNo
work_memYes
maintenance_work_memNo

Output Schema

NameRequiredDescription
rowsYes
columnsYes
row_countYes
truncatedYes

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 and openWorldHint=false, so safety is covered; the description adds genuinely useful behavior beyond that: SET LOCAL scoping inside the same read-only transaction, no leakage back into the pool, allowlist validation identical to run_select, and a hard 2GB cap framed as an OOM safeguard. These are real operational constraints an agent could not 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 core purpose, then constraints, then a concrete call example — every sentence carries information. It is dense and parenthesis-heavy, and the out-of-scope note trails at the end, but nothing is redundant.

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 read-only tool with annotations and an output schema, the description covers the mechanism, hard limits, validation and scope exclusions; return values needn't be explained. The only missing piece an agent would want is what `max_rows` does and whether the 2GB/allowlist limits are configurable.

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 only 20% (just `database`), so the description has to carry the load and largely does: it specifies that both knobs use `^\d+(kB|MB|GB)$`, are capped at 2GB, and that `maintenance_work_mem` is optional, plus it notes `sql` is read-only-validated. The gap is `max_rows` (default 1000), which neither the schema nor the description explains.

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 read-only SELECT") plus the defining trait that separates it from siblings: a per-statement elevated, bounded `work_mem`. The reader instantly understands this is run_select with a tuned memory knob, not a generic query runner.

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 explicit when-to-use ("heavy analytical SELECTs (large sorts / hash joins / GROUP BY) that spill to disk under the default work_mem") and an explicit when-not ("non-transactional maintenance (CREATE INDEX CONCURRENTLY, VACUUM) is out of scope"). What it never does is name run_select or run_select_parallel as the fallback for ordinary or parallel queries, leaving that routing to inference.

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

summarize_tableSummarize tableA
Read-only

Return a one-stop snapshot of a table: columns, primary key, foreign keys, every other constraint, indexes, storage + row-count + last-vacuum/analyze stats, and (optionally) a short sample of rows. Replaces what would otherwise be 4-5 individual tool calls. Set sample_rows=0 on wide / jsonb-heavy tables where the sample isn't useful.

Example: summarize_table(schema='public', table='users', sample_rows=5)

NameRequiredDescriptionDefault
tableYes
schemaYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.
sample_rowsNo

Output Schema

NameRequiredDescription
statsYes
tableYes
schemaYes
columnsYes
indexesYes
constraintsYes
primary_keyYes
sample_rowsYes
foreign_keysYes

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the description only needs to add context, and it does: it discloses that real row data is returned by default (sample_rows defaults to 5) and advises disabling it on wide/jsonb-heavy tables, which is a genuine cost/data-exposure signal. It stops short of saying whether sampling respects RLS or how expensive the stats collection is on very large relations.

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 outcome ('one-stop snapshot') before the content list, and the sibling-substitution claim follows immediately. The enumerated payload is long but each item earns its place by telling the agent it can skip the narrow tools; the trailing example is useful, though the paragraph is a single dense run-on sentence that could be split for scanability.

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?

An output schema exists, so the return shape needn't be explained, and the annotations carry the safety profile — the description covers the remaining burden well by naming what is aggregated and how to suppress the row sample. The one omission relative to a multi-object introspection tool is any hint about cost or permissions on large or restricted tables.

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 only 25% (only `database` is documented in the schema), so the description must carry more weight. It does add real semantics for sample_rows — default is a sample of rows and 0 disables it — and the example shows schema/table/sample_rows together. However, `schema` and `table` remain bare strings with no qualification guidance (case sensitivity, search_path, whether unqualified names work), leaving a meaningful gap at this coverage level.

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 ('Return a one-stop snapshot of a table') and then enumerates exactly what the snapshot contains: columns, PK, FKs, constraints, indexes, storage/row-count/vacuum-analyze stats, optional row sample. The line 'Replaces what would otherwise be 4-5 individual tool calls' positions it against the granular siblings (describe_table, list_indexes, list_constraints, list_foreign_keys) without needing to open any schema.

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 a clear selection rule (use this instead of chaining 4-5 narrower tools) and one explicit tuning condition: set sample_rows=0 on wide/jsonb-heavy tables where the sample isn't useful. It does not name a specific fallback sibling for the case where the caller only needs one slice (e.g. list_indexes alone), so the when-not side is only partially covered.

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

test_rls_for_roleTest RLS for roleA
Read-only

Test what an RLS-bound role can read from a table. Reports whether RLS is enabled on the table, lists the policies that apply to the given role, counts the rows the role can read, and returns up to sample_size rows so the agent can inspect them. Runs as the target role inside a READ ONLY transaction — no writes can leak. Pure read.

NameRequiredDescriptionDefault
roleYes
tableYes
schemaYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.
sample_sizeNo

Output Schema

NameRequiredDescription
roleYes
tableYes
sampleYes
schemaYes
columnsYes
rls_enabledYes
rows_visibleYes
active_policiesYes

TDQS

A4/5.0
Behavior4/5

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

Beyond readOnlyHint=true and openWorldHint=false, it discloses meaningful execution semantics: the query runs as the target role and inside a READ ONLY transaction, so no writes can leak. That is exactly the kind of context annotations cannot convey. It still omits cost/limit characteristics for a full count over large tables, which is a real behavioral concern for row-counting tools.

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 action, then outputs, then safety. The closing "Pure read." is partly redundant with "no writes can leak" and the readOnlyHint annotation, but it is a cheap emphasis rather than bloat.

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?

With an output schema present, the return-value explanation is a bonus rather than a necessity. The gap is on the input side and on operational cost: for a tool that counts all readable rows, the description gives no sense of expense or scale limits, which matters when choosing it over a cheap metadata listing.

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 only 20%, so the description must carry the load: it explains sample_size in effect ("returns up to sample_size rows") and ties role and table to the operation. However, schema is never mentioned, no format or qualification guidance is given (e.g., schema.table naming), and database is left entirely to the schema field.

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 ("Test what an RLS-bound role can read from a table") and then enumerates the concrete outputs: RLS-enabled status, applicable policies, readable row count, and a row sample. That is clearly distinct from siblings like list_policies or list_grants, which only enumerate metadata without exercising the role.

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

Usage Guidelines4/5

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

The description makes the usage context clear: use this when you need to know what a specific role actually sees through RLS, not just which policies exist. It does not explicitly name alternatives (e.g., list_policies for a purely declarative view) or state when not to use it, so it stops short of a 5.

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

translate_nl_to_sqlTranslate NL to SQLA
Read-only

Translate a natural-language question into a read-only PostgreSQL query against schema. The LLM provider (anthropic / openai / gemini / deepseek / qwen / openrouter / perplexity, plus any operator-declared custom OpenAI-compatible provider) sees a compact brief of the schema (tables, columns, foreign keys) and is instructed to return JSON with sql and explanation. When execute=true, the generated SQL goes through the SAME safety allowlist as run_select before running — writes / DDL / multi-statement input are rejected even if the model produced them. Returns the SQL, model rationale, and (when executed) rows / columns / row_count. table_filter narrows the brief to a known subset when the question is clearly scoped. provider, when supplied, selects which configured LLM provider to call (use this to route between the configured vendors per-call when multiple are configured); when omitted, MCPg uses the default (MCPG_NL2SQL_PROVIDER, otherwise the first available in preference order anthropic → openai → gemini → deepseek → qwen → openrouter → perplexity). Call get_server_info to see which providers are configured.

Example: translate_nl_to_sql(question='top 10 customers by revenue last month', schema='public', execute=true)

NameRequiredDescriptionDefault
schemaYes
executeNo
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.
max_rowsNo
providerNo
questionYes
table_filterNo
explain_preflightNo

Output Schema

NameRequiredDescription
sqlYes
rowsYes
errorYes
modelYes
columnsYes
refusedNo
executedYes
providerYes
row_countYes
tokens_inNo
tokens_outNo
explanationYes
refusal_reasonNo
schema_contextYes

TDQS

A4.3/5.0
Behavior5/5

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

Annotations only declare readOnlyHint and openWorldHint; the description adds substantial operational context beyond that: writes/DDL/multi-statement output is rejected by the same allowlist as run_select even if the model emits it, the provider preference order is spelled out (MCPG_NL2SQL_PROVIDER then anthropic → ... → perplexity), and it describes what is returned (SQL, rationale, and rows/columns/row_count when executed). This is exactly the mutation-safety and credential/routing information 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?

The first sentence front-loads the purpose and the safety/execution paragraph follows logically, with the provider enumeration and the example at the end. It is dense but nearly every clause carries information; the long provider list and parenthetical asides add some bulk but not filler.

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

Completeness4/5

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

For an 8-parameter, LLM-backed tool with an output schema already documenting return values, the description covers the risky behavior (allowlist, rejection of writes), provider selection, and scoping well. The remaining shortfall is the undocumented max_rows default and explain_preflight toggle, which matter for controlling cost/output size.

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 very low (13%), so the description must carry the load. It does explain provider (default resolution and routing), table_filter (narrows the schema brief), and execute (triggers the allowlist check plus execution), and it includes a worked example tying question/schema/execute together. However max_rows and explain_preflight are never mentioned, and database is only covered by the schema itself, leaving meaningful gaps.

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 ('Translate a natural-language question into a read-only PostgreSQL query against `schema`') and names the downstream artifact (JSON with `sql` and `explanation`). It also distinguishes itself from the sibling `run_select` by explaining that generated SQL passes through the same allowlist, so an agent can tell the two apart 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 Guidelines4/5

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

It states the core trigger (an NL question needing SQL), when to set execute=true, when to use table_filter ('when the question is clearly scoped'), and how to pick a provider per-call. It also routes the agent to get_server_info to discover configured providers. It stops short of explicitly saying 'use run_select instead if you already have SQL text', so it's strong but not fully exhaustive.

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

tune_vector_indexTune vector indexA
Read-only

Recommend an ivfflat or hnsw configuration for a pgvector column. Reads the live row count and column dimension, applies the standard pgvector heuristics, and returns the parameters plus a ready-to-run CREATE INDEX statement. Requires the vector extension.

NameRequiredDescriptionDefault
tableYes
columnYes
metricNol2
schemaYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.
index_typeNohnsw

Output Schema

NameRequiredDescription
dimensionYes
rationaleYes
row_countYes
index_typeYes
parametersYes
create_index_sqlYes

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safe-read profile is covered; the description adds genuine context by saying it reads live row count and column dimension and returns a ready-to-run CREATE INDEX statement, making clear it advises rather than builds the index. It stops short of noting cost or runtime of the recommended build, which is the one behavior an agent might still need.

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?

Three tight sentences: what it does, how it behaves, and the prerequisite. Nothing is repeated from the title and no sentence is 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 values need no explanation, and the extension prerequisite is stated. However, for a 6-parameter tool at low schema coverage, the undefined metric and index_type tradeoffs leave real gaps an agent would want before calling it.

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 only 17%, so the description must compensate: it covers schema/table/column implicitly and index_type via 'ivfflat or hnsw', but the metric parameter (default l2) and its allowed values are never mentioned, even though metric directly changes the emitted CREATE INDEX statement. The added meaning is partial rather than complete.

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 ('Recommend an ivfflat or hnsw configuration for a pgvector column') and implicitly separates itself from query-time tuning siblings such as recommend_hnsw_ef_search and recommend_ivfflat_probes by targeting index-build configuration instead.

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 prerequisite ('Requires the vector extension') is explicit and useful, but there is no statement of when to prefer this over recommend_indexes or the recall-analysis tools, nor any exclusion guidance. Usage is implied by the resource description rather than spelled out.

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

turboquant_approx_candidatesTurboQuant approx candidatesA
Read-only

Run tq_approx_candidates against a turboquant index — approximate k-NN retrieval, no exact rerank. metric is 'cosine' | 'inner_product' | 'l2' (mapped to upstream's runtime metric text). half_precision=True switches to the halfvec overload. probes / oversample_factor are optional per-query knobs (consider calling recommend_turboquant_query_knobs first). Requires the pg_turboquant extension. Returns a list of candidate objects with candidate_id, approximate_distance, and approximate_rank.

NameRequiredDescriptionDefault
tableYes
metricYes
probesNo
schemaYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.
id_columnYes
query_vectorYes
half_precisionNo
candidate_limitYes
embedding_columnYes
oversample_factorNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, yet the description still adds real behavior: the upstream metric-text mapping, the halfvec overload triggered by half_precision, and the precise return fields (candidate_id, approximate_distance, approximate_rank) with an explicit warning that scores are approximate. It omits cost/latency characteristics and any note on how probes affects recall versus speed.

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 the verb and the approximate/no-rerank distinction, then walks the knobs in the order an agent would set them. Dense but every clause carries information; the return-field sentence duplicates the output schema slightly.

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 an 11-parameter tool with an output schema, the description covers the non-obvious pieces (extension requirement, metric mapping, halfvec overload, knob recommendation) and correctly leaves return-shape detail to the output schema. It stops short of telling the agent where to discover valid table/column values, despite list_turboquant_indexes and get_turboquant_index_metadata being available siblings.

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 only 9%, so the description must carry the load, and it does explain metric's three legal values, half_precision's overload switch, and the role of probes/oversample_factor. However, seven required parameters (schema, table, id_column, embedding_column, query_vector, candidate_limit) get no semantic treatment — notably query_vector's array-or-string form and what candidate_limit actually bounds.

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 the exact underlying routine (tq_approx_candidates), the resource (a turboquant index) and the operation (approximate k-NN retrieval), and explicitly bounds it with 'no exact rerank'. That clause alone separates it from the sibling turboquant_rerank_candidates 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 Guidelines4/5

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

Gives concrete preconditions (pg_turboquant extension required) and routes the agent to recommend_turboquant_query_knobs before tuning probes/oversample_factor. The 'no exact rerank' note implies when to escalate to the rerank sibling, but it never names turboquant_rerank_candidates explicitly, so the alternative is inferred rather than stated.

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

turboquant_rerank_candidatesTurboQuant rerank candidatesB
Read-only

Run tq_rerank_candidates against a turboquant index — approximate retrieval followed by SQL-side exact rerank to final_limit results. Returns the candidates with both approximate and exact ranks / distances. half_precision=True switches to the halfvec overload. Requires the pg_turboquant extension.

NameRequiredDescriptionDefault
tableYes
metricYes
probesNo
schemaYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.
id_columnYes
final_limitYes
query_vectorYes
half_precisionNo
candidate_limitYes
embedding_columnYes
oversample_factorNo

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered; the description then adds genuinely new behavioral context: the two-phase execution model, the pg_turboquant extension dependency, and the halfvec overload triggered by half_precision. It does not mention cost, latency, or what happens when candidate_limit < final_limit, but the additions go meaningfully beyond the 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?

Three compact sentences, front-loaded with the operation and pipeline, then returns, then the precision switch and prerequisite. No filler, though the backtick-heavy notation (``final_limit``) and the trailing dependency sentence are slightly awkward in ordering.

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 the brief return-value note suffices, and the extension prerequisite is a valuable addition. But for a 12-parameter, 8-required tool with near-zero schema coverage, the description leaves most parameters — including the query_vector format and the metric/probes knobs — undocumented, which is a real gap for correct invocation.

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 8% — only `database` is documented in the schema — so the description carries the burden for 12 parameters. It clarifies final_limit (exact rerank target), half_precision, and ties candidate_limit to the approximate stage only via the phrase 'approximate retrieval', but leaves metric, probes, oversample_factor, id_column, embedding_column, query_vector (array vs string form), schema, and table entirely unexplained.

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 names a specific operation and resource: run tq_rerank_candidates against a turboquant index, with the two-stage pipeline (approximate retrieval then SQL-side exact rerank to final_limit) spelled out. That mechanism implicitly separates it from turboquant_approx_candidates and from generic vector_search, though no sibling is named explicitly.

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?

It gives a prerequisite (requires the pg_turboquant extension) and a mode switch (half_precision=True uses the halfvec overload), which helps an agent decide it can call the tool at all. However, there is no explicit guidance on when to choose this over turboquant_approx_candidates, vector_search, or the analyze_reranker_* tools, so the selection logic 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.

vector_recall_at_kVector recall at kA
Read-only

Measure recall@k of an existing pgvector index against a brute-force ground truth (function-form distance, which pgvector documents as non-indexed). Returns the mean overlap over a sample of rows from the table. Requires the vector extension.

NameRequiredDescriptionDefault
kNo
tableYes
columnYes
metricNol2
schemaYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.
id_columnYes
sample_sizeNo

Output Schema

NameRequiredDescription
kYes
metricYes
mean_recallYes
sample_sizeYes

TDQS

A3.6/5.0
Behavior4/5

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

Annotations already establish readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description still adds real value beyond that: it discloses the return semantics ('mean overlap over a sample of rows'), the ground-truth methodology, and the vector-extension prerequisite. It does not warn that the brute-force comparison is potentially expensive on large tables, which is the main operational risk.

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?

Three sentences, front-loaded with the core action and free of filler; the parenthetical about function-form distance is well placed as an inline caveat. Slightly dense, but every clause carries 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?

An output schema exists, so the return values need not be explained, and the description is adequate on methodology. For an 8-parameter tool with 13% schema coverage and a near-duplicate sibling, though, it leaves an agent guessing about metric options, id_column's role, and how to choose between this and analyze_hnsw_recall.

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 only 13% — just the 'database' parameter is documented, so seven others (k, table, column, metric, schema, id_column, sample_size) carry titles only. The description partially compensates by mentioning 'k' in recall@k and 'a sample of rows' (mapping loosely to sample_size), but gives no meaning for metric, id_column, or column. It is not the baseline-3 case where the schema does the heavy lifting, yet it does not fall to 1 because it clarifies the two most conceptually load-bearing parameters.

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 names a specific verb and resource ('Measure recall@k of an existing pgvector index') and immediately pins down the comparison baseline ('brute-force ground truth') plus a caveat about function-form distance being non-indexed. That is far more specific than a tautology. It stops short of a 5 because the sibling tool analyze_hnsw_recall targets the same measurement question and is never acknowledged or distinguished.

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: it measures an *existing* index, which suggests when it applies. The only explicit precondition is 'Requires the vector extension.' There is no guidance on when to prefer this over analyze_hnsw_recall, tune_vector_index, or recommend_ivfflat_probes, all of which sit in the same vector-tuning cluster.

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

verify_audit_chainVerify audit chainA
Read-only

Verify the HMAC-SHA256 signature chain of persisted audit events in mcpg_audit.events. Returns an object with verified (bool), events_checked (int), the first_event_id and last_event_id covered by the walk, and (on failure) error and first_invalid_id pointing at where the chain broke.

NameRequiredDescriptionDefault
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

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

Annotations already establish readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds genuinely useful context: the walk covers a range and on failure reports `error` and `first_invalid_id` pointing at the break point, which tells the agent how to interpret partial results. It does not, however, mention cost or time proportional to event volume for a full chain walk.

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?

One front-loaded sentence states the operation, then the return shape in a compact second sentence. No filler, no restatement of the title.

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

Completeness4/5

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

With an output schema present, the description needn't restate every field, and it stays complete enough for a zero-required-parameter, read-only tool. The only mild gap is silence on the secondary-database targeting option and on how long a full chain verification may take.

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 single `database` parameter is fully documented in the schema, including the 'rejected if not a configured id' constraint. The description adds nothing about parameters, so the baseline 3 applies — notably it never mentions that a secondary read-only database can be targeted.

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?

Names a specific verb and resource — verifying the HMAC-SHA256 signature chain of persisted audit events in mcpg_audit.events — which is unmistakably distinct from listing tools like list_audit_events. An agent can tell exactly what operation this performs 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 Guidelines3/5

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

Usage is only implied by the word 'Verify' — an agent can infer this is an integrity/tamper check rather than a read of event contents. There is no explicit when-to-use or when-not-to-use guidance and no mention of list_audit_events as the complementary alternative.

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

verify_connection_encryptionVerify connection encryptionA
Read-only

Report whether MCPg's own connection to PostgreSQL is TLS-encrypted, including the negotiated protocol version, cipher, and key bits (from pg_stat_ssl). Also returns a cluster-wide tally of encrypted vs unencrypted backends (a lower bound under non-superuser privileges). Complements the startup TLS-enforcement check by confirming the live connection actually came up encrypted.

NameRequiredDescriptionDefault
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
sslYes
bitsYes
cipherYes
versionYes
total_connectionsYes
encrypted_connectionsYes
unencrypted_connectionsYes

TDQS

A4.1/5.0
Behavior4/5

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

Beyond the readOnly/openWorld annotations, it discloses the source view (pg_stat_ssl), the caveat that the cluster-wide tally is a lower bound under non-superuser privileges, and the negotiated TLS fields returned. That privilege caveat is exactly the kind of context annotations cannot express.

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?

Three sentences, front-loaded with the core purpose, followed by scope caveat and sibling relationship. Dense with useful detail and no filler, though the parenthetical about pg_stat_ssl is slightly cluttered.

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?

An output schema exists, so return values need not be spelled out, yet the description still names the key fields and the privilege caveat. Combined with the single well-documented parameter and read-only annotation, an agent has enough to call it 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?

Schema coverage is 100% and the sole 'database' parameter is fully documented in the schema, including the secondary-database targeting rule. The description adds no parameter-level meaning beyond that, 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?

States a specific verb and resource ('Report whether MCPg's own connection to PostgreSQL is TLS-encrypted') and names the exact data source (pg_stat_ssl). It explicitly distinguishes itself from the startup TLS-enforcement check, so an agent can separate it from the sibling security 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?

Gives a clear use context: confirms the live connection actually came up encrypted, as a complement to the startup enforcement check. It does not state exclusions or name a concrete alternative tool to call instead, so it stops short of full when/when-not guidance.

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

wait_for_lsnWait for LSNA
Read-only

Issue WAIT FOR LSN '<lsn>' TIMEOUT <ms> and block until WAL replay catches up on the connected backend. timeout_ms defaults to 0 (wait indefinitely); a positive value bounds the wait — on timeout the helper returns timed_out=true rather than raising so the caller can decide whether to retry or fall through. LSN format is strictly validated (hex/hex) before any SQL is composed. Requires PG 19+; raises on older servers with the poll-loop fallback in the message. Returns an object with lsn, timeout_ms (int), timed_out (bool), and wait_sql (the rendered statement).

Example: wait_for_lsn(lsn='0/1234ABCD', timeout_ms=5000)

NameRequiredDescriptionDefault
lsnYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.
timeout_msNo

Output Schema

NameRequiredDescription
lsnYes
wait_sqlYes
timed_outYes
timeout_msYes

TDQS

A4/5.0
Behavior5/5

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

Well beyond the readOnlyHint/openWorldHint annotations, it discloses that the call blocks, that timeout_ms=0 waits indefinitely, that timeouts are returned rather than raised, that the LSN is strictly validated before SQL composition, and that PG 19+ is required with a raise plus poll-loop fallback hint on older servers. That is exactly the operational context an agent needs before invoking a blocking call.

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 actual SQL it issues, then semantics, then failure modes. Slightly padded by re-enumerating the return object fields (`lsn`, `timeout_ms`, `timed_out`, `wait_sql`) even though an output schema exists, plus a redundant example line.

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?

Covers blocking behavior, timeout semantics, version gating, and error behavior for a mutation-adjacent blocking tool. The secondary/read-only `database` targeting is only documented in the schema, and the return-field listing duplicates the output schema, so nothing essential 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 only 33% and the two otherwise undocumented parameters — `lsn` and `timeout_ms` — are both addressed in prose: strict `hex/hex` validation for lsn and the default-0/indefinite-wait meaning plus bound behavior for timeout_ms. Only `database` is left solely to the schema, so the description largely compensates for the coverage gap.

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 names a specific verb and mechanism — issues `WAIT FOR LSN '<lsn>' TIMEOUT <ms>` and blocks until WAL replay catches up — so the purpose is unmistakable. It does not differentiate from related siblings such as get_wait_for_lsn_status, get_current_wal_lsn, or check_pitr_readiness, which keeps it out of 5 territory.

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?

It explains the timeout decision path (returns `timed_out=true` so the caller can retry or fall through), which implies a read-your-writes / catch-up use case. But it never states when to reach for this versus the sibling status or PITR-check tools, leaving alternative selection to inference.

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

walk_blocking_chainsWalk blocking chainsC
Read-only

Walk and reconstruct the lock-wait graph of the database. Detects deadlock cycles, traces linear blocking paths to their root blockers, and renders a Mermaid flowchart representing the lock dependency graph. Read-only. Returns an object with cycles (list of detected cycle PID lists), paths (linear blocking paths as PID lists), roots (root blocker PIDs), nodes (dict keyed by PID with per-backend lock detail), and mermaid (the pre-rendered flowchart string).

NameRequiredDescriptionDefault
limitNo
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
nodesYes
pathsYes
rootsYes
cyclesYes
mermaidYes

TDQS

C2.9/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, so 'Read-only' merely repeats structured data. The description does add value by describing the computation performed (cycle detection, root-blocker resolution, flowchart rendering), but omits cost/limits — e.g. how the `limit` governs graph size or whether the Mermaid render is expensive on large graphs.

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?

Front-loaded with the action and scope, which is good, but the final sentence enumerating `cycles`, `paths`, `roots`, `nodes`, and `mermaid` restates the output schema verbatim, spending a full sentence on information the agent already has.

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?

Behavior and return contents are covered, and the output schema makes the return-value enumeration redundant. The blocking gap is the undocumented `limit` parameter for a graph-walk operation where result size matters, leaving the agent unable to size the call intelligently.

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 only 50% schema description coverage, the description should compensate, but it mentions neither parameter. The `database` parameter is documented in the schema, while `limit` has no description anywhere — its default of 50 and its effect on cycles/paths/nodes is unexplained.

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?

Names a specific verb and resource: 'Walk and reconstruct the lock-wait graph', and enumerates the concrete sub-tasks (deadlock cycle detection, linear blocking path tracing, Mermaid rendering). An agent knows exactly what it produces. It stops short of naming how it differs from close siblings like find_blocking_chains or list_locks.

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

Usage Guidelines2/5

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

No when-to-use or when-not-to-use guidance, and no reference to alternatives. Given the sibling set contains find_blocking_chains and list_locks, which overlap heavily with this tool's lock-wait investigation domain, an agent is left to guess which one to pick.

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

why_is_this_slowWhy is this slowA
Read-only

Diagnose why a SQL query might be slow, in one call. Runs EXPLAIN (FORMAT JSON) — does NOT execute the query — walks the plan tree, snapshots concurrent active queries + blocking lock pairs, reads the cluster-wide cache hit ratio, and produces categorised suggestions (plan / contention / cache / maintenance). Read-only; safe to run on a statement the agent doesn't want to materialise yet.

Example: why_is_this_slow(sql='SELECT * FROM orders WHERE customer_id = 42')

NameRequiredDescriptionDefault
sqlYes
databaseNoOptional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected.

Output Schema

NameRequiredDescription
sqlYes
suggestionsYes
explain_planYes
plan_summaryYes
active_queriesYes
blocking_locksYes
cache_hit_ratioYes

TDQS

A4.4/5.0
Behavior5/5

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

Annotations only declare readOnlyHint/openWorldHint; the description goes much further by disclosing the diagnostics it bundles (plan tree walk, concurrent active queries, blocking lock pairs, cluster-wide cache hit ratio) and the fact that it does no write or execution. Crucially it explains WHY it is read-only — EXPLAIN without ANALYZE — which is the non-obvious safety detail 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?

The opening clause is front-loaded with the core capability and the no-execution guarantee follows immediately; the example anchors the call format. The middle sentence is dense with a comma-list of diagnostics, which is efficient but slightly overloaded for a single sentence.

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 structure needn't be spelled out, yet the description still tells the agent what categories of findings come back (plan / contention / cache / maintenance). Combined with the safety disclosure and example, nothing needed 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.

Parameters3/5

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

Schema coverage is 50%: `database` is well documented in the schema (targeting configured secondary databases via list_databases), while `sql` has none. The example shows the shape of the SQL argument, which helps slightly, but the description adds no semantics about database targeting or SQL statement constraints. Baseline 3 applies since the schema does most of the work.

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 outcome ("Diagnose why a SQL query might be slow") and immediately pins down the mechanism (EXPLAIN FORMAT JSON, no execution). The scope is concrete enough to separate it from read/execute tools like run_select and from pure plan viewers like explain_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?

Gives a clear when-to-use signal: for a statement the agent doesn't want to materialise yet, and the no-execution guarantee makes the safe-use context explicit. It stops short of naming alternatives (explain_query, analyze_query_plan, run_select) or stating exclusions, so the agent must infer routing from neighbouring tool names.

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. 175 tool updatesv0.8.4
    • Changedanalyze_distance_metric1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedanalyze_hnsw_recall1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedanalyze_lock_hotspots1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedanalyze_mpp_query_plan1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedanalyze_query_plan1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedanalyze_rerank_ndcg1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedanalyze_rerank_score_distribution1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedanalyze_reranker_lift1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedanalyze_session_cost1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedanalyze_table_bloat1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedanalyze_topk_stability1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedanalyze_vector_search_efficiency1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedanalyze_workload1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedaudit_database1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedaudit_sequences1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedaudit_settings1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedcheck_database_health1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedcheck_pitr_readiness1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedcheck_segment_health1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedcluster_vectors1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedcompare_schemas1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedcross_table_similarity1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changeddescribe_ao_table1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changeddescribe_property_graph1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changeddescribe_redis_cache_table1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changeddescribe_table1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changeddetect_n_plus_one1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changeddetect_vector_outliers1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedexplain_query1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedexport_query1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedexport_table1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedfind_blocking_chains1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedfind_sensitive_columns1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedfind_unused_objects1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedfull_text_search1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedfuzzy_search1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedgenerate_diesel_schema1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedgenerate_drizzle_schema1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedgenerate_ecto_schemas1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedgenerate_ent_schemas1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedgenerate_fk_cascade_graph1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedgenerate_graph_projection1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedgenerate_jooq_config1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedgenerate_prisma_schema1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedgenerate_schema_diagram1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedgenerate_schema_docs1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedgenerate_sqlalchemy_models1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedgenerate_sqlc_schema1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedgenerate_test_data1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedgenerate_test_row_for1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedgeo_search1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedget_aio_status1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedget_compact_schema1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedget_current_wal_lsn1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedget_data_checksums_status1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedget_database_ddl1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedget_hypertable_stats1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedget_logical_replication_status1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedget_pg_search_index_metadata1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedget_pg19_ddl_status1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedget_pg19_partitions_status1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedget_pg19_stats_status1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedget_pgq_status1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedget_prewarm_extension_status1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedget_redis_cache_stats1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedget_repack_status1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedget_role_ddl1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedget_skip_scan_status1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedget_tablespace_ddl1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedget_timescaledb_telemetry_report1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedget_turboquant_heap_stats1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedget_turboquant_index_metadata1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedget_turboquant_last_scan_stats1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedget_wait_for_lsn_status1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedget_wal_archive_status1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedget_warehousepg_status1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedhybrid_bm25_vector_search1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedhybrid_search1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedlint_naming_conventions1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedlist_active_queries1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedlist_audit_events1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedlist_autowarm_jobs1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedlist_available_extensions1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedlist_chunks1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedlist_composite_types1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedlist_constraints1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedlist_continuous_aggregates1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedlist_cron_jobs1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedlist_distribution_policies1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedlist_domains1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedlist_enums1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedlist_extensions1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedlist_foreign_data_wrappers1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedlist_foreign_keys1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedlist_foreign_servers1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedlist_foreign_tables1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedlist_functions1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedlist_generated_columns1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedlist_grants1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedlist_hypertables1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedlist_indexes1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedlist_locks1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedlist_partitions1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedlist_pg_search_indexes1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedlist_policies1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedlist_prewarmed_relations1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedlist_property_graphs1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedlist_publications1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedlist_redis_foreign_servers1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedlist_resource_groups1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedlist_roles1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedlist_schemas1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedlist_sequences1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedlist_subscriptions1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedlist_tables1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedlist_timescale_jobs1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedlist_triggers1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedlist_turboquant_indexes1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedlist_user_mappings1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedlist_views1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedmigrate_vector_to_halfvec1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedmmr_search1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedmonitor_embedding_drift1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedmonitor_index_build1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedopen_cursor1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedoptimize_query1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedpg_search_more_like_this1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedpg_search_parse_query1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedpg_search_run1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedread_autovacuum_priority1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedread_migration_history1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedread_pg_buffercache_relations1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedread_pg_buffercache_summary1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedread_pg_stat_io1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedread_pg_stat_lock1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedread_pg_stat_recovery1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedread_pg_wal_records1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedread_pg_wal_stats1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedrecommend_efficiency_thresholds1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedrecommend_headline_tools1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedrecommend_hnsw_ef_search1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedrecommend_index_drops1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedrecommend_indexes1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedrecommend_io_method1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedrecommend_ivfflat_probes1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedrecommend_pg_search_maintenance1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedrecommend_prewarm_targets1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedrecommend_read_your_writes1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedrecommend_redis_cache_targets1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedrecommend_redistribute1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedrecommend_rerank_strategy1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedrecommend_skip_scan_indexes1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedrecommend_turboquant_maintenance1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedrecommend_turboquant_query_knobs1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedrecommend_vector_quantization1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedretrieve_with_context1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedrun_advisors1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedrun_pgq1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedrun_select1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedrun_select_parallel1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedrun_select_tuned1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedsummarize_table1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedtest_rls_for_role1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedtranslate_nl_to_sql1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedtune_vector_index1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedturboquant_approx_candidates1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedturboquant_rerank_candidates1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedvector_range_search1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedvector_recall_at_k1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedvector_search1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedverify_audit_chain1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedverify_connection_encryption1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedwait_for_lsn1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedwalk_blocking_chains1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
    • Changedwhy_is_this_slow1 field changed
      • changedInput schema / properties / database / description
        Previous value: -"Optional: target a configured secondary (read-only) database by name; omit for the primary. Call list_databases to see the configured ids."New value: +"Optional: a database id from list_databases, to target a configured secondary (read-only) database; omit for the primary. Database names that are not configured ids are rejected."
  2. 5 tool updatesv0.8.3
    • Addedget_hypertable_stats
    • Addedget_timescaledb_telemetry_report
    • Addedinspect_guc
    • Addedlist_continuous_aggregates
    • Addedlist_timescale_jobs
  3. 1 tool updatev0.8.2
    • Changedtranslate_nl_to_sql2 fields changed
      • addedOutput schema / properties / schema_context
        Added value: +{
        +  "title": "Schema Context",
        +  "type": "string"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "sql",
        -  "explanation",
        -  "model",
        -  "provider",
        -  "executed",
        -  "rows",
        -  "columns",
        -  "row_count",
        -  "error"
        -]New value: +[
        +  "sql",
        +  "explanation",
        +  "model",
        +  "provider",
        +  "schema_context",
        +  "executed",
        +  "rows",
        +  "columns",
        +  "row_count",
        +  "error"
        +]
  4. 1 tool update
    • Changedtranslate_nl_to_sql2 fields changed
      • addedOutput schema / properties / tokens_in
        Added value: +{
        +  "default": 0,
        +  "title": "Tokens In",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / tokens_out
        Added value: +{
        +  "default": 0,
        +  "title": "Tokens Out",
        +  "type": "integer"
        +}
  5. 8 tool updates
    • Changedaudit_database1 field changed
      • addedInput schema / properties / fresh
        Added value: +{
        +  "default": false,
        +  "title": "Fresh",
        +  "type": "boolean"
        +}
    • Changeddescribe_table1 field changed
      • addedInput schema / properties / fresh
        Added value: +{
        +  "default": false,
        +  "title": "Fresh",
        +  "type": "boolean"
        +}
    • Changedget_compact_schema1 field changed
      • addedInput schema / properties / fresh
        Added value: +{
        +  "default": false,
        +  "title": "Fresh",
        +  "type": "boolean"
        +}
    • Changedlist_constraints1 field changed
      • addedInput schema / properties / fresh
        Added value: +{
        +  "default": false,
        +  "title": "Fresh",
        +  "type": "boolean"
        +}
    • Changedlist_foreign_keys1 field changed
      • addedInput schema / properties / fresh
        Added value: +{
        +  "default": false,
        +  "title": "Fresh",
        +  "type": "boolean"
        +}
    • Changedlist_indexes1 field changed
      • addedInput schema / properties / fresh
        Added value: +{
        +  "default": false,
        +  "title": "Fresh",
        +  "type": "boolean"
        +}
    • Changedrecommend_indexes1 field changed
      • addedInput schema / properties / fresh
        Added value: +{
        +  "default": false,
        +  "title": "Fresh",
        +  "type": "boolean"
        +}
    • Addedrun_analytical_query
  6. 1 tool update
    • Changedtranslate_nl_to_sql3 fields changed
      • addedInput schema / properties / explain_preflight
        Added value: +{
        +  "default": true,
        +  "title": "Explain Preflight",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / refusal_reason
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Refusal Reason"
        +}
      • addedOutput schema / properties / refused
        Added value: +{
        +  "default": false,
        +  "title": "Refused",
        +  "type": "boolean"
        +}
  7. 185 tool updatesv0.6.8
    • First observedanalyze_distance_metric
    • First observedanalyze_hnsw_recall
    • First observedanalyze_lock_hotspots
    • First observedanalyze_mpp_query_plan
    • First observedanalyze_query_plan
    • First observedanalyze_rerank_ndcg
    • First observedanalyze_rerank_score_distribution
    • First observedanalyze_reranker_lift
    • First observedanalyze_session_cost
    • First observedanalyze_table_bloat
    • First observedanalyze_topk_stability
    • First observedanalyze_vector_search_efficiency
    • First observedanalyze_workload
    • First observedaudit_database
    • First observedaudit_sequences
    • First observedaudit_settings
    • First observedcheck_database_health
    • First observedcheck_pitr_readiness
    • First observedcheck_segment_health
    • First observedclose_cursor
    • First observedcluster_vectors
    • First observedcompare_schemas
    • First observedcross_table_similarity
    • First observeddescribe_ao_table
    • First observeddescribe_graph
    • First observeddescribe_property_graph
    • First observeddescribe_redis_cache_table
    • First observeddescribe_self
    • First observeddescribe_table
    • First observeddescribe_tool
    • First observeddetect_n_plus_one
    • First observeddetect_vector_outliers
    • First observedexplain_query
    • First observedexport_query
    • First observedexport_table
    • First observedfetch_cursor
    • First observedfind_blocking_chains
    • First observedfind_sensitive_columns
    • First observedfind_unused_objects
    • First observedfull_text_search
    • First observedfuzzy_search
    • First observedgenerate_diesel_schema
    • First observedgenerate_drizzle_schema
    • First observedgenerate_ecto_schemas
    • First observedgenerate_ent_schemas
    • First observedgenerate_fk_cascade_graph
    • First observedgenerate_graph_diagram
    • First observedgenerate_graph_projection
    • First observedgenerate_jooq_config
    • First observedgenerate_prisma_schema
    • First observedgenerate_schema_diagram
    • First observedgenerate_schema_docs
    • First observedgenerate_sqlalchemy_models
    • First observedgenerate_sqlc_schema
    • First observedgenerate_test_data
    • First observedgenerate_test_row_for
    • First observedgeo_search
    • First observedget_aio_status
    • First observedget_compact_schema
    • First observedget_current_wal_lsn
    • First observedget_data_checksums_status
    • First observedget_database_ddl
    • First observedget_logical_replication_status
    • First observedget_metrics_exposition
    • First observedget_pg_search_index_metadata
    • First observedget_pg19_ddl_status
    • First observedget_pg19_partitions_status
    • First observedget_pg19_stats_status
    • First observedget_pgq_status
    • First observedget_prewarm_extension_status
    • First observedget_redis_cache_stats
    • First observedget_repack_status
    • First observedget_role_ddl
    • First observedget_server_info
    • First observedget_skip_scan_status
    • First observedget_tablespace_ddl
    • First observedget_turboquant_heap_stats
    • First observedget_turboquant_index_metadata
    • First observedget_turboquant_last_scan_stats
    • First observedget_wait_for_lsn_status
    • First observedget_wal_archive_status
    • First observedget_warehousepg_status
    • First observedhybrid_bm25_vector_search
    • First observedhybrid_search
    • First observedlint_naming_conventions
    • First observedlist_active_queries
    • First observedlist_audit_events
    • First observedlist_autowarm_jobs
    • First observedlist_available_extensions
    • First observedlist_chunks
    • First observedlist_composite_types
    • First observedlist_constraints
    • First observedlist_cron_jobs
    • First observedlist_cursors
    • First observedlist_databases
    • First observedlist_distribution_policies
    • First observedlist_domains
    • First observedlist_enums
    • First observedlist_extensions
    • First observedlist_foreign_data_wrappers
    • First observedlist_foreign_keys
    • First observedlist_foreign_servers
    • First observedlist_foreign_tables
    • First observedlist_functions
    • First observedlist_generated_columns
    • First observedlist_grants
    • First observedlist_graphs
    • First observedlist_hypertables
    • First observedlist_indexes
    • First observedlist_locks
    • First observedlist_partitions
    • First observedlist_pg_search_indexes
    • First observedlist_policies
    • First observedlist_prewarmed_relations
    • First observedlist_property_graphs
    • First observedlist_publications
    • First observedlist_redis_foreign_servers
    • First observedlist_replicas
    • First observedlist_resource_groups
    • First observedlist_roles
    • First observedlist_schemas
    • First observedlist_sequences
    • First observedlist_subscriptions
    • First observedlist_tables
    • First observedlist_triggers
    • First observedlist_turboquant_indexes
    • First observedlist_user_mappings
    • First observedlist_views
    • First observedmigrate_vector_to_halfvec
    • First observedmmr_search
    • First observedmonitor_embedding_drift
    • First observedmonitor_index_build
    • First observedopen_cursor
    • First observedoptimize_query
    • First observedpg_search_more_like_this
    • First observedpg_search_parse_query
    • First observedpg_search_run
    • First observedread_autovacuum_priority
    • First observedread_migration_history
    • First observedread_pg_buffercache_relations
    • First observedread_pg_buffercache_summary
    • First observedread_pg_stat_io
    • First observedread_pg_stat_lock
    • First observedread_pg_stat_recovery
    • First observedread_pg_wal_records
    • First observedread_pg_wal_stats
    • First observedrecommend_efficiency_thresholds
    • First observedrecommend_headline_tools
    • First observedrecommend_hnsw_ef_search
    • First observedrecommend_index_drops
    • First observedrecommend_indexes
    • First observedrecommend_io_method
    • First observedrecommend_ivfflat_probes
    • First observedrecommend_pg_search_maintenance
    • First observedrecommend_postgres_conf
    • First observedrecommend_prewarm_targets
    • First observedrecommend_read_your_writes
    • First observedrecommend_redis_cache_targets
    • First observedrecommend_redistribute
    • First observedrecommend_rerank_strategy
    • First observedrecommend_skip_scan_indexes
    • First observedrecommend_turboquant_maintenance
    • First observedrecommend_turboquant_query_knobs
    • First observedrecommend_vector_quantization
    • First observedretrieve_with_context
    • First observedrun_advisors
    • First observedrun_cypher
    • First observedrun_pgq
    • First observedrun_select
    • First observedrun_select_parallel
    • First observedrun_select_tuned
    • First observedsummarize_table
    • First observedtest_rls_for_role
    • First observedtranslate_nl_to_sql
    • First observedtune_vector_index
    • First observedturboquant_approx_candidates
    • First observedturboquant_rerank_candidates
    • First observedvector_range_search
    • First observedvector_recall_at_k
    • First observedvector_search
    • First observedverify_audit_chain
    • First observedverify_connection_encryption
    • First observedwait_for_lsn
    • First observedwalk_blocking_chains
    • First observedwhy_is_this_slow

TDQS

B3.2/5.0

Scored across 191 tools

Disambiguation2/5

The surface contains many overlapping clusters: run_select / run_analytical_query / run_select_tuned / run_select_parallel, explain_query / analyze_query_plan / why_is_this_slow / optimize_query, and numerous recommend_* / audit_* / status-probe tools. Descriptions are detailed and often cross-reference each other, but with 191 tools the boundaries are still hard for an agent to hold reliably, leading to likely misselection.

Naming Consistency4/5

All tool names use snake_case and the dominant pattern is verb_noun (list_tables, describe_table, recommend_indexes, get_server_info). There are minor noun-first deviations such as vector_search, hybrid_search, and pg_search_run, but the overall convention remains readable and mostly consistent.

Tool Count1/5

191 tools is an extreme mismatch for a single MCP server surface, even for a broad PostgreSQL administration product. The catalogue should be split into focused servers or packs; as one set, discovery and selection cost is overwhelming and each tool no longer clearly earns its place.

Completeness2/5

The read-only introspection, advisor, and diagnostics surface is extremely deep, but core lifecycle operations are absent: there are no write/DDL/transaction tools. Multiple descriptions explicitly point agents to run_write, prepare_migration, validate_migration_schema, alter_system, run_maintenance, and list_tools, none of which appear in this catalogue, creating dead ends.

Maintenance

ActivityActive
ResponsivenessSyncing

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    D
    maintenance
    A Model Context Protocol server that enables powerful PostgreSQL database management capabilities including analysis, schema management, data migration, and monitoring through natural language interactions.
    18
    1,931 npm
    203
    AGPL 3.0
  • A
    license
    Not graded
    quality
    D
    maintenance
    A Model Context Protocol server that provides AI assistants with secure, read-only access to PostgreSQL databases while offering comprehensive tools for schema exploration, query validation, and performance optimization.
    MIT