Skip to main content
Glama
bunkerity

BunkerWeb MCP

Official

Manage services, instances, bans, configuration snippets, plugins, and scheduler jobs. Connect through streamable HTTP or a local stdio subprocess. Legacy JSON-RPC HTTP and WebSocket endpoints remain available for existing integrations.

You need a reachable BunkerWeb API and its credentials when authentication is enabled. See the BunkerWeb documentation for API setup.

Quick start

Connect to an existing BunkerWeb API

  1. Clone this repository and open its directory.

  2. Copy .env.example to .env. Set BUNKERWEB_BASE_URL to an API address reachable from the container, and supply its bearer token or Basic credentials. A container's localhost refers to itself.

  3. Set MCP_ALLOWED_HOSTS=localhost,localhost:8080,127.0.0.1,127.0.0.1:8080 for local HTTP clients. Keep SEARCH_MODE=disabled unless you have a search service.

  4. Run docker compose -f docker-compose-mcp-only.yml up --build -d.

  5. Check liveness with curl http://127.0.0.1:8080/health; expect "status":"healthy".

  6. Connect your client to http://127.0.0.1:8080/mcp/.

The MCP-only Compose file loads .env, builds the server, and publishes port 8080. For the published image instead, run docker run --rm -p 127.0.0.1:8080:8080 --env-file .env bunkerity/bunkerweb-mcp:latest. Use a release tag for a fixed version; the release workflow builds images for AMD64 and ARM64.

Try the bundled demo stack

Run docker compose up --build -d from the repository directory. The default docker-compose.yml starts BunkerWeb 1.6.13, its scheduler and API, MariaDB, Redis, and this server. It publishes BunkerWeb on ports 80/443 and MCP on 8080. The included .mcp.json points Claude Code at this server. The demo publishes /mcp/ on port 8080 on all interfaces without a client token check.

This file sets the API URL and demo credentials in its service definitions; editing .env does not replace those values. It also disables search and MCP DNS rebinding protection. Use it on a trusted development machine; review credentials, port exposure, and host validation before exposing it to a network.

Related MCP server: Developer Toolbox MCP

Connect an MCP client

Streamable HTTP

Use /mcp/, including the trailing slash. The repository's Claude Code config uses:

{
  "mcpServers": {
    "bunkerweb": {
      "type": "http",
      "url": "http://127.0.0.1:8080/mcp/"
    }
  }
}

For a remote server, change the URL to your HTTPS endpoint. When runtime log access is enabled, add "headers": {"x-mcp-token": "<shared-secret>"} inside the server entry. Read the authentication limits in Security before exposing HTTP.

Stdio: Claude Code or Claude Desktop

From the repository directory, install with Python 3.11 or newer using the hash-pinned build and runtime dependencies:

python3 -m venv .venv
.venv/bin/pip install --require-hashes --no-deps -r requirements-build.txt -r requirements.txt
.venv/bin/pip install --no-deps --no-build-isolation .

This creates .venv/bin/bunkerweb-mcp in your checkout. Use its absolute path in the client JSON below, replacing /absolute/path/to with your repository directory. It runs a stdio subprocess without an HTTP listener.

For Claude Code, replace the HTTP entry in .mcp.json with this configuration. For Claude Desktop, put it in claude_desktop_config.json:

{
  "mcpServers": {
    "bunkerweb": {
      "command": "/absolute/path/to/.venv/bin/bunkerweb-mcp",
      "env": {
        "BUNKERWEB_BASE_URL": "http://api.example.com:8888",
        "BUNKERWEB_API_TOKEN": "<api-token>",
        "SEARCH_MODE": "disabled"
      }
    }
  }
}

Replace the executable path and API address with your own. Keep real credentials out of version control. Stdio uses your local process permissions and API credentials.

Configuration

config.py reads environment variables and .env. Defaults below come from that settings model; Compose service values and container environment variables can override them. unset denotes an absent value or an empty string.

Environment variable

Default

Meaning

BUNKERWEB_BASE_URL

http://localhost:8888

Base URL for the BunkerWeb control-plane API.

BUNKERWEB_API_TOKEN

unset

Static API token used for Authorization bearer header (masked in logs).

BUNKERWEB_BASIC_USERNAME

unset

Username for HTTP Basic authentication.

BUNKERWEB_BASIC_PASSWORD

unset

Password for HTTP Basic authentication (masked in logs).

BUNKERWEB_REQUEST_TIMEOUT_SECONDS

30.0

HTTP request timeout in seconds.

BUNKERWEB_MAX_RETRIES

3

Maximum number of retries for transient HTTP errors.

BUNKERWEB_RETRY_BACKOFF_INITIAL

0.5

Initial backoff delay in seconds.

BUNKERWEB_RETRY_BACKOFF_MAX

5.0

Maximum backoff delay in seconds.

BUNKERWEB_WEBSOCKET_TOKEN

unset

Shared secret for legacy RPC/WebSocket access; also required on MCP HTTP when runtime logs are enabled. See Security.

BUNKERWEB_LOG_LEVEL

INFO

Application log level.

BUNKERWEB_LOGS_PATH

unset

Runtime log directory; unset disables log tools. Mount read-only.

BUNKERWEB_PROMPT_CATALOG

unset

Custom tool-prompt JSON path; unset uses the bundled catalog.

BUNKERWEB_REDACT_SECRETS

false

Mask the values of settings whose names match a sensitive pattern in tool and resource outputs, withhold upstream error details and refuse writes to sensitive settings. See Security.

BUNKERWEB_REDACT_PATTERN

unset

Regular expression that replaces the built-in sensitive setting name pattern; unset keeps the built-in one. Avoid nested quantifiers such as (a+)+$.

SEARCH_MODE

remote

remote enables documentation search; disabled omits the tool. Compose and .env.example use disabled.

SEARCH_API_URL

http://localhost:8000

URL of the remote search service API.

SEARCH_TIMEOUT

10.0

Search API request timeout in seconds.

MCP_ENABLE_DNS_REBINDING_PROTECTION

true

Enable DNS rebinding protection for MCP endpoints (recommended for production).

MCP_ALLOWED_HOSTS

localhost,127.0.0.1

Comma-separated MCP Host allowlist. Include the port variants clients send.

MCP_ALLOWED_ORIGINS

unset

Comma-separated MCP Origin allowlist for browser clients.

MCP_ENABLE_SKILLS

true

Serve bundled Agent Skills as skill://bunkerweb/ resources. Set false to omit them.

MCP_READ_ONLY

false

Register only read-only tools; write tools are not available on any transport.

RATE_LIMIT_ENABLED

false

Enable rate limiting on endpoints.

RATE_LIMIT_TOOLS

30/minute

Requests to /tools per client IP, when rate limiting is enabled.

RATE_LIMIT_RPC

100/minute

Requests to /rpc per client IP, when rate limiting is enabled.

RATE_LIMIT_WS

500/minute

Messages per WebSocket connection, when rate limiting is enabled.

CACHE_ENABLED

true

Cache selected read operations in process memory.

WORKERS is a Docker entrypoint setting, default 1, rather than a Pydantic setting. Caches and rate-limit state live in each worker process.

Search needs a separate service: set SEARCH_MODE=remote and SEARCH_API_URL to its URL. This repository does not bundle that service. Without it, disable search; otherwise the server registers search_bunkerweb_docs and readiness checks the service.

Tools and resources

Read GET /tools for the running server's tool names, descriptions, and input schemas. The registry defines 44 API tools:

Group

Tools

Authentication and probes

authenticate, ping, health, diagnose

Instances

list_instances, instance_get, instance_create, instance_update, instance_delete, instances_delete_bulk, instance_ping, instances_ping_all, instance_stop, instances_stop_all, reload_instance, reload_instances

Bans

list_bans, ban_ip, unban_ip

Services

list_services, get_service, create_service, update_service, delete_service, convert_service

Global configuration

global_config_read, global_config_update

Custom configuration

configs_list, config_get, config_create, config_update, config_delete, configs_delete_bulk, configs_upload, config_upload_update

Plugins

plugins_list, plugins_upload, plugin_delete

Job cache files

cache_list, cache_fetch_file, cache_delete_file, cache_delete_bulk

Scheduler jobs

jobs_list, jobs_run

Optional tools:

  • logs_list, logs_read: register when BUNKERWEB_LOGS_PATH points to a runtime log directory. Mount it read-only; HTTP mode also requires the shared secret. Reads scan up to 1 MiB and return at most 500 lines or 64 KiB of content, with cursors for older history. Compressed .gz rotations are excluded. Treat log content as untrusted data.

  • search_bunkerweb_docs: registers in remote search mode.

Use diagnose to check the connected API's host, reachability, authentication, version, MULTISITE, and instance counts. Pass service to inspect its existence, draft state, and setting-owner counts. An unknown version appears as unknown (strictest rules applied).

update_service checks setting names and ownership before sending changes. It refuses the request if validation reads fail or MULTISITE is not yes. It skips invalid or externally owned keys and unsupported renames; if nothing remains, it sends no write. After an accepted write, it reads the service back without the result cache. The result adds summary as its first field and a receipt with db (verified, partial, or unverified), plus issues and hints when needed. These report names and reasons, without setting values. For example, a complete match reads DB VERIFIED (2/2 MATCH). LIVE UNVERIFIED. A failed read-back reads WRITE ACCEPTED. DB UNVERIFIED. LIVE UNVERIFIED. Only a read-back that confirms a draft adds DRAFT: NOT PUBLISHED. A failed read-back omits the draft marker. The summary always ends LIVE UNVERIFIED. BunkerWeb 1.6 offers no live-state signal; the receipt does not prove that instances use the saved configuration.

Tool metadata identifies reads and destructive writes. MCP_READ_ONLY=true removes write tools and their prompts on every transport, including authenticate, which returns a credential. See ADR 0006 for the version rules and enforcement boundary.

The MCP adapter also exposes read-only resources:

URI

Contents

config://global

Global configuration; an empty upstream result includes guidance to use get_service with full=true.

logs://jobs

Scheduler jobs and execution history, separate from runtime log files.

bans://active

Active IP bans.

instances://status

Registered instances and their status.

skill://bunkerweb/<skill>/<path>

Bundled Agent Skills and reference files as text; see Agent Skills.

The first four resources return JSON. Skill resources register when MCP_ENABLE_SKILLS=true.

Tool guidance comes from the bundled prompt catalog. The server exposes matching MCP prompts when catalog text exists. Override the catalog with BUNKERWEB_PROMPT_CATALOG.

Examples and legacy workflow integrations live in n8n-workflows.

Agent Skills

The server bundles 13 BunkerWeb Agent Skills (59 files), available through MCP resources/list and resources/read. Start with skill://bunkerweb/bunkerweb/SKILL.md; the server's initialization instructions point there too. This entrypoint links to the other 12 skills on GitHub and to its bundled references/ files.

Read bundled files at skill://bunkerweb/<skill>/<path>, for example skill://bunkerweb/bunkerweb/references/docker.md. Files are served verbatim, with text/markdown for .md files. Set MCP_ENABLE_SKILLS=false to omit skill resources and the skills sentence from the server instructions.

Skills come from bunkerity/bunkerweb-skills, pinned by SKILLS_REF. Refresh with scripts/sync_skills.py --ref <sha>; CI runs the script with --check to detect drift.

Security

Tools can change configuration, stop instances, delete services, and install plugins. Grant access only to clients you trust with the configured BunkerWeb API credentials. Set MCP_READ_ONLY=true to serve only read tools on every transport. The server has no per-client roles.

The HTTP application implements these shared-secret checks:

Endpoint

Authentication

/mcp/

Requires x-mcp-token only when BUNKERWEB_LOGS_PATH is configured. Without runtime logs, setting the shared secret alone does not protect MCP HTTP.

/rpc

Requires x-mcp-token when BUNKERWEB_WEBSOCKET_TOKEN is non-empty.

/ws

Requires the token query parameter when BUNKERWEB_WEBSOCKET_TOKEN is non-empty.

/tools, /health, /ready, /metrics

No application token check.

HTTP startup fails if you configure runtime logs without a non-empty shared secret. BUNKERWEB_API_TOKEN and Basic credentials authenticate the server to BunkerWeb; they do not authenticate MCP clients. The API client prefers a bearer token over Basic auth.

Keep HTTP on a trusted network or behind an authenticated reverse proxy. Use TLS for remote connections, restrict the exposed endpoints, and configure MCP_ALLOWED_HOSTS and MCP_ALLOWED_ORIGINS for your clients. DNS rebinding protection does not replace authentication. See docs/security.md.

Set BUNKERWEB_REDACT_SECRETS=true to mask the values of sensitive settings (matched by name) in tool and resource outputs before they reach the client. Upstream API error details are withheld and only the HTTP status is returned. It is not a content scanner: custom config snippets, log lines, documentation search results, cache files outside the denylist and secrets embedded in other values are not masked. See docs/security.md.

Observability

The HTTP server exposes Prometheus metrics at /metrics, liveness at /health, and dependency readiness at /ready. Readiness probes BunkerWeb's /ping without API credentials and, in remote search mode, the search service's /health; a protected API can therefore fail readiness even when authenticated tools work.

See docs/OBSERVABILITY.md for metrics, tracing, and dashboard reference. Grafana dashboards: BunkerWeb MCP and MCP BunkerWeb. Tracing is opt-in; this repository does not include a monitoring Compose stack.

Development

Use the hash-pinned build and development dependencies before installing this package from source. AGENTS.md contains installation, lint, formatting, strict type-checking, and test commands. Tests mock upstream HTTP calls and enforce an 80% coverage floor.

.pre-commit-config.yaml checks YAML/TOML, file hygiene, and Python lint/formatting. Run pre-commit install to install the local hooks. The architecture decisions record design context. docs/tdqs.md explains the Glama quality score and how to run the same scorer locally with scripts/tdqs.py before changing tool descriptions.

Supply chain

  • Build, runtime, and development dependencies use hash-pinned requirements-build.txt, requirements.txt, and requirements-dev.txt locks. Edit their .in sources and regenerate with the uv commands in AGENTS.md; do not hand-edit generated locks.

  • CI runs quality checks, tests on Python 3.11–3.14, CodeQL, and container checks. Plumber checks CI/CD security; OpenSSF Scorecard analyzes repository security practices. Badges link to published results.

  • The release workflow requests build provenance and an SBOM for Docker images.

  • Follow .github/SECURITY.md to report vulnerabilities.

License

MIT. See LICENSE.

Available Tools

45 tools
authenticateB

Returns a new BunkerWeb API token; changes nothing in the BunkerWeb configuration.

NameRequiredDescriptionDefault
payloadNoOptional JSON payload
passwordNoPassword for Basic auth
usernameNoUsername for Basic auth

TDQS

B3.1/5.0
Behavior3/5

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

With readOnlyHint=false the agent might assume a mutation, but the description usefully clarifies that no configuration changes occur; that is real context beyond the annotations. However, it says nothing about credential requirements, token lifetime, or rate limits, and it does not explain why a 'read-like' operation is flagged as non-read-only.

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

Conciseness4/5

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

A single front-loaded sentence with no filler; the token-returning behavior leads and the safety note follows. It is efficient, though the extreme brevity leaves obvious questions unaddressed.

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?

No output schema, three parameters, and no annotation detail about token semantics. An agent is not told where the returned token is used, its validity duration, or that credentials are mandatory despite zero required parameters.

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

Parameters3/5

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

Schema description coverage is 100% and each of the three parameters (payload, password, username) is documented in the schema, so the baseline of 3 applies. The description adds no extra meaning about how credentials are supplied or what payload does.

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

Purpose4/5

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

States a specific verb and resource: 'Returns a new BunkerWeb API token.' No sibling tool competes for the authentication role, so the purpose is unambiguous, though it never names the credentials required to obtain the token.

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?

Gives no when-to-use context: it does not say the token is a prerequisite for the other API tools, nor when to re-authenticate versus reuse an existing token. The only guidance-adjacent statement is the negative claim about configuration.

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

ban_ipA

Ban one or more IPs, globally or per service, for exp seconds (0 = permanent). Use unban_ip to lift a ban. Acts on the instances immediately.

NameRequiredDescriptionDefault
bansYesList of ban requests

TDQS

A4/5.0
Behavior3/5

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

Annotations only declare readOnlyHint=false and destructiveHint=false, so the description must carry most of the behavioral load. 'Acts on the instances immediately' usefully discloses timing/effect, but it does not say whether the ban persists across restarts or config reloads, what happens to already-established connections, or what the result looks like. Useful context, but significant gaps remain for a mutating tool.

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

Conciseness5/5

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

Three short sentences, front-loaded with the action and scope, followed by the alternative and the effect. No wasted words or hedging.

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

Completeness4/5

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

For a single required parameter whose nested fields are fully documented in the schema and with no output schema, the description covers action, scope, duration, and the inverse tool. The main omission is persistence/lifecycle behavior, which matters for a security-sensitive mutation.

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

Parameters3/5

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

Schema description coverage is 100%, so every parameter including exp, reason, and service is already documented in the schema; the description's 'for exp seconds (0 = permanent)' and 'globally or per service' largely restate that. It does confirm that 'one or more IPs' maps to the bans array, but adds no syntax or format detail beyond the schema.

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

Purpose5/5

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

States a specific verb and resource ('Ban one or more IPs'), plus the scope dimension ('globally or per service') and duration semantics. It is clearly distinguishable from the sibling unban_ip, which it names, and from list_bans.

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

Usage Guidelines4/5

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

Names the inverse operation ('Use unban_ip to lift a ban') so the agent knows which sibling selects the opposite action, and 'Acts on the instances immediately' implies this is a live runtime action rather than a config edit. No explicit when-not guidance (e.g., checking list_bans first, or persistence vs. restart) is given.

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

cache_delete_bulkA
Destructive

Delete several job cache files. Use cache_delete_file for one; jobs_run regenerates them. Queued for the scheduler; this tool cannot confirm it ran.

NameRequiredDescriptionDefault
filesYesCache files to delete, each keyed as in cache_list

TDQS

A4.5/5.0
Behavior4/5

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

The destructiveHint annotation already declares the safety profile, yet the description adds two facts the annotations cannot: the work is queued for the scheduler and the tool cannot confirm execution. That async, fire-and-forget trait is critical for a destructive op. It stops short of stating permission prerequisites or whether a delete can be undone, keeping it below a 5.

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

Conciseness5/5

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

Three short sentences, zero padding, with the action front-loaded and the caveat and alternative packed into the remainder. Every sentence earns its place.

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

Completeness5/5

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

For a destructive, asynchronous bulk tool with fully described parameters and no output schema, the description covers the action, the sibling alternative, the regeneration path, and the inability to confirm success. Nothing an agent needs to call it correctly is missing.

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

Parameters3/5

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

The single top-level parameter is fully documented in the schema (coverage 100%), including nested keys cross-referenced to cache_list. The description adds no syntax or format detail beyond that, so the schema carries the load and baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource with explicit cardinality: 'Delete several job cache files.' It immediately distinguishes itself from the singular sibling by naming cache_delete_file, so an agent can pick between them without opening either schema.

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

Usage Guidelines5/5

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

Explicitly routes single-file deletion to cache_delete_file and explains the recovery path ('jobs_run regenerates them'), which is exactly the context needed before invoking a destructive bulk operation. No ambiguity about when this tool versus its alternative applies.

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

cache_delete_fileA
Destructive

Delete one job cache file. Use cache_delete_bulk for several; jobs_run regenerates it. Queued for the scheduler; this tool cannot confirm it ran.

NameRequiredDescriptionDefault
pluginYesPlugin ID that owns the file, as listed by cache_list
serviceNoService ID that owns the file; omit for global
job_nameYesJob that wrote the file, as listed by cache_list
file_nameYesFile name, as listed by cache_list

TDQS

A4.5/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, so the description is not the sole carrier of the safety profile. It nonetheless adds information annotations cannot express: the deletion is queued for the scheduler and the tool cannot confirm execution, which changes how an agent should verify results. It stops short of stating permissions or whether a queued delete can be cancelled.

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

Conciseness5/5

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

Three short sentences, front-loaded with the action, then the alternative, then the async caveat. No filler and every clause carries decision-relevant 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 4-parameter destructive tool with full schema coverage, no output schema, and existing destructive annotations, the description covers the remaining gaps an agent needs: sibling routing, regeneration semantics, and the fire-and-forget execution model.

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

Parameters3/5

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

Schema description coverage is 100%, including per-field guidance pointing back to cache_list and the note that 'service' can be omitted for global. The description adds nothing about parameters beyond the schema, so baseline 3 is appropriate.

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

Purpose5/5

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

States a specific verb+resource with explicit cardinality: 'Delete one job cache file.' The word 'one' plus the sibling reference 'cache_delete_bulk' lets an agent distinguish this from the bulk variant without opening either schema.

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

Usage Guidelines5/5

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

Directly names the alternative and the condition that selects it ('Use cache_delete_bulk for several'), and adds a decision-relevant fact ('jobs_run regenerates it') that tells the agent the deletion is not catastrophic. Both when-to-use and when-to-use-something-else are covered.

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

cache_fetch_fileA
Read-only

Read one job cache file, keyed as listed by cache_list. Returns printable text, or base64 bytes with download=true. Use cache_list to find files.

NameRequiredDescriptionDefault
pluginYesPlugin ID that owns the file, as listed by cache_list
serviceNoService ID that owns the file; omit for global
downloadNoTrue returns the raw bytes as data_base64; false returns JSON with printable text only
job_nameYesJob that wrote the file, as listed by cache_list
file_nameYesFile name, as listed by cache_list

TDQS

A4.4/5.0
Behavior4/5

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

readOnlyHint=true already covers the safety profile, and the description adds real behavioral detail beyond it: the return is printable text by default or base64 bytes when download=true. It does not cover error cases (missing file, permission) but adds substantive 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?

Three short sentences, front-loaded with the action and the key semantics, with zero 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?

Read-only, no output schema, so the description carrying the return-value distinction (text vs base64) is exactly what's needed. Minor gaps around file-not-found behavior keep it from a 5.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3, and the description reinforces the download flag's effect on return type beyond the schema wording. The plugin/service/job_name/file_name keying is only restated, so it doesn't lift this to 5.

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

Purpose5/5

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

States a specific verb and resource ('Read one job cache file') and immediately scopes it against the listing sibling. An agent can distinguish it from cache_list and cache_delete_file from the description alone.

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 routes the agent to cache_list to discover file keys, which is the required prerequisite for all three required params. It does not spell out when-not to use it (e.g., it is not for jobs/configs), but the usage context is clear.

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

cache_listA
Read-only

List files that scheduler jobs cached, filtered by service, plugin or job. Use cache_fetch_file to read one file.

NameRequiredDescriptionDefault
pluginNoFilter by plugin ID, e.g. letsencrypt
serviceNoFilter by service ID; omit or 'global' to list every scope, global included
job_nameNoFilter by job name
with_dataNoInclude text file contents inline; false returns metadata only

TDQS

A4/5.0
Behavior3/5

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

readOnlyHint=true already declares the safety profile, so the description only needs to add context. It does clarify these are job-run cache artifacts fetched by file, but it says nothing about result volume, ordering, or how with_data affects response size — the schema carries that instead.

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

Conciseness5/5

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

Two short sentences, purpose first and the sibling hand-off second. Nothing is redundant with the schema or the title, and every clause 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?

A read-only listing tool with full schema documentation and no output schema needs mainly to state scope and the read-a-file alternative, both of which are present. The remaining gap is how listing relates to deletion siblings and what a cached file represents across job runs.

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

Parameters3/5

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

Schema coverage is 100%, so both the filter semantics (including the 'global' nuance for service) and with_data are already documented. The description restates the filter axes (service, plugin, job) without adding format or interaction details, so baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource ('List files that scheduler jobs cached') plus the filter axes, so an agent knows exactly what it returns. It also names the sibling cache_fetch_file as the tool for reading a single file, cleanly separating the two.

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 routes content retrieval to cache_fetch_file ('use cache_fetch_file to read one file'), which is the main ambiguity for a listing tool. It gives no guidance on the other cache siblings (cache_delete_file, cache_delete_bulk) or on when the listing is empty versus erroring, so it falls short of full when/when-not coverage.

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

config_createA
Destructive

Create one custom config snippet from text. Use configs_upload for several files. Saved to the database; the scheduler applies it later; this tool cannot confirm it is live.

NameRequiredDescriptionDefault
dataYesConfiguration content
nameYesSnippet name: letters, digits, _ or -, no extension
typeYesCustom config type, e.g. http, server-http, default-server-http, stream, server-stream, modsec, modsec-crs, crs-plugins-before, crs-plugins-after
serviceNoService ID that owns the snippet; omit or 'global' for global
is_draftNoCreate as draft

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false and destructiveHint=true, so the mutation profile is known. The description adds genuinely non-obvious behavior: the snippet is only persisted and the scheduler applies it later, so the tool cannot confirm it is live — a critical expectation-setting detail for an async write. It does not cover permissions or duplicate-name handling, keeping it below 5.

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

Conciseness5/5

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

Three short sentences, front-loaded with the core action, then the alternative, then the async caveat. No padding or restated name/title.

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

Completeness4/5

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

With a fully documented schema, annotations, and no output schema, the description covers the essential gaps: persistence vs. live application and the single-vs-bulk split. Minor omissions remain (duplicate name behavior, whether the return is the created snippet), but nothing an agent needs to call it correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so all five parameters (including the service/global choice and is_draft) are already documented with formats and defaults. The description's 'from text' hints that data is inline content rather than a file path, but adds nothing about the individual parameters. Baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource with scope ('Create one custom config snippet from text') and immediately distinguishes it from the bulk sibling configs_upload. An agent can tell exactly which operation this performs without opening the schema.

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

Usage Guidelines4/5

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

Explicitly routes multi-file work to configs_upload ('Use configs_upload for several files'), giving a clear when-to-use-this-instead signal. It stops short of distinguishing create from the update siblings (config_update, config_upload_update), so the selection context is not fully closed.

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

config_deleteA
Destructive

Delete one custom config snippet. Use configs_delete_bulk for several. Saved to the database; the scheduler applies it later; this tool cannot confirm it is live.

NameRequiredDescriptionDefault
nameYesSnippet name: letters, digits, _ or -, no extension
typeYesCustom config type, e.g. http, server-http, default-server-http, stream, server-stream, modsec, modsec-crs, crs-plugins-before, crs-plugins-after
serviceNoService ID that owns the snippet; omit or 'global' for global

TDQS

A4.4/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true, but the description adds critical behavior the annotations cannot express: the deletion is persisted to the database and applied asynchronously by the scheduler, and the call cannot confirm liveness. That timing caveat materially changes how an agent should report results to a user.

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

Conciseness5/5

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

Three short sentences, each earning its place: the action, the alternative routing, and the async caveat. Front-loaded with the core action and no filler.

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

Completeness4/5

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

For a destructive single-item mutation with no output schema, the description covers the essential concerns: specificity, the bulk alternative, and the deferred-application semantics. What remains unsaid (permission requirements, behavior on a non-existent snippet, error modes) is minor but not trivial.

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

Parameters3/5

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

Schema description coverage is 100% – all three parameters carry their own descriptions including name format rules and the global-service convention. The description adds no parameter-level semantics beyond what the schema states, so the baseline 3 applies.

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

Purpose5/5

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

The description uses a specific verb and resource ('Delete one custom config snippet') and immediately scopes the cardinality to a single item, which distinguishes it from configs_delete_bulk. An agent can select it without opening the schema.

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

Usage Guidelines4/5

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

It names the explicit alternative for the multi-item case ('Use configs_delete_bulk for several'), giving clear routing guidance. It stops short of stating prerequisites or when-not conditions beyond the bulk case, so it is not a full 5.

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

config_getA
Read-only

Read one custom config snippet with its content by service, type and name. Use configs_list to find snippets.

NameRequiredDescriptionDefault
nameYesSnippet name: letters, digits, _ or -, no extension
typeYesCustom config type, e.g. http, server-http, default-server-http, stream, server-stream, modsec, modsec-crs, crs-plugins-before, crs-plugins-after
serviceNoService ID that owns the snippet; omit or 'global' for global

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds real context beyond that by stating the call returns the snippet's content (not just metadata), which is exactly what distinguishes it from the list sibling.

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

Conciseness5/5

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

Two sentences, zero waste, with the core action and keying front-loaded and the alternative pointer trailing. Nothing to trim.

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

Completeness4/5

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

For a read-only single-resource getter with fully documented params and annotations covering safety, the only real gap is not-found/error behavior. Since no output schema exists, the brief mention that content is returned is sufficient for an agent to call it correctly.

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

Parameters3/5

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

Schema description coverage is 100% — type enumerations, name format and the 'global' service convention are all documented in the schema itself. The description only restates the keying fields, adding no syntax or default behavior of its own.

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

Purpose4/5

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

Specific verb+resource: 'Read one custom config snippet with its content' keyed by service, type and name. It implicitly separates itself from global_config_read by saying 'custom config snippet', though it doesn't name that sibling explicitly.

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

Usage Guidelines4/5

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

Explicitly routes discovery to configs_list ('Use configs_list to find snippets'), giving the agent a clear alternative for lookup vs. direct read. No explicit when-not conditions, but the intended workflow is unambiguous.

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

configs_delete_bulkA
Destructive

Delete several custom config snippets in one call. Use config_delete for one. Saved to the database; the scheduler applies it later; this tool cannot confirm it is live.

NameRequiredDescriptionDefault
configsYesSnippets to delete, each by service, type and name

TDQS

A4.4/5.0
Behavior4/5

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

Goes beyond the annotations by disclosing that the delete is persisted to the database and only applied later by the scheduler, and that the tool cannot confirm the change is live. This is exactly the asynchronous caveat an agent needs before reporting success. It stops short of saying whether deletion is reversible or what happens if a listed snippet does not 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?

Three short sentences, zero waste, with the scope stated first and the caveat last. Every sentence carries distinct information.

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

Completeness4/5

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

No output schema exists, so the description correctly signals that no liveness confirmation is returned, which is the key completeness concern for a destructive bulk call. What remains unaddressed is partial-failure semantics for a batch delete, a meaningful gap for an array-input destructive tool.

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

Parameters3/5

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

Schema coverage is 100% and the nested ConfigKeyParams fields (name, type, service) are fully documented inline, so the description adds little parameter detail. It frames the input as a list of snippets keyed by service/type/name, but does not state behavior for duplicate or unknown entries. Baseline 3 is appropriate when the schema does the heavy lifting.

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

Purpose5/5

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

States a specific verb and resource with an explicit bulk scope ('Delete several custom config snippets in one call'), which distinguishes it from the singular sibling config_delete by name. An agent can tell exactly what it does without opening the schema.

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

Usage Guidelines5/5

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

Explicitly routes the agent: bulk use here, single deletion via config_delete. The alternative and the condition that selects it are both named, leaving nothing to inference.

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

configs_listA
Read-only

List custom config snippets (service, type, name), optionally with content. Use config_get to read one snippet in full.

NameRequiredDescriptionDefault
typeNoFilter by type. Custom config type, e.g. http, server-http, default-server-http, stream, server-stream, modsec, modsec-crs, crs-plugins-before, crs-plugins-after
serviceNoFilter by service ID; omit or 'global' to list every scope, global included
with_dataNoInclude each snippet's content; false returns metadata only
with_draftsNoInclude snippets of draft services

TDQS

A4/5.0
Behavior3/5

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

The readOnlyHint annotation already establishes that this is a safe read operation. The description adds that content can optionally be included, but it does not disclose further behavioral context such as default draft inclusion or pagination/return behavior.

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

Conciseness5/5

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

The description is two tight sentences with zero waste. It front-loads the listing purpose and immediately follows with the key alternative.

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

Completeness4/5

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

For a simple read-only list tool with fully described parameters, the description is largely complete. It explains the return shape at a high level and when to prefer config_get, though it does not mention the with_drafts behavior that may matter to callers.

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

Parameters3/5

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

Schema description coverage is 100%, so all four parameters are already documented in the schema. The description mentions service, type, and optional content, but adds no syntax, defaults, or filtering details 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 states a specific verb and resource: list custom config snippets. It names the relevant dimensions (service, type, name) and explicitly distinguishes the tool from config_get for full single-snippet 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?

It gives a clear usage cue by directing users to config_get when reading one snippet in full, implying configs_list is for listing or metadata retrieval. It does not explicitly state when not to use the tool or mention other sibling alternatives, but the context is clear.

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

configs_uploadA
Destructive

Create snippets from base64 files, one per file, named after the file. Use config_create for text. Saved to the database; the scheduler applies it later; this tool cannot confirm it is live.

NameRequiredDescriptionDefault
filesYesFiles to create, one snippet per file, named after the sanitized file stem
serviceNoService ID for every file; omit or 'global' for global
is_draftNoCreate as draft
config_typeYesType for every uploaded file. Custom config type, e.g. http, server-http, default-server-http, stream, server-stream, modsec, modsec-crs, crs-plugins-before, crs-plugins-after

TDQS

A4.2/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, but the description adds genuinely new behavior: writes go to the database, the scheduler applies them later, and the tool cannot confirm the config is live. That deferred-application caveat is exactly the kind of context an agent needs. It stops short of stating what gets overwritten on a name collision, which matters given destructiveHint=true.

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

Conciseness5/5

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

Three short clauses with zero filler, and the core action plus the count/naming rule are front-loaded ahead of the alternative and the caveat. Every sentence carries distinct information.

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

Completeness4/5

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

For a batch upload tool with no output schema, it covers the essential gaps: multi-file semantics, naming, the text alternative, and the fact that success does not mean the config is live. Absent details about overwrite behavior and draft handling are the remaining minor holes.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3; the schema already documents filename, content_base64, service, is_draft, and config_type. The description only reinforces the file-to-snippet naming relationship and the base64 requirement, adding little beyond the structured fields and never mentioning config_type or service scoping.

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 ('Create snippets from base64 files') plus the cardinality and naming rule ('one per file, named after the file'), and explicitly contrasts with the sibling config_create for text input. An agent can distinguish it from config_create, config_update, and config_upload_update without opening any schema.

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

Usage Guidelines4/5

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

Explicitly routes text content to config_create, which is the most likely confusion point among siblings. It does not, however, address when to prefer config_upload_update or how this differs from config_update, so the guidance is clear but not exhaustive.

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

config_updateA
Destructive

Edit, rename or move one snippet from text; omitted fields keep their value. Use config_upload_update to send a file. Saved to the database; the scheduler applies it later; this tool cannot confirm it is live.

NameRequiredDescriptionDefault
dataNoNew snippet content; omit to keep
nameYesSnippet name: letters, digits, _ or -, no extension
typeYesCustom config type, e.g. http, server-http, default-server-http, stream, server-stream, modsec, modsec-crs, crs-plugins-before, crs-plugins-after
serviceNoService ID that owns the snippet; omit or 'global' for global
is_draftNoSet the draft flag; omit to keep
new_nameNoRename the snippet; omit to keep
new_typeNoChange the type; omit to keep
new_serviceNoMove to this service; omit to keep

TDQS

A4.3/5.0
Behavior4/5

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

Beyond the annotations (readOnlyHint=false, destructiveHint=true), the description discloses the crucial asynchronous behavior: the change is saved to the database and the scheduler applies it later, so the tool cannot confirm the change is live. That is real value an agent cannot infer from the structured fields. It stops short of stating reversibility or permission requirements.

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

Conciseness5/5

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

Two tight sentences with zero waste: operation and merge semantics first, sibling routing second. The important asynchronous caveat is packed into the same space without padding.

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 fully described 8-parameter schema, no output schema, and destructive annotations, the description supplies exactly the missing pieces: the patch contract, the sibling alternative, and the eventual-consistency caveat. Nothing an agent needs to call this correctly is absent.

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

Parameters3/5

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

Schema description coverage is 100%, so every one of the 8 parameters is already documented, including the per-param 'omit to keep' note. The description's merge-semantics sentence restates that contract rather than adding new meaning, so the baseline of 3 applies.

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

Purpose5/5

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

States a specific verb set (edit, rename, move) against a specific resource (one snippet, inline text) and explicitly separates itself from the file-based sibling config_upload_update. An agent can identify the operation and its scope without opening the schema.

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

Usage Guidelines4/5

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

Names the alternative for file uploads ('Use config_upload_update to send a file') and states the patch-style contract that omitted fields keep their value. It does not distinguish config_update from config_create or state any precondition around draft vs. live snippets, but the key sibling routing is explicit.

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

config_upload_updateA
Destructive

Replace one snippet's content from a base64 file; without new_name the file stem renames it. Use config_update for text. Saved to the database; the scheduler applies it later; this tool cannot confirm it is live.

NameRequiredDescriptionDefault
fileYesFile whose content replaces the snippet's
nameYesSnippet name: letters, digits, _ or -, no extension
typeYesCustom config type, e.g. http, server-http, default-server-http, stream, server-stream, modsec, modsec-crs, crs-plugins-before, crs-plugins-after
serviceNoService ID that owns the snippet; omit or 'global' for global
new_nameNoNew name; if omitted the file stem renames the snippet, so pass the current name to keep it
new_typeNoChange the type; omit to keep
new_serviceNoMove to this service; omit to keep
new_is_draftNoSet the draft flag; omit to keep

TDQS

A4.4/5.0
Behavior5/5

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

Annotations declare destructiveHint=true, and the description backs that up with the specific destructive side effect most agents would miss: omitting new_name silently renames the snippet from the file stem. It also discloses the persistence model (database write, scheduler applies later) and an explicit limitation (cannot confirm it is live), which no annotation conveys.

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

Conciseness5/5

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

Three short clauses, front-loaded with the action and the base64 requirement, followed by the alternative and then the persistence caveat. Telegraphic but every clause carries a distinct, load-bearing fact.

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

Completeness4/5

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

For an eight-parameter destructive mutation with no output schema, the description covers the surprising side effect, the alternative tool, and the deferred-application model, which is what an agent most needs. It stops short of stating that the prior content is lost or whether type/service must match the existing snippet, leaving a small gap.

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

Parameters3/5

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

Schema description coverage is 100%, so all eight parameters, including the new_name rename behavior and the service/global default, are already documented in the schema. The description echoes the new_name trap for emphasis but adds no syntax or constraint beyond the structured fields, so the baseline 3 applies.

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

Purpose5/5

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

"Replace one snippet's content from a base64 file" gives a specific verb (replace), a scoped resource (one snippet's content), and the input medium (base64 file). The singular "one snippet" implicitly separates it from the bulk sibling configs_upload, and the next clause explicitly separates it from config_update.

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?

"Use config_update for text" names the primary alternative and the condition that selects it, which is exactly the routing decision an agent faces. It does not address when to prefer configs_upload (bulk) or config_create instead, so the alternative map is clear but not complete.

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

convert_serviceA
Destructive

Switch a service between online and draft without deleting it. Use delete_service to remove it. Saved to the database; the scheduler applies it later; this tool cannot confirm it is live.

NameRequiredDescriptionDefault
serviceYesService identifier
convert_toYesTarget state

TDQS

A4.6/5.0
Behavior5/5

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

Beyond the annotations, the description discloses critical behavior: the change is saved to the database, applied asynchronously by the scheduler, and the tool cannot confirm the service is live. That async caveat is exactly the kind of context an agent needs for a mutation whose effect is delayed.

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

Conciseness5/5

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

Three short sentences, front-loaded with the core action and followed by the deletion alternative and the async behavior caveat. Every sentence adds useful information with no repetition 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?

For a two-parameter mutation with no output schema, the description covers the essential semantics and the delayed-application caveat. Minor gaps remain, such as error behavior or permission requirements, but the core context needed to invoke it correctly 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?

The schema already documents both parameters at 100% coverage, but the description adds meaningful domain context by naming the two target states, online and draft, which the schema does not specify via enum or description. This helps the agent infer valid convert_to values.

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

Purpose5/5

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

The description uses a precise verb and resource: 'Switch a service between online and draft.' It also explicitly distinguishes the operation from deletion by naming delete_service, so an agent can tell this is a state-change tool, not a removal tool.

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

Usage Guidelines4/5

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

It gives a clear when-to-use versus delete_service: use this to change state without deleting. However, it does not address update_service, another sibling that could plausibly overlap with changing service state, so the alternative guidance is incomplete.

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

create_serviceA

Create a service from SERVER_NAME and optional settings. Use update_service to change one. Saved to the database; the scheduler applies it later; this tool cannot confirm it is live.

NameRequiredDescriptionDefault
is_draftNoCreate as draft
variablesNoService variables
server_nameYesPrimary server name

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare a non-read-only, non-destructive write. The description adds genuinely useful behavior beyond that: the change is persisted to the database, the scheduler applies it asynchronously, and the tool cannot confirm the service is live. It doesn't mention validation of names, uniqueness, or what is returned, but the eventual-consistency caveat is the important disclosure an agent needs.

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

Conciseness5/5

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

Three compact clauses, front-loaded with the action and followed by the alternative and the behavioral caveat. No sentence is redundant with another, and nothing is padded.

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

Completeness4/5

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

For a three-parameter create tool with annotations and no output schema, the description covers the action, the alternative, and the async persistence caveat. It leaves the return value (e.g., whether a created service identifier is returned) unstated, which is the only meaningful gap.

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

Parameters3/5

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

Schema description coverage is 100%, so all three parameters (including is_draft and variables) are already documented. The description only restates SERVER_NAME and refers vaguely to "optional settings" without adding semantics such as draft behavior or how variables are substituted. Baseline 3 is appropriate when the schema carries the parameter burden.

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

Purpose5/5

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

States a specific verb and resource ("Create a service") plus the key input (SERVER_NAME) and the optional-settings dimension. It also names the sibling that handles the mutation case, so the agent can separate create_service from update_service without inspecting either schema.

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

Usage Guidelines4/5

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

"Use update_service to change one" gives an explicit alternative and the condition that selects it, which is the main routing ambiguity in this sibling cluster. It stops short of covering edge cases like when to use convert_service or is_draft instead, so it is clear context rather than exhaustive guidance.

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

delete_serviceA
Destructive

Delete a service and all its settings; not reversible. Use convert_service to take it offline. Saved to the database; the scheduler applies it later; this tool cannot confirm it is live.

NameRequiredDescriptionDefault
serviceYesService identifier to delete

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true, but the description adds genuinely new context: deletion wipes settings as well as the service, it is irreversible, the change is persisted and applied asynchronously by the scheduler, and the tool cannot confirm the outcome. The async/no-liveness-confirmation disclosure is the kind of trait annotations cannot convey.

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

Conciseness5/5

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

Three short clauses, zero filler, front-loaded with the action and its irreversibility before the alternative and the async caveat. Every sentence carries decision-relevant information.

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

Completeness4/5

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

For a one-param mutation with no output schema, the description covers danger, alternative, and execution model — nearly everything needed. The only small gap is return/error behavior (what happens if the service does not exist), which 'cannot confirm it is live' only partially implies.

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

Parameters3/5

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

With a single parameter at 100% schema coverage, the schema already documents 'service' as the identifier to delete. The description adds nothing about format or resolution (name vs UUID) beyond the schema, so this sits at the baseline.

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

Purpose5/5

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

States a specific verb and resource ('Delete a service') and immediately scopes it ('and all its settings'), which distinguishes it from narrower siblings like instance_delete and plugin_delete. The contrast with convert_service makes the boundary unmistakable.

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 routes the agent to the alternative ('Use convert_service to take it offline') and encodes the when-not condition via 'not reversible' — an agent wanting a reversible takedown is steered away. This is exactly the when-to-use-vs-alternative guidance the dimension rewards.

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

diagnoseB
Read-only

Read-only check of the connected BunkerWeb: reachability, authentication, version, MULTISITE, instances, and optionally who owns a service's settings.

NameRequiredDescriptionDefault
serviceNoOptional service ID (its first SERVER_NAME) to also check existence, draft state and setting owners

TDQS

B3.4/5.0
Behavior3/5

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

The description's 'read-only' claim is consistent with readOnlyHint=true and it enumerates what is inspected, which is useful. It does not disclose cost, latency, permission requirements, or what a failed vs. partially-failed check looks like, so it adds modest value over the annotation.

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

Conciseness4/5

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

One front-loaded sentence with a compact enumeration of checks; nothing is wasted, though the trailing 'and optionally who owns a service's settings' is slightly buried for the only parameter-dependent behavior.

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

Completeness3/5

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

No output schema exists, so the description must imply the return shape, and it only lists topics checked rather than describing the report structure or what happens on partial failures. Adequate but not complete for a diagnostic entry point.

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

Parameters3/5

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

Schema description coverage is 100% and the single optional 'service' parameter is fully documented there, so the schema carries the load. The description only hints at the extra behavior ('who owns a service's settings'), adding marginal detail beyond the schema.

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

Purpose4/5

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

States a specific verb (read-only check) and resource (connected BunkerWeb) and enumerates the dimensions checked: reachability, authentication, version, MULTISITE, instances, and service ownership. An agent understands the scope immediately, though it never distinguishes itself from siblings like health or ping.

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

Usage Guidelines3/5

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

Usage is only implied — the breadth of checks suggests a first-line triage tool, but there is no explicit 'use this when X, use health/ping instead when Y' routing despite several overlapping diagnostic siblings (health, ping, instance_get).

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

get_serviceA
Read-only

Read one service's settings by ID; full=true adds defaults. Cached up to 5 min. Use list_services to find IDs, global_config_read for global settings.

NameRequiredDescriptionDefault
fullNoInclude derived defaults
methodsNoInclude method metadata
serviceYesService identifier
with_draftsNoInclude draft services

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, so safety is covered. The description adds meaningful behavior beyond that with 'Cached up to 5 min', telling the agent results may be stale. It doesn't discuss auth requirements or error cases, but for a read-only lookup the cache disclosure is the key trait.

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

Conciseness5/5

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

Two tight sentences with zero waste: core behavior first, then caching caveat, then sibling routing. Everything is front-loaded and each clause earns its place.

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

Completeness5/5

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

For a read-only getter with no output schema and full schema documentation, the description supplies what structured fields cannot: sibling routing, the meaning of the full flag, and cache staleness. Nothing needed to call it correctly is missing.

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

Parameters3/5

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

Schema coverage is 100%, with all four parameters documented including the full/methods/with_drafts defaults, so the schema carries the semantics. The description restates only the full flag and adds no format details for the service identifier or methods/with_drafts beyond the schema. Baseline 3 applies.

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

Purpose5/5

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

Names a specific verb and resource ('read one service's settings by ID') plus the scope modifier (full=true adds defaults), so an agent knows exactly what the tool returns. It is immediately distinguishable from list_services and global_config_read, which it names.

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 routes the agent: use list_services to find IDs and global_config_read for global settings. It also states the condition under which the full flag matters, leaving no alternatives to inference.

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

global_config_readA
Read-only

Read global settings; full=true adds defaults. Results may be cached up to 10 min. Use get_service for one service's settings.

NameRequiredDescriptionDefault
fullNoInclude defaulted settings
methodsNoInclude method metadata

TDQS

A4.2/5.0
Behavior4/5

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

Annotations only declare readOnlyHint=true, so the description's added caveat that results may be cached up to 10 minutes is genuinely new and operationally important for a read tool — it tells the agent the data may be stale. It does not disclose anything about permissions or the shape of the returned settings, so it stops short of a 5.

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

Conciseness5/5

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

Three compact clauses, front-loaded with the core action, then the caching caveat, then the alternative routing. Every sentence earns its place with no filler.

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

Completeness4/5

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

For a two-boolean read-only tool this covers the essentials: what it returns conceptually (global settings plus optional defaults), staleness (10-minute cache), and where to go for the narrower case. It does not describe the response structure, and with no output schema present that leaves a small gap, but not one that would cause a mis-call.

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

Parameters3/5

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

Schema coverage is 100%, so both parameters are already documented. The description restates full=true as adding defaults, which marginally reinforces the schema rather than adding new semantics, and it never mentions the methods parameter at all. Baseline 3 is appropriate.

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

Purpose5/5

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

States a specific verb and resource ("Read global settings") and immediately differentiates from the sibling get_service by naming it for the per-service case. An agent can pick between the two without opening either schema.

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

Usage Guidelines4/5

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

Explicitly routes the agent to get_service when only one service's settings are needed, which is the primary confusion risk here. It stops short of stating when-not to use this tool (e.g., prefer config_get for individual config entries), so it is clear context rather than full when/when-not guidance.

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

global_config_updateA
Destructive

Set global settings from key-value pairs; other settings are kept. Use update_service for one service. Saved to the database; the scheduler applies it later; this tool cannot confirm it is live.

NameRequiredDescriptionDefault
configYesKey-value pairs to update

TDQS

A4.2/5.0
Behavior4/5

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

Annotations only say readOnlyHint=false and destructiveHint=true; the description goes further by disclosing that other settings are preserved (merge, not replace), that changes persist to the database, and that the scheduler applies them later so liveness cannot be confirmed. That async caveat is exactly the kind of trait annotations cannot convey. Not a 5 because prerequisite permissions/validation behavior remain unstated.

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

Conciseness5/5

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

Three compact clauses: what it does, which sibling to prefer, and the persistence/async caveat. Front-loaded and every sentence earns its place.

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

Completeness4/5

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

For a destructive, async-applied config mutation with no output schema, the description covers scope, merge behavior, persistence, and the delayed-application limitation. Minor gap: no statement about permissions or validation failures on bad keys.

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

Parameters3/5

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

Schema coverage is 100% and the single 'config' parameter is documented as flexible key-value pairs, so the schema already carries the weight. The description adds merge semantics ('other settings are kept'), which is genuinely useful, but adds no key naming or value-format guidance.

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

Purpose5/5

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

States a specific verb and resource ('Set global settings from key-value pairs') and immediately distinguishes scope from the sibling 'update_service for one service'. An agent can pick between the two without opening either schema.

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

Usage Guidelines4/5

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

Explicitly routes the agent to update_service when the change is scoped to a single service, which is the most likely confusion point among the large sibling set. It lacks an explicit 'when not to use' clause beyond that, so it stops short of a 5.

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

healthA
Read-only

Read the API's own liveness probe (GET /health); it does not contact instances. Use instances_ping_all for instances and diagnose for auth and version checks.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.6/5.0
Behavior4/5

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

Annotations only declare readOnlyHint=true, so the description earns credit for disclosing that the probe 'does not contact instances' — a genuinely useful scope boundary that prevents misreading an all-healthy response as instance health. It stops short of describing what the response contains or failure semantics, which keeps it below 5.

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

Conciseness5/5

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

Two tight sentences: the capability first, then the routing to alternatives. Zero filler and no repetition of the name or endpoint twice.

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 no-arg, read-only liveness probe with rich annotation and full schema coverage, the description covers purpose, scope, and sibling routing. The only gap is the shape of the result (e.g. status payload or degraded state), which there is no output schema to cover.

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 takes zero parameters, so there is no parameter semantics to convey; the baseline for a no-param tool applies. Nothing in the description is needed to disambiguate arguments.

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

Purpose5/5

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

States a specific verb and resource ('Read the API's own liveness probe') and anchors it to a concrete endpoint (GET /health). The scope qualifier 'its own' plus the sibling callouts make it unambiguously distinct from instances_ping_all and ping.

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 routes the agent: use instances_ping_all for instance reachability and diagnose for auth/version checks. Both alternatives are named with the condition that selects them, leaving nothing to inference.

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

instance_createA

Register a new instance for the scheduler to manage. Use instance_update to change one. Saved to the database; the scheduler applies it later; this tool cannot confirm it is live.

NameRequiredDescriptionDefault
nameNoFriendly instance name
portNoInstance API HTTP port (API_HTTP_PORT)
methodNoSource method tag recorded on the instance
hostnameYesHostname or IP the scheduler uses to reach the instance API
https_portNoInstance API HTTPS port
server_nameNoHost header sent to the instance API (API_SERVER_NAME)
listen_httpsNoWhether the instance API is reached over HTTPS

TDQS

A4.4/5.0
Behavior5/5

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

Annotations only say readOnlyHint=false and destructiveHint=false. The description adds genuinely new behavioral context: the record is persisted to the database, the scheduler applies it asynchronously later, and the call cannot confirm the instance is live. That async/eventual-consistency caveat is exactly the kind of information an agent cannot get from structured fields.

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

Conciseness5/5

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

Three short sentences, no filler: purpose first, alternative second, behavioral caveat last. Each sentence carries distinct information.

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

Completeness4/5

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

For a 7-parameter creation tool with no output schema, the description covers what is created, what happens to it, and the key limitation on confirmation. It does not indicate what the call returns (e.g. an id or the created record), which would help close the loop on a create operation.

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

Parameters3/5

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

Schema description coverage is 100%, so all seven parameters (hostname, port, server_name, listen_https, etc.) are already documented. The description adds no parameter-level meaning beyond the schema, which is acceptable at full coverage but merits only the baseline.

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

Purpose5/5

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

States a specific verb and resource ("Register a new instance for the scheduler to manage") and immediately differentiates it from instance_update. An agent can tell which sibling to pick without opening any schema.

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

Usage Guidelines4/5

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

Explicitly routes modification cases to instance_update ("Use instance_update to change one"), giving a clear alternative for the adjacent operation. It stops short of stating preconditions or when-not-to-use cases (e.g. duplicate hostnames), so not a full 5.

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

instance_deleteA
Destructive

Unregister one UI/API-registered instance; the host keeps running. Use instances_delete_bulk for several. Saved to the database; the scheduler applies it later; this tool cannot confirm it is live.

NameRequiredDescriptionDefault
hostnameYesInstance hostname

TDQS

A4.4/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, so the safety profile is known; the description still adds real value by disclosing the asynchronous model ("Saved to the database; the scheduler applies it later") and its key limitation ("cannot confirm it is live"). It doesn't state any auth/permission requirements or what an error response looks like for a non-existent hostname, which keeps it below a 5 for a destructive mutation.

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

Conciseness5/5

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

Three compact clauses, each load-bearing: what it does, how to handle multiples, and the async caveat. The primary effect and the host-keeps-running reassurance are front-loaded ahead of the routing hint.

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

Completeness4/5

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

For a one-parameter destructive tool with no output schema, the description covers the essentials: effect scope, alternative for bulk, deferred application, and inability to verify liveness. The only meaningful gap is that the deferred-application warning doesn't say how to check whether the deletion actually took effect (e.g., via instance_get).

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

Parameters3/5

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

Schema coverage is 100% with a single required hostname already documented as "Instance hostname", so the schema carries the parameter burden. The description only indirectly enriches the parameter by implying the hostname must refer to a UI/API-registered instance rather than a file-declared one — a useful but thin addition over the schema.

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

Purpose5/5

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

States a specific verb and resource ("Unregister one UI/API-registered instance") and immediately scopes the effect ("the host keeps running"), which separates it from instance_stop and instance_delete-adjacent siblings. The restriction to UI/API-registered instances further pins down which entities are eligible.

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 routes multi-delete traffic to instances_delete_bulk ("Use instances_delete_bulk for several"), giving a named alternative plus the condition that selects it. The "UI/API-registered" qualifier also implicitly excludes config-file-declared instances, so the agent knows the boundary of applicability.

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

instance_getA
Read-only

Fetch one registered instance by hostname. Results may be cached up to 60 s. Use list_instances to find hostnames, instance_ping to test reachability.

NameRequiredDescriptionDefault
hostnameYesInstance hostname

TDQS

A4.4/5.0
Behavior4/5

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

The annotations already declare this as a read-only operation. The description adds a useful behavioral detail not present in annotations: results may be cached for up to 60 seconds, which can affect freshness expectations.

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 sentences, front-loads the core action, then adds caching and sibling-usage guidance. There is no wasted text.

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

Completeness4/5

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

For a simple one-parameter read operation with readOnlyHint and full schema coverage, the description is nearly complete. It could say a little more about the fetched instance shape, but the core behavior and freshness caveat are covered.

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

Parameters3/5

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

Schema coverage is 100% for the single hostname parameter, so the schema already carries the parameter documentation. The description reinforces the hostname-based lookup but does not add syntax or format details 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 states a specific verb and resource: fetch one registered instance by hostname. It also names related tools, which helps distinguish this operation from listing instances or pinging reachability.

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

Usage Guidelines5/5

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

It explicitly tells the agent how to obtain a hostname via list_instances and directs reachability testing to instance_ping. This gives clear routing guidance against the most relevant sibling tools.

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

instance_pingA
Read-only

Ping one instance live by hostname. Use instances_ping_all for every instance; instance_get returns the stored record without pinging.

NameRequiredDescriptionDefault
hostnameYesInstance hostname

TDQS

A4.4/5.0
Behavior4/5

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

Annotations declare readOnlyHint=true, and the description adds the key behavioral distinction that this performs a live probe rather than reading cached state, which matters for latency and failure modes. It stops short of saying what a failed ping looks like or whether it can time out.

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

Conciseness5/5

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

Two short sentences, zero filler, with the primary action front-loaded and the disambiguation following. Every clause carries routing or scope information.

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

Completeness4/5

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

For a single-parameter read-only probe, the description covers what it does, how it differs from neighbors, and that the result is live. What a ping result contains (latency, success/failure) is left implicit since there is no output schema to lean on.

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

Parameters3/5

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

One required parameter at 100% schema coverage, so the schema already defines hostname as 'Instance hostname'. The description's 'by hostname' restates the same idea and adds no format or resolution detail beyond the schema, making the baseline 3 appropriate.

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

Purpose5/5

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

States a specific verb ('ping'), scope ('one instance') and mode ('live by hostname'), which immediately separates it from the bulk and read-only siblings. An agent can pick this without opening any schema.

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

Usage Guidelines5/5

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

Explicitly names two alternatives and the condition selecting each: instances_ping_all for every instance, instance_get for the stored record without pinging. The remaining case (live single-instance probe) is the implied default and is unambiguous.

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

instances_delete_bulkA
Destructive

Unregister several UI/API-registered instances; the hosts keep running. Use instance_delete for one. Saved to the database; the scheduler applies it later; this tool cannot confirm it is live.

NameRequiredDescriptionDefault
instancesYesHostnames to delete

TDQS

A4.7/5.0
Behavior5/5

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

Goes well beyond the destructiveHint=true annotation: it clarifies the hosts are NOT stopped, that the change is persisted to the database and applied asynchronously by the scheduler, and that the tool cannot confirm liveness. These are exactly the caveats an agent needs before calling a destructive bulk operation.

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

Conciseness5/5

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

Three compact clauses, zero filler, with the destructive scope and the sibling alternative front-loaded before the caveats. Every sentence carries distinct information.

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

Completeness5/5

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

For a one-parameter destructive tool with no output schema, it covers effect (unregister), non-effect (hosts keep running), persistence/async semantics, verification limits, and the single-vs-bulk alternative. Nothing material is missing.

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

Parameters3/5

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

Schema coverage is 100% for the single `instances` array parameter, so the schema already documents it as hostnames to delete. The description adds only the quantifier "several" and the notion that entries are UI/API-registered, which is marginal beyond the schema. Baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource ("Unregister several UI/API-registered instances") plus the crucial scope qualifier that the hosts keep running. This is immediately distinguishable from instance_delete and instance_stop, which are named or implied in the sibling list.

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

Usage Guidelines5/5

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

Explicitly routes the agent: "Use instance_delete for one," which names the alternative and the condition that selects it. Combined with "several" in the opening clause, the bulk-vs-single decision is fully determined.

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

instances_ping_allA
Read-only

Ping every registered instance live and report which answer. Use instance_ping for one host; list_instances returns registration data without pinging.

NameRequiredDescriptionDefault

No parameters

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 the description is consistent with that while adding real information: the ping is live (actual contact with hosts) rather than reading stored registration data. It does not cover latency, timeouts, or what an unreachable instance yields, which keeps it below a 5.

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

Conciseness5/5

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

Two short sentences, zero waste, with the core action front-loaded and the sibling disambiguation following. Every clause earns its place.

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

Completeness4/5

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

For a zero-argument read-only tool with no output schema, 'report which answer' adequately signals the per-instance answer mapping. It stops short of describing timeout or partial-failure reporting, which is the only remaining 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 tool takes zero parameters, so the baseline is 4; there is nothing for the description to compensate for. No misleading parameter language is present.

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 (ping) and resource (every registered instance) plus the output intent (report which answer). It also distinguishes itself from two named siblings, so an agent can select it without opening any schema.

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

Usage Guidelines5/5

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

Explicitly routes alternatives: instance_ping for a single host, list_instances for registration data without pinging. Both the when-to-use and the when-not-to-use conditions are stated.

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

instances_stop_allA
Destructive

Stop every registered instance; traffic stops until they restart. Use instance_stop for one host. Acts on the instances immediately.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.6/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, so the safety profile is known; the description adds genuinely new consequence information (traffic stops until instances restart) and timing (acts immediately). It stops short of stating auth requirements, whether it fails partially, or how recovery is triggered beyond the word "restart."

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

Conciseness5/5

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

Three short clauses, zero filler, with the blast radius and the outage consequence front-loaded before the alternative-tool pointer. 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 no parameters and no output schema, and annotations covering the safety profile, the description supplies what an agent actually needs: scope, consequence, and the sibling alternative. Slightly thin only on partial-failure behavior and how instances are restarted.

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 takes zero parameters, so there is no parameter meaning to convey and the baseline applies. The description correctly implies a global scope with no filtering options.

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

Purpose5/5

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

States a specific verb and resource with an explicit scope qualifier ("Stop every registered instance") and immediately contrasts it with the single-host sibling. An agent can distinguish this from instance_stop without opening any schema.

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

Usage Guidelines5/5

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

Names the alternative explicitly ("Use instance_stop for one host") and pairs it with the condition that selects it. That is the only realistic branching decision for this tool family, and it is stated outright.

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

instance_stopA
Destructive

Stop one instance by hostname; it serves no traffic until restarted. Use instances_stop_all for all. Acts on the instances immediately.

NameRequiredDescriptionDefault
hostnameYesInstance hostname

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare this is not read-only and is destructive, and the description adds useful behavioral context: the instance serves no traffic until restarted and the action is immediate. It does not describe confirmation, error behavior, or side effects beyond traffic loss, but it meaningfully improves on 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 and front-loaded: the main action and scope come first, followed by the sibling alternative and the immediate effect. Every clause earns its place.

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

Completeness4/5

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

For a single-parameter destructive tool with annotations covering safety and a fully described schema, the description is largely complete: it names the impact and immediate behavior. It does not mention failure handling or restart expectations beyond traffic loss, but no major invocation gap remains.

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

Parameters3/5

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

Schema description coverage is 100%, so the hostname parameter is already documented. The description reinforces that the tool targets one instance by hostname but adds no format, validation, or example semantics 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 states a specific verb and resource: stop one instance, scoped by hostname. It also explicitly distinguishes the single-instance action from the bulk sibling instances_stop_all, so an agent can select it without opening the schema.

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

Usage Guidelines4/5

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

It gives a clear usage condition by specifying one instance versus all instances and naming instances_stop_all for the bulk case. It does not discuss other nearby alternatives such as deletion or reload, but the primary routing guidance is clear.

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

instance_updateA
Destructive

Change a registered instance; omitted fields keep their value. Use instance_create for a new host. Saved to the database; the scheduler applies it later; this tool cannot confirm it is live.

NameRequiredDescriptionDefault
nameNoNew friendly name; omit to keep
portNoNew instance API HTTP port; omit to keep
methodNoNew source method tag; omit to keep
hostnameYesHostname of the registered instance to update
https_portNoNew instance API HTTPS port; omit to keep
server_nameNoNew Host header for the instance API; omit to keep
listen_httpsNoReach the instance API over HTTPS; omit to keep

TDQS

A4.2/5.0
Behavior4/5

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

Adds real behavior beyond the annotations: the write is persisted to the database yet only applied later by the scheduler, and the tool cannot confirm the change is live. That async propagation caveat is exactly the kind of context annotations cannot express. It stops short of 5 because destructiveHint=true is left unqualified – no word on whether re-pointing ports/server_name breaks a running instance or whether the change is reversible.

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

Conciseness5/5

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

Three short sentences, no waste, ordered by importance: what it does, the alternative, then the operational caveat. Every clause earns its place.

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

Completeness4/5

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

For a 7-parameter mutation with no output schema, the description covers the essentials an agent needs to call it safely: partial-update semantics and the fact that success is not immediately verifiable. Missing only permission/error expectations and any hint that the instance must already be registered, which the hostname description partially covers.

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

Parameters3/5

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

Schema coverage is 100% and each property already carries an "omit to keep" description, so the description's patch-semantics line mostly restates what the schema documents. It adds no field-level meaning (e.g. what hostname keys on, or how port vs https_port interact), so baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource ("Change a registered instance") and immediately distinguishes it from the sibling creator ("Use instance_create for a new host"). An agent can tell update apart from create/delete/get without opening any schema.

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

Usage Guidelines4/5

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

Explicitly routes new-host work to instance_create, and the patch semantics ("omitted fields keep their value") tell the agent it may send a partial payload. It gives no when-not guidance (e.g. use instance_get first to inspect current values, or that hostname must already exist), keeping it 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.

jobs_listA
Read-only

List scheduler jobs with their run history and cache metadata. Use cache_list for the files they wrote, and jobs_run when writes are enabled to trigger them.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

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

readOnlyHint=true already tells the agent this is a safe read, so the description's burden is lighter. It adds real context beyond the annotation: the listing includes run history and cache metadata, and that triggering jobs is a separate, write-gated action. It does not cover pagination or result volume, which keeps it below a 5.

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

Conciseness5/5

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

Two short sentences, zero filler, with the core purpose front-loaded and the sibling routing as follow-up. Every clause carries information.

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

Completeness4/5

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

For a zero-parameter read tool with no output schema, the description covers what the tool does, what comes back at a high level, and where to go for related operations. Only minor gaps remain, such as ordering or volume of the returned job list.

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

Parameters4/5

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

The tool takes no parameters and the schema is empty, so there is nothing for the description to disambiguate. Baseline 4 applies; no parameter semantics are missing.

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

Purpose5/5

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

The description states a specific verb and resource ("List scheduler jobs") and adds the payload scope ("with their run history and cache metadata"). It also names the sibling tools that cover adjacent tasks, so an agent can distinguish it from cache_list and jobs_run without opening any schema.

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

Usage Guidelines4/5

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

It explicitly routes two common follow-on intents: use cache_list for the files the jobs wrote, and use jobs_run to trigger jobs (only when writes are enabled). That is clear positive guidance with a stated precondition, though there is no explicit statement of when not to use jobs_list.

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

jobs_runA

Trigger the jobs of one or more plugins, e.g. after cache_delete_file. Use jobs_list to check results. Queued for the scheduler; this tool cannot confirm it ran.

NameRequiredDescriptionDefault
jobsYesJobs to execute

TDQS

A4.5/5.0
Behavior5/5

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

Adds the single most important behavioral fact, which no annotation conveys: the trigger is queued for the scheduler and 'this tool cannot confirm it ran.' That tells the agent to poll jobs_list rather than treat a success response as execution. With readOnlyHint=false and destructiveHint=false, the safety profile is already covered by annotations, so this is pure added 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?

Three short sentences, zero waste, and the action is front-loaded before the alternative tool and the async caveat. Every sentence carries distinct information.

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

Completeness5/5

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

For a one-parameter async trigger tool with no output schema, the description covers what it does, when to call it, that it is fire-and-forget, and where to look for outcomes. Nothing an agent needs in order to invoke it correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100% and the single parameter (an array of JobDescriptor with plugin and informational name) is fully documented in the schema. The description only paraphrases it with 'one or more plugins', adding no format or cardinality detail beyond what the schema already states. Baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource: 'Trigger the jobs of one or more plugins.' It also names the sibling tool jobs_list for result checking and gives a concrete motivating example (cache_delete_file), so an agent can tell it apart from jobs_list without opening either schema.

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

Usage Guidelines4/5

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

Provides a concrete usage cue ('e.g. after cache_delete_file') and explicitly routes result-checking to jobs_list. What is missing is any when-not guidance or prerequisite note (e.g. whether the plugin must already exist or be enabled).

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

list_bansA
Read-only

List active IP bans as reported by each instance. Results may be cached up to 30 s. It gives the exact IPs and services for unban_ip when writes are enabled.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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

The readOnlyHint annotation already signals a safe read operation. The description adds useful behavioral context by disclosing that results may be cached up to 30 s and by explaining that the output contains exact IPs and services for unban_ip.

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

Conciseness5/5

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

The description is two sentences with no wasted text. The core purpose is front-loaded, followed by the cache caveat and the unban_ip connection.

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

Completeness5/5

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

For a read-only list tool with no parameters and no output schema, the description is complete enough: it covers scope, per-instance reporting, cache behavior, and the practical use of the returned IP/service data.

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 are no parameter semantics to clarify. Per the baseline for a 0-parameter tool, this dimension scores 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 states a specific verb and resource ("List active IP bans") and adds scope ("as reported by each instance"). It also names the sibling tool unban_ip, which helps distinguish its role from related ban-management 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?

It gives clear usage context: the output provides the exact IPs and services needed for unban_ip when writes are enabled. It does not state explicit exclusions or when-not conditions, but the intended use case is clear.

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

list_instancesA
Read-only

List every registered BunkerWeb instance with its status. Results may be cached up to 60 s. Use instance_get for one host, instances_ping_all for live reachability.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, so safety is covered by structured data. The description adds genuinely useful behavioral context with the 'cached up to 60 s' staleness window, which affects whether the agent can trust status freshness. It doesn't say whether auth is required or whether the list is paginated, so it is above baseline but not rich.

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

Conciseness5/5

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

Three short sentences, zero waste, with the core action front-loaded and the caveat and routing following in priority order.

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?

No output schema exists, yet the description discloses the key returned field (status) and the freshness caveat, which is sufficient for a zero-param list tool. Only the auth/permission expectation is left implicit.

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?

Zero parameters, so the baseline applies. The description still clarifies scope by saying 'every' instance, signaling there is no filtering or pagination knob to reach for.

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

Purpose5/5

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

States a specific verb and resource ('List every registered BunkerWeb instance') plus the payload detail that matters ('with its status'). This is clearly distinguishable from instance_get and instances_ping_all, which it names.

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 routes the agent: 'Use instance_get for one host, instances_ping_all for live reachability.' Both the when-to-use and the alternatives are stated, leaving nothing to inference.

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

list_servicesA
Read-only

List services with their configuration and dates. Results may be cached up to 5 min. Use get_service to read one service in detail.

NameRequiredDescriptionDefault
with_draftsNoInclude draft services

TDQS

A4.2/5.0
Behavior4/5

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

The readOnlyHint annotation already declares this is a safe read, and the description adds a genuinely non-obvious behavioral trait: results may be cached for up to 5 minutes, which matters for freshness expectations. It stops short of describing ordering, size limits, or pagination of the result set.

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

Conciseness5/5

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

Three short sentences with zero filler; the core purpose leads, the caching caveat and the sibling pointer follow in priority order.

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

Completeness4/5

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

For a simple one-parameter read tool with annotation coverage and no output schema, the definition covers purpose, freshness, and the key alternative. A brief note on result shape or scale (how many services, whether unpaginated) would close the remaining gap.

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

Parameters3/5

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

Schema description coverage is 100% and the single boolean with_drafts is fully documented in the schema, so baseline 3 applies. The description adds no extra meaning about the parameter, such as whether drafts are excluded by default in downstream behavior.

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

Purpose5/5

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

States a specific verb and resource ('List services') plus what is returned ('configuration and dates'), and explicitly contrasts with the sibling get_service for single-service detail. An agent can distinguish this from get_service without opening either schema.

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

Usage Guidelines4/5

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

Explicitly routes the agent to get_service when one service's full detail is needed, which is a clear usage split. It does not state when to use list vs. other list siblings (e.g. configs_list) or how with_drafts should factor into the decision, so it falls just short of full when/when-not coverage.

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

pingA
Read-only

Check that the BunkerWeb API answers (GET /ping, returns pong). Use it as the fastest liveness probe; use diagnose to also check authentication, version and instances.

NameRequiredDescriptionDefault

No parameters

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, so the safety profile is covered. The description adds useful scope information beyond that: it discloses that this call checks reachability only and does not verify authentication, version, or instances, which prevents an agent from over-reading a successful pong. A minimal note on timeout/error behavior would earn a 5.

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

Conciseness5/5

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

Two short sentences, front-loaded with the action and endpoint, then the routing guidance. Every clause carries information; nothing is padding.

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

Completeness5/5

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

For a zero-parameter liveness probe, the description covers what it does, what response to expect, what it does not verify, and which sibling to use instead. No output schema exists, but the return value (pong) is stated inline, so nothing an agent needs is missing.

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

Parameters4/5

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

The tool takes zero parameters, so there is nothing for the description to disambiguate and the baseline of 4 applies. No misleading parameter claims are made.

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

Purpose5/5

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

States a specific verb and resource ('Check that the BunkerWeb API answers'), names the exact endpoint (GET /ping), and gives the expected response (pong). An agent can distinguish it from diagnose without reading any schema.

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

Usage Guidelines5/5

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

Explicitly says to use it as the fastest liveness probe and names the alternative, diagnose, together with what extra checks that alternative adds (authentication, version, instances). Both the when and the when-else are stated.

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

plugin_deleteA
Destructive

Uninstall one UI-installed plugin by ID; other plugins are refused. Use plugins_list with type=ui to find IDs. Saved to the database; the scheduler applies it later; this tool cannot confirm it is live.

NameRequiredDescriptionDefault
plugin_idYesID of a UI plugin, as returned by plugins_list type=ui

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true, so the description does not waste words on that; instead it adds non-obvious behavior - the delete is persisted to the database and applied later by the scheduler, and the tool cannot confirm the plugin is actually stopped. This deferred/asynchronous consequence is exactly what annotations cannot convey.

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

Conciseness5/5

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

Three short clauses, front-loaded with the action and scope, then the lookup helper, then the behavioral caveat. No filler and no repetition.

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

Completeness5/5

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

For a single-parameter destructive tool with annotations covering the safety profile and no output schema, the description supplies everything needed: how to obtain the ID, what gets rejected, and the fact that success is not immediately verifiable.

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

Parameters3/5

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

Schema coverage is 100% and the single parameter already documents 'ID of a UI plugin, as returned by plugins_list type=ui'. The description largely restates that constraint, adding no syntax, format, or edge-case detail beyond the schema, so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource ('Uninstall one UI-installed plugin by ID') plus a scope restriction ('other plugins are refused'), which immediately separates it from plugins_upload and plugins_list. No ambiguity about what the tool does.

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 names the prerequisite/alternative: 'Use plugins_list with type=ui to find IDs.' It also states an exclusion ('other plugins are refused'), so the agent knows both when to use it and when it will fail.

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

plugins_listA
Read-only

List installed plugins, filtered by type (all, external, ui, pro). type=ui lists the IDs accepted by plugin_delete when writes are enabled; use jobs_list for jobs.

NameRequiredDescriptionDefault
typeNoPlugin type filter: all, external, ui or proall
with_dataNoInclude each plugin's archive data

TDQS

A4.1/5.0
Behavior3/5

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

readOnlyHint=true already declares the safety profile, so the description's burden is lighter. It adds a useful conditional note that the ui listing only maps to deletable IDs "when writes are enabled", but says nothing about the with_data payload cost or result size, which matters for a listing call that can embed archive data.

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

Conciseness4/5

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

One front-loaded sentence with no filler; the filter semantics come first and the cross-references follow. The trailing "use jobs_list for jobs" clause is slightly tangential but earns its place as disambiguation.

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

Completeness4/5

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

For a two-parameter, fully documented, read-only list tool with no output schema, this covers what an agent needs to invoke it correctly. Minor gaps remain around the shape/cost of results when with_data is true, but the schema carries the parameter meaning.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3; the description goes slightly beyond by giving type=ui a downstream meaning (IDs accepted by plugin_delete) rather than just an enum label. The with_data parameter is left entirely to the schema, which is acceptable given full coverage.

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

Purpose5/5

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

Specific verb+resource ("List installed plugins") plus the filter dimension (all, external, ui, pro). It also names the sibling it is not ("use jobs_list for jobs") and cross-references plugin_delete, so an agent can place it in the toolset without opening the schema.

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

Usage Guidelines4/5

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

Gives a concrete selection rule for the type parameter (type=ui → IDs accepted by plugin_delete when writes are enabled) and redirects to jobs_list for jobs. It lacks an explicit statement of when not to call it, but the routing context is clear enough to act on.

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

plugins_uploadA
Destructive

Install UI plugins from base64 archives; an existing plugin ID is refused. Use plugin_delete first to replace a UI plugin. Saved to the database; the scheduler applies it later; this tool cannot confirm it is live.

NameRequiredDescriptionDefault
filesYesPlugin archives (.zip, .tar.gz or .tar.xz), base64 encoded
methodNoInstallation method; the API supports only uiui

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true, but the description adds critical context the annotations can't: the refusal on existing IDs, the asynchronous scheduler-based apply, and that the tool cannot confirm liveness. This is exactly the kind of operational nuance an agent needs beyond the safety flags.

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

Conciseness5/5

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

Three compact sentences, front-loaded with the action and the refusal behavior before the replacement guidance and async caveat. No filler or repetition.

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 write tool with no output schema, the description covers what gets written (database), when it takes effect (scheduler later), what it cannot confirm (liveness), and the replacement workflow. Nothing an agent needs to avoid a bad call is missing.

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

Parameters3/5

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

Schema coverage is 100% and both parameters (files, method) are fully documented in the schema, so the description correctly defers to it. It adds no parameter-level detail itself, which is acceptable at this coverage level, but it doesn't earn extra credit.

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

Purpose5/5

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

States a specific verb and resource ('Install UI plugins from base64 archives') and immediately names a key constraint ('an existing plugin ID is refused'). An agent can distinguish this from plugins_list and plugin_delete without opening the schema.

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

Usage Guidelines5/5

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

Explicitly names the alternative path for replacement ('Use plugin_delete first to replace a UI plugin') and the condition that triggers it (existing plugin ID). It also notes the failure mode when the ID exists, so the agent knows when not to call it directly.

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

reload_instanceA
Destructive

Reload configuration on one instance, testing it first by default. Use reload_instances for all. Acts on the instances immediately.

NameRequiredDescriptionDefault
testNoTest the configuration first and reload only if the test passes; this still reloads, it is not a dry run.
hostnameYesTarget instance hostname

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false and destructiveHint=true, so the risk profile is known. The description adds that the action 'acts on the instances immediately', implying no confirmation or undo step, but says nothing about service interruption, rollback on failure, or what changes if the test rejects the config.

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

Conciseness4/5

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

Three short, front-loaded sentences with no filler, and the alternative is named before the caveat. Minor flaw: 'Acts on the instances immediately' uses a plural noun for a single-instance tool, which slightly muddies the scope it just established.

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

Completeness3/5

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

For a destructive single-instance mutation with no output schema, the definition covers what it does and the sibling choice, but leaves out operational consequences an agent should weigh: service disruption during reload, what happens when the config test fails, and whether the previous config is retained.

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

Parameters3/5

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

Schema coverage is 100% and the 'test' parameter already documents the non-dry-run semantics in detail. The description only echoes the default ('testing it first by default') and adds no syntax, format, or hostname-selection guidance beyond the schema. Baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource ('Reload configuration on one instance') plus the default behavior (test first), and explicitly contrasts with the sibling 'reload_instances'. An agent can pick between the singular and bulk tools without opening either schema.

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

Usage Guidelines4/5

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

'Use reload_instances for all' names the alternative and the condition that selects it, giving clear scope guidance. It stops short of stating when a reload should be avoided (e.g. healthy instances or maintenance windows), so there is no explicit when-not.

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

reload_instancesA
Destructive

Reload configuration on every instance, testing it first by default. Use reload_instance for one host. Acts on the instances immediately.

NameRequiredDescriptionDefault
testNoTest the configuration first and reload only if the test passes; this still reloads, it is not a dry run.

TDQS

A4.2/5.0
Behavior3/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, so the safety profile is known. 'Acts on the instances immediately' adds useful context that there is no confirmation or preview step, but the description says nothing about rolling vs parallel execution, partial failure handling, or whether a failed reload leaves instances in a bad state — material for a destructive bulk operation.

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

Conciseness5/5

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

Three short sentences with zero filler; scope, alternative, and immediacy are all front-loaded. Nothing is repeated or padded.

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

Completeness4/5

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

For a one-parameter tool with no output schema and annotations covering destructiveness, the description covers scope, targeting, default behavior, and immediacy. The only gap is what happens on partial failure across many instances, which is secondary.

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

Parameters3/5

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

Schema description coverage is 100% and the single test parameter is already fully documented, including the important 'not a dry run' caveat. The description only echoes the default, so baseline 3 applies.

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

Purpose5/5

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

States a specific verb (reload) and resource scope (every instance) and immediately distinguishes itself from the single-host sibling reload_instance. An agent can tell the two apart without opening either schema.

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

Usage Guidelines5/5

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

'Use reload_instance for one host' names the alternative and the condition that selects it, giving a clear fan-out vs single-target rule. The default test-first behavior is also surfaced so the agent knows what happens without parameters.

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

search_bunkerweb_docsA
Read-only

Search the official BunkerWeb documentation by meaning (remote semantic search). Returns titled sections with URL, category and relevance, one per document. Use it for how-to and setting questions; use the API tools to read live state.

NameRequiredDescriptionDefault
limitNoMaximum results to return, 1 to 50
queryYesQuestion or topic in natural language, any language
categoryNoOptional docs section filter, e.g. api, plugins, features
min_scoreNoRelevance threshold from 0 to 1; lower it when nothing matches
max_content_lengthNoCharacters of content per result; 0 returns full sections

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior3/5

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

readOnlyHint=true already covers the safety profile, and the description adds that the search is remote/semantic and what each result contains (title, URL, category, relevance). However, an output schema exists, so the return-shape detail is largely redundant, and it says nothing about latency, result volume, or behavior when nothing matches (that tuning hint lives only in the schema).

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

Conciseness5/5

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

Two sentences, purpose front-loaded, then return shape, then the routing rule. No filler and every clause carries information.

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

Completeness5/5

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

With 5 params at full schema coverage, a readOnly annotation and an output schema, the description covers everything an agent still needs: what the search is, what it returns, and when to prefer the live-state API 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 description coverage is 100%, including the purpose of query, limit, category, min_score and max_content_length, so the schema does the heavy lifting. The description adds no parameter-level guidance beyond implying natural-language queries and a category-ish result field.

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

Purpose5/5

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

States a specific verb and resource ("Search the official BunkerWeb documentation") plus the mechanism (semantic / meaning-based, remote) and the unit of return (one titled section per document). It also explicitly distinguishes itself from the API tools that read live state, so an agent can separate documentation lookup from live-state calls at a glance.

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

Usage Guidelines4/5

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

Gives a clear routing rule: how-to and setting questions go here, live-state questions go to the API tools. It stops short of naming which specific sibling to use for a given live-state need, but the boundary is unambiguous.

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

unban_ipA
Destructive

Lift bans for one or more IPs, globally or per service. Use list_bans first to find them. Acts on the instances immediately.

NameRequiredDescriptionDefault
bansYesList of unban requests

TDQS

A4/5.0
Behavior4/5

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

Annotations already flag this as a destructive, non-read-only mutation; the description adds the non-obvious behavioral fact that it 'Acts on the instances immediately', warning the agent that there is no staging or confirmation step. It leaves out error behavior for unknown or non-banned IPs and permission requirements, keeping it out of the top band.

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

Conciseness5/5

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

Three short sentences, front-loaded with the action and scope, then the prerequisite, then the behavioral warning. Nothing is redundant and every sentence adds information.

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

Completeness4/5

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

For a destructive mutation with no output schema, the description covers what it does, what to do first, and that the effect is immediate. It could still say what happens on partial failures across the bans array or whether unbanning an already-unbanned IP is a no-op, but nothing essential is absent.

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

Parameters3/5

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

Schema coverage is 100% and the nested UnbanPayload already documents ip and service. The description only hints at semantics by saying 'globally or per service', loosely implying that omitting service means a global unban, but it never states that mapping explicitly. Baseline 3 applies when the schema carries the parameter burden.

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

Purpose4/5

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

States a specific verb and resource ('Lift bans for ... IPs') plus its scope ('globally or per service'), which clearly separates it from sibling tools like ban_ip and list_bans. It stops short of naming the inverse operation explicitly, but the resource-level precision is enough for an agent to pick it correctly.

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?

'Use list_bans first to find them' gives an explicit prerequisite and points at the sibling that produces valid inputs. It does not state exclusions (e.g., when to use ban_ip instead), so it falls short of a full when/when-not statement.

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

update_serviceA
Destructive

Change a service's settings; skips unknown or externally owned keys and reads back the result. Use global_config_update for global settings. Saved to the database; the scheduler applies it later; this tool cannot confirm it is live.

NameRequiredDescriptionDefault
serviceYesExisting service identifier
is_draftNoToggle draft state
variablesNoUnprefixed per-service setting names and values; unknown or externally owned names are skipped and reported.
server_nameNoRename the service

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already flag this as a mutating, destructive tool, but the description adds genuinely non-obvious context: unknown or externally owned keys are skipped rather than erroring, the result is read back, and the write is persisted for a later scheduler pass without confirming it is live. The main omission is what happens when the service is missing and whether omitted fields are left untouched.

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

Conciseness5/5

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

Three short clauses with no filler; the skip behavior and the async-application caveat are both front-loaded where the agent will read them.

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?

No output schema exists, and the description tells the agent the result is read back after applying skips, which is the key return-value fact. Together with the destructive annotation, that covers nearly everything needed to call it correctly, missing only failure behavior for an invalid service.

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

Parameters3/5

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

Schema coverage is 100% and each parameter is documented, including the skip-and-report semantics of 'variables'. The description mirrors rather than extends that, so it earns the baseline rather than more.

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

Purpose5/5

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

States a specific verb and resource ('Change a service's settings') and immediately scopes it against a named sibling ('Use global_config_update for global settings'). An agent can distinguish this from global_config_update and config_update without opening a schema.

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

Usage Guidelines4/5

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

Gives an explicit alternative for the adjacent case (global settings) and implies the per-service scope. It does not cover when-not-to-use cases such as a nonexistent service or what happens if the caller wants immediate effect, but the routing guidance is clear.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 20 tool updatesv0.6.0
    • Changedcache_delete_bulk5 fields changed
      • addedInput schema / $defs / CacheFileKeyParams / properties / file_name / description
        Added value: +"File name, as listed by cache_list"
      • addedInput schema / $defs / CacheFileKeyParams / properties / job_name / description
        Added value: +"Job that wrote the file, as listed by cache_list"
      • addedInput schema / $defs / CacheFileKeyParams / properties / plugin / description
        Added value: +"Plugin ID that owns the file, as listed by cache_list"
      • addedInput schema / $defs / CacheFileKeyParams / properties / service / description
        Added value: +"Service ID that owns the file; omit for global"
      • addedInput schema / properties / files / description
        Added value: +"Cache files to delete, each keyed as in cache_list"
    • Changedcache_delete_file4 fields changed
      • addedInput schema / properties / file_name / description
        Added value: +"File name, as listed by cache_list"
      • addedInput schema / properties / job_name / description
        Added value: +"Job that wrote the file, as listed by cache_list"
      • addedInput schema / properties / plugin / description
        Added value: +"Plugin ID that owns the file, as listed by cache_list"
      • addedInput schema / properties / service / description
        Added value: +"Service ID that owns the file; omit for global"
    • Changedcache_fetch_file5 fields changed
      • addedInput schema / properties / download / description
        Added value: +"True returns the raw bytes as data_base64; false returns JSON with printable text only"
      • addedInput schema / properties / file_name / description
        Added value: +"File name, as listed by cache_list"
      • addedInput schema / properties / job_name / description
        Added value: +"Job that wrote the file, as listed by cache_list"
      • addedInput schema / properties / plugin / description
        Added value: +"Plugin ID that owns the file, as listed by cache_list"
      • addedInput schema / properties / service / description
        Added value: +"Service ID that owns the file; omit for global"
    • Changedcache_list4 fields changed
      • addedInput schema / properties / job_name / description
        Added value: +"Filter by job name"
      • addedInput schema / properties / plugin / description
        Added value: +"Filter by plugin ID, e.g. letsencrypt"
      • addedInput schema / properties / service / description
        Added value: +"Filter by service ID; omit or 'global' to list every scope, global included"
      • addedInput schema / properties / with_data / description
        Added value: +"Include text file contents inline; false returns metadata only"
    • Changedconfig_create3 fields changed
      • changedInput schema / properties / name / description
        Previous value: -"Configuration name"New value: +"Snippet name: letters, digits, _ or -, no extension"
      • changedInput schema / properties / service / description
        Previous value: -"Service identifier or global"New value: +"Service ID that owns the snippet; omit or 'global' for global"
      • changedInput schema / properties / type / description
        Previous value: -"Configuration type"New value: +"Custom config type, e.g. http, server-http, default-server-http, stream, server-stream, modsec, modsec-crs, crs-plugins-before, crs-plugins-after"
    • Changedconfig_delete3 fields changed
      • changedInput schema / properties / name / description
        Previous value: -"Configuration name"New value: +"Snippet name: letters, digits, _ or -, no extension"
      • changedInput schema / properties / service / description
        Previous value: -"Service identifier or global"New value: +"Service ID that owns the snippet; omit or 'global' for global"
      • changedInput schema / properties / type / description
        Previous value: -"Configuration type"New value: +"Custom config type, e.g. http, server-http, default-server-http, stream, server-stream, modsec, modsec-crs, crs-plugins-before, crs-plugins-after"
    • Changedconfig_get3 fields changed
      • changedInput schema / properties / name / description
        Previous value: -"Configuration name"New value: +"Snippet name: letters, digits, _ or -, no extension"
      • changedInput schema / properties / service / description
        Previous value: -"Service identifier or global"New value: +"Service ID that owns the snippet; omit or 'global' for global"
      • changedInput schema / properties / type / description
        Previous value: -"Configuration type"New value: +"Custom config type, e.g. http, server-http, default-server-http, stream, server-stream, modsec, modsec-crs, crs-plugins-before, crs-plugins-after"
    • Changedconfig_update8 fields changed
      • addedInput schema / properties / data / description
        Added value: +"New snippet content; omit to keep"
      • addedInput schema / properties / is_draft / description
        Added value: +"Set the draft flag; omit to keep"
      • changedInput schema / properties / name / description
        Previous value: -"Configuration name"New value: +"Snippet name: letters, digits, _ or -, no extension"
      • addedInput schema / properties / new_name / description
        Added value: +"Rename the snippet; omit to keep"
      • addedInput schema / properties / new_service / description
        Added value: +"Move to this service; omit to keep"
      • addedInput schema / properties / new_type / description
        Added value: +"Change the type; omit to keep"
      • changedInput schema / properties / service / description
        Previous value: -"Service identifier or global"New value: +"Service ID that owns the snippet; omit or 'global' for global"
      • changedInput schema / properties / type / description
        Previous value: -"Configuration type"New value: +"Custom config type, e.g. http, server-http, default-server-http, stream, server-stream, modsec, modsec-crs, crs-plugins-before, crs-plugins-after"
    • Changedconfig_upload_update9 fields changed
      • addedInput schema / $defs / ConfigUploadFile / properties / filename / description
        Added value: +"File name, with its extension"
      • addedInput schema / properties / file / description
        Added value: +"File whose content replaces the snippet's"
      • changedInput schema / properties / name / description
        Previous value: -"Configuration name"New value: +"Snippet name: letters, digits, _ or -, no extension"
      • addedInput schema / properties / new_is_draft / description
        Added value: +"Set the draft flag; omit to keep"
      • addedInput schema / properties / new_name / description
        Added value: +"New name; if omitted the file stem renames the snippet, so pass the current name to keep it"
      • addedInput schema / properties / new_service / description
        Added value: +"Move to this service; omit to keep"
      • addedInput schema / properties / new_type / description
        Added value: +"Change the type; omit to keep"
      • changedInput schema / properties / service / description
        Previous value: -"Service identifier or global"New value: +"Service ID that owns the snippet; omit or 'global' for global"
      • changedInput schema / properties / type / description
        Previous value: -"Configuration type"New value: +"Custom config type, e.g. http, server-http, default-server-http, stream, server-stream, modsec, modsec-crs, crs-plugins-before, crs-plugins-after"
    • Changedconfigs_delete_bulk4 fields changed
      • changedInput schema / $defs / ConfigKeyParams / properties / name / description
        Previous value: -"Configuration name"New value: +"Snippet name: letters, digits, _ or -, no extension"
      • changedInput schema / $defs / ConfigKeyParams / properties / service / description
        Previous value: -"Service identifier or global"New value: +"Service ID that owns the snippet; omit or 'global' for global"
      • changedInput schema / $defs / ConfigKeyParams / properties / type / description
        Previous value: -"Configuration type"New value: +"Custom config type, e.g. http, server-http, default-server-http, stream, server-stream, modsec, modsec-crs, crs-plugins-before, crs-plugins-after"
      • addedInput schema / properties / configs / description
        Added value: +"Snippets to delete, each by service, type and name"
    • Changedconfigs_list4 fields changed
      • changedInput schema / properties / service / description
        Previous value: -"Service identifier or global"New value: +"Filter by service ID; omit or 'global' to list every scope, global included"
      • changedInput schema / properties / type / description
        Previous value: -"Configuration type filter"New value: +"Filter by type. Custom config type, e.g. http, server-http, default-server-http, stream, server-stream, modsec, modsec-crs, crs-plugins-before, crs-plugins-after"
      • addedInput schema / properties / with_data / description
        Added value: +"Include each snippet's content; false returns metadata only"
      • addedInput schema / properties / with_drafts / description
        Added value: +"Include snippets of draft services"
    • Changedconfigs_upload4 fields changed
      • addedInput schema / $defs / ConfigUploadFile / properties / filename / description
        Added value: +"File name, with its extension"
      • changedInput schema / properties / config_type / description
        Previous value: -"Configuration type"New value: +"Type for every uploaded file. Custom config type, e.g. http, server-http, default-server-http, stream, server-stream, modsec, modsec-crs, crs-plugins-before, crs-plugins-after"
      • addedInput schema / properties / files / description
        Added value: +"Files to create, one snippet per file, named after the sanitized file stem"
      • changedInput schema / properties / service / description
        Previous value: -"Service identifier or global"New value: +"Service ID for every file; omit or 'global' for global"
    • Changeddiagnose1 field changed
      • addedInput schema / properties / service / description
        Added value: +"Optional service ID (its first SERVER_NAME) to also check existence, draft state and setting owners"
    • Changedinstance_create6 fields changed
      • changedInput schema / properties / hostname / description
        Previous value: -"Instance hostname"New value: +"Hostname or IP the scheduler uses to reach the instance API"
      • addedInput schema / properties / https_port / description
        Added value: +"Instance API HTTPS port"
      • addedInput schema / properties / listen_https / description
        Added value: +"Whether the instance API is reached over HTTPS"
      • addedInput schema / properties / method / description
        Added value: +"Source method tag recorded on the instance"
      • addedInput schema / properties / port / description
        Added value: +"Instance API HTTP port (API_HTTP_PORT)"
      • addedInput schema / properties / server_name / description
        Added value: +"Host header sent to the instance API (API_SERVER_NAME)"
    • Changedinstance_update7 fields changed
      • changedInput schema / properties / hostname / description
        Previous value: -"Instance hostname to update"New value: +"Hostname of the registered instance to update"
      • addedInput schema / properties / https_port / description
        Added value: +"New instance API HTTPS port; omit to keep"
      • addedInput schema / properties / listen_https / description
        Added value: +"Reach the instance API over HTTPS; omit to keep"
      • addedInput schema / properties / method / description
        Added value: +"New source method tag; omit to keep"
      • addedInput schema / properties / name / description
        Added value: +"New friendly name; omit to keep"
      • addedInput schema / properties / port / description
        Added value: +"New instance API HTTP port; omit to keep"
      • addedInput schema / properties / server_name / description
        Added value: +"New Host header for the instance API; omit to keep"
    • Changedjobs_run2 fields changed
      • addedInput schema / $defs / JobDescriptor / properties / name / description
        Added value: +"Job name; informational, the API triggers the plugin's jobs"
      • addedInput schema / $defs / JobDescriptor / properties / plugin / description
        Added value: +"Plugin ID that owns the job"
    • Changedplugin_delete1 field changed
      • addedInput schema / properties / plugin_id / description
        Added value: +"ID of a UI plugin, as returned by plugins_list type=ui"
    • Changedplugins_list2 fields changed
      • changedInput schema / properties / type / description
        Previous value: -"Plugin type filter"New value: +"Plugin type filter: all, external, ui or pro"
      • addedInput schema / properties / with_data / description
        Added value: +"Include each plugin's archive data"
    • Changedplugins_upload3 fields changed
      • addedInput schema / $defs / ConfigUploadFile / properties / filename / description
        Added value: +"File name, with its extension"
      • addedInput schema / properties / files / description
        Added value: +"Plugin archives (.zip, .tar.gz or .tar.xz), base64 encoded"
      • changedInput schema / properties / method / description
        Previous value: -"Installation method"New value: +"Installation method; the API supports only ui"
    • Changedsearch_bunkerweb_docs5 fields changed
      • addedInput schema / properties / category / description
        Added value: +"Optional docs section filter, e.g. api, plugins, features"
      • addedInput schema / properties / limit / description
        Added value: +"Maximum results to return, 1 to 50"
      • addedInput schema / properties / max_content_length / description
        Added value: +"Characters of content per result; 0 returns full sections"
      • addedInput schema / properties / min_score / description
        Added value: +"Relevance threshold from 0 to 1; lower it when nothing matches"
      • addedInput schema / properties / query / description
        Added value: +"Question or topic in natural language, any language"
  2. 31 tool updatesv0.5.0
    • Changedauthenticate3 fields changed
      • addedInput schema / properties / password / description
        Added value: +"Password for Basic auth"
      • addedInput schema / properties / payload / description
        Added value: +"Optional JSON payload"
      • addedInput schema / properties / username / description
        Added value: +"Username for Basic auth"
    • Changedban_ip1 field changed
      • addedInput schema / properties / bans / description
        Added value: +"List of ban requests"
    • Changedconfig_create5 fields changed
      • addedInput schema / properties / data / description
        Added value: +"Configuration content"
      • addedInput schema / properties / is_draft / description
        Added value: +"Create as draft"
      • addedInput schema / properties / name / description
        Added value: +"Configuration name"
      • addedInput schema / properties / service / description
        Added value: +"Service identifier or global"
      • addedInput schema / properties / type / description
        Added value: +"Configuration type"
    • Changedconfig_delete3 fields changed
      • addedInput schema / properties / name / description
        Added value: +"Configuration name"
      • addedInput schema / properties / service / description
        Added value: +"Service identifier or global"
      • addedInput schema / properties / type / description
        Added value: +"Configuration type"
    • Changedconfig_get3 fields changed
      • addedInput schema / properties / name / description
        Added value: +"Configuration name"
      • addedInput schema / properties / service / description
        Added value: +"Service identifier or global"
      • addedInput schema / properties / type / description
        Added value: +"Configuration type"
    • Changedconfig_update3 fields changed
      • addedInput schema / properties / name / description
        Added value: +"Configuration name"
      • addedInput schema / properties / service / description
        Added value: +"Service identifier or global"
      • addedInput schema / properties / type / description
        Added value: +"Configuration type"
    • Changedconfig_upload_update3 fields changed
      • addedInput schema / properties / name / description
        Added value: +"Configuration name"
      • addedInput schema / properties / service / description
        Added value: +"Service identifier or global"
      • addedInput schema / properties / type / description
        Added value: +"Configuration type"
    • Changedconfigs_list2 fields changed
      • addedInput schema / properties / service / description
        Added value: +"Service identifier or global"
      • addedInput schema / properties / type / description
        Added value: +"Configuration type filter"
    • Changedconfigs_upload3 fields changed
      • addedInput schema / properties / config_type / description
        Added value: +"Configuration type"
      • addedInput schema / properties / is_draft / description
        Added value: +"Create as draft"
      • addedInput schema / properties / service / description
        Added value: +"Service identifier or global"
    • Changedconvert_service2 fields changed
      • addedInput schema / properties / convert_to / description
        Added value: +"Target state"
      • addedInput schema / properties / service / description
        Added value: +"Service identifier"
    • Changedcreate_service3 fields changed
      • addedInput schema / properties / is_draft / description
        Added value: +"Create as draft"
      • addedInput schema / properties / server_name / description
        Added value: +"Primary server name"
      • addedInput schema / properties / variables / description
        Added value: +"Service variables"
    • Changeddelete_service1 field changed
      • addedInput schema / properties / service / description
        Added value: +"Service identifier to delete"
    • Addeddiagnose
    • Changedget_service4 fields changed
      • addedInput schema / properties / full / description
        Added value: +"Include derived defaults"
      • addedInput schema / properties / methods / description
        Added value: +"Include method metadata"
      • addedInput schema / properties / service / description
        Added value: +"Service identifier"
      • addedInput schema / properties / with_drafts / description
        Added value: +"Include draft services"
    • Changedglobal_config_read2 fields changed
      • addedInput schema / properties / full / description
        Added value: +"Include defaulted settings"
      • addedInput schema / properties / methods / description
        Added value: +"Include method metadata"
    • Changedglobal_config_update1 field changed
      • addedInput schema / properties / config / description
        Added value: +"Key-value pairs to update"
    • Changedinstance_create2 fields changed
      • addedInput schema / properties / hostname / description
        Added value: +"Instance hostname"
      • addedInput schema / properties / name / description
        Added value: +"Friendly instance name"
    • Changedinstance_delete1 field changed
      • addedInput schema / properties / hostname / description
        Added value: +"Instance hostname"
    • Changedinstance_get1 field changed
      • addedInput schema / properties / hostname / description
        Added value: +"Instance hostname"
    • Changedinstance_ping1 field changed
      • addedInput schema / properties / hostname / description
        Added value: +"Instance hostname"
    • Changedinstance_stop1 field changed
      • addedInput schema / properties / hostname / description
        Added value: +"Instance hostname"
    • Changedinstance_update1 field changed
      • addedInput schema / properties / hostname / description
        Added value: +"Instance hostname to update"
    • Changedinstances_delete_bulk1 field changed
      • addedInput schema / properties / instances / description
        Added value: +"Hostnames to delete"
    • Changedjobs_run1 field changed
      • addedInput schema / properties / jobs / description
        Added value: +"Jobs to execute"
    • Changedlist_services1 field changed
      • addedInput schema / properties / with_drafts / description
        Added value: +"Include draft services"
    • Changedplugins_list1 field changed
      • addedInput schema / properties / type / description
        Added value: +"Plugin type filter"
    • Changedplugins_upload1 field changed
      • addedInput schema / properties / method / description
        Added value: +"Installation method"
    • Changedreload_instance2 fields changed
      • addedInput schema / properties / hostname / description
        Added value: +"Target instance hostname"
      • addedInput schema / properties / test / description
        Added value: +"Test the configuration first and reload only if the test passes; this still reloads, it is not a dry run."
    • Changedreload_instances1 field changed
      • addedInput schema / properties / test / description
        Added value: +"Test the configuration first and reload only if the test passes; this still reloads, it is not a dry run."
    • Changedunban_ip1 field changed
      • addedInput schema / properties / bans / description
        Added value: +"List of unban requests"
    • Changedupdate_service4 fields changed
      • addedInput schema / properties / is_draft / description
        Added value: +"Toggle draft state"
      • addedInput schema / properties / server_name / description
        Added value: +"Rename the service"
      • addedInput schema / properties / service / description
        Added value: +"Existing service identifier"
      • addedInput schema / properties / variables / description
        Added value: +"Unprefixed per-service setting names and values; unknown or externally owned names are skipped and reported."
  3. 44 tool updatesv0.1.0
    • First observedauthenticate
    • First observedban_ip
    • First observedcache_delete_bulk
    • First observedcache_delete_file
    • First observedcache_fetch_file
    • First observedcache_list
    • First observedconfig_create
    • First observedconfig_delete
    • First observedconfig_get
    • First observedconfig_update
    • First observedconfig_upload_update
    • First observedconfigs_delete_bulk
    • First observedconfigs_list
    • First observedconfigs_upload
    • First observedconvert_service
    • First observedcreate_service
    • First observeddelete_service
    • First observedget_service
    • First observedglobal_config_read
    • First observedglobal_config_update
    • First observedhealth
    • First observedinstance_create
    • First observedinstance_delete
    • First observedinstance_get
    • First observedinstance_ping
    • First observedinstance_stop
    • First observedinstance_update
    • First observedinstances_delete_bulk
    • First observedinstances_ping_all
    • First observedinstances_stop_all
    • First observedjobs_list
    • First observedjobs_run
    • First observedlist_bans
    • First observedlist_instances
    • First observedlist_services
    • First observedping
    • First observedplugin_delete
    • First observedplugins_list
    • First observedplugins_upload
    • First observedreload_instance
    • First observedreload_instances
    • First observedsearch_bunkerweb_docs
    • First observedunban_ip
    • First observedupdate_service

TDQS

A3.6/5.0

Scored across 45 tools

Disambiguation4/5

Most tools have distinct purposes and the descriptions actively cross-reference alternatives, which helps separate similar operations like ping/health/diagnose and list_instances/instance_get. However, there are still several clusters where boundaries require careful reading, especially monitoring tools, single-vs-bulk instance operations, and service versus global configuration tools.

Naming Consistency2/5

Naming mixes verb_noun patterns (list_services, get_service, create_service) with noun_verb and singular/plural prefixes (instance_get, instances_ping_all, config_get, configs_list, cache_delete_file, jobs_run). The prefixes make tools readable, but the convention is not predictable across the set.

Tool Count2/5

With 45 tools, the surface is very large for an MCP server and exceeds the typical well-scoped range. While the domain is broad, many near-sibling operations could be consolidated or grouped to reduce selection burden.

Completeness4/5

The tool set covers core BunkerWeb administration well: authentication, services, instances, bans, global config, custom configs, plugins, cache/jobs, and documentation search. Some lifecycle gaps remain, such as richer plugin management and job creation/management, but agents can work around most missing operations.

Maintenance

ActivityNo data
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    MCP server for the Mobilerun platform, exposing tools for device control, workflow automation, task management, and platform operations via a stateless HTTP or stdio interface with bearer-token authentication and policy-based access control.
    Apache 2.0
  • A
    license
    Not graded
    quality
    A
    maintenance
    Aggregates multiple backend MCP servers (Stdio, SSE, and Streamable HTTP) into a single hub, exposing their combined tools and resources through unified SSE or Streamable HTTP endpoints, or as a Stdio server, while routing requests to the correct backend. Adds API-key/bearer-token endpoint security, per-tool enable/disable and renaming, and an optional web admin UI with live config reload, install monitoring, and a web terminal.
    52 npm
    MIT