Skip to main content
Glama

mcp-zuul

Debug build failures by asking questions, not clicking through web UIs. An MCP server for Zuul CI.

If mcp-zuul saves you a debugging session, a ⭐ star helps others find it.

One command, no install:

claude mcp add zuul -e ZUUL_URL=https://your-zuul.example.com -- uvx mcp-zuul

48 tools, 5 prompts, 3 resources — covering builds, logs, pipelines, jobs, infrastructure, and live status. Works with Claude Code, Claude Desktop, Cursor, Codex, Windsurf, and any MCP-compatible client.

Why mcp-zuul?

mcp-zuul

Raw Zuul API

Zuul web UI

Failure analysis

Structured — task, host, error, rc

Raw JSON, parse yourself

Click through log pages

Log search

Regex + context lines + line ranges

Not available

Browser Ctrl+F

Flaky detection

Automatic pass/fail statistics

Manual query + calculate

Not available

Test results

Parsed JUnit XML with failure details

Not available

External link

Anomaly detection

ML-based via LogJuicer

Not available

Not available

Live status

Job progress, ETA, pre-failure alerts

Polling API

Manual refresh

Multi-instance

One config entry per Zuul

Different base URLs

Different browser tabs

Related MCP server: mcp-server-logs-sieve

Quick Start

uvx (no install, recommended):

claude mcp add zuul \
               -e ZUUL_URL=https://softwarefactory-project.io/zuul \
               -e ZUUL_DEFAULT_TENANT=rdoproject.org \
               -- uvx mcp-zuul

pip:

pip install mcp-zuul

Docker:

docker build -t mcp-zuul .

LobeHub — send this to your AI agent:

Read https://lobehub.com/mcp/imatza-rh-mcp-zuul/skill.md and follow the instructions to install the MCP server.

See Setup for full configuration options including Kerberos and multi-instance.

Features

Structured failure analysisget_build_failures parses Zuul's job-output.json and returns exactly which Ansible task failed, on which host, with error message, return code, and stderr. No log scrolling needed.

Read any log fileget_build_log isn't limited to job-output.txt. Pass log_name to read any file in the build's log directory (ci_script logs, ansible.log, deployment logs) with full grep, tail, and line-range support.

Precise log navigation — Jump to exact line ranges with start_line/end_line. After finding an error at line 6148, read lines 6130-6160 instead of scrolling through 200-line chunks.

Smart grep — Regex search with context lines. Auto-converts common shell-grep \| syntax to Python regex | so patterns like error\|failed\|timeout just work.

Live pipeline awarenessget_change_status returns live job progress with elapsed times, estimated completion, and pre-failure detection (pre_fail field). When the change isn't in pipeline, automatically fetches the latest completed buildset.

Tool filtering — Reduce LLM tool-selection noise with ZUUL_ENABLED_TOOLS or ZUUL_DISABLED_TOOLS. Only expose the tools your workflow needs — the rest are removed from the server entirely.

URL-based input — Paste a Zuul build URL directly. Tools auto-parse the tenant and UUID from URLs like https://zuul.example.com/t/tenant/build/abc123 — no manual extraction needed.

Flaky job detectionfind_flaky_jobs analyzes recent build history and computes pass/fail statistics to identify intermittent failures automatically.

Job dependency graphget_freeze_jobs returns the fully-resolved job graph for a pipeline/project/branch, showing all jobs with their dependencies after inheritance resolution.

Kerberos/SPNEGO auth — First-class support for Zuul instances behind OIDC + Kerberos. Drives the full SPNEGO redirect chain automatically. Session cookies persist and re-authenticate transparently on expiry.

Streamable HTTP transport — Run as a persistent HTTP server with MCP_TRANSPORT=streamable-http for remote/shared deployment. Supports stdio (default), SSE, and streamable-http.

Write operations — Enqueue/dequeue/promote changes and re-enqueue buildsets. Pipeline-affecting tools are disabled by default (ZUUL_READ_ONLY=true) and removed from the server entirely so LLMs don't even see them. Autohold management (create/delete) is always available since it doesn't affect running pipelines.

LogJuicer integrationget_build_anomalies uses ML-based log analysis to find unusual lines by comparing failed logs against successful baselines. Optional — requires LOGJUICER_URL.

Token-efficient output — All responses strip None values and use compact formatters. tail_build_log returns just the last N lines — the fastest way to check why a build failed.

Error handling — All tools return JSON, errors included. Network failures, auth issues, and invalid parameters produce {"error": "descriptive message"}. Tools never raise unhandled exceptions.

Tools

Builds & Failures

Tool

What it does

list_builds

Search builds by project, pipeline, job, change, result. Includes buildset_uuid for cross-referencing.

get_build

Full build details — nodeset, log URL, artifacts, error detail. Accepts url or uuid.

get_build_failures

Start here for failures. Structured task-level data from job-output.json — failed play, task, host, msg, rc, stderr/stdout. Accepts url or uuid.

diagnose_build

One-call failure diagnosis. Combines structured failures from job-output.json with targeted log context (fatal/FAILED lines with surrounding context from job-output.txt). Use instead of calling get_build_failures + get_build_log separately. Accepts url or uuid.

get_build_log

Read and search log files. Modes: summary (tail + error lines), full (paginated), grep (regex + context), start_line/end_line (exact range). Supports log_name for any file. Accepts url or uuid.

tail_build_log

Fastest failure check. Last N lines of a log (default 50, max 500). More token-efficient than get_build_log summary mode. Accepts url or uuid.

browse_build_logs

List log directory contents or fetch specific files (inventory, artifacts, must-gather). Max 512KB per file. Accepts url or uuid.

stream_build_console

Live console from RUNNING builds. Connects to Zuul WebSocket, returns last N lines (tail). For completed builds, use tail_build_log. Optional — requires pip install mcp-zuul[console].

Buildsets

Tool

What it does

list_buildsets

Search buildsets. Use include_builds=true to inline full build details (saves round-trips).

get_buildset

Full buildset with all builds and events. Accepts url or uuid.

Pipeline & Status

Tool

What it does

get_status

Live pipeline status — what's queued, running, with job progress and ETA. Filterable by pipeline and project.

get_change_status

Status for a change/PR/MR. In pipeline: live jobs with elapsed times. Not in pipeline: auto-fetches latest completed buildset. Accepts url or change.

list_pipelines

All pipelines with their trigger types.

Jobs & Projects

Tool

What it does

list_tenants

All tenants with project counts.

list_jobs

List jobs with optional name filter.

get_job

Job configuration — parent, nodeset, timeout, variants, source project.

get_project

Which pipelines and jobs are configured for a project.

list_projects

List all projects in a tenant with optional name filter.

get_config_errors

Check this when jobs aren't running. Configuration errors, missing refs, broken configs. Filterable by project.

get_freeze_jobs

Resolved job dependency graph for a pipeline/project/branch. Shows exactly which jobs will run with inheritance resolved.

get_freeze_job

Resolved job config after inheritance. Final merged nodeset, playbooks, variables, and timeout for a specific job. Answers "what will this job actually do?"

find_flaky_jobs

Analyze recent build history for intermittent failures. Computes pass/fail rate and flags jobs as flaky (>20% failure with mixed results).

get_build_times

Build duration trends with avg/min/max stats. Detect performance regressions or timeout-prone jobs.

get_job_durations

Batch avg/min/max duration for multiple jobs in one call. Designed for monitoring an entire pipeline chain without N separate calls.

check_health

Test API connectivity, auth status, and config. Triggers re-auth automatically if the Kerberos session expired.

get_tenant_info

Tenant capabilities — auth realms, job history support, websocket URL.

Infrastructure

Tool

What it does

list_nodes

Nodepool nodes with state (ready, in-use, building), provider, and label. Includes state summary.

list_labels

Available nodepool labels — what node types jobs can request.

list_semaphores

Resource locks with current holders and max capacity. Check when jobs wait unexpectedly.

list_autoholds

Active autohold requests — nodes held after failure for debugging.

get_autohold

Full details of a specific autohold request — held nodes, timing, project/job.

list_providers

Nodepool cloud providers with flavors (VM sizes), images, and labels.

list_images

Nodepool disk images with build status and provider upload state.

list_system_events

System events — config updates, reconfigurations, pipeline changes. Useful for "why did my job stop running?"

get_badge

CI status badge URL (SVG) for a project — embeddable in READMEs with Markdown snippet.

get_connections

Configured source connections — Gerrit, GitHub, GitLab instances with driver and hostname.

get_components

System components — schedulers, executors, mergers, web servers with state and version.

Write Operations

Pipeline-affecting operations — disabled by default (ZUUL_READ_ONLY=true). Set ZUUL_READ_ONLY=false to enable. Requires auth token or Kerberos. Autohold management (create/delete) is always available since it doesn't affect running pipelines.

Tool

What it does

enqueue

Enqueue a change or ref into a pipeline. Supports both change-based (check/gate) and ref-based (periodic) enqueue.

promote

Promote changes to the top of a pipeline queue. Use for urgent fixes when gate has a long queue.

reenqueue_buildset

Re-enqueue a buildset — reads project/pipeline/ref from a previous buildset and enqueues it again.

dequeue

Remove a change or ref from a pipeline. Destructive.

autohold_create

Create an autohold request — hold nodes after failure for debugging. Not gated by ZUUL_READ_ONLY.

autohold_delete

Delete an autohold request. Not gated by ZUUL_READ_ONLY.

Test Results & Log Analysis

Tool

What it does

get_build_test_results

Parse JUnit XML test results. Discovers test files via zuul-manifest.json, returns structured pass/fail/skip counts with failure details. Works with tempest, tobiko, and any JUnit XML output.

get_build_anomalies

ML-based log anomaly detection via LogJuicer. Compares failed logs against successful baselines. Requires LOGJUICER_URL.

Prompts

Pre-built prompt templates that pre-load context and guide analysis:

Prompt

What it does

debug_build

Fetches build details + structured failures, checks for flaky signal from recent history, then guides root cause analysis.

compare_builds

Loads two builds side-by-side with inline failure data for differential analysis — "why did this start failing?"

check_change

Determines live pipeline status or latest results for a change, with appropriate next steps.

tenant_health

Assesses overall tenant health — components, config errors, and node pool status in one view.

diagnose_queue_delay

Diagnoses why jobs are queued or delayed — checks nodes, semaphores, and system state.

Resources

Browsable context that clients can attach to conversations without tool calls:

Resource

URI Pattern

Build details

zuul://{tenant}/build/{uuid}

Job configuration

zuul://{tenant}/job/{name}

Project configuration

zuul://{tenant}/project/{org}/{repo}

Setup

MCP client configuration

All clients use the same JSON structure. Add to your client's MCP config file:

Claude Code (~/.claude.jsonmcpServers):

{
  "mcpServers": {
    "zuul": {
      "command": "uvx",
      "args": ["mcp-zuul"],
      "env": {
        "ZUUL_URL": "https://softwarefactory-project.io/zuul",
        "ZUUL_DEFAULT_TENANT": "rdoproject.org"
      }
    }
  }
}

Claude Desktop (claude_desktop_config.json), Cursor (.cursor/mcp.json), and other MCP clients use the same format. GUI-based clients don't inherit your shell PATH - use the full path to uvx (run which uvx to find it).

Or via CLI:

claude mcp add zuul \
               -e ZUUL_URL=https://softwarefactory-project.io/zuul \
               -e ZUUL_DEFAULT_TENANT=rdoproject.org \
               -- uvx mcp-zuul

Environment variables

Variable

Required

Default

Description

ZUUL_URL

Yes

Zuul base URL (e.g. https://softwarefactory-project.io/zuul)

ZUUL_DEFAULT_TENANT

No

Default tenant (saves passing tenant on every call)

ZUUL_AUTH_TOKEN

No

Bearer token for authenticated instances

ZUUL_USE_KERBEROS

No

false

Enable Kerberos/SPNEGO authentication

ZUUL_TIMEOUT

No

30

HTTP timeout in seconds

ZUUL_VERIFY_SSL

No

true

SSL certificate verification

MCP_TRANSPORT

No

stdio

Transport: stdio, sse, or streamable-http

MCP_HOST

No

127.0.0.1

HTTP server bind address (non-stdio transports)

MCP_PORT

No

8000

HTTP server port (non-stdio transports)

ZUUL_ENABLED_TOOLS

No

Comma-separated list of tools to enable (disables all others)

ZUUL_DISABLED_TOOLS

No

Comma-separated list of tools to disable (mutually exclusive with above)

ZUUL_READ_ONLY

No

true

Set to false to enable pipeline-affecting write operations (enqueue, promote, dequeue, reenqueue_buildset). Autohold management (create/delete) is always available.

LOGJUICER_URL

No

LogJuicer base URL for ML-based log anomaly detection

Token authentication

Pass ZUUL_AUTH_TOKEN via host environment — never hardcode tokens in config files (visible in ps output):

export ZUUL_AUTH_TOKEN=<your-token>

For Docker, forward without a value to inherit from host:

"args": ["run", "-i", "--rm", "-e", "ZUUL_AUTH_TOKEN", "mcp-zuul"]

Kerberos / SPNEGO

For Zuul behind OIDC + Kerberos. Requires a valid Kerberos ticket (kinit) and the gssapi package.

Linux prerequisites - gssapi has no pre-built Linux wheels and must compile from source:

# Fedora/RHEL/CentOS
sudo dnf install krb5-devel python3-devel gcc

# Debian/Ubuntu
sudo apt install libkrb5-dev python3-dev gcc

macOS and Windows have pre-built wheels - no extra packages needed.

Then install with Kerberos support:

pip install mcp-zuul[kerberos]    # or: uvx --with "mcp-zuul[kerberos]" mcp-zuul

Via CLI:

claude mcp add -s user zuul-internal \
               -e ZUUL_URL=https://internal-zuul.example.com/zuul \
               -e ZUUL_DEFAULT_TENANT=my-tenant \
               -e ZUUL_USE_KERBEROS=true \
               -e ZUUL_VERIFY_SSL=false \
               -- uvx --with "mcp-zuul[kerberos]" mcp-zuul

Or via JSON config:

{
  "zuul-internal": {
    "command": "uvx",
    "args": ["--with", "mcp-zuul[kerberos]", "mcp-zuul"],
    "env": {
      "ZUUL_URL": "https://internal-zuul.example.com/zuul",
      "ZUUL_USE_KERBEROS": "true",
      "ZUUL_VERIFY_SSL": "false"
    }
  }
}

For Docker, mount the Kerberos ticket cache:

docker run -i --rm \
  -v /etc/krb5.conf:/etc/krb5.conf:ro \
  -v /tmp/krb5cc_$(id -u):/tmp/krb5cc_$(id -u):ro \
  -e KRB5CCNAME=/tmp/krb5cc_$(id -u) \
  -e ZUUL_URL=https://internal-zuul.example.com/zuul \
  -e ZUUL_USE_KERBEROS=true \
  mcp-zuul

Multiple instances

Add separate entries per Zuul instance:

{
  "mcpServers": {
    "zuul-rdo": {
      "command": "uvx", "args": ["mcp-zuul"],
      "env": { "ZUUL_URL": "https://softwarefactory-project.io/zuul", "ZUUL_DEFAULT_TENANT": "rdoproject.org" }
    },
    "zuul-internal": {
      "command": "mcp-zuul",
      "env": { "ZUUL_URL": "https://internal.example.com/zuul", "ZUUL_USE_KERBEROS": "true" }
    }
  }
}

Troubleshooting

krb5-config: not found or Python.h: No such file when installing mcp-zuul[kerberos] on Linux:

gssapi has no pre-built Linux wheels - it compiles from source. Install system packages first:

# Fedora/RHEL/CentOS
sudo dnf install krb5-devel python3-devel gcc

# Debian/Ubuntu
sudo apt install libkrb5-dev python3-dev gcc

uvx: command not found in Cursor or Claude Desktop:

GUI-based MCP clients don't inherit your shell PATH. Use the full path to uvx:

which uvx    # find the path, e.g. /usr/bin/uvx or ~/.local/bin/uvx

Then use that absolute path as command in your MCP config:

"command": "/usr/bin/uvx"

Permission errors on ~/.local/share/uv/:

If uv was previously run with sudo, the cache directory may be root-owned:

sudo chown -R $(whoami) ~/.local/share/uv/

Usage Examples

Debug a build failure

"Why did the latest build of my-project fail?"

list_builds(project="my-project", result="FAILURE", limit=1)get_build_failures(uuid="...") → root cause with task name, error, and return code.

Deep-dive into logs

"The structured data says 'non-zero return code' but no error detail.
 Check the ci_script logs."

browse_build_logs(uuid="...", path="controller/ci-framework-data/logs/") → finds ci_script_008_run.logget_build_log(uuid="...", log_name="controller/ci-framework-data/logs/ci_script_008_run.log", grep="error|timed out|Error 1", context=2) → exact error with surrounding context.

Navigate to a specific error

"Show me lines 6478-6484 of the job output"

get_build_log(uuid="...", start_line=6478, end_line=6484) → exactly those 7 lines.

Check live pipeline status

"Is change 54321 in any pipeline?"

get_change_status(change="54321") → live jobs with elapsed times and ETA, or latest completed buildset if not in pipeline.

Compare build results across a pipeline

"Show me all builds from the latest buildset"

list_builds to get buildset_uuidget_buildset(uuid="...") → all sibling builds with results and durations.

Paste a Zuul URL directly

"What went wrong with this build?
 https://zuul.example.com/t/tenant/build/abc123def"

get_build_failures(url="https://zuul.example.com/t/tenant/build/abc123def") → tenant and UUID auto-extracted.

Debug why a job isn't running

"My project's check pipeline seems broken — jobs aren't triggering"

get_config_errors(project="org/my-project") → configuration errors, missing refs, or repo access issues.

Check node availability

"Jobs are stuck in queue — are there nodes available?"

list_nodes() → node states with by_state summary → list_labels() → available node types.

Detect flaky jobs

"Is this job flaky? It keeps failing intermittently"

find_flaky_jobs(job_name="my-deploy-job", limit=30) → pass/fail stats, failure rate, flaky=true/false.

See what jobs run for a project

"What jobs are configured for openstack-operator in the check pipeline?"

get_freeze_jobs(pipeline="check", project="openstack-k8s-operators/openstack-operator") → resolved job graph with dependencies.

Quick log tail

"Show me the last 30 lines of the build log"

tail_build_log(uuid="...", lines=30) → just the tail, minimal tokens.

What nodeset does my job use after inheritance?

"What nodeset and playbooks will deploy-job actually use?"

get_freeze_job(pipeline="check", project="org/repo", job_name="deploy-job") → resolved nodeset, playbooks, variables, timeout after all parent inheritance.

Development

git clone https://github.com/imatza-rh/mcp-zuul.git
cd mcp-zuul
uv sync --extra dev

# Run locally
ZUUL_URL=https://softwarefactory-project.io/zuul uv run mcp-zuul

# Run tests
uv run pytest tests/ -v

# Lint and format
uv run ruff check src/ tests/
uv run ruff format --check src/ tests/

# Type check
uv run mypy src/mcp_zuul/

# Build Docker image
docker build -t mcp-zuul .

Architecture

MCP Client (Claude Code, Cursor, etc.)
    │
    ▼
┌──────────────────────────────────────────────────┐
│  src/mcp_zuul/                                   │
│                                                  │
│  server.py       MCPServer instance               │
│  config.py       env vars, transport, filtering  │
│  auth.py         Kerberos/SPNEGO + OIDC          │
│  errors.py       @handle_errors decorator        │
├──────────────────────────────────────────────────┤
│  tools/          48 tools across 8 submodules    │
│  prompts.py      5 prompt templates              │
│  resources.py    3 zuul:// resources             │
├──────────────────────────────────────────────────┤
│  helpers.py      API client, URL parsing         │
│  formatters.py   token-efficient output          │
│  parsers.py      Ansible/JUnit/log parsing       │
│  classifier.py   failure classification          │
├──────────────────────────────────────────────────┤
│  httpx clients   API (auth) + logs (no auth)     │
└────────┬─────────────────────────┬───────────────┘
         ▼                         ▼
    Zuul REST API           Log file hosts

See CLAUDE.md for full architecture details.

Listings

Contributing

Contributions welcome. Please open an issue first to discuss significant changes.

# Fork, clone, and install dev dependencies
uv sync --extra dev

# Make changes, then verify
uv run pytest tests/ -v
uv run ruff check src/ tests/
uv run ruff format src/ tests/
uv run mypy src/mcp_zuul/

License

Apache-2.0

Available Tools

44 tools
autohold_createCreate AutoholdA
Idempotent

Create an autohold request — hold nodes after a job failure for debugging.

Requires ZUUL_READ_ONLY=false.

Args: project: Project name (e.g. "org/repo") job: Job name to hold nodes for tenant: Tenant (default from env) reason: Why the hold is needed count: Failed builds to hold (default 1) node_hold_expiration: Seconds to hold nodes (default 86400 = 24h) change: Change filter (optional) ref: Ref filter (optional)

ParametersJSON Schema
NameRequiredDescriptionDefault
jobYes
refNo
countNo
changeNo
reasonNo
tenantNo
projectYes
node_hold_expirationNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false and destructiveHint=false; the description aligns with these and adds valuable context beyond them — the ZUUL_READ_ONLY=false environment requirement is a key behavioral constraint not captured in annotations. No contradiction between description and annotations; the description augments the safety profile with an operational prerequisite.

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 appropriately sized and well-organized: a front-loaded purpose sentence, a one-line prerequisite, then a clean Args list. Every line earns its place — no filler, no repetition of schema fields, and the parameter list is structured for easy scanning.

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 8-parameter mutation tool with an output schema present, the description is complete: it covers purpose, environmental requirements, and every parameter's semantics, defaults, and optionality. The output schema handles return values, so no additional description of results is needed.

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 fully compensates by documenting all 8 parameters with semantics ('project: Project name (e.g. org/repo)'), defaults ('count: Failed builds to hold (default 1)'), units ('node_hold_expiration: Seconds... default 86400 = 24h'), and optionality ('change: Change filter (optional)'). This adds substantial meaning beyond the bare schema.

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

Purpose5/5

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

The description states a specific verb+resource ('Create an autohold request') with the precise purpose: 'hold nodes after a job failure for debugging.' This clearly distinguishes it from siblings like autohold_delete, list_autoholds, and get_autohold, which serve different lifecycle actions on the same resource.

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 conveys when to use the tool ('after a job failure for debugging') and states a critical precondition ('Requires ZUUL_READ_ONLY=false'). It names the context clearly but doesn't explicitly exclude alternatives (e.g., viewing existing holds via list_autoholds), though the create-vs-read distinction is fairly implicit.

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

autohold_deleteDelete AutoholdA
DestructiveIdempotent

Delete an autohold request.

Requires ZUUL_READ_ONLY=false.

Args: autohold_id: Autohold request ID (from list_autoholds) tenant: Tenant (default from env)

ParametersJSON Schema
NameRequiredDescriptionDefault
tenantNo
autohold_idYes

Output Schema

ParametersJSON 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 destructiveHint=true and readOnlyHint=false. The description adds valuable context by requiring ZUUL_READ_ONLY=false for write access and specifying that autohold_id should be obtained from list_autoholds. This clarifies operational prerequisites and dependencies 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?

The description is extremely concise and well-structured: a single-line purpose, a requirement, and a clean argument list. Every sentence adds essential value with no filler or 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 simple delete operation with two parameters and an output schema, the description covers all necessary invocation details: purpose, prerequisite, and parameter sources. The destructive nature is already captured by annotations, making this sufficiently complete for an agent to use correctly.

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

Parameters4/5

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

Schema description coverage is 0%, so the description carries the full burden for parameter semantics. It explains autohold_id as the ID from list_autoholds and notes that tenant defaults from the environment, adding meaningful guidance beyond the schema's bare type definitions.

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 'Delete an autohold request' with a specific verb and resource, distinguishing it from sibling tools like autohold_create and list_autoholds. The purpose is unambiguous and action-oriented.

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 explicit guidance on when to use this tool versus alternatives. It mentions a prerequisite (ZUUL_READ_ONLY=false) but does not provide context for when deletion is appropriate or when to prefer other autohold-related tools.

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

batch_diagnoseBatch Diagnose BuildsA
Read-onlyIdempotent

Classify multiple failed builds in one call — returns a triage table.

Runs diagnose_build(brief=True) in parallel for each UUID and returns a compact classification summary. Use instead of calling diagnose_build N times when triaging multiple failures.

Args: uuids: List of build UUIDs to diagnose (max 20) tenant: Tenant (default from env)

ParametersJSON Schema
NameRequiredDescriptionDefault
uuidsYes
tenantNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description goes further by revealing that the tool runs diagnose_build(brief=True) in parallel, returns a compact classification summary, and enforces a max of 20 UUIDs. This adds behavior context beyond the annotations, but it does not discuss error handling or partial failure behavior, which would be valuable.

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 tightly structured: it opens with the core purpose, then explains the execution model, then gives usage alternatives, and finishes with an Args list. Every sentence earns its place, and the content is front-loaded. No padding or redundant statements.

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 batch nature and the availability of an output schema, the description covers all essential context: what it does, how it works, when to use it, parameter constraints, and return style. The presence of an output schema means detailed return field documentation is unnecessary here. The description is complete for selecting and invoking this tool correctly.

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

Parameters4/5

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

Schema description coverage is 0%, so the description must carry parameter semantics. It does so effectively: 'uuids: List of build UUIDs to diagnose (max 20)' and 'tenant: Tenant (default from env)' add constraints and defaults not present in the raw schema. This provides actionable meaning for both parameters, though it could be slightly richer (e.g., UUID format hints).

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: 'Classify multiple failed builds in one call — returns a triage table.' It clearly distinguishes from the sibling diagnose_build by stating 'Use instead of calling diagnose_build N times when triaging multiple failures.' This explicitly identifies the tool's unique role in the batch context.

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 provides explicit usage guidance: 'Use instead of calling diagnose_build N times when triaging multiple failures.' It also explains the mechanism (runs diagnose_build(brief=True) in parallel) and implies the single-build alternative is diagnose_build, giving clear context for selection.

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

browse_build_logsBrowse Log FilesA
Read-onlyIdempotent

Browse or fetch files from a build's log directory.

Without path: lists top-level. With trailing '/': lists subdirectory. With file path: fetches content (max 512KB). For filtered reads, use get_build_log with grep instead.

Args: uuid: Build UUID tenant: Tenant (default from env) path: Relative path within the log dir (e.g. "logs/controller/") url: Zuul build URL (alternative to uuid + tenant) max_lines: Limit file content to first N lines (0 = no limit) direct_log_url: Log URL from a prior call. Skips build metadata fetch.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNo
pathNo
uuidNo
tenantNo
max_linesNo
direct_log_urlNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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

Discloses important behaviors beyond annotations: path semantics (no path lists top-level, trailing '/' lists subdir, file path fetches content), a 512KB size limit, max_lines behavior, and direct_log_url skipping build metadata fetch. These details are essential for correct invocation.

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 well-structured: a one-sentence overview, a short mode breakdown, and a bulleted Args list. Every sentence provides necessary information 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 all functional modes, parameter semantics, size limits, and alternatives. With an output schema present, return values are already specified, so the description is complete for tool selection and invocation.

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 explains every parameter (uuid, tenant, path, url, max_lines, direct_log_url) with concrete meaning and example format. It fully compensates for the schema's lack of description and adds practical context.

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

Purpose5/5

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

The description opens with a specific verb-resource pair: 'Browse or fetch files from a build's log directory.' It clearly explains the three modes (top-level listing, subdirectory listing, file content fetch) and distinguishes itself from get_build_log by mentioning it as an alternative for filtered reads.

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 when to use get_build_log instead for filtered reads, and provides usage patterns for path handling and direct_log_url. It does not exhaustively cover all sibling alternatives, but the guidance is clear and practical.

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

check_healthHealth CheckA
Read-onlyIdempotent

Test Zuul API connectivity and auth status.

Use this to verify the server is reachable. Re-auth happens automatically via Kerberos if the session expired.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

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 idempotentHint=true, indicating a safe, idempotent operation. The description adds useful behavioral context: 'Re-auth happens automatically via Kerberos if the session expired.' This goes beyond the annotations and provides insight into session management, which is valuable for the agent.

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: two short sentences in total, front-loaded with the primary purpose. Every sentence adds value—the first states the function, the second provides usage context and an important behavioral detail. No filler or redundant text.

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 (zero parameters) and the presence of an output schema, the description is complete. It covers the purpose, usage, and an important behavioral trait (auto re-auth). There is no missing info that would impede an agent from selecting or invoking the tool correctly.

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

Parameters4/5

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

The tool has zero parameters, so there is no parameter info to explain. Per the rubric, a baseline of 4 is appropriate for zero-parameter tools. The description does not need to describe parameters, and the schema coverage is 100% (vacuously).

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

Purpose5/5

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

The description clearly states the tool's function: 'Test Zuul API connectivity and auth status.' This is a specific verb+resource combination that distinguishes it from sibling tools like list/get operations. The title 'Health Check' also reinforces the purpose, making it unambiguous.

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 when to use the tool: 'Use this to verify the server is reachable.' This is sufficient for a health check tool, though it does not explicitly mention alternatives. However, given the unique purpose and context signals, no exclusions are necessary.

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

diagnose_and_testDiagnose with TestsA
Read-onlyIdempotent

One-call diagnosis + test results — combines diagnose_build and get_build_test_results.

Fetches build metadata once, then runs failure analysis and JUnit test parsing in parallel. Saves a round-trip vs calling both tools separately.

Args: uuid: Build UUID tenant: Tenant (default from env) url: Zuul build URL (alternative to uuid + tenant) brief: Brief diagnosis (default true). Set false for full failure details.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNo
uuidNo
briefNo
tenantNo

Output Schema

ParametersJSON 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 readOnly, idempotent, and non-destructive. The description adds operational detail: 'fetches build metadata once' and runs failure analysis and JUnit test parsing 'in parallel'. This goes beyond the annotations by revealing internal execution and efficiency, though it doesn't cover error handling or 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?

The description is succinct: a two-line pitch, a short behavior sentence, and a clear arg list. It front-loads the purpose and avoids fluff. Every sentence earns its place.

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

Completeness4/5

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

Given the tool's medium complexity (combination of two operations), the description covers behavior, parameters, and rationale. It doesn't discuss what happens when both uuid and url are provided or neither, but the existence of an output schema reduces the need to detail return values. Overall, sufficient for an agent to invoke correctly.

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

Parameters4/5

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

With 0% schema description coverage, the description compensates by listing all four args with meaning: uuid, tenant, url (as alternative), and brief (with default and effect). This adds value beyond the bare parameter names in the schema, though some descriptions (e.g., 'uuid: Build UUID') are minimally informative.

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 'combines diagnose_build and get_build_test_results' to provide 'One-call diagnosis + test results'. This specific verb+resource pairing distinguishes it from siblings like diagnose_build, get_build_test_results, and get_build_failures.

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 explicitly notes this tool 'Saves a round-trip vs calling both tools separately', giving clear when-to-use guidance. It doesn't explicitly exclude use cases like 'if you only need one result, use the individual tool', but the combined-purpose framing implies it. The alt-parameter option (url vs uuid+tenant) adds useful context.

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

diagnose_buildDiagnose Build FailureA
Read-onlyIdempotent

One-call failure diagnosis — structured failures + relevant log context.

Combines get_build_failures (which task failed, error message) with targeted log grep (surrounding context from job-output.txt). Returns everything needed to understand a failure in a single call.

Use this instead of calling get_build_failures + get_build_log separately.

Args: uuid: Build UUID tenant: Tenant (default from env) url: Zuul build URL (alternative to uuid + tenant) brief: Return only classification + root cause (default false). Omits playbooks, log_context, and full task details for ~95% smaller response.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNo
uuidNo
briefNo
tenantNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

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

While annotations already declare the tool as read-only and non-destructive, the description adds valuable context about the composite behavior (merging failure info with log grep) and the brief mode's omission of playbooks/log_context/full task details. It does not over-explain, and no contradictions exist.

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 well-structured, front-loading the core value proposition followed by a clear parameter list. Every sentence contributes to understanding, and there is no redundant or filler content.

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

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 and annotations convey safety, the description covers the main return content and behavior modes well. It could briefly mention handling of errors or when to prefer batch_diagnose for multiple builds, but these are minor gaps in an otherwise complete context.

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?

The schema has zero descriptions, so the description fully compensates by explaining each parameter: uuid, tenant, url (as alternative to uuid+tenant), and brief (with effect on response size). This is exactly the kind of semantic enrichment needed for schema-sparse tools.

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 identifies the tool as a one-call failure diagnosis combining failure classification with log context. It explicitly distinguishes itself from siblings get_build_failures and get_build_log, making its purpose and scope unambiguous.

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

Usage Guidelines5/5

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

It explicitly says 'Use this instead of calling get_build_failures + get_build_log separately,' providing direct guidance on choosing this over alternatives. The mention of the 'brief' mode for smaller responses also helps users pick the right option based on needs.

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

find_flaky_jobsFlaky Job DetectionA
Read-onlyIdempotent

Detect flaky jobs by analyzing recent build history for intermittent failures.

Computes pass/fail statistics from recent builds. A job with mixed results and >20% failure rate is likely flaky.

Args: job_name: Job name to analyze tenant: Tenant (default from env) project: Project filter pipeline: Pipeline filter limit: Builds to analyze (default 20, max 100) detail: Include individual build list (default false)

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
detailNo
tenantNo
projectNo
job_nameYes
pipelineNo

Output Schema

ParametersJSON 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, idempotentHint=true, and destructiveHint=false. The description adds context by explaining the analysis methodology (computes pass/fail statistics, threshold for flaky) and parameter behaviors like limit max and tenant default, which goes beyond the structured 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 well-structured with a clear one-sentence summary, a brief paragraph on the detection logic, and a numbered Args list. It is a bit verbose due to the parameter details, but every sentence serves a purpose and is easy to scan.

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 that the tool has an output schema, the description does not need to explain return values. It covers the purpose, methodology, all input parameters with semantics, and acknowledges defaults/limits. It does not list prerequisites or when not to use, but for a read-only analysis tool, it is sufficiently complete.

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

Parameters5/5

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

Schema description coverage is 0%, and the description fully compensates by providing meaningful explanations for each parameter: job_name, tenant, project, pipeline, limit, and detail. It clarifies defaults, filters, and what the detail flag does, adding value beyond the raw 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 tool's purpose: 'Detect flaky jobs by analyzing recent build history for intermittent failures.' It uses a specific verb ('detect') and resource ('flaky jobs'), and the method is described. This distinguishes it from sibling tools like get_job or get_build.

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 what the tool does and even provides a criterion (>20% failure rate), but it does not explicitly state when to use this tool over alternatives or mention any exclusions. Usage is implied rather than directly contrasted with siblings.

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

get_autoholdAutohold DetailsA
Read-onlyIdempotent

Get details of a specific autohold request.

Args: autohold_id: Autohold request ID (from list_autoholds) tenant: Tenant (default from env)

ParametersJSON Schema
NameRequiredDescriptionDefault
tenantNo
autohold_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, so the description adds no extra context beyond that. It is consistent with annotations, but it does not disclose additional behavioral traits like error handling or response specifics.

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 brief and front-loaded with the core action, followed by a compact Args list. Every sentence serves a purpose, with no redundant or irrelevant 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 simple get-by-ID tool with an output schema present, the description provides sufficient context. The annotations cover safety, the Args cover parameters, and the 'from list_autoholds' hint supplies workflow context, making the tool fully usable.

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?

The input schema has no property descriptions (coverage 0%), but the description's 'Args' section fully compensates by explaining both parameters: autohold_id's source and tenant's default-from-env behavior. This adds clear 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?

The description uses a specific verb ('Get details') and a clear resource ('specific autohold request'), distinguishing it from sibling tools like list_autoholds. The title 'Autohold Details' reinforces the tool's unique focus.

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

Usage Guidelines3/5

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

The description implies usage context by noting that autohold_id comes from list_autoholds, but it does not explicitly state when to use this tool versus alternatives or mention any exclusions. The guidance is minimal and implied rather than direct.

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

get_badgeProject BadgeA
Read-onlyIdempotent

Get a status badge URL (SVG) for a project's latest buildset result.

Args: project: Project name (e.g. "org/repo") tenant: Tenant (default from env) pipeline: Pipeline filter branch: Branch filter

ParametersJSON Schema
NameRequiredDescriptionDefault
branchNo
tenantNo
projectYes
pipelineNo

Output Schema

ParametersJSON 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 readOnly, idempotent, and non-destructive hints. The description adds useful behavioral context: the output is an SVG URL, it reflects the latest buildset result, and the tenant parameter defaults from the environment. This goes beyond the annotation hints.

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 exceptionally concise: one purpose sentence followed by a structured arguments list. Every sentence earns its place with relevant details, and the purpose is front-loaded.

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 only needs to cover purpose and parameters, which it does adequately. Minor ambiguity around the exact semantics of pipeline/branch filters remains, but the tool is simple enough that the provided details are sufficient for correct invocation.

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?

The schema has 0% description coverage, so the description must compensate. It does: project includes an example format ('org/repo'), tenant notes the env default, and pipeline/branch are described as filters. While 'filter' is somewhat vague, the added context clearly aids 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?

The description clearly states 'Get a status badge URL (SVG) for a project's latest buildset result' – a specific verb (get), resource (badge URL), and scope (latest buildset). This distinguishes it from sibling tools like get_build or get_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?

The description gives no explicit guidance on when to use this tool vs alternatives, nor does it mention exclusions. The intended use is implied by the purpose (obtaining badge URLs), but no comparison to similar status tools is provided.

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

get_buildBuild DetailsA
Read-onlyIdempotent

Get build details — log URL, nodeset, artifacts, timing, error detail.

Args: uuid: Build UUID (full or prefix from list_builds) tenant: Tenant (default from env) url: Zuul build URL (alternative to uuid + tenant) brief: Compact response with just uuid, job, result, pipeline, duration (default false)

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNo
uuidNo
briefNo
tenantNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

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 idempotentHint=true, so the safety profile is covered. The description adds what specific details are returned (log URL, nodeset, artifacts, etc.) and the effect of the 'brief' flag, providing some value beyond annotations. No contradiction is present.

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

Conciseness5/5

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

The description is concise, with a clear one-line purpose then a structured Args list. Every sentence adds value—no filler or repetition. It is front-loaded with the main 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 is a simple read-only getter with an output schema and strong annotations, the description covers all essentials: what it returns, all parameter semantics, and the brief option. It does not need to explain return format because the output schema exists.

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

Parameters5/5

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

Schema description coverage is 0%, so the description must fully explain parameters. It does so effectively: uuid explains full or prefix from list_builds, tenant notes default from env, url explains alternative to uuid+tenant, and brief specifies the compact response fields. Each parameter's meaning and usage is clarified.

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

Purpose5/5

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

The description clearly states the tool retrieves build details and lists specific items (log URL, nodeset, artifacts, timing, error detail). It distinguishes from siblings like list_builds (which lists builds) and get_build_failures (specifically failures). The verb 'Get' and resource 'build' are 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?

The description provides some usage context by explaining that uuid comes from list_builds and that url is an alternative to uuid+tenant. However, it does not explicitly state when to use this tool over alternatives like get_build_log or get_build_failures. The 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.

get_build_anomaliesLog Anomaly DetectionA
Read-onlyIdempotent

Detect anomalous log lines using LogJuicer ML-based analysis.

Requires LOGJUICER_URL to be configured.

Args: uuid: Build UUID tenant: Tenant (default from env) url: Zuul build URL (alternative to uuid + tenant)

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNo
uuidNo
tenantNo

Output Schema

ParametersJSON 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 and idempotentHint, so safety is clear. The description adds valuable context by noting the LOGJUICER_URL configuration requirement and the parameter alternatives (url vs uuid+tenant), going beyond the annotations without contradicting them.

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 and well-structured: a one-sentence purpose, a requirement line, and a clean Args list with no redundant text. Every sentence earns its place.

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

Completeness4/5

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

With an output schema present, the description needn't explain return values. It covers the essential context: purpose, environment requirement, and parameter semantics. It lacks some usage scenarios, but for a simple tool, the essentials are covered.

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

Parameters5/5

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

Schema coverage is 0%, so the description must compensate, and it does excellently. It explains each parameter (uuid as build ID, tenant with env default, url as alternative to uuid+tenant), providing meaning and relationships not present 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?

The description clearly states the tool detects anomalous log lines using LogJuicer ML-based analysis. This is specific and distinguishes it from sibling tools like get_build_log or get_build_failures, which focus on raw logs or failures rather than ML-driven anomaly detection.

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

Usage Guidelines3/5

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

The description implies usage for anomaly detection but does not explicitly state when to use this tool over alternatives or provide exclusions. It mentions a prerequisite (LOGJUICER_URL) but lacks clear guidance on selection among sibling tools.

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

get_build_failuresBuild Failure AnalysisA
Read-onlyIdempotent

Analyze a failed build — which task failed, on which host, with error message.

Parses job-output.json for precise failure data. Prefer diagnose_build for most use cases (adds classification and log context).

Args: uuid: Build UUID tenant: Tenant (default from env) url: Zuul build URL (alternative to uuid + tenant)

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNo
uuidNo
tenantNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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

The annotations already declare readOnlyIntent and idempotent behavior, and the description goes beyond this by revealing that it parses job-output.json and returns precise failure data (task, host, error). It also distinguishes its behavior from diagnose_build, providing useful context about what it does not do (classification/log context).

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 and well-structured. It opens with a clear purpose statement, follows with the parsing behavior and sibling alternative, then lists parameters. Every sentence adds value with no redundancy or fluff.

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 explain return values. It covers the core purpose, the specific data source (job-output.json), and parameter semantics. The only minor gap is the lack of explicit mention of behavior when no failures are found, but given the output schema and annotations, this is 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?

The input schema has no parameter descriptions (0% coverage), but the description includes an Args section that explains each parameter: uuid, tenant (with default from env), and url (as an alternative to uuid+tenant). This compensates well for the schema's lack of detail, though it could be more elaborate with format or precedence rules.

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

Purpose5/5

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

The description clearly states the tool analyzes a failed build and identifies which task failed, on which host, with the error message. It also distinguishes itself from the sibling tool diagnose_build by noting it provides raw failure data, making its unique role 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?

The description explicitly recommends diagnose_build for most use cases, citing that it adds classification and log context, which gives the agent a clear alternative. However, it does not specify the exact scenarios where get_build_failures should be chosen instead, so the guidance is slightly incomplete.

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

get_build_logRead Build LogA
Read-onlyIdempotent

Read, search, and navigate build log files with grep, line ranges, and error summary.

Args: uuid: Build UUID tenant: Tenant (default from env) log_name: Log file to read (default "job-output.txt") mode: "summary" (tail + errors), "errors" (errors only, no tail), or "full" (paginated) lines: For summary: tail count (default 50). For full: offset start line. start_line: Read from this line (1-based, overrides mode with end_line) end_line: Read up to this line (1-based, inclusive) grep: Regex to filter lines (overrides mode). Use | for OR. context: Lines of context around grep matches (default 0, max 10) url: Zuul build URL (alternative to uuid + tenant) direct_log_url: Log URL from a prior get_build/diagnose_build call. Skips the build metadata fetch when provided. max_matches: Max grep matches to return (default 50, max 200) filter_noise: Filter out noise lines (failed=0, RETRYING) from grep results (default true)

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNo
grepNo
modeNosummary
uuidNo
linesNo
tenantNo
contextNo
end_lineNo
log_nameNojob-output.txt
start_lineNo
max_matchesNo
filter_noiseNo
direct_log_urlNo

Output Schema

ParametersJSON 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 read-only and idempotent behavior, and the description adds substantial behavioral detail: mode semantics, grep overload behavior, context limits, max matches, noise filtering, and the direct_log_url optimization that skips metadata fetching. 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 well-structured with a front-loaded summary followed by a concise Arg list. Each parameter line earns its place by explaining defaults, limits, or behavior. For a tool with 13 parameters, it is appropriately sized and easy to scan.

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

Completeness5/5

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

Given the tool's complexity (13 params, 0% schema coverage) and the existence of an output schema, the description covers all necessary invocation details: parameter meanings, defaults, modes, overrides, and alternate input methods. It is complete enough for an agent to select and invoke the tool correctly.

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

Parameters5/5

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

The input schema has 0% description coverage, so the description fully compensates by documenting all 13 parameters with defaults, allowed ranges, mode interpretations, and interaction rules (e.g., start_line overrides mode, grep overrides mode). This is far beyond what the schema provides.

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

Purpose5/5

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

The description clearly states the tool's purpose: 'Read, search, and navigate build log files with grep, line ranges, and error summary.' It uses specific verbs and identifies the resource (build logs), while the mention of grep and error summary differentiates it from sibling tools like tail_build_log or stream_build_console.

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 by explaining modes, parameter overrides, and the direct_log_url shortcut from prior calls. However, it doesn't explicitly state when not to use this tool or name alternative tools, so it lacks explicit when-not/alternatives guidance.

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

get_buildsetBuildset DetailsA
Read-onlyIdempotent

Get buildset details — result, pipeline, project, change.

Brief (default): compact metadata only. Set brief=False for full details with builds, events, and timing.

Args: uuid: Buildset UUID tenant: Tenant (default from env) url: Zuul buildset URL (alternative to uuid + tenant) brief: Compact response (default true). Set false for full timing/events.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNo
uuidNo
briefNo
tenantNo

Output Schema

ParametersJSON 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 mark readOnlyHint, openWorldHint, idempotentHint, and non-destructive, so the bar is lower. The description adds behavioral context beyond annotations by explaining that brief returns compact metadata while brief=False returns builds, events, and timing, and that url can be used instead of uuid+tenant. It does not contradict any 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?

The description is appropriately sized and well-structured: a one-line summary, a concise note on the brief flag, and a simple Args list. Every sentence earns its place without redundancy, making it easy to scan.

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

Completeness5/5

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

Since an output schema exists to describe return values, the description need not explain them. It adequately covers all input parameters, defaults, and the two identifier modes, providing enough information for an agent to invoke the tool correctly and understand response size trade-offs.

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

Parameters5/5

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

Schema description coverage is 0%, so the description must fully compensate. It lists all four parameters (uuid, tenant, url, brief) with clear semantics: uuid and tenant for direct lookup, url as an alternative identifier, and brief with its effect on response detail. This adds meaning far beyond the schema's bare parameter titles.

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 'Get buildset details — result, pipeline, project, change,' which clearly specifies the action (get) and resource (buildset) and lists key contents. It distinguishes from siblings like list_buildsets by focusing on a single buildset, and from get_build by targeting the buildset level.

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 brief parameter's default and how to get full details with brief=False, which is helpful for response size. However, it does not explicitly state when to use this tool over alternatives like get_build or list_buildsets; the usage context is implied by the resource name rather than stated.

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

get_build_test_resultsTest ResultsA
Read-onlyIdempotent

Parse JUnit XML test results from a build's log directory.

Discovers test result files via zuul-manifest.json. Works with tempest, tobiko, and any JUnit XML output.

Args: uuid: Build UUID tenant: Tenant (default from env) url: Zuul build URL (alternative to uuid + tenant) failures_only: Only return suites with failures (default true)

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNo
uuidNo
tenantNo
failures_onlyNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is known. The description adds useful behavioral context: it discovers files via zuul-manifest.json and supports specific test formats, which goes beyond the basic 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 well-structured: it leads with the core purpose, then provides discovery context and accepted formats, and ends with a concise Args list. Every sentence adds value without fluff.

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

Completeness5/5

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

The description covers the tool's scope (JUnit XML parsing), discovery mechanism, supported formats, and parameter semantics. An output schema exists, so explaining the return structure is handled externally. The description is complete for a read-only test-result fetch tool.

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

Parameters5/5

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

Schema description coverage is 0%, but the description fully compensates by clearly documenting each parameter: uuid, tenant, url (alternative to uuid+tenant), and failures_only (default true). This adds meaning beyond the raw schema definitions.

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

Purpose5/5

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

The description clearly states the tool's purpose: 'Parse JUnit XML test results from a build's log directory.' This uses a specific verb ('parse') and resource ('test results from a build's log directory'), and distinguishes it from sibling tools like get_build_log or get_build_failures.

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 when to use the tool: it discovers test files via zuul-manifest.json and supports tempest, tobiko, and any JUnit XML output. It does not explicitly name alternatives or exclusions, but the context is sufficient to infer this is for fetching test results from builds.

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

get_build_timesBuild Duration TrendsA
Read-onlyIdempotent

Build duration trends — compute avg/min/max to detect performance regressions.

Returns ALL results (no result filtering). For SUCCESS-only averages, use get_job_durations instead.

Args: tenant: Tenant (default from env) job_name: Job name filter project: Project filter pipeline: Pipeline filter branch: Branch filter limit: Max results, 1-100 (default 20) skip: Pagination offset detail: Include individual build list (default true)

ParametersJSON Schema
NameRequiredDescriptionDefault
skipNo
limitNo
branchNo
detailNo
tenantNo
projectNo
job_nameNo
pipelineNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint: false. The description adds valuable behavioral context beyond these: it returns ALL results (no result filtering), and the 'detail' parameter controls whether an individual build list is included. This goes beyond what annotations provide, though it doesn't discuss pagination behavior or performance implications.

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 and well-structured: a one-sentence purpose, a clear note about result filtering with sibling alternative, then a compact Args list. Every sentence adds value, and the formatting makes key details easy to scan.

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

Completeness5/5

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

Given the tool's moderate complexity (8 optional parameters) and strong annotations, the description fully covers usage context: what it does, when to use it, key behavioral traits (all results, filters, pagination), and parameter meanings. Output schema is present, so return-value details are not needed in the description.

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

Parameters4/5

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

Schema coverage is 0%, and the description compensates by listing all 8 parameters with helpful semantics: tenant default comes from env, limit is 'Max results, 1-100 (default 20)', detail includes 'individual build list'. This adds meaning beyond the bare schema titles and defaults, though some parameters (branch, project, pipeline) are only described as 'filter' without deep 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?

Description clearly states the tool computes build duration trends (avg/min/max) to detect performance regressions, using a specific verb and resource. It further distinguishes itself from the sibling get_job_durations by noting it returns ALL results with no filtering, making its purpose unique.

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 states when to use this tool (detect performance regressions) and provides a direct alternative: 'For SUCCESS-only averages, use get_job_durations instead.' Also clarifies that it returns all results (no result filtering), guiding the agent away from inappropriate use.

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

get_change_statusChange StatusA
Read-onlyIdempotent

Pipeline status for a specific change or PR/MR.

When in pipeline: live status with jobs, elapsed times, buildset UUID. When not in pipeline: fetches latest completed buildset automatically.

Args: change: Change number, GitHub ref (refs/pull/N/head), or GitLab ref tenant: Tenant (default from env) url: Zuul change status URL (alternative to change + tenant) brief: Strip to monitoring essentials (~50% smaller). Use for repeated polls.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNo
briefNo
changeNo
tenantNo

Output Schema

ParametersJSON 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 indicate read-only, idempotent, non-destructive behavior. The description adds real value by disclosing that it automatically fetches the latest completed buildset when not in the pipeline, shows live status with jobs/elapsed time/buildset UUID, and can reduce output size with `brief`. No contradiction with 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?

The description is compact, front-loaded with the core purpose, and then uses a scannable Args block. Every sentence contributes meaningful information: state-dependent behavior, parameter meaning, defaults, alternatives, and recommended polling mode. There is no fluff 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?

Given the rich annotations, 4 simple parameters, and presence of an output schema, the description covers the main invocation modes well. The only slight gap is that it never explicitly tells the agent that one of `change` or `url` must be supplied, while the schema marks all parameters as optional.

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?

Although the input schema has 0% parameter description coverage, the Args section fully documents all four parameters: accepted formats for `change`, default behavior for `tenant`, `url` as an alternative to change+tenant, and the purpose of `brief`. This completely compensates for the empty schema descriptions.

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

Purpose5/5

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

The description clearly states "Pipeline status for a specific change or PR/MR," which is an unambiguous verb+resource+scope definition. It also distinguishes itself from generic status tools by explaining live status vs. auto-fetching the latest completed buildset, and it is appropriately distinct from sibling get_status/list_build 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 useful guidance: it explains what happens when the change is in the pipeline vs. not, and it recommends the `brief` mode for repeated polls. However, it does not explicitly name alternatives or state when this tool should not be used, so it falls slightly short of full usage guidance.

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

get_componentsSystem ComponentsA
Read-onlyIdempotent

Show Zuul system components — schedulers, executors, mergers, web servers.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, covering the safety profile. The description adds the specific component categories, which is useful but does not disclose additional operational behavior beyond what annotations and the output schema would convey.

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

Conciseness5/5

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

The description is a single, front-loaded sentence that wastes no words. It conveys the action, target resource, and scope efficiently.

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 available, the description provides sufficient context by naming the component types. It is complete for the tool's simplicity and does not need to explain return values 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?

The tool has zero parameters, so the schema provides no parameter details. Per the baseline for parameterless tools, the description is not expected to document parameters, and it appropriately focuses on the resource being retrieved.

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 clear verb ('Show') and identifies the specific resource ('Zuul system components'), with concrete examples (schedulers, executors, mergers, web servers). This distinguishes it from sibling tools that focus on build, job, or node details.

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 when to use the tool—when you need an overview of Zuul's core components—but provides no explicit guidance on when NOT to use it or alternatives to prefer. This is adequate for a simple, parameterless tool.

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

get_config_errorsConfiguration ErrorsA
Read-onlyIdempotent

Get Zuul configuration errors — broken configs, missing refs, syntax errors.

First tool to check when a job isn't being triggered.

Args: tenant: Tenant (default from env) project: Project filter (optional)

ParametersJSON Schema
NameRequiredDescriptionDefault
tenantNo
projectNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, and non-destructive behavior. The description adds useful context beyond annotations: it specifies the types of errors (broken configs, missing refs, syntax errors) and notes that tenant defaults from the environment. This provides meaningful behavioral insight without contradicting 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?

The description is extremely concise and well-structured: a one-line purpose, a one-line usage hint, and a clean parameter list. Every sentence adds value, and the most important information (purpose and when to use) is front-loaded.

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

Completeness5/5

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

Given this is a simple read-only tool with two optional parameters and an output schema, the description covers the essential aspects: what it does, when to use it, and parameter meanings. The output schema handles return values, so no further detail is needed. It is complete for the tool's complexity.

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?

The schema has zero descriptions for its two parameters. The description compensates fully by explaining 'tenant: Tenant (default from env)' and 'project: Project filter (optional),' adding meaning beyond the raw schema. It clarifies the source of the default and the optional nature of the filter.

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

Purpose5/5

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

The description clearly states the tool's function: 'Get Zuul configuration errors — broken configs, missing refs, syntax errors.' It uses a specific verb and resource, and the examples distinguish it from sibling tools. The phrase 'First tool to check when a job isn't being triggered' further clarifies its specific 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 provides a clear usage context: 'First tool to check when a job isn't being triggered.' This tells the agent when to use it, but it does not explicitly mention alternatives or when not to use it. The context is strong enough to guide selection among siblings like diagnose_build or get_build_failures.

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

get_connectionsSource ConnectionsA
Read-onlyIdempotent

List configured source connections — Gerrit, GitHub, GitLab instances.

Shows what code review systems this Zuul instance talks to, with connection type, hostname, and base URL.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON 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 no destructiveness. The description adds context about what is listed (connection type, hostname, base URL) and that it shows Zuul's code review systems, which is useful 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 sentences: first states purpose, second provides details. No unnecessary words. Front-loaded with key 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 no parameters, comprehensive annotations, and an output schema (exists but not shown), the description fully explains the tool's behavior and output. For a list tool, 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, so schema coverage is 100%. The description does not need to add parameter info. Baseline for zero parameters is 4.

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 'List' and the resource 'configured source connections', with specific examples (Gerrit, GitHub, GitLab). The tool is distinct from sibling tools which deal with builds, jobs, etc.

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. The description implies it's for viewing connections, but does not provide conditions or exclusions.

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

get_freeze_jobResolved Job ConfigurationA
Read-onlyIdempotent

Get fully-resolved job configuration after inheritance.

Shows final merged nodeset, timeout, and playbooks. Use to understand exactly what a job will do.

Args: pipeline: Pipeline name (e.g. "check", "gate") project: Project name job_name: Job name to resolve branch: Branch name (default "main") tenant: Tenant (default from env) include_vars: Include vars/extra_vars/host_vars/group_vars (default false, can be large)

ParametersJSON Schema
NameRequiredDescriptionDefault
branchNomain
tenantNo
projectYes
job_nameYes
pipelineYes
include_varsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is covered. The description adds behavioral context by explaining that the result is fully resolved after inheritance and warns that include_vars 'can be large', which is a useful operational caution beyond the schema. 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 tight and well-organized: three meaningful sentences in the intro followed by a structured Args block. Every line adds value, with no redundant or vague text. It is appropriately sized for the tool's complexity.

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 output schema exists and annotations cover safety and idempotency, the description fully explains what the tool does and its key parameters. The include_vars warning addresses a meaningful edge case. Together with the structured Args, the tool is adequately specified for correct selection and invocation.

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

Parameters5/5

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

Schema description coverage is 0%, so the description carries full responsibility for parameter meaning. It does this excellently: pipeline includes examples ('check', 'gate'), branch has a default, tenant default is from env, and include_vars is explained with a size warning. This compensates fully for the missing schema descriptions.

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

Purpose5/5

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

The description opens with a clear verb-object pair ('Get fully-resolved job configuration') and adds specificity with 'after inheritance'. It further explains the output ('final merged nodeset, timeout, and playbooks'), which distinguishes it from sibling tools like get_job and get_freeze_jobs. The phrase 'Use to understand exactly what a job will do' reinforces the tool's purpose.

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 when-to-use guidance: 'Use to understand exactly what a job will do.' It implies this tool is for seeing the fully merged configuration, but it does not explicitly name alternatives or state when not to use it. The 'after inheritance' context hints at the distinction but lacks an explicit exclusion.

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

get_freeze_jobsResolved Job GraphA
Read-onlyIdempotent

Get the resolved job graph for a pipeline/project/branch.

Shows which jobs will run with all inheritance resolved, including dependencies. Use to understand job ordering.

Args: pipeline: Pipeline name (e.g. "check", "gate") project: Project name branch: Branch name (default "main") tenant: Tenant (default from env)

ParametersJSON Schema
NameRequiredDescriptionDefault
branchNomain
tenantNo
projectYes
pipelineYes

Output Schema

ParametersJSON 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 read-only, idempotent, and non-destructive behavior. The description adds context about inheritance resolution and dependency display, giving insight into the computational behavior. No contradiction with annotations.

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

Conciseness4/5

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

The main description is concise and front-loaded with the core purpose. The Args block adds necessary parameter context, but partially duplicates schema information, making it slightly longer than strictly 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?

With an output schema present and annotations covering safety, the description adequately explains the tool's function, usage, and parameters. It doesn't discuss error cases or edge scenarios, but that is not critical given the available schema.

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?

The input schema has 0% description coverage, but the description includes an Args section explaining each parameter with examples (e.g., pipeline examples, branch default, tenant default). This fully compensates for the schema's lack of descriptions.

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

Purpose5/5

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

The description clearly states that the tool gets the resolved job graph for a pipeline/project/branch, showing which jobs will run with inheritance and dependencies resolved. This specific verb+resource pairing distinguishes it from sibling tools like get_freeze_job (singular) and get_job.

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 use case with 'Use to understand job ordering,' which implies when to apply the tool. However, it does not explicitly compare against alternatives or state when not to use it, 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.

get_jobJob ConfigurationA
Read-onlyIdempotent

Get job configuration — parent, nodeset, timeout, branches, and all variants.

Args: name: Job name tenant: Tenant (default from env)

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
tenantNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=true, and destructiveHint=false, covering the safety profile. The description adds the list of returned configuration fields but no additional behavioral traits (e.g., authentication, error cases). No contradiction with annotations.

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

Conciseness5/5

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

The description is extremely concise: one front-loaded sentence for purpose and a compact two-item Args list. No filler or redundant 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 simple read-only configuration retrieval with comprehensive annotations and an output schema, the description adequately covers the tool's scope. Minor vagueness in 'all variants' does not detract significantly.

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?

The input schema has no parameter descriptions (0% coverage). The description's Args section clarifies 'name' as 'Job name' and 'tenant' as 'Tenant (default from env)', adding meaningful semantics beyond the raw schema types.

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 the specific verb 'Get' and identifies the resource as 'job configuration' with concrete fields (parent, nodeset, timeout, branches). This clearly distinguishes it from sibling tools like list_jobs (list) and get_build (build-specific resource).

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

Usage Guidelines3/5

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

The description implies usage when one needs job configuration details but does not explicitly state when to use this tool versus alternatives like list_jobs or get_build. No exclusions or preferred contexts are mentioned.

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

get_job_durationsBatch Job Duration StatsA
Read-onlyIdempotent

Get avg/min/max duration for multiple jobs in a single call.

Fetches build history per job in parallel. Designed for monitoring tools that need durations for an entire pipeline chain.

Args: job_names: List of job names to get stats for tenant: Tenant (default from env) result: Result filter (default "SUCCESS" for clean averages) limit: Builds per job to analyze (default 10, max 50)

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
resultNoSUCCESS
tenantNo
job_namesYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the readOnly/idempotent annotations, the description discloses concrete behavioral traits: parallel fetching of build history, a default result filter of 'SUCCESS' for clean averages, and a limit cap of 50. These details help the agent understand side effects and defaults beyond 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.

Conciseness5/5

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

The description is tightly structured: a one-sentence summary, a behavior note, a use-case sentence, and a minimal Args list. No fluff; every sentence adds value. The key information is front-loaded.

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

Completeness5/5

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

Given the tool has an output schema, the description need not explain return values. It covers purpose, behavior, use context, and all parameters comprehensively. Annotations handle safety traits. The description is fully sufficient for an agent to select and invoke the tool correctly.

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

Parameters5/5

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

With 0% schema description coverage, the description carries full burden and succeeds by explicitly listing each parameter with meaning: job_names, tenant (default from env), result (default 'SUCCESS'), and limit (default 10, max 50). It adds context not visible in the schema, such as the rationale for the default result filter.

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: 'Get avg/min/max duration for multiple jobs in a single call.' It clearly states the batch scope, distinguishing it from single-job tools like get_job or get_build_times. The added detail about parallel fetching reinforces its unique function.

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: 'Designed for monitoring tools that need durations for an entire pipeline chain.' This implies when to use it, but it does not explicitly name alternatives or state when not to use it. It conveys the batch vs. single-call distinction implicitly.

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

get_projectProject ConfigurationA
Read-onlyIdempotent

Get project configuration — which pipelines and jobs are configured.

Args: name: Project name (e.g. "openstack-k8s-operators/openstack-operator") tenant: Tenant (default from env)

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
tenantNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already indicate a safe, idempotent read operation. The description adds context that 'configuration' refers to pipelines and jobs, but does not disclose additional behaviors such as error handling or requirements. No contradiction with annotations.

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

Conciseness5/5

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

The description is concise and front-loaded with the primary purpose, followed by a brief parameter list. No unnecessary words.

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

Completeness4/5

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

The tool is simple with a clear read-only purpose, strong annotations, and an output schema. The description covers the essential purpose and parameter hints, though it could differentiate from similarly named sibling 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 0%, so the description must compensate. It lists both parameters and enriches the name parameter with an example and clarifies the tenant default as 'from env', though it could provide more detail on 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?

The description clearly states the tool retrieves project configuration, specifying that it covers configured pipelines and jobs. This distinguishes it from sibling tools like get_job or list_projects by focusing on the project-level configuration.

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

Usage Guidelines3/5

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

The description does not explicitly provide when-to-use guidance or alternatives. It implies usage via the purpose statement but lacks exclusions or comparisons to sibling tools, leaving the agent to infer appropriate usage.

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

get_statusPipeline StatusB
Read-onlyIdempotent

Live pipeline status showing what's currently queued/running.

Args: tenant: Tenant (default from env) pipeline: Pipeline name filter project: Project filter active_only: Only show pipelines with active items (default true) brief: Compact output (~50% smaller) for repeated polling

ParametersJSON Schema
NameRequiredDescriptionDefault
briefNo
tenantNo
projectNo
pipelineNo
active_onlyNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.1/5.0
Behavior2/5

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

While annotations already declare readOnlyHint=true, openWorldHint=true, and idempotentHint=true, the description actually ADDS confusion rather than clarity. The mention of 'showing what's currently queued/running' in the description could be read as too narrow (suggesting only active items are shown) when active_only defaults to true but is configurable. No disclosure of rate limits, scope limitations, or details about 'live' semantics (is this a snapshot managed internally? What are the consistency guarantees during concurrent writes?). The description should clarify that this endpoint only reads and never mutates state, which is especially important when a sibling tool like autohold_create could be a follow-up action.

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, active sentences. The 'live' framing and the explicit note about pollability are immediately useful. The mention of 'roughly 50%% smaller' is a useful approximation for agents considering retention versus bandwidth. Each sentence earns its place — no filler or redundant phrasing.

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?

With a 5-parameter tool defaulting active_only=true and zero schema coverage, the description must clarify query semantics, default behavior, and interaction between parameters, but doesn't explain why a user would set active_only=false. There's no mention of what the output contains (which the output schema presumably documents) but also no mention of time-window limitations, whether 'brief' affects the output schema differently, or whether pagination exists for large pipelines. The description covers the tool's nice-to-haves but leaves core behavioral gaps unfilled.

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

Parameters3/5

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

Schema description coverage is 0%, so the description carries the full burden, but it doesn't do much beyond restating parameter names. The description says 'tenant' is 'default from env' and 'brief' 'reduces output' which mirrors the schema's own documentation, adding only marginal context about 'brief' reducing size by ~50% and tenant's env fallback. The main contribution is the '(default from env)' clarification for tenant — that's genuinely useful — but the context for pipeline and project is minimal, and there's no mention of query semantics for pipeline or project.

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 'Live pipeline status showing what's currently queued/running' uses a specific verb (get/show status) with a clear resource scope (pipelines) and states a behavioral trait (the 'live' aspect indicating real-time visibility into queued/running items). It's clear enough to distinguish from most siblings (e.g., get_build, list_jobs), though it doesn't explicitly name alternatives like list_pipelines. The Live/queued framing differentiates it from static resource-listing siblings like list_buildsets or get_config_errors.

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 polling usage via the 'brief' parameter ('for repeated polling') and is named 'Live pipeline status' with a default state of active_only=true, which implies it's for monitoring. However, there's no explicit when-to-use/when-not-to-use guidance, and with 43 siblings available (list_builds, get_build, diagnose_build, etc.), the description misses the opportunity to clarify when get_status is more appropriate than querying individual build status endpoints.

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

get_tenant_infoTenant InformationA
Read-onlyIdempotent

Get tenant capabilities, auth config, and websocket URL.

Args: tenant: Tenant (default from env)

ParametersJSON Schema
NameRequiredDescriptionDefault
tenantNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false. The description adds minimal behavioral context beyond the annotation profile, only listing the data fetched (capabilities, auth config, websocket URL). It does not add details about permissions or response behavior, but the annotation coverage is sufficient for a read-only call.

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: a single sentence with the purpose plus an Args line for the parameter. It is front-loaded, contains no filler or redundancy, and every part adds value.

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

Completeness5/5

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

The tool is simple (one optional parameter, no nesting), annotations cover safety (read-only, idempotent), and an output schema exists so return format is structurally documented. The description fully captures what the tool does and its parameter, making it complete for this complexity level.

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?

Although schema description coverage is 0%, the description includes an 'Args' section that explains 'tenant' as a tenant string with default from env. This adds meaning beyond the raw schema and compensates for the lack of schema descriptions, making the parameter's role clear.

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 states 'Get tenant capabilities, auth config, and websocket URL.' This clearly identifies the verb (get), resource (tenant), and specific data returned. It is distinguishable from list_tenants and other get_* tools by focusing on a single tenant's detailed info, but it does not explicitly compare to siblings.

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: the tool gets tenant-specific information, with a tenant parameter defaulting from env. No explicit when/when-not guidance or alternatives are mentioned. The absence of any stated context or exclusions brings it to an implied-usage level rather than explicit guidance.

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

investigate_changeInvestigate ChangeA
Read-onlyIdempotent

One-call investigation — builds + diagnosis + autohold status for a change.

Combines list_builds, diagnose_build(brief), and autohold lookup into a single response. Designed for the common "what's happening with this change?" workflow — replaces 3-4 separate tool calls.

Args: change: Change number (e.g. "2601") job: Job name filter (substring). When set, only builds matching this job are included and autoholds are filtered. tenant: Tenant (default from env)

ParametersJSON Schema
NameRequiredDescriptionDefault
jobNo
changeYes
tenantNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and idempotentHint=true, and the description adds context about combining multiple operations into one response, which is useful. It does not disclose any side effects beyond that, but given the annotations, the bar is met. No contradiction with annotations.

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

Conciseness4/5

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

The description is fairly concise, but the use of a multi-line Args block with plain text is somewhat verbose. The core description is front-loaded with a clear one-liner, and the extra detail on parameters is structured. It earns the score for efficiency without waste, though formatting could be improved with bullet points.

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 has a moderate complexity (combining multiple operations) and an output schema exists, so return values are covered. The description explains the combining behavior and parameter filtering. However, it does not mention edge cases like what happens for invalid change numbers or how autohold filtering works in detail, but given the output schema and annotations, completeness is adequate.

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

Parameters3/5

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

The description provides brief parameter explanations: 'change' as the change number, 'job' as a substring filter, and 'tenant' defaulting from env. However, schema description coverage is 0%, and the description only adds a bit of detail beyond the schema (e.g., substring matching and filtering behavior). It could provide more detail on parameter formats 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?

The description clearly states it is a one-call investigation tool that combines building, diagnosis, and autohold status into a single response. It explicitly names the combined functions (list_builds, diagnose_build(brief), autohold lookup) and distinguishes it from alternatives.

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 explains that the tool is designed for the common 'what's happening with this change?' workflow and replaces 3-4 separate tool calls, giving clear context on when to use it. However, it does not explicitly state when not to use it or list direct alternatives within the description, though sibling tools imply alternatives.

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

list_autoholdsAutohold RequestsA
Read-onlyIdempotent

List autohold requests — nodes held after failure for debugging.

Check when jobs are stuck waiting for nodes or to find your autohold.

Args: tenant: Tenant (default from env) project: Project filter (substring match). When set, uses the project-scoped API endpoint for server-side filtering. job: Job name filter (substring match, client-side)

ParametersJSON Schema
NameRequiredDescriptionDefault
jobNo
tenantNo
projectNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false. The description adds valuable behavior beyond annotations: project filter uses a project-scoped API endpoint for server-side filtering, job filter is client-side, and tenant defaults from env. 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?

Front-loaded with a clear purpose and use case, followed by a structured Args list. Every sentence earns its place; no redundant or extraneous content.

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

Completeness5/5

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

For a simple read-only list tool with an output schema, the description covers purpose, parameters, and key behavioral differences (server vs client filtering). The optional parameters and output schema are already structured, so no further explanation is needed.

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 has 0% description coverage, but the description's Args section fully compensates by explaining each parameter: tenant (default from env), project (server-side substring match via project-scoped endpoint), job (client-side substring match). This is exactly what the schema lacks.

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

Purpose5/5

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

States a specific verb+resource ('List autohold requests') and explains what autoholds are ('nodes held after failure for debugging'), distinguishing it from sibling tools like get_autohold (single item) and autohold_create/delete (mutations).

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 clear usage context: 'Check when jobs are stuck waiting for nodes or to find your autohold.' It does not explicitly name alternative tools, but the purpose and parameters imply when listing is appropriate versus other operations.

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

list_buildsSearch BuildsA
Read-onlyIdempotent

Search builds with filters. Returns compact build summaries.

Args: tenant: Tenant (default from env) project: Project filter pipeline: Pipeline filter job_name: Job name filter change: Change number filter branch: Branch filter patchset: Patchset filter ref: Git ref filter result: Result filter (SUCCESS, FAILURE, TIMED_OUT, SKIPPED, etc.) completed_after: ISO 8601 lower bound on completion time completed_before: ISO 8601 upper bound on completion time started_after: ISO 8601 lower bound on start time started_before: ISO 8601 upper bound on start time limit: Max results, 1-100 (default 20) skip: Pagination offset

ParametersJSON Schema
NameRequiredDescriptionDefault
refNo
skipNo
limitNo
branchNo
changeNo
resultNo
tenantNo
projectNo
job_nameNo
patchsetNo
pipelineNo
started_afterNo
started_beforeNo
completed_afterNo
completed_beforeNo

Output Schema

ParametersJSON 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, openWorldHint, idempotentHint, and destructiveHint=false, so the safety profile is clear. The description adds that results are 'compact build summaries,' which is useful, but doesn't disclose other behaviors like pagination details or result ordering. No contradiction with annotations.

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

Conciseness5/5

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

The description is optimally structured: a one-line summary followed by a clean argument list. Every line is informative, no fluff. The front-loaded summary immediately conveys the tool's purpose.

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 search tool with an output schema, this is quite complete. It covers all filters, return type, and even default behavior for tenant. It lacks explicit guidance on when to use vs siblings, which would make it fully complete, but the core information is present.

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

Parameters4/5

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

Schema coverage is 0%, so the description must carry parameter meaning, and it does: it explains each filter's purpose, gives examples for result (SUCCESS, FAILURE, etc.), specifies ISO 8601 format for time bounds, and provides a 1-100 range for limit. Some entries like 'Project filter' are thin, but overall it adds significant value over the schema's bare names.

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 'Search builds with filters' and 'Returns compact build summaries,' giving a specific verb and resource. It distinguishes from get_build by implying search/list behavior, though it doesn't explicitly name alternatives.

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 makes it obvious that this tool is for searching/filtering builds, but it doesn't provide explicit when-to-use vs alternatives, nor mention any exclusions. Usage context is implied by the filter parameters rather than stated.

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

list_buildsetsSearch BuildsetsA
Read-onlyIdempotent

Search buildsets (groups of builds triggered by a single event).

Args: tenant: Tenant (default from env) project: Project filter pipeline: Pipeline filter change: Change number filter branch: Branch filter ref: Git ref filter result: Result filter completed_after: ISO 8601 lower bound on completion time completed_before: ISO 8601 upper bound on completion time started_after: ISO 8601 lower bound on start time started_before: ISO 8601 upper bound on start time limit: Max results, 1-100 (default 20) skip: Pagination offset include_builds: Fetch full details per buildset (slower, best with limit <= 5)

ParametersJSON Schema
NameRequiredDescriptionDefault
refNo
skipNo
limitNo
branchNo
changeNo
resultNo
tenantNo
projectNo
pipelineNo
started_afterNo
include_buildsNo
started_beforeNo
completed_afterNo
completed_beforeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already establish this as read-only, idempotent, non-destructive, and open-world. The description adds valuable behavioral context beyond annotations, notably the performance trade-off for 'include_builds: Fetch full details per buildset (slower, best with limit <= 5)', which is critical for effective use. No contradictions found.

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 well-structured: a clear one-sentence purpose followed by an 'Args' block with one-line explanations for each parameter. It is appropriately sized for 14 parameters, with no redundant or filler content. Every line earns its place.

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

Completeness5/5

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

With 14 parameters and no schema-level descriptions, the description covers all parameters meaningfully. It also explains the buildsets concept and includes a performance caveat for include_builds. Given the output schema exists, return values are not needed. The description is complete for this tool's complexity.

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

Parameters5/5

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

Schema description coverage is 0%, so the description carries the full burden for parameter meaning. It does so excellently: every parameter (tenant, project, pipeline, change, branch, ref, result, time filters, limit, skip, include_builds) gets a concise explanation. It also includes constraints and defaults, such as 'limit: Max results, 1-100 (default 20)', which are not 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?

The description opens with 'Search buildsets' and immediately defines buildsets as 'groups of builds triggered by a single event', which clearly states the tool's function and distinguishes it from sibling tools like list_builds or get_buildset. The verb 'Search' and resource 'buildsets' are specific.

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 when to use the tool by explaining it searches buildsets with various filters, and it defines what a buildset is. However, it does not explicitly mention alternatives or when not to use it, leaving some 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.

list_imagesNodepool ImagesA
Read-onlyIdempotent

List nodepool disk images with build status and upload artifacts.

Args: tenant: Tenant (default from env)

ParametersJSON Schema
NameRequiredDescriptionDefault
tenantNo

Output Schema

ParametersJSON 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 read-only, idempotent, non-destructive, and open-world behavior. The description adds that the output includes build status and upload artifacts, which gives useful context about the data scope beyond the schema. No behavioral claims contradict 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 two sentences plus a one-line Args section, front-loaded with the purpose. No filler or repetition; every sentence earns its place.

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

Completeness5/5

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

Given a simple list operation, an output schema to define return data, and strong annotations, the description covers the essential use case and the single parameter's default source. The tool's behavior is fully specified for an agent to invoke correctly.

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

Parameters4/5

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

Schema description coverage is 0%, so the description must compensate. It explains the 'tenant' parameter as a tenant name and states that it defaults from the environment, adding meaning beyond the schema's bare string type and empty default. This is sufficient for a single optional 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 uses a specific verb-resource pair ('List nodepool disk images') and adds scope ('with build status and upload artifacts'). It is clearly distinct from sibling tools like list_nodes or list_pipelines, so purpose 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?

The description implies usage by stating the tool lists images, but it provides no explicit guidance on when to choose it over alternatives or any exclusions. For a straightforward list tool, this is adequate but not exemplary; no comparison to sibling tools is offered.

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

list_jobsList JobsA
Read-onlyIdempotent

List all jobs in a tenant. Optionally filter by name substring.

Args: tenant: Tenant (default from env) filter: Case-insensitive name substring filter limit: Max results (default 200, 0 for unlimited)

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
filterNo
tenantNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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

The description adds behavioral detail beyond the readOnly/idempotent annotations: it explains filter case-insensitivity, the limit default and behavior of 0 for unlimited, and the tenant default from environment. This provides useful context that the annotations alone do not cover.

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 a clear first sentence followed by a bullet-like args list. Every sentence is necessary and adds value, with no redundant or filler 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?

The description covers essential functionality and parameter details, and the presence of an output schema handles return value documentation. Minor gaps like ordering or pagination are not disclosed, but for a simple list endpoint with good annotations, the completeness is sufficient.

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?

The input schema has no descriptions, so the description fully compensates by defining each parameter: tenant default from env, case-insensitive name substring filter, and limit with default 200 and 0 for unlimited. This removes ambiguity that would otherwise exist.

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 all jobs in a tenant' with an optional substring filter, using a specific verb and resource scope. It distinguishes itself from siblings like get_job by explicitly covering the plural 'all jobs' and the tenant scope.

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

Usage Guidelines3/5

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

The description implies usage context ('in a tenant') but does not explicitly state when to prefer this over alternative tools like get_job or list_pipelines. There is no direct mention of exclusions or alternative guidance, leaving the agent to infer the appropriate scenario.

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

list_labelsNodepool LabelsA
Read-onlyIdempotent

List available nodepool labels (node types that jobs can request).

Args: tenant: Tenant (default from env)

ParametersJSON Schema
NameRequiredDescriptionDefault
tenantNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is fully covered. The description adds no additional behavioral context such as pagination, result limits, or side effects. It merely restates the listing operation, so transparency is not enhanced 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?

The description is two short sentences, front-loading the purpose first and then documenting the sole parameter. No wasted words. It is appropriately sized for a simple list 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?

The tool is a simple read-only listing operation with one optional parameter and an output schema, so the combination of annotations, output schema, and this description largely covers the necessary context. However, it lacks explicit guidance on when to choose this tool over the many sibling list tools, which is a minor 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?

The schema has one parameter 'tenant' with only a title and empty default, giving 0% description coverage. The description compensates by stating 'tenant: Tenant (default from env),' which clarifies that the default is read from the environment rather than being a literal empty string. This adds meaningful information 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 available nodepool labels' and clarifies they are 'node types that jobs can request.' This uses a specific verb and resource, and distinguishes from sibling list tools like list_nodes and list_projects.

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

Usage Guidelines3/5

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

The description does not explicitly state when to use this tool versus alternatives. The phrase 'node types that jobs can request' implies the use case of checking available node types for jobs, but no alternatives are named or exclusions given. This is implied usage rather than explicit guidance.

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

list_nodesNodepool NodesA
Read-onlyIdempotent

List nodepool nodes — available, in-use, or provisioning.

Check when jobs are stuck waiting for nodes. Summary by default, set detail=true for individual nodes.

Args: tenant: Tenant (default from env) detail: Include individual node list (default false) limit: Max nodes in detail list (default 200, 0 for unlimited)

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
detailNo
tenantNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds meaningful behavior: the default summary output vs detail=true for individual nodes, and the limit parameter with 0 for unlimited. This goes beyond safety to explain output behavior, which is valuable.

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 short sections: purpose, use case, and args. It front-loads the primary purpose and uses a clean list format for parameters. 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?

With an output schema present, return value details are covered. The description covers all parameters, default behavior, and the diagnostic use case. It's complete for a read-only list tool with no nested structures.

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 has 0% description coverage, so the description fully compensates by explaining each parameter: tenant (default from env), detail (include individual node list), and limit (max nodes, 0 unlimited). This adds meaning beyond the raw schema.

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

Purpose5/5

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

The description opens with 'List nodepool nodes — available, in-use, or provisioning,' which clearly states the action and resource, and enumerates the node states. This distinguishes it from other list tools like list_jobs and list_projects by focusing specifically on nodepool nodes.

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 provides an explicit use case: 'Check when jobs are stuck waiting for nodes.' It also gives guidance on parameter selection ('Summary by default, set detail=true for individual nodes'). However, it doesn't explicitly mention alternatives or when not to use, so it's not a 5.

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

list_pipelinesList PipelinesA
Read-onlyIdempotent

List all pipelines with their trigger types.

Args: tenant: Tenant (default from env)

ParametersJSON Schema
NameRequiredDescriptionDefault
tenantNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, covering the safety profile. The description adds that the result includes trigger types, but does not disclose behavior like pagination or performance implications.

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

Conciseness5/5

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

The description is two short sentences plus a minimal Args block, front-loading the main purpose with no fluff.

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

Completeness5/5

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

For a simple read-only list tool with one optional parameter, an existing output schema, and robust annotations, the description is largely sufficient. It clearly states the scope ('all pipelines') and the included information (trigger types), and nothing essential seems 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 0% (no parameter descriptions in the schema), so the description must compensate. It provides a brief but meaningful note that 'tenant' defaults from environment, which adds context beyond the schema's default empty string.

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

Purpose5/5

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

The description clearly states the tool lists all pipelines and includes their trigger types, using the verb 'list' and specifying the resource. It distinguishes from sibling list tools which target different resources (e.g., list_projects, list_nodes).

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 no explicit guidance on when to use this tool versus alternatives, nor any exclusions. However, the straightforward nature of a 'list all' operation makes the usage context clear, and there is no obvious sibling alternative for listing pipelines.

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

list_projectsList ProjectsA
Read-onlyIdempotent

List all projects in a tenant. Optionally filter by name substring.

Args: tenant: Tenant (default from env) filter: Case-insensitive name substring filter limit: Max results (default 200, 0 for unlimited)

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
filterNo
tenantNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false. The description adds useful parameter-level behavior (case-insensitive filter, tenant from env, limit semantics) but does not disclose additional operational traits like pagination or rate limits. It does not contradict 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 front-loaded with the core purpose in the first sentence, followed by a compact Args block. Every sentence adds value, with no fluff or repetition of schema defaults.

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, rich annotations, and presence of an output schema, the description covers purpose, filtering, defaults, and limits. It is sufficiently complete for an AI agent to select 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?

Schema description coverage is 0%, so the description carries the full burden. It explains all three parameters with semantics beyond the schema: tenant defaults from env, filter is case-insensitive substring, limit has special 0=unlimited behavior. This fully compensates for the missing schema descriptions.

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 'List all projects in a tenant' with a specific verb and resource, and optionally filter by name. It distinguishes from siblings (like get_project or list_pipelines) by the resource type, though it does not explicitly name an alternative.

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 when to use the tool (when listing projects) but does not explicitly state when not to use it or mention alternatives. The optional filter and default tenant provide some context, but there is no direct comparison to sibling tools like get_project.

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

list_providersNodepool ProvidersA
Read-onlyIdempotent

List nodepool cloud providers with flavors and images.

Args: tenant: Tenant (default from env)

ParametersJSON Schema
NameRequiredDescriptionDefault
tenantNo

Output Schema

ParametersJSON 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, destructiveHint, idempotentHint, and openWorldHint, covering the safety profile. The description adds that the tool returns flavors and images, but does not disclose additional behavioral traits such as ordering, pagination, or how tenant affects results. This is consistent 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 a single sentence plus a concise argument line. It contains no filler or redundant phrases, and the structure clearly separates the main action from the parameter documentation.

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 strong annotations, the description is nearly adequate for a simple one-parameter listing tool. It lacks a bit of context about the 'nodepool' concept or how tenant scoping works, but overall it provides sufficient coverage for the tool's simplicity.

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 description adds the note 'default from env' for the tenant parameter, which goes beyond the schema's simple default of empty string. However, it does not explain what tenant means in the context of providers or how it filters results, leaving the parameter only partially explained.

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 a clear resource 'nodepool cloud providers', and specifies the content ('flavors and images'). This clearly distinguishes it from sibling list tools like list_projects, list_nodes, and list_images.

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 provides no guidance on when to use this tool versus alternatives. It does not mention exclusions, prerequisites, or relationship to sibling tools. The argument line is about the tenant parameter, not usage context.

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

list_semaphoresSemaphoresA
Read-onlyIdempotent

List semaphores — resource locks that limit concurrent job execution.

Check when jobs are waiting unexpectedly.

Args: tenant: Tenant (default from env)

ParametersJSON Schema
NameRequiredDescriptionDefault
tenantNo

Output Schema

ParametersJSON 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, idempotentHint, and destructiveHint false, covering the safety profile. The description adds meaningful context by explaining what semaphores are, which goes beyond the annotations. It doesn't mention auth or rate limits, but the annotation coverage lowers the bar, and the conceptual definition adds value.

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: two sentences and an args list. It front-loads the core purpose ('List semaphores') and follows with a practical use case. Every sentence contributes without redundancy or 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?

Given the tool's simplicity (one optional parameter) and the presence of an output schema, the description is largely complete. It states what semaphores are, when to use the tool, and the one parameter's default. It omits potential filtering/scope details, but for a list tool with annotations covering safety, this is adequate.

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

Parameters3/5

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

Schema description coverage is 0%, so the description must compensate. It documents the tenant parameter with '(default from env)', adding an environment-default nuance not present in the schema. However, it does not elaborate on what tenant means or how it affects results, leaving partial ambiguity for the single 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 uses a specific verb ('List') and resource ('semaphores'), then defines semaphores as 'resource locks that limit concurrent job execution.' This clearly distinguishes it from sibling tools, and the added use case 'Check when jobs are waiting unexpectedly' reinforces its diagnostic purpose.

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 a clear usage context: 'Check when jobs are waiting unexpectedly.' This implies when the tool should be used (diagnosing unexpected waits). However, it does not explicitly name alternative tools or state when not to use it, so it stops short of full guidance.

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

list_system_eventsSystem EventsA
Read-onlyIdempotent

List system events — config updates, reconfigurations, pipeline changes.

Args: tenant: Tenant (default from env) event_type: Event type filter limit: Max results (default 50) skip: Pagination offset

ParametersJSON Schema
NameRequiredDescriptionDefault
skipNo
limitNo
tenantNo
event_typeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint false, so the safety profile is clear. The description adds minimal behavioral context beyond the listed examples, such as pagination via skip and limit defaults, but does not disclose ordering, event type value formats, or any special behavior. It does not contradict 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 exceptionally concise: one purpose sentence followed by a clean argument list. Every sentence earns its place, with no redundant filler or repetition of schema defaults.

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 presence of an output schema and strong safety annotations, the description covers the essential purpose and all parameter semantics. It lacks some behavioral details like result ordering or event_type accepted values, but for a simple list operation the provided context is nearly complete.

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

Parameters5/5

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

With 0% schema description coverage, the description fully compensates by explaining every parameter: tenant (default from env), event_type (filter), limit (max results, default 50), and skip (pagination offset). This adds concrete meaning that the bare schema properties lack.

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 'List system events' and immediately specifies the scope with examples ('config updates, reconfigurations, pipeline changes'). This provides a specific verb, resource, and meaningful content that distinguishes it from sibling list tools like list_builds or list_jobs.

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 guidance on when to use this tool versus alternatives. It does not mention prerequisites, exclusions, or point to sibling tools. The description implies usage for listing system events, but lacks contextual direction or comparisons.

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

list_tenantsList TenantsA
Read-onlyIdempotent

List all Zuul tenants with project and queue counts.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare read-only, idempotent, and non-destructive behavior. The description adds value by specifying the data returned (project and queue counts), which is 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?

Single sentence, no redundant information, front-loaded with key action and resource.

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 (no parameters), the description fully covers what the tool does and what it returns, and an output schema likely exists for further detail.

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 the description does not need to add parameter details. Baseline for 0 params is 4.

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 (list) and resource (Zuul tenants) and specifies the output includes project and queue counts, making it distinct from 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 does not explicitly mention when to use this tool versus alternatives, but its purpose is clear and the context of listing all tenants is unambiguous.

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

stream_build_consoleStream Build ConsoleA
Read-onlyIdempotent

Read live console output from a RUNNING build via WebSocket.

For RUNNING builds only. For completed builds, use tail_build_log. Requires pip install mcp-zuul[console].

Args: uuid: Build UUID (from get_change_status) tenant: Tenant (default from env) url: Zuul build URL (alternative to uuid + tenant) lines: Lines to return from end (default 100, max 500) timeout: Seconds to buffer (default 10, max 30)

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNo
uuidNo
linesNo
tenantNo
timeoutNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

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

The description adds valuable behavioral context beyond the annotations: it uses WebSocket, only works for running builds, requires the 'console' extra package, and has configurable lines/timeout limits. Annotations already declare readOnlyHint and idempotentHint, so the added operational constraints are a plus, though error/stream-end behavior is not described.

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 well-structured and front-loaded: the first sentence gives the core purpose, followed by clear usage constraints and a compact Args list. Every sentence adds necessary information without fluff.

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 all key parameters, the critical running-build constraint, the alternative tool, and installation requirements. It does not explicitly explain streaming semantics or error handling when the build completes mid-stream, but the presence of an output schema reduces the need to describe return values.

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?

The input schema has no property descriptions (0% coverage), but the description includes a full 'Args' section explaining each parameter, its default, and constraints (e.g., 'lines: Lines to return from end (default 100, max 500)'). This fully compensates for the schema's lack of descriptions.

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

Purpose5/5

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

The description states a specific verb and resource: 'Read live console output from a RUNNING build via WebSocket.' It clearly distinguishes from sibling tail_build_log by emphasizing the running-build scope and by naming the alternative for completed builds.

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?

Provides explicit when-to-use and when-not-to-use guidance: 'For RUNNING builds only. For completed builds, use tail_build_log.' It also mentions the installation prerequisite, helping the agent decide if the tool is available.

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

tail_build_logLog TailA
Read-onlyIdempotent

Get the last N lines of a build log — fastest way to see why a build failed.

More token-efficient than get_build_log(mode="summary") when you just need the tail.

Args: uuid: Build UUID tenant: Tenant (default from env) lines: Lines from the end (default 50, max 500) log_name: Log file to read (default "job-output.txt") url: Zuul build URL (alternative to uuid + tenant) skip_postrun: Tail from run phase end, skipping post-run (default true) direct_log_url: Log URL from a prior call. Skips build metadata fetch.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNo
uuidNo
linesNo
tenantNo
log_nameNojob-output.txt
skip_postrunNo
direct_log_urlNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, covering basic safety. The description adds useful behavioral context beyond annotations, such as 'fastest way' (performance) and specific parameter behaviors like skip_postrun and direct_log_url, which are not in 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?

The description is compact, with a two-sentence opening that gets straight to the point, followed by a well-organized Args list. Every line adds value and there is no redundant 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?

Given that an output schema exists, the description does not need to explain return values. It covers the core purpose, provides alternatives, explains parameter behaviors, and includes defaults, making it sufficient for an agent to select and invoke the tool correctly.

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

Parameters5/5

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

The input schema has no descriptions (coverage 0%), but the description's Args section thoroughly explains all 7 parameters, including defaults, maximums, and alternatives (uuid vs url, direct_log_url). This fully compensates for the schema gap and makes parameter usage clear.

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

Purpose5/5

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

The description clearly states the tool's function with a specific verb and resource: 'Get the last N lines of a build log'. It also provides a use case ('fastest way to see why a build failed'), distinguishing it from siblings like get_build_log and stream_build_console.

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 compares to an alternative: 'More token-efficient than get_build_log(mode="summary") when you just need the tail.' This gives the agent clear conditions for when to choose this tool and when another might be better.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 6 tool updatesv0.11.0
    • Addedautohold_create
    • Addedautohold_delete
    • Changedget_build1 field changed
      • addedInput schema / properties / brief
        Added value: +{
        +  "default": false,
        +  "title": "Brief",
        +  "type": "boolean"
        +}
    • Changedget_status1 field changed
      • addedInput schema / properties / brief
        Added value: +{
        +  "default": false,
        +  "title": "Brief",
        +  "type": "boolean"
        +}
    • Addedinvestigate_change
    • Changedlist_autoholds2 fields changed
      • addedInput schema / properties / job
        Added value: +{
        +  "default": "",
        +  "title": "Job",
        +  "type": "string"
        +}
      • addedInput schema / properties / project
        Added value: +{
        +  "default": "",
        +  "title": "Project",
        +  "type": "string"
        +}
  2. 11 tool updatesv0.10.0
    • Addedbatch_diagnose
    • Changedbrowse_build_logs1 field changed
      • addedInput schema / properties / direct_log_url
        Added value: +{
        +  "default": "",
        +  "title": "Direct Log Url",
        +  "type": "string"
        +}
    • Addeddiagnose_and_test
    • Changeddiagnose_build1 field changed
      • addedInput schema / properties / brief
        Added value: +{
        +  "default": false,
        +  "title": "Brief",
        +  "type": "boolean"
        +}
    • Changedfind_flaky_jobs1 field changed
      • addedInput schema / properties / detail
        Added value: +{
        +  "default": false,
        +  "title": "Detail",
        +  "type": "boolean"
        +}
    • Changedget_build_log3 fields changed
      • addedInput schema / properties / direct_log_url
        Added value: +{
        +  "default": "",
        +  "title": "Direct Log Url",
        +  "type": "string"
        +}
      • addedInput schema / properties / filter_noise
        Added value: +{
        +  "default": true,
        +  "title": "Filter Noise",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / max_matches
        Added value: +{
        +  "default": 50,
        +  "title": "Max Matches",
        +  "type": "integer"
        +}
    • Changedget_build_test_results1 field changed
      • addedInput schema / properties / failures_only
        Added value: +{
        +  "default": true,
        +  "title": "Failures Only",
        +  "type": "boolean"
        +}
    • Changedget_build_times1 field changed
      • addedInput schema / properties / detail
        Added value: +{
        +  "default": true,
        +  "title": "Detail",
        +  "type": "boolean"
        +}
    • Changedget_buildset1 field changed
      • addedInput schema / properties / brief
        Added value: +{
        +  "default": true,
        +  "title": "Brief",
        +  "type": "boolean"
        +}
    • Changedget_freeze_job1 field changed
      • addedInput schema / properties / include_vars
        Added value: +{
        +  "default": false,
        +  "title": "Include Vars",
        +  "type": "boolean"
        +}
    • Changedtail_build_log1 field changed
      • addedInput schema / properties / direct_log_url
        Added value: +{
        +  "default": "",
        +  "title": "Direct Log Url",
        +  "type": "string"
        +}
  3. 1 tool updatev0.9.0
    • Addedcheck_health
  4. 5 tool updatesv0.7.1
    • Addedget_autohold
    • Addedget_badge
    • Addedlist_images
    • Addedlist_providers
    • Addedlist_system_events
  5. 28 tool updatesv0.7.0
    • Changedbrowse_build_logs4 fields changed
      • addedInput schema / properties / max_lines
        Added value: +{
        +  "default": 0,
        +  "title": "Max Lines",
        +  "type": "integer"
        +}
      • addedInput schema / properties / url
        Added value: +{
        +  "default": "",
        +  "title": "Url",
        +  "type": "string"
        +}
      • addedInput schema / properties / uuid / default
        Added value: +""
      • removedInput schema / required
        Removed value: -[
        -  "uuid"
        -]
    • Addeddiagnose_build
    • Addedfind_flaky_jobs
    • Changedget_build3 fields changed
      • addedInput schema / properties / url
        Added value: +{
        +  "default": "",
        +  "title": "Url",
        +  "type": "string"
        +}
      • addedInput schema / properties / uuid / default
        Added value: +""
      • removedInput schema / required
        Removed value: -[
        -  "uuid"
        -]
    • Addedget_build_anomalies
    • Changedget_build_failures3 fields changed
      • addedInput schema / properties / url
        Added value: +{
        +  "default": "",
        +  "title": "Url",
        +  "type": "string"
        +}
      • addedInput schema / properties / uuid / default
        Added value: +""
      • removedInput schema / required
        Removed value: -[
        -  "uuid"
        -]
    • Changedget_build_log3 fields changed
      • addedInput schema / properties / url
        Added value: +{
        +  "default": "",
        +  "title": "Url",
        +  "type": "string"
        +}
      • addedInput schema / properties / uuid / default
        Added value: +""
      • removedInput schema / required
        Removed value: -[
        -  "uuid"
        -]
    • Addedget_build_test_results
    • Addedget_build_times
    • Changedget_buildset3 fields changed
      • addedInput schema / properties / url
        Added value: +{
        +  "default": "",
        +  "title": "Url",
        +  "type": "string"
        +}
      • addedInput schema / properties / uuid / default
        Added value: +""
      • removedInput schema / required
        Removed value: -[
        -  "uuid"
        -]
    • Changedget_change_status4 fields changed
      • addedInput schema / properties / brief
        Added value: +{
        +  "default": false,
        +  "title": "Brief",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / change / default
        Added value: +""
      • addedInput schema / properties / url
        Added value: +{
        +  "default": "",
        +  "title": "Url",
        +  "type": "string"
        +}
      • removedInput schema / required
        Removed value: -[
        -  "change"
        -]
    • Addedget_components
    • Addedget_config_errors
    • Addedget_connections
    • Addedget_freeze_job
    • Addedget_freeze_jobs
    • Addedget_job_durations
    • Addedget_tenant_info
    • Addedlist_autoholds
    • Changedlist_builds4 fields changed
      • addedInput schema / properties / completed_after
        Added value: +{
        +  "default": "",
        +  "title": "Completed After",
        +  "type": "string"
        +}
      • addedInput schema / properties / completed_before
        Added value: +{
        +  "default": "",
        +  "title": "Completed Before",
        +  "type": "string"
        +}
      • addedInput schema / properties / started_after
        Added value: +{
        +  "default": "",
        +  "title": "Started After",
        +  "type": "string"
        +}
      • addedInput schema / properties / started_before
        Added value: +{
        +  "default": "",
        +  "title": "Started Before",
        +  "type": "string"
        +}
    • Changedlist_buildsets4 fields changed
      • addedInput schema / properties / completed_after
        Added value: +{
        +  "default": "",
        +  "title": "Completed After",
        +  "type": "string"
        +}
      • addedInput schema / properties / completed_before
        Added value: +{
        +  "default": "",
        +  "title": "Completed Before",
        +  "type": "string"
        +}
      • addedInput schema / properties / started_after
        Added value: +{
        +  "default": "",
        +  "title": "Started After",
        +  "type": "string"
        +}
      • addedInput schema / properties / started_before
        Added value: +{
        +  "default": "",
        +  "title": "Started Before",
        +  "type": "string"
        +}
    • Changedlist_jobs1 field changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 200,
        +  "title": "Limit",
        +  "type": "integer"
        +}
    • Addedlist_labels
    • Addedlist_nodes
    • Addedlist_projects
    • Addedlist_semaphores
    • Addedstream_build_console
    • Addedtail_build_log
  6. 14 tool updatesv0.1.1
    • First observedbrowse_build_logs
    • First observedget_build
    • First observedget_build_failures
    • First observedget_build_log
    • First observedget_buildset
    • First observedget_change_status
    • First observedget_job
    • First observedget_project
    • First observedget_status
    • First observedlist_builds
    • First observedlist_buildsets
    • First observedlist_jobs
    • First observedlist_pipelines
    • First observedlist_tenants

TDQS

A3.7/5.0
Disambiguation3/5

While most tools are clearly distinct, there is notable overlap among get_build_failures, diagnose_build, diagnose_and_test, and batch_diagnose, as well as among get_build_log, tail_build_log, and browse_build_logs. The descriptions help clarify intended usage, but the boundaries between these tools are not always crisp, and an agent might struggle to choose the right one.

Naming Consistency4/5

Tool names generally follow a consistent snake_case verb-noun pattern (e.g., list_pipelines, get_build, list_buildsets). Occasional deviations like batch_diagnose and diagnose_and_test still fit the overall style, and the prefix pattern (list_ for collections, get_ for singular) is predictable. Minor inconsistency exists with verbs like check, browse, tail, and stream, but the convention remains readable and coherent.

Tool Count2/5

With 41 tools, this server is substantially over the 3-15 range that is typically well-scoped. Although Zuul is a complex system, several tools are redundant or could be consolidated (e.g., tail_build_log vs. get_build_log's summary mode, batch_diagnose vs. multiple diagnose_build calls). The high count risks overwhelming agents and increases selection errors.

Completeness3/5

The server provides extensive read-only coverage of Zuul's configuration, build status, logs, and failure diagnosis, including helpful specialized tools for flaky detection and timing. However, it lacks any mutation capabilities (e.g., creating/deleting autoholds, enqueueing/dequeueing changes) and misses some management features like autohold creation. For a server that contains 'get' and 'list' for many resources, the absence of lifecycle operations is a notable gap.

Maintenance

ActivityActive
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    An MCP server that connects Claude (or any MCP compatible client) to your existing log infrastructure. Query, summarize, and trace logs in plain English across GCP Cloud Logging, AWS CloudWatch, Azure Log Analytics, Grafana Loki, and Elasticsearch without writing filter expressions or leaving your editor.
    17
    3
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    MCP server for Zuul CI/CD with 25 tools for builds, pipelines, queue management (enqueue/dequeue/promote), infrastructure visibility, and autohold management. Supports stdio, HTTP, and SSE transports.
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/imatza-rh/mcp-zuul'

If you have feedback or need assistance with the MCP directory API, please join our Discord server